Локализация сингулярных/множественных слов - каковы различные языковые правила для грамматических чисел?
Я разрабатываю библиотеку форматирования строки .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 множественных форм, и для определения правильной формы требуется определенная логика. Я хотел бы расширить свой код, чтобы разместить несколько языков. Например, я слышал, что русский, польский и турецкий языки имеют довольно разные правила, чем английский, поэтому это может быть отличной отправной точкой.
Однако я говорю только по-английски и по-испански, так как я могу определить правильные грамматические правила для многих общих языков?
Изменить. Мне также хотелось бы узнать некоторые хорошие "английские" фразы без английского для моих модульных тестов здесь: Какие хорошие не-английские фразы с единственными и множественными формами, которые могут быть использованы для тестирования библиотеки интернационализации и локализации?
Ответы
Ответ 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);