Перевод на языки с нерегулярными правилами - PullRequest
6 голосов
/ 20 марта 2012

Чтобы сделать систему управления контентом PHP расширяемой , языковые переводы имеют решающее значение.Я исследовал подходы к программированию для системы переводов и подумал, что Qt Linguist является хорошим примером.

Это пример использования из документации Qt:

int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));

Qt использует правила известного языка, чтобы определить, имеет ли "message" добавление "s" на английском языке.

Когда я привел этот пример в команду разработчиков, они обнаружили проблему, которая ставит под угрозу эффективность расширяемости моделирования с помощью функции tr() Qt.

Это аналогичный пример, за исключением того, что сейчас что-то серьезно не так.

int n = deadBacteria.count();
showMessage(tr("%n bacterium(s) killed", "", n));

Множественное число от«bacterium» - это «bacteria».Неправильно добавлять «s».

У меня нет большого опыта работы с Qt Linguist, но я не видел, как он обрабатывает нерегулярные спряжения и формы.

Aболее сложная фраза может быть "%n cactus(s) have grown.".Множественное число должно быть «cactii», а «have» должно быть сопряжено с «has», если есть один кактус.

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

  1. Возможно, существует язык, который изменяет существительные нерегулярным образом, даже если исходная строка работает на английском языке, например, "%n message(s) saved".В MyImaginaryLanguage правильным способом формирования переведенной строки может быть « 1Message сохранено », « M2essage сохранено », « Me3ssage сохранено » для значений %n1, 2 и 3 соответственно, и не похоже, что в Qt Linguist есть правила для этого.
  2. Чтобы сделать CMS расширяемой, как мне нужна моя, все типывеб-приложений должны быть учтены. Кто-то может создать ролевую игру , которая требует построения предложений типа " 5 кактусов выросли. " Или, может быть, программное обеспечение безопасности хочетскажем, " ClamAV обнаружил 2 вируса. " вместо " ClamAV обнаружил 2 вируса (ов). "

После поиска в Интернете, чтобы увидеть, если другиеРазработчики Qt имеют решение этой проблемы и, не найдя ни одного, я пришел к Stack Overflow.

Я хочу знать:

  1. Какой должна быть расширяемая и эффективная техника программированияиспользуется для перевода строк с возможными нерегулярными правилами?
  2. Что делают программисты и переводчики Qt, если сталкиваются с этой проблемой нерегулярности?

Ответы [ 3 ]

6 голосов
/ 20 марта 2012

Вы неправильно поняли, как работает множественное число в Qt: это не автоматический перевод.

Обычно у вас есть строка по умолчанию, например, "% n кактусов выросли." который является литералом в вашем коде. Вы можете положить в нее все, что захотите, например. "dingbat wibble foo% n bar".

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

Лингвист запрограммирован на различные правила того, как языки обрабатывают количество чего-либо. На английском это просто единственное или множественное число; но если у языка есть определенная форма для нуля или чего-то еще, он представляет их в Linguist. Затем он позволяет вам ввести любое правильное предложение на целевом языке перевода и обрабатывает %n там, где вы решили, что оно должно быть в переведенной форме.

Так что, кто бы ни делал перевод в Linguist, будет предоставлен источник, и он должен будет заполнить единственное и множественное число, например.

Исходный текст: %n cactus(s) have grown.

Английский перевод (Singular): %n cactus has grown.

Английский перевод (Plural): %n cacti have grown.

Если приложение не может найти установленный перевод, оно возвращается к исходному литералу. Кроме того, исходный литерал - это то, что видит переводчик, поэтому должен вывести из него то, что вы имели в виду. Следовательно, "dingbat wibble foo% n bar" может не быть хорошей идеей при описании того, сколько кактусов выросло.

Дальнейшее чтение:

3 голосов
/ 20 марта 2012

Ваш лучший выбор - использовать GNU gettext i18n.Он прекрасно интегрирован в PHP и дает вам инструменты для точного определения всех изворотливых правил грамматики множественных форм.

1 голос
/ 20 марта 2012

Используя Qt Linguist, вы можете обрабатывать различные грамматические числа в зависимости от целевого языка. Поэтому каждый раз, когда в строке tr обнаруживается %n, переводчику будет предложено предоставить все необходимые переводы для целевого языка. Проверьте эту статью для более подробной информации:

http://doc.qt.nokia.com/qq/qq19-plurals.html

...