복수형(Pluralization)
GitLab에서 국제화(i18n) 복수형 처리를 위한 GNU gettext 기반 n_() 및 n__() 함수 사용 방법과 올바른 복수형 패턴을 설명합니다.
복수형은 국제화(i18n) 결함 중 가장 흔한 원인 중 하나입니다. 영어에는 두 가지 복수 형태(단수와 기타)가 있지만, 많은 언어에는 더 많은 형태 가 있습니다. 폴란드어와 우크라이나어는 네 가지, 아랍어는 여섯 가지 형태를 사용합니다. 잘못된 복수형 처리는 수백만 명의 사용자에게 문법적으로 깨진 문장을 제공합니다. GitLab에서 복수형 처리 방식 # GitLab은 복수형 처리를 위해 GNU gettext를 사용합니다. n_() (Ruby/HAML) 및 n__() (JavaScript) 함수는 카운트에 따라 올바른 복수 형태를 선택합니다: # Ruby/HAML n_('Apple', 'Apples', count) // JavaScript n__('Apple', 'Apples', count) Gettext는 단일 카운트를 평가하여 사용할 복수 형태를 결정합니다: ngettext(singular, plural, count) ↑ one number only 각 타깃 언어는 PO 파일 헤더( Plural-Forms )에 자체 복수형 규칙을 정의하며, 이 규칙이 카운트를 올바른 msgstr[] 슬롯으로 매핑합니다. 번역자는 언어에서 요구하는 만큼의 형태를 제공합니다. n_()과 n__()을 사용해야 하는 경우 # 카운트에 따라 단어 형태가 변하는 경우 n_() 또는 n__() 을 사용합니다. 기준: 카운트에 따라 명사 또는 동사가 다르게 변형되나요? // 올바름: 카운트에 따라 "day"의 형태가 변함 n__('Last day', 'Last %d days', count) // 올바름: "issue"의 형태가 변함 n__('%d issue', '%d issues', count) n_() 과 n__() 은 동일한 문자열의 복수 형태 사이에서 선택하는 용도로만 사용합니다. 서로 다른 문자열 간의 로직 제어에는 사용하지 마세요. 문자열에 카운트 변수가 포함된 경우, 명사를 복수형으로 만들어야 하는지 확인하세요. 흔한 실수는 %{variable} 을 통해 카운트를 전달하면서 n__() 가 아닌 __() 또는 s__() 를 사용하는 것인데, 이 경우 명사가 항상 단수 형태로 표시됩니다: // 잘못됨: 카운트에 관계없이 "days"가 항상 단수 s__('TrialWidget|%{daysLeft} days left in trial') // 올바름: 카운트에 따라 명사가 복수형이 됨 n__('TrialWidget|%{daysLeft} day left in trial', 'TrialWidget|%{daysLeft} days left in trial', daysLeft) 구조적으로 다른 문자열에는 별도의 문자열과 함께 if / else 를 사용합니다: # 권장: 다른 문자열은 조건부 로직으로 처리 if selected_projects.one? selected_projects.first.name else n_("Project selected", "%d projects selected", selected_projects.count) end # 피할 것: 변수 이름과