x
 
Антон Лях
27 апреля 2017
Советы почтой каждую неделю
Пожалуйста, получите наше письмо, чтобы подтвердить свой адрес:
Вы подписаны на «Советы за неделю»:

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


Антон!

Задача сделать сайт многоязычным довольно объёмная. Сперва сайт надо подготовить к многоязычности, интернационализировать:

  • решить как определять текущий язык: из урла, настроек пользователя, заголовка Accept-Language или по геолокации;
  • заменить текст на абстрактные ключи («Новости» → nav.news, «Подписаться» → form.subscribe);
  • подготовить к локализации даты, время, денежные единицы и фразы с числительными (Нет писем, 5 писем, 2 письма).

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

Что для этого использовать — зависит от вашей задачи и используемых технологий. Советую использовать что-то готовое: штатный i18n в Рельсовых проектах, i18n.js или i18next в проектах на Яваскрипте и Ноде. Они хорошо документированы, поддерживают плюрализацию и локализацию дат, чисел и денежных единиц.

Выбранный бэкенд интернационализации и определит хранилище переводов. Как правило, используют YAML, JSON или какой-то нативный формат.

Например, в книгах бюро переводы хранятся в объектах Яваскрипта, а нужный перевод выбирается по языку, на котором написана книга:

I18n.translations.ru.test = {
  intro: 'Ответьте на все вопросы теста, <br>чтобы узнать результат.',
  rerun: '↺ Пересдать',
  scored: { // плюрализация
    one: 'Вы ответили правильно на %{count} вопрос из %{total}',
    few: 'Вы ответили правильно на %{count} вопроса из %{total}',
    many: 'Вы ответили правильно на %{count} вопросов из %{total}',
    other: 'Вы ответили правильно на %{count} вопросов из %{total}',
  },
};

I18n.translations.en.test = {
  intro: 'Answer all questions of the test<br>to know the result.',
  rerun: '↺ Retake',
  scored: {
    one: "You've correctly answered %{count} question out of %{total}",
    other: "You've correctly answered %{count} questions out of %{total}",
  },
};

В проектах на Рельсах переводы, как правило, хранятся в YAML, а язык определяется по урлу (?locale=es), настройкам пользователя или заголовку Accept-Language.

# config/locales/en.yml
en:
  date:
    formats:
      short_date: "%b %e, %Y" # Apr 22, 2017

  form:
    import: Import
    caution: Caution

# config/locales/de.yml
de:
  date:
    formats:
      short_date: "%e. %b %Y" # 22. Apr 2017

  form:
    import: Importiern
    caution: Achtung

Советую сразу обозначить текущий язык в разметке: <body class="en_locale">. Так будет проще исправлять вёрстку для языков, в которых слова в 2–3 раза длиннее или короче, чем в русском: немецкий, японский, китайский.

См. также:

P. S. Мы ищем фронтендера в издательство.

P. P. S. Это был совет о веб-разработке. Хотите знать всё о коде, тестах, фронтенд-разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.
Вёрстка и прототипирование — дисциплина Школы дизайнеров. Набор весной. Оставьте почту, и мы напишем вам, когда откроется следующий набор.
 

Поделиться
Отправить

Цель рубрики — обсуждение вопросов дизайна всех видов, текста в дизайне и взаимоотношений дизайнеров с клиентами.

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

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

Вот такой веб 2.0.

Как устроена беспарольная аутентификация почтой 7 Как вы проверяете соответствие вёрстки макету 2




Недавно всплыло

1 1 3 Как вы верифицируете оценку сроков от сотрудника? 1