Плюрализующие и локализующие строки в C # - PullRequest
3 голосов
/ 16 сентября 2009

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

Однако недавно я смирился с тем фактом, что в некоторых культурах есть множественные формы множественного числа. Кто-нибудь сталкивался с хорошим решением этой проблемы в C #, не говоря уже о WPF?

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

  • 1 плик
  • 2,3,4 плики
  • 5-21 пликоу
  • 22-24 плики
  • 25-31 плико'в

Ответы [ 4 ]

8 голосов
/ 16 сентября 2009

Mozilla реализовала это в Firefox 3, и у них есть руководство, описывающее, как использовать их реализацию здесь . В частности, в разделе Developing with PluralForm они имеют ссылку

Ресурс: //gre/modules/PluralForm.jsm

к источнику их реализации. Должен быть открыт изнутри Firefox 3 и выше.

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

НТН.

4 голосов
/ 16 сентября 2009

Подумайте о том, чтобы попытаться вообще избежать этой проблемы. Вместо того, чтобы строить предложения, попробуйте создать свой пользовательский интерфейс, чтобы избежать проблемы. Вместо того, чтобы говорить «5 страниц», попробуйте сказать: «Страниц: 5».

2 голосов
/ 16 сентября 2009

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

Я бы не советовал избегать этого, так как вы можете быстро потерять поток естественного языка "Минс ответил назад: 6".

Возможно, вы имели в виду это в первую очередь, но гораздо более распространенный сценарий - это вариации синтаксического размещения в разных культурах. Например, строка, желающая быть локализованной «Эта страница просматривается X раз». Вы можете сделать 3 локализуемых строки для этого:

PageViewStart = "Эта страница просмотрена" PageViewEnd = "время" PageViewEndPlural = "times"

Тогда простая псевдо-реализация будет

PageViewStart + pageCount.ToString () + pageCount == 1? PageViewEnd: PageViewEndPlural;

Однако на голландском языке «Deze pagina является {0} keer bekeken» и на корейском языке «조회수 {0}». Таким образом, вы видите, что сразу же столкнетесь с проблемами с реализациями нескольких способов форматирования структуры множественных предложений в разных языках.

Я намеренно оставил {0} в примерах, поскольку это намекает на мое решение. Используйте локализацию для всего предложения во множественном и не множественном числе.

PageView = "Эта страница просмотрена 1 раз." PageViewPlural = "Эта страница была просмотрена {0} раз."

Таким образом, вы можете написать условное выражение (снова псевдо в зависимости от вашей реализации):

pageCount> 1? PageView: String.Format (PageViewPlural, pageCount.ToString ());

Единственное, что вашим переводчикам потребуется инструктаж относительно значения и размещения токена {0} в файле resx.

1 голос
/ 16 сентября 2009

Полагаю, вы знаете, что gettext обрабатывает множественное число. Но в целом я бы старался этого избегать (как сказал Юлий).

Это не только существительные - фразы могут меняться (например, в немецком "1 Datei konnte nicht gelöscht werden" / "2 Dateien konnten nicht gelöscht werden" ).

Это гораздо более дружелюбно и элегантно, чем уклонение от проблем "Dateien, die nicht gelöscht werden konnten: 2" , но есть компромисс в том, сколько ресурсов у вас есть для локализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...