Локализация единственного / множественного числа слов - каковы различные языковые правила для грамматических чисел? - PullRequest
12 голосов
/ 21 августа 2011

Я занимаюсь разработкой библиотеки форматирования строк .NET, чтобы помочь с локализацией приложения.Он называется SmartFormat и имеет открытый исходный код на GitHub .

Одна из проблем, которую он пытается решить, - Грамматические числа .Это также известно как «формы единственного и множественного числа» или «условное форматирование», и вот фрагмент того, как это выглядит на английском языке:

var message = "There {0:is|are} {0} {0:item|items} remaining";

// You can use the Smart.Format method just like using String.Format:
var output = Smart.Format(CultureInfo.CurrentUICulture, message, items.Count);

Английское правило, как я уверен, вы знаете,является то, что есть 2 формы (единственное и множественное число), которые могут применяться к существительным, глаголам и прилагательным.Если количество 1, то используется единственное число, в противном случае используется множественное число.

Сейчас я пытаюсь «расширить свой кругозор», применяя правильные правила для других языков!Я понял, что некоторые языки могут иметь до 4 множественных форм, и для определения правильной формы требуется определенная логика.Я хотел бы расширить свой код для размещения нескольких языков.Например, я слышал, что в русском, польском и турецком языках правила совершенно иные, чем в английском, поэтому это может быть отличной отправной точкой.

Однако я говорю только по-английски и по-испански, так как я могуопределить правильные грамматические правила для многих распространенных языков?

Редактировать : Я также хотел бы знать некоторые хорошие неанглийские "тестовые фразы" для моих модульных тестов здесь: Что такоеКакие-нибудь хорошие неанглийские фразы с формами единственного и множественного числа, которые можно использовать для проверки библиотеки интернационализации и локализации?

Ответы [ 3 ]

10 голосов
/ 21 августа 2011

Определенно, разные языки имеют разные правила множественного числа.Особенно интересными могут быть арабский и польский, которые содержат довольно много множественных форм.

Если вы хотите узнать больше об этих правилах, пожалуйста, посетите Unicode Common Locale Data Repository , а именно Правила множественного числа языков .

Там довольно много интересной информации, к сожалению, некоторые из них, к сожалению, неверны.Надеюсь, правильные формы множественного числа (по крайней мере для польского, насколько я могу судить :)).

1 голос
/ 11 февраля 2012

Было бы неплохо, если бы вы предоставили в теле вопроса образец правил, которые вы используете, в каком формате они принимают?

В любом случае, в вашем примере:

var message = "There {0:is:are} {0} {0:item:items} remaining";

Вы, похоже, исходите из предположения, что выбор в обоих сегментах выбора основан на одном и том же единственном правиле и что существует прямое соответствие между этими двумя вариантами выбора - то есть одно и то же единственное правило выберет (то есть элемент) или (являются предметами).

Это предположение не обязательно корректно для других языков, например, вымышленный английский-ez (просто, чтобы читателю было легче разобраться, примеры на иностранных языках раздражают - я заимствую с арабского, но упрощаю) много). Правила для этого языка следующие:

Первый сегмент выбора такой же, как в обычном английском:

is: count=1
are: count=0, count=2..infinity

Второй сегмент выбора имеет правило, отличное от обычного английского, примите следующее простое правило:

item: count=1
item-da: count=2 # this language has a special dual form.
items: count=0, count=3..infinity 

Теперь единственное правило не будет адекватным - мы можем предложить другую форму:

var message = "There {0:is:are@rule1} {0} {0:item:items@rule2} remaining";

У этого решения могут быть проблемы в других ситуациях, но мы обсуждаем приведенный вами пример.

Проверьте gettext (позволяет выбрать полное сообщение для одного уровня) и ICU (позволяет выбрать полное сообщение для нескольких уровней, то есть для нескольких переменных).

0 голосов
/ 07 ноября 2017

Подход, который вы выбрали, может работать в большинстве случаев на английском и испанском языках, но, скорее всего, не работает на многих других языках. Проблема в том, что у вас есть только один шаблон, который пытается решить все грамматические числа.

var message = "There {0:is|are} {0} {0:item|items} remaining";

Вам нужен один шаблон для каждого грамматического пола. Здесь я объединил два шаблона в одну строку с несколькими шаблонами.

var message = PluralFormat("one;There is {0} item remaining;other;There are {0} items remaining", count);

В английском используются два грамматических числа: единственное и множественное число. один начинает единственное число, а другой начинает множественное число.

При переводе, например, на финский язык, который использует столько же грамматических чисел, сколько вы бы использовали

"one;{0} kappale jäljellä;other;{0} kappaletta jäljellä"

Однако японцы используют только одно грамматическое число, поэтому японцы используют только другое. Польский использует три грамматических числа, поэтому он будет содержать одно, несколько и много.

Во-вторых, вам понадобятся правильные правила для выбора правильного количества рисунков. CLDR консорциума Unicode содержит правила в файле XML.

Я реализовал библиотеку с открытым исходным кодом, которая использует правила CLDR (преобразованные из XML в код C # и включенные в библиотеку) и строки с несколькими шаблонами для поддержки как грамматических чисел, так и грамматических родов.

https://github.com/jaska45/I18N

Используя эту библиотеку, ваши сэмплы превращаются в

var message = MultiPattern.Format("one;There is {0} item remaining;other;There are {0} items remaining", count);
...