언어마다 복수형이 달라지는 이유
zero, one, two, few, many, other 카테고리는 언어별 CLDR 규칙을 따릅니다. 영어에서 one은 1만 뜻하고, 프랑스어에서는 0과 1을 포함합니다. 러시아어와 폴란드어에는 few와 many가 더해지고, 아랍어는 여섯 가지를 모두 쓰며, 한국어와 일본어는 other 하나뿐입니다. 따라서 영어용으로 쓴 두 분기짜리 메시지는 번역하는 순간 불완전해질 수 있습니다.
이 도구는 이 규칙을 브라우저(Intl.PluralRules)에서 읽습니다. 표시되는 카테고리와 예시 숫자는 해당 언어 자체의 것이며, 관리할 표가 따로 없습니다.
gen-l10n의 =1 함정
=1 분기는 flutter gen-l10n이 생성하는 코드에서 one 카테고리가 됩니다. 프랑스어에서는 이 카테고리가 0에도 적용되므로, count = 0일 때 "1 article restant"(1개 남음)이 표시됩니다. 숫자를 텍스트에 넣은 one 카테고리를 쓰거나 =0 분기를 추가하세요. 도구에서는 체크박스로 추가할 수 있습니다. 자세한 내용은 ICU 복수형과 플레이스홀더 가이드에 있습니다.
결과 사용 방법
- 언어별
"key": "{count, plural, …}" 줄을 해당 app_xx.arb 파일에 복사합니다.
@key 메타데이터는 템플릿 파일에 한 번만 추가합니다.
flutter gen-l10n을 실행합니다. other 분기가 없거나 중괄호가 닫히지 않았으면 파일 이름과 함께 생성이 멈춥니다.
그다음 플레이스홀더를 빠뜨리거나 이름을 바꾼 번역이 없는지는 ARB 누락 키 검사기로 확인하세요.
도구의 한계
이 도구는 구조를 생성할 뿐 번역은 하지 않습니다. 각 형태의 텍스트는 직접 씁니다. select 메시지와 중첩된 복수형은 다루지 않으며, l10n.yaml에서 use-escaping을 켰을 때 필요한 아포스트로피 이중화도 하지 않습니다.