Подтвердить что ты не робот

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

Я разрабатываю библиотеку форматирования строки .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);

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Это предположение не обязательно верно для других языков, например, для фиктивного языка English-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:[email protected]} {0} {0:item:[email protected]} remaining";

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

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

Ответ 3

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

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ä"

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

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

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

https://github.com/jaska45/I18N

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

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