Разработка международного переводческого / языкового адаптера для глобальных приложений - PullRequest
3 голосов
/ 10 апреля 2011

Я буду реализовывать это для Node.js (Javascript на стороне сервера), но этот вопрос касается общего подхода к решению этой проблемы.

Существует множество платформ, поддерживающих перевод для международных приложений.

Например, Адаптер перевода Zend работает следующим образом:

printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));

Система Android использует файл strings.xml для каждого языка и работает с той же концепцией, что и Zend.

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

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

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

Ответы [ 2 ]

5 голосов
/ 10 апреля 2011

На самом деле очень сложно ответить на этот вопрос напрямую. Здесь много вариантов использования. Если бы я проектировал такую ​​систему, я бы помнил следующее:

1. Может потребоваться изменить порядок предложений после перевода (вы уже упоминали об этом). Именно поэтому мы используем пронумерованные заполнители, такие как {1}, {2} и некоторые средства форматирования сообщения.

2. Существует довольно много языков, которые имеют несколько форм множественного числа. То есть, если сообщение содержит некоторое число, в зависимости от количества оно будет переведено по-другому. Например:

Английский: 1 вирус был найден | 2 вируса были найдены | Найдено 5 вирусов

Польский: Znaleziono 1 wirusa | Znaleziono 2 Wirusy | Znaleziono 5 wirusów

Это нелегко, но мне действительно нравится, как GetText делает это (есть некое выражение, которое решает, какую форму использовать, а также поддержку нескольких форм).

3. Пользователи такой библиотеки могут захотеть иметь именованные заполнители (см. Предыдущие вопросы в тегах I18n), например, «Это сообщение для $ {name} в $ {location}» и использовать это например так:

var formatted = 'Это сообщение для $ {name} в формате $ {location}'. ('Location = Warsaw', 'name = Paweł');

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

4. Java склонны форматировать числа, а также даты для конкретной локали в методе MessageFormat.format (). Это не идеальное поведение, и оно создает немного проблем, особенно в JavaScript. Ну, первое, что вам нужно знать, что это за локаль текущего пользователя. Если вы делаете, это легко? Ну нет. Существует несколько возможных форматов дат - Java перечисляет их как: полный, длинный, средний, короткий и по умолчанию. К сожалению, нет никаких различий во время форматирования - AFAIR short всегда будет использоваться. Конечно, можно передать его формат заполнителю примерно так (AFAIR): {0, date, yyyy-MM-dd}. Это создает еще одну проблему: переводчики всегда должны будут предоставлять формат. Это подвержено ошибкам. Вместо этого я отформатировал бы шаблон по умолчанию (если дополнительная информация не указана) и разрешил бы передавать имена шаблонов: {0, date, long}.

Для чисел это может быть что угодно: валюта, процент или простое числовое значение. Вы также должны поддержать различие, некоторые примеры: {0, валюта, символ: $, длинный}, {0, процент}, {0, число, длинный}. Не легко догадаться, что я имею в виду, но для больших чисел вы можете использовать группирующие разделители (1 000 000,00 $), давайте назовем это длинным форматом, тогда как иногда вы хотели бы напечатать число следующим образом: 1234. Задача не из легких.

5. .Net имеет концепцию культуры пользовательского интерфейса (CurrentUICulture) и культуры форматирования (CurrentCulture). Первый используется для определения подходящего языка для сообщений пользовательского интерфейса, а второй используется для форматирования (числа, даты, валюты и т.

6. Разные языки, как правило, используют разные параметры сортировки , но даже один и тот же язык может использовать два (или более) разных языка. Я не уверен, соответствует ли это объему, но по крайней мере это полезно знать.

7. Может потребоваться поддержка различных кодировок символов (и, вероятно, будет). Тем не менее, вы можете захотеть ограничить файл кодировки для ресурсов UTF-8. Он не будет охватывать все возможные символы (см., Например, GB18030 ), но он близок.

...?

Ну, я уверен, что забыл что-то важное, поскольку задача, к которой вы приближаетесь, монументальна. И я не знаю много о Node.js (как в том, что в настоящее время поддерживается).

Редактировать

8. Конечно, я забыл упомянуть, что по мере развития программного обеспечения меняется только несколько сообщений пользовательского интерфейса, поэтому необходимо объединить старые переводы (это называется усилением в терминах L10n).Обычно используется какое-то программное обеспечение Translation Memory (например, POEdit, встроенный редактор форматов файлов GetText).Программное обеспечение ТМ обычно имеет поддержку, ограниченную только определенными форматами файлов, поэтому было бы неплохо придерживаться существующего формата, а не создавать свой собственный.Это может означать удаление некоторых функций из списка ...

3 голосов
/ 10 апреля 2011

Ваш дизайн должен учитывать ...

Изменение порядка параметров

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

Форматеры

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

Уникальные ключи

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

Инструменты

Разрешение переводчикам проигрывать "файлы с простым текстом"может вызвать проблемы.В идеале вам понадобится какой-нибудь механизм для обработки кодировок, добавления комментариев переводчиков от специалистов, восстановления переводов между версиями и проверки результирующих строк, чтобы гарантировать, что параметры подстановки соответствуют исходным строкам.


Я бы посмотрел наИнтерфейсы ICU, .Net и Java для вдохновения.

...