저희가 지원하는 42개 언어 중 14개 언어에서는 "one"이라는 복수형 범주가 단순히 1만을 위한 것이 아닙니다
언어
앱의 문자열 "One habit left today"에는 복수형 파트너인 "%d habits left today"가 있습니다. Android는 범주에 따라 이 둘 중 하나를 선택합니다. 영어는 1에는 "one"을, 그 외 모든 값에는 "other"를 사용합니다. 러시아어에서는 범주 "one"이 1, 21, 31, 41 등에 사용됩니다. 저희의 번역 검증은 같은 날 두 번, 각각 다른 방향에서 이를 잘못 처리했습니다.
올바른 번역이 거부되었습니다
11월 2일, 저희는 예제 앱에서 번역 키트를 다시 실행했습니다. 러시아어 "one"에 대해 모델은 "Осталась %d привычка на сегодня"("%d habit left today", 숫자 포함)를 작성했습니다. 저희 검증은 이를 영어 "one" 형식과 비교하여 영어에는 없는 %d가 발견되었다며, 이를 임의로 추가된 플레이스홀더로 간주하고 거부했습니다. 모델이 옳았습니다. 남은 습관이 21개인 사용자는 이 형식을 보게 되므로, 숫자를 표시해야 합니다. 저희는 검증을 수정했습니다: 형식이 영어 "other" 형식이 사용하는 개수를 추가할 수 있습니다. 다음 실행에서는 예제의 모든 350개 문자열을 작성했습니다.
잘못된 번역이 통과되었을 것입니다
동일한 검증이 반대 경우를 통과시켰습니다. 모델이 "Осталась одна привычка"("one habit left")를 작성했다면, 문자열에서 손실된 것이 없으므로 통과했을 것이며, 남은 습관이 21개인 사용자는 습관이 하나 있다고 안내받았을 것입니다. 이전 규칙은 영어에서 "one"은 1만을 의미하므로, 모든 "one" 형식이 숫자를 생략하는 것을 허용했습니다.
이제 검증은 Android와 ICU가 사용하는 유니코드 복수형 규칙인 CLDR에서 각 범주가 어떤 숫자를 포함하는지 파악합니다. 여러 숫자를 포함하는 범주용 형식은 숫자를 표시해야 합니다. 단일 숫자용 형식은 이를 생략할 수 있습니다: 독일어 "one"은 1만 해당하므로 "Noch eine Gewohnheit"은 적절합니다.
"one"이 단순히 1이 아닌 경우
Babel 2.10이 인식하는 CLDR 데이터가 지원하는 41개 타겟 언어 중 14개 언어에서는 "one"이 숫자 1 이상을 포함합니다:
- 1, 21, 31, 41…: 러시아어, 우크라이나어, 세르비아어, 마케도니아어.
- 0과 1: 프랑스어, 포르투갈어, 페르시아어, 아르메니아어, 칸나다어, 펀자브어, 암하라어. 습관이 0개일 때 "Une habitude restante"가 표시됩니다.
- 1과 11: 스코틀랜드 게일어. 1, 101, 201…: 슬로베니아어(여기서 "two"는 102와 202도 포함합니다).
- 4, 6 또는 9로 끝나지 않는 모든 숫자: 필리핀어.
ICU 메시지에서는 자체 분기가 이를 변경합니다. 메시지에 =0{…}을 사용하면 프랑스어 "one"에는 1만 남게 되며, 검사에서 이를 반영합니다.
Android 자체 문자열과 대조하여 검증
출하 전에 Android 프레임워크 문자열의 복수형 메시지에 규칙을 적용해 보았습니다. 당사 언어 39개에서 번역 897건을 검사했지만 아무것도 감지되지 않았습니다. Google 번역팀은 여러 숫자를 포함하는 모든 분기에 숫자를 넣었고, 영어에서 1에 고유한 분기를 할당한 경우에도 러시아어 "one" 분기까지 포함했습니다. 러시아어 "one" 분기 중 하나에서 숫자를 수동으로 제거하자, 검사 결과 해당 형태가 21, 31, 41, 51에도 사용된다고 나타났습니다.
규칙은 ICU 메시지에 대해 GitHub에서 무료로 제공되는 translation-checks 1.2.0에, Android 복수형과 ICU 메시지에 대해서는 Polyglot 1.2.0에 포함되어 있습니다. 이번 주에 추가한 다른 검사 항목은 다른 문자 체계의 문자에 대한 노트에 있습니다.