перевод числительных Как создать свой сайт > Вебмастеру > Создание своего сайта > GetText — удобство перевода числительных

GetText — удобство перевода числительных

— Машину, которая идёт в голове пробега,
нужно украсить хотя бы одним лозунгом, — сказал Остап.
«Золотой телёнок», Ильф и Петров.
23 апреля 2008

Gettext — это стандартный инструмент для интернационализации приложений, разработанный в GNU. В нашей компании он также является стандартом и автоматически включается в список минимальных зависимостей каждого нового приложения, которое мы создаём. К сожалению gettext не лишён недостатков, но преимущества с лихвой перевешивают. Об одном из таких преимуществ gettext перед кустарными методами интернационализации приложений, а именно об удобстве перевода числительных, пойдёт речь в этом посте.


Совсем коротко о gettext

    Если вы когда-нибудь писали мультиязычное приложение, такое как, например, веб-сайт на PHP, то наверняка переводили различные строки и надписи при помощи некоторого ассоциативного массива типа $translations, где ключом у вас являлась исходная строка на английском или её сокращённый вариант, а значением каждой ячейки массива — перевод этой строки на соответствующий язык (например $translations[”Hello World!”] = “Привет мир!”). Далее ваш скрипт, зная о языке пользователя, просто подключал соответствующий файл с массивом $translations и таким образом осуществлялся перевод. Некоторые разработчики для этих целей используют также таблицы БД или комбинации из файлов и БД.

    В принципе, ничего плохого во всех этих подходах нет. Более того, это даже единственный вариант, если вам нужна гарантия, что ваше приложение заработает на совершенно любом хостинге. Но если подобных жёстких требований к вашему проекту не предъявляется, то для перевода лучше использовать gettext.

    Вкратце: в тех местах кода, где следует выводить локализованную строку, вы делаете это так:

    print _('Hello World!');

    Здесь подчёркивание (underscore) — это короткий псевдоним функции gettext(). Затем вы запускаете великолепный редактор poEdit, конфигурируете и натравливаете его на исходники своего проекта, нажимаете кнопочку «Сканировать». После этого poEdit находит все строки, нуждающиеся в переводе, и заполняет ими каталог (PO-файл). Ваш переводчик переводит эти строки (опять же при помощи poEdit) и создаёт откомпилированные MO-файлы, которые вы затем кладёте под проект и подключаете примерно как здесь.

    Бесспорные преимущества gettext в связке с poEdit:

  • Более «чистый» и понятный код, нет мешающегося под ногами массива а-ля $translations, к тому же быстрее;
  • Это стандарт. Имеются реализации для различных языков программирования (даже для JavaScript);
  • Удобный менеджмент благодаря poEdit: автоматическое нахождение новых и чуть изменившихся строк, автоматическое удаление строк, исчезнувших из проекта;
  • poEdit также умеет строить собственный словарь переводов, что способно сэкономить время переводчику;
  • Дополнительно, в связке с возможностью Subversion под названием Externals Definitions и соответствующих hook-скриптов, можно обеспечить абсолютно независимую работу программистов и переводчиков;

    Дальнейший рассказ о gettext и poEdit находится за рамками этой статьи, поэтому если интересуетесь — обратитесь к разделу «Ссылки» в конце поста.

Формы слов после числительных

    Приятно видеть, когда веб-приложение «общается» с тобой на твоём родном языке, причём до мелочей корректно. Стремясь сделать свой блог лучше, я даже изобрёл свой велосипед в виде плагина для правильного написания количества комментариев в Wordpress. Жаль, но многие разработчики просто не «заморачиваются» подобными «мелочами». В gettext вся эта чехарда с окончанием существительного в зависимости от числительного, стоящего перед ним, решается очень просто.

    Для начала просто выведем количество минут:

    print sprintf(ngettext('%d minute ago', '%d minutes ago', $mins), $mins);

    Здесь мы применяем другую функцию — ngettext(), которая принимает три параметра: строка для единственного числа, во втором параметре — для множественного, а третьим параметром — собственно число минут (в переменной $mins). Строки для единственного и множественного числа имеют смысл только для английского языка (или когда нет перевода) и не имеют смысла, например, для русского или латышского языков. Так как принцип образования окончаний существительных после числительных в этих языках другой.

    Это предусмотрено в gettext — для любого языка можно задать свой скрипт. Для этого сперва сканируем свой код в poEdit, затем идём в Catalog->Settings и в текстовое поле Plural Forms копипастим скрипт для соответствующего языка отсюда. Например, для великого и могучего:

    nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;

    Сохраняем результат, находим нашу строку «%d minute ago» в каталоге poEdit (возможно придётся просканировать исходники ещё раз), кликаем на неё. В левом нижнем углу окна редактора наблюдаем следующую форму:

Изображение недоступно

    В русском языке есть три формы окончаний после числительных и каждая из них представлена на рисунке своим табом. В скобочках указано число, к которому вам как бы нужно подобрать существительное. Например, соответственно «1 минуту назад», «2 минуты назад» и «5 минут назад». Сохраняем и компилируем в MO-файл как обычно и используем в вашем приложении. Теперь оно умеет выводить минуты правильно. Как видите всё просто, можете проделать это и с годами, месяцами, часами и т. д.

Автор: Юрий Пименов.


Комментарии...


⇓ 

Поделись ссылкой на Seoded.ru с друзьями, знакомыми и собеседниками в соцсетях и на форумах! А сам сайт добавь в закладки! Так победим.

Поделиться ссылкой на эту страницу в:

Полезные ссылки:

Грамотный сайт принесёт много денег Как зарабатывают на сайтах с рецензиями к фильмам

Ещё материалы по этой теме:

Как бесплатно зарегистрировать домен в зоне org.ua? Как писать статьи для сайта «Экстремальный» подход в контексте UI/UX проектирования XSS в веб-аппликациях Парсер Вордстата на PHP
основан в 2008 г. © Все права на материалы сайта Seoded.ru принадлежат Алексею Вострову.
Копирование (полное или частичное) любых материалов сайта возможно только с разрешения автора и при указании ссылки на источник.
Ослушавшихся находит и забирает Бабайка!