Необходим вклад в реализацию JavaScript i18n - PullRequest
0 голосов
/ 12 ноября 2011

Я разрабатываю помощник i18n для JavaScript и хотел бы получить информацию о реализации.

В базовом сценарии он должен обеспечивать некоторую функциональность поиска на основе объекта локали: (с поддержкой переменных)

var locales = {
  en : {
    pages : {
      myPage1 : {
        title : "A title with <em>highlighted %s</em>",
      }
    }
  }
}

function _(path) {
   //lookup and return translation
}

_(pages.myPage1.title, "text") => "A title with <em>highlighted text</em>"

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

var locales = {
  en : {
    pages : {
      myPage1 : {
        title : "A title with <em>%s text</em>",
        tickets : {
          _0 : "0 tickets left",
          _1 : "1 ticket left",
          _1+ : "%s tickets left"
        }
      }
    }
  }
}

function _n(path, count) {
   //lookup and return translation
}

_n(pages.myPage1.ticketsLeft,5) => "5 tickets left"

... А также интегрировать это с движком шаблонов:

<h1>{{ _(pages.myPage1.title) }}</h1>
<p>{{ _n(pages.myPage1.ticketsLeft, {{ variable }} ) }}</p>

Вопросы:

  1. Какие подводные камни существуют в базовом i18n и в чем отсутствует реализация, описанная выше, которую следует рассмотреть с самого начала?

  2. Как бы вы закодировали фактические методы _ (), _n (), чтобы они работали с объектом как данный?

  3. Есть идеи по интеграции шаблонов - как это сделать?

  4. Существуют ли какие-либо "службы краудсорсинга перевода", которые хорошо работают вместе с JavaScript?

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

В дополнение к проблеме формы множественного числа, о которой говорил Павел Дида, есть еще несколько потенциальных проблем:

  • Для записи числа может потребоваться локализация, частично из-за того, что формат больших чисел варьируется (например, 1 234 против 1234 против 1’234 против чего-то еще), частично из-за того, что могут потребоваться разные цифры. Библиотека Globalize.js решает первую проблему, проблема с цифрами может потребовать отдельного кодирования.
  • В случае 0 элементов может быть более естественным использовать эквивалент «Нет», чем цифра ноль, в тексте, показанном пользователю.
  • Использование подобной разметки проблематично, так как обычно она отображается курсивом, а курсив не имеет смысла для многих систем письма. Вам может понадобиться использовать таблицы стилей для конкретного языка, чтобы изменить отображение. Это как таковая внешняя по отношению к JavaScript, но чтобы сделать это возможным, убедитесь, что создаваемая разметка либо содержит атрибут lang (чтобы таблицы стилей могли применять разные правила для каждого языка), либо ссылалась на таблицы стилей для конкретного языка.

Метод localize () в Globalize.js очень прост, подходит для случая локализации (перевода) набора строковых литералов. Но вы можете написать свой собственный, более сложный код, чтобы добавить туда свойства объектов культуры.

В целом, многое зависит от предполагаемой области применения: сколько языков (и какие типы языков) вы собираетесь охватить, и какие виды локализации, отличные от простой локализации строк, вам понадобятся? Реализация общей схемы для обработки выражений типа «n элементов» не проста - CLDR предоставляет вам наборы правил, но вам нужно будет их кодировать, а в переводах вам нужно будет запрашивать все соответствующие наклонные формы существительное, подобное «номеру». Если такие выражения встречаются только в некоторых конкретных контекстах, возможно, было бы целесообразно переформулировать вещи так, чтобы вы не говорили «n оставленных билетов», а «Количество оставленных билетов: n». Это быть намного проще в реализации: просто локализация строк и локализация чисел.

1 голос
/ 12 ноября 2011

Объявление 1. Ваше предположение только на одну форму множественного числа неверно.Некоторые языки имеют несколько различных форм множественного числа (ваш польский перевод вашего примера):

один: Pozostał jeden bilet.
несколько: Pozostały 2 bilety.
многие: Pozostało 5 biletów.
другие:Позостало 1,5 билета.// Хорошо, этот не имеет смысла, но вот как он будет переведен, если он сделает ...

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

Ad 2. Для перевода я бы использовал Globalize , так как он имеет эту функцию более или менее встроенной (есть функция Localize()).Единственной проблемой из моих наблюдений будет местный запасной вариант.На самом деле вам нужно убедиться, что что-то вроде de-AT (немецкий / австрийский) возвращается к de (немецкий / инвариант страны), если у вас нет конкретных переводов для данного языка.С китайским языком может быть большая проблема, вы не должны ни при каких обстоятельствах прибегать к упрощенному китайскому языку (если zh указывает на него), если у вас есть традиционный китайский язык.Использование zh-Hans и zh-Hant может быть хорошей идеей.
Что касается множественных форм, вам, вероятно, необходимо включить данные из таблицы CLDR выше и использовать некоторую логику, основанную на Locale.Я бы, вероятно, расширил бы файлы культуры Globalize, добавив формы множественного числа, а затем вызвав FindClosestCulture() (если я правильно его помню), я бы проверил, какое правило я должен использовать для этого контекста (локаль и число).Затем прочитайте соответствующее сообщение с помощью Localize().Конечно, нужно писать сообщения с соответствующими ключами, например:

tickets-one : One ticket left.
tickets-other: : {0} tickets left.

Кстати.Я бы использовал пронумерованные заполнители.Причина в том, что иногда вам нужно разместить более одного.В этом случае, если у вас два одинаковых заполнителя %s, переводчики не смогут переупорядочить предложение.И это требуется чаще, чем вы думаете (многие языки имеют совершенно другие правила грамматики, чем английский).

Ad 3. В зависимости от вашего движка шаблонов ...
Ad 4. ​​Это зависит от того, как вы хотитеинтегрировать это.Обычно используется трансляция на стороне сервера, поэтому вы на самом деле записываете файл JavaScript из серверной части приложения.В этом случае, в зависимости от технологии, которую вы используете в своем бэк-энде, вы можете использовать простые файлы свойств или более сложные (но часто лучшие) решения, такие как Gettext.Для обоих форматов вы можете легко найти краудсорсинговую платформу (т.е. Launchpad поддерживает последнюю из коробки).Если вы хотите, чтобы кто-то переводил ваши файлы JavaScript, подобные тем, которые вы показываете выше, это не очень хорошая идея.Одна проблема с этим, это нестандартно, поэтому многие люди не знают, как это перевести.Во-вторых, это очень легко повредить, забыв добавить запятую, двоеточие или фигурную скобку.Это ошибки, с которыми вам (или какой-то несчастной душе, пользующейся написанным вами) придется столкнуться.

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