Статьи

Локализация PHP-приложений «Правильный путь», часть 1

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

Локализация программных приложений в целом была громоздкой и подверженной ошибкам задачей, приводящей к большому количеству грязного кода. Некоторые разработчики даже используют разные версии кода для одного и того же приложения, но для разных локалей, что делает практически невозможным управление базой кода. Введите gettext, замечательный инструмент с открытым исходным кодом, который облегчит вашу жизнь, позволив вам сосредоточиться на своем коде. Локализация становится вопросом написания отдельных файлов перевода для целевого языка, что может быть легко выполнено переводчиком с помощью Poedit. Если вы овладеете gettext для PHP, вы обнаружите, что расширение глобального охвата вашего приложения действительно может быть просто вопросом перевода!

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

Подготовка окружающей среды

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

  • PHP 5.x на Apache (или на любом другом веб-сервере) с включенным расширением gettext. Вы всегда можете получить последнюю версию PHP для вашей платформы на www.php.net .
  • Poedit, кроссплатформенный редактор для каталогов gettext. Это действительно хороший инструмент, который позволяет вам хранить переводы отдельно от кода приложения. Вы можете получить копию с www.poedit.net

Независимо от вашей платформы, чтобы использовать gettext из PHP, вам нужно будет установить библиотеку gettext и расширение PHP, которое подключается к библиотеке.

Пользователи Ubuntu / Debian могут использовать apt-getyum Если вы используете другую Unix-подобную систему, перейдите по адресу www.gnu.org/s/gettext и получите копию gettext, совместимую с вашей платформой. Пользователи Windows могут загрузить последний исполняемый файл и установить его с gnuwin32.sourceforge.net/packages/gettext.htm .

После установки библиотеки вам нужно включить расширение PHP для gettext, отредактировав php.ini

  # для пользователей Windows
 расширение = php_gettext.dll
 # для * nix пользователей
 расширение = gettext.so 

Затем установите Poedit, который будет использоваться позже. Вы можете скачать копию с www.poedit.net .

Привет мир с gettext

В своем корневом веб-каталоге создайте каталог песочницы для игры с gettext с именем TestI18N В каталоге TestI18N

directory structure

В будущих проектах вы можете действительно назвать родительский каталог и каталог Localeen_USLC_MESSAGES en_US Первая часть представляет собой двухбуквенную строчную аббревиатуру для языка в соответствии со спецификацией ISO 639-1. Вторая часть после подчеркивания — это двухбуквенный заглавный код страны в соответствии со спецификацией ISO 3166-1 alpha-2. Таким образом, en_US

Затем убедитесь, что Poedit правильно работает на вашей платформе. Запустите программу и выберите в верхней строке меню FileNew Catalog В окне настроек заполните информацию ниже, пропустив пока что поле множественных форм:

poedit settings window

Нажмите OKmessages.poLC_MESSAGES

Теперь закройте Poedit и используйте ваш любимый текстовый редактор, чтобы открыть messages.po Вы можете редактировать его вручную, но чтобы избавить себя от хлопот, мы позволим Poedit создать для нас основные определения. Оставьте пустую строку после строк, которые уже есть в файле, и добавьте следующее:

  # Тестовый токен 1
 msgstr "HELLO_WORLD"
 msgstr "Привет, мир!"

 # Тестовый токен 2
 msgstr "TEST_TRANSLATION"
 msgstr "Тестирование перевода ..." 

Сохраните messages.po

В Poedit выберите « FileSave Причина, по которой мы сохраняем PO-файл в Poedit, заключается в том, что они должны быть скомпилированы в специальный формат, используемый gettext. После сохранения в Poedit вы увидите, что новый файл был создан в том же каталоге с тем же именем, но с расширением .mo Если вы хотите продолжить изменять и сохранять PO-файл с помощью обычного текстового редактора, вам необходимо скомпилировать его с помощью команды pocompile Дополнительный шаг компиляции не требуется, если вы используете Poedit, потому что он автоматически компилирует файл каждый раз, когда вы сохраняете его.

Вернувшись в каталог TestI18Ntest-locale.php

 <?php
// I18N support information here
$language = "en_US";
putenv("LANG=" . $language); 
setlocale(LC_ALL, $language);

// Set the text domain as "messages"
$domain = "messages";
bindtextdomain($domain, "Locale"); 
bind_textdomain_codeset($domain, 'UTF-8');

textdomain($domain);

echo _("HELLO_WORLD");

Откройте TestI18N/test-locale.php Если все установлено правильно и работает нормально, на странице отобразится Hello World .

Резюме

Когда дело доходит до локализации вашего PHP-приложения, у вас может быть много вариантов в вашем распоряжении. Мы решили использовать библиотеку GNU gettext и ее расширение PHP, мощный и простой подход, который локализует приложение «Правильный путь!». В этой статье вы увидели, что нужно для установки gettext и расширения PHP, кратко использовали Poedit и вызвали аппетит с помощью простого сценария Hello World. Часть 2 будет использовать это в качестве основы для получения дополнительной информации о gettext; Я объясню каждую функцию, представленную в скрипте Hello World, а также, как работает библиотека gettext.

Изображение через sgame / Shutterstock