i18n 구현 방법 비교

Category
OpenSource
Status
Published
Tags
국제화
Description
Published
Slug

i18n 구현 방법 비교

React i18next 방식

import { useTranslation } from 'react-i18next'; const { t } = useTranslation(); // 사용법 t('message', { count: 5 }); t('user.name', { name: 'John' });

Lighthouse ICU MessageFormat 방식

import * as i18n from '../lib/i18n/i18n.js'; const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings); // 사용법 str_(UIStrings.unsupportedCSSProperty, { propertyCount: properties.length, properties: properties.join(', ') });

차이점과 특징

React i18next

// 번역 파일 (JSON) { "message": "You have {{count}} items", "message_plural": "You have {{count}} items" } // 사용 t('message', { count: 1 }); // "You have 1 item" t('message', { count: 5 }); // "You have 5 items"

Lighthouse ICU

// UI 문자열 정의 (소스코드에서) unsupportedCSSProperty: `{propertyCount, plural, =1 {Unsupported CSS Property: {properties}} other {Unsupported CSS Properties: {properties}} }`, // 사용 str_(UIStrings.unsupportedCSSProperty, { propertyCount: 1, properties: "height" }); // "Unsupported CSS Property: height" str_(UIStrings.unsupportedCSSProperty, { propertyCount: 3, properties: "height, width, color" }); // "Unsupported CSS Properties: height, width, color"

왜 Lighthouse가 ICU를 선택했나?

  1. Google 표준: Google 내부 프로젝트들이 공통으로 사용
  1. Unicode 표준: 국제 표준이므로 안정적
  1. 복잡한 복수형 지원: 언어별 복수형 규칙을 정확히 처리
  1. 조건부 메시지: 단순 번역을 넘어서 복잡한 로직 지원
 

React i18next vs ICU

특징
React i18next
ICU MessageFormat
학습 곡선
쉬움
복잡함
복수형 처리
단순
정교함
조건부 로직
제한적
강력함
번들 크기
작음
큼
표준화
커뮤니티
Unicode/Google

구현한 부분에서의 ICU 활용

// 추가한 새로운 메시지 unsupportedCustomCSSProperty: `{propertyCount, plural, =1 {Custom CSS properties cannot be animated on the compositor: {properties}} other {Custom CSS properties cannot be animated on the compositor: {properties}} }`, // 실제 사용에서 ICU 엔진이 처리하는 과정: // 입력: propertyCount=2, properties="--swing-y, --rotation" // ICU 처리: propertyCount != 1 이므로 "other" 브랜치 선택 // 결과: "Custom CSS properties cannot be animated on the compositor: --swing-y, --rotation"
React의 t() 방식도 i18n이고, Lighthouse의 ICU 방식도 i18n
둘 다 다국어 지원이라는 같은 목적을 가진 서로 다른 구현 방법