Добавление поддержки i18n в PHP с помощью gettext?

Я всегда слышал о gettext - я знаю, что это своего рода команда unix для поиска перевода на основе предоставленного строкового аргумента, а затем создает файл .pot, но может ли кто-нибудь объяснить мне с точки зрения непрофессионала, как это делается в веб-фреймворк?

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


person meder omuraliev    schedule 28.07.2009    source источник


Ответы (1)


Система gettext воспроизводит строки из набора двоичных файлов, созданных из исходных текстовых файлов, содержащих переводы одного и того же предложения на разные языки.

Ключ поиска — это предложение на «базовом» языке.

в вашем исходном коде у вас будет что-то вроде

echo _("Hello, world!");

для каждого языка у вас будет соответствующий текстовый файл с ключом и переведенной версией (обратите внимание на %s, который можно использовать с функциями printf)

french
msgid "Hello, world!"
msgstr "Salut, monde!"
msgid "My name is %s"
msgstr "Mon nom est %s"

italian
msgid "Hello, world!"
msgstr "Ciao, mondo!"
msgid "My name is %s"
msgstr "Il mio nome è %s"

Это основные шаги, которые необходимо выполнить для создания локализации.

  • весь ваш текстовый вывод должен использовать функции gettext (gettext(), ngettext(), _())
  • используйте xgettext (*nix) для анализа ваших файлов php и создания базового текстового файла .po
  • используйте poedit, чтобы добавить тексты перевода в файлы .po
  • используйте msgfmt (*nix) для создания двоичного файла .mo из файла .po
  • поместите файлы .mo в структуру каталогов, например

locale/de_DE/LC_MESSAGES/myPHPApp.mo

locale/en_EN/LC_MESSAGES/myPHPApp.mo

локаль/it_IT/LC_MESSAGES/myPHPApp.mo

тогда ваш php-скрипт должен установить локаль, которую необходимо использовать

Пример из руководства по php очень ясен для этой части

<?php
// Set language to German
setlocale(LC_ALL, 'de_DE');

// Specify location of translation tables
bindtextdomain("myPHPApp", "./locale");

// Choose domain
textdomain("myPHPApp");

// Translation is looking for in ./locale/de_DE/LC_MESSAGES/myPHPApp.mo now

// Print a test message
echo gettext("Welcome to My PHP Application");

// Or use the alias _() for gettext()
echo _("Have a nice day");
?>

Всегда из руководства по php смотрите здесь хороший учебник

person yann.kmm    schedule 28.07.2009
comment
Но приведенный выше пример руководства по PHP, похоже, не переводит данную строку. Есть ли что-то еще, что можно сделать с примером? - person Amandeep kaur; 08.09.2017