Перевод интерфейса в php

Локализация приложений Webasyst

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

Локализация приложений

Для отображения перевода строки слово на языке пользователя нужно в коде использовать следующие конструкции:

Если перевод строки слово не будет найден, система отобразит текст слово без перевода.

Файлы локализации gettext, содержащие переводы строк интерфейса на различные языки, необходимо размещать в файловой структуре приложения по следующему правилу: wa-apps/[app_id]/locale/[локаль]/LC_MESSAGES/[app_id].po . Например, файл с переводом строк на русский язык для приложения с идентификатором blog должен располагаться по адресу wa-apps/blog/locale/ru_RU/LC_MESSAGES/blog.po .

Файл с расширением имени .po — это текстовый файл специального формата, содержащий перевод строк для конкретной языковой локали. Для подключения перевода из .po-файла, его необходимо скомпилировать в файл с расширением .mo, например, с помощью программы poEdit.

Пример содержимого .po-файла с переводом строк на русский язык:

msgid "" msgstr "" "Project-Id-Version: Guestbook\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2011-04-27 10:30+0300\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "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));\n" "X-Poedit-Language: Russian\n" "X-Poedit-Country: Russian Federation\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPath-1: .\n" msgid "Name" msgstr "Имя" msgid "Message" msgstr "Сообщение" msgid "post" msgid_plural "posts" msgstr[0] "запись" msgstr[1] "записи" msgstr[2] "записей"

Пары «ключ—перевод»

Ключ и его перевод представлены в .po-файле двумя последовательными строками следующего вида:

  • msgid — это ключ строки локализации, который используется в коде приложения (PHP или Smarty)
  • msgstr — перевод строки

Рекомендуется использовать в качестве ключей локализации строки на английском языке. При таком подходе приложение сразу получает рабочий вариант интерфейса на английском языке. Если в приложении будет (частично или полностью) отсутствовать перевод, то вместо переведённых строк в интерфейсе приложения будут использоваться их ключи на английском языке.

Множественные формы строк локализации

Множественные формы перевода позволяют легко отображать в приложении слова в нужной форме, например: 21 запись, 22 записи, 25 записей.

Следующая строка в заголовках .po-файла указывает, что в русском языке есть три множественные формы (как в примере выше) и задаёт формулу, по которой определяется нужная форма слова для любого целого числа:

"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));\n"

Пример перевода множественной формы в .po-файле:

msgid "post" msgid_plural "posts" msgstr[0] "запись" msgstr[1] "записи" msgstr[2] "записей"

Для получения нужной формы слова в PHP-коде нужно использовать следующую конструкцию:

// вернёт значение запись, записи либо записей в зависимости от значения $n согласно формуле в .po-файле _w('post', 'posts', $n);

Аналогичная конструкция для шаблонов Smarty:

Обратите внимание на отличие этой конструкций от синтаксиса перевода обычных (немножественных) форм, используемых в Smarty. Для немножественных переводов рекомендуется использовать в шаблонах Smarty конструкцию вида [`строка`].

Функция _w() умеет также автоматически заменять в переводе подстроку %d на значение $n средствами PHP-функции sprintf , например:

_w('%d file', '%d files', 21); // 21 файл _w('%d file', '%d files', 22); // 22 файла _w('%d file', '%d files', 25); // 25 файлов 

Автоматическая сборка .po-файла

Фреймворк позволяет автоматически выполнять анализ всего кода приложения, собирать используемые в нём ключи локализации и дописывать отсутствующие ключи в .po-файл. Если сам .po-файл отсутствует, то он создается автоматически. Для запуска скрипта автоматической сборки .po-файла выполните следующую команду в терминале командной строки:

php.exe wa.php locale [app_id]
Пример

Автоматическая сборка .po-файлов плагинов, виджетов и тем дизайна выполняется аналогично:

php wa.php locale [app_id]/plugins/[plugin_id] php wa.php locale [app_id]/widgets/[widget_id] php wa.php locale [app_id]/themes/[theme_id]
Примеры
php wa.php locale someapp/plugins/myplugin php wa.php locale someapp/widgets/mywidget php wa.php locale someapp/themes/mytheme

Сборка файлов локализации в режиме отладки

Сборщик файлов локализации умеет добавлять в .po-файл комментарии с путями к тем файлам продукта, в которых были найдены ключи локализации.

Пример
#: /wa-apps/myapp/templates/actions/info.html:38 msgid "Company" msgstr ""

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

Чтобы добавить в .po-файл такие комментарии, запустите команду сборщика с параметром —debug .

Пример
php wa.php locale myapp --debug

После перевода строк в .po-файле снова запустите сборщик локализации — без ключа —debug . Вызов сборщика без дополнительного ключа удалит из .po-файла лишние комментарии и уменьшит размер файла, который должен быть включён в дистрибутив продукта.

Локализация плагинов приложений

Для локализации плагинов с помощью собственных файлов локализации в PHP-коде вместо функции _w() следует использовать функцию _wp() .

Файлы локализации плагинов приложений, так же как и для приложений, должны размещаться в locale/[локаль]/LC_MESSAGES/ (в поддиректории плагина) и именоваться по правилу [app_id]_[plugin_id].po и [app_id]_[plugin_id].mo . Например, .po-файл локализации для русского языка некоторого плагина с идентификатором some приложения shop должен находиться по адресу wa-apps/shop/plugins/some/locale/ru_RU/LC_MESSAGES/shop_some.po (.mo-файл должен находиться в этой же директории).

Локализация тем дизайна

Темы дизайна поддерживают 2 способа локализации текстовых строк:

Локализация темы дизайна в манифесте theme.xml

Такой способ локализации традиционно использовался в темах дизайна. Для локализации темы дизайна этим способом нужно добавить в корневой XML-элемент манифеста вложенный элемент по следующему примеру:

  String key Перевод строки  Another string key Перевод другой строки  

Ключи локализации в шаблонах темы дизайна нужно указывать в виде

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

Локализация темы дизайна с использованием gettext

Файлы локализации темы дизайна при использовании gettext размещаются в директориях вида wa-apps/[app_id]/themes/[theme_id]/locale/[locale_id]/LC_MESSAGES/[app_id]_[theme_id].po . Для быстрого создания файлов локализации удобно использовать команду автоматического сборщика.

При использовании этого способа ключи локализации в единственном числе нужно указывать в шаблонах точно так же:

А формы множественного числа в шаблоны дизайна нужно добавлять в формате

Локализация системных плагинов

В именах файлов локализации системных плагинов, размещаемых в директории wa-plugins/ , в качестве префикса имени следует использовать идентификаторы payment_ , shipping_ , sms_ — в зависимости от имени поддиректории, в которой размещается системный плагин. Пример .po-файла локализации для русского языка некоторого платежного плагина с идентификатором some : wa-plugins/payment/some/locale/ru_RU/LC_MESSAGES/payment_some.po

Чтобы подключить строки локализации системного плагина в его исходном коде, используйте публичный метод _w() базового класса waSystemPlugin , как показано ниже:

Разработка продукта, предназначенного для использования только на одном языке

Если ваш продукт (приложение или плагин) гарантированно предназначен для использования только на одном языке, использовать механизм локализации нет необходимости. В таком случае все строки локализации пишите в исходном коде продукта непосредственно на том языке, на котором им будут пользоваться. Конструкции _w() , _wp() и [«] в этом случае использовать не нужно.

Источник

PHP – как перевести веб-сайт на несколько языков?

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

$english = array('index', array('h1' => 'this is some h1 text', 'h2' => 'this is some h2 text')); $japanese = array('index', array('h1' => '世界交換への歓迎', 'h2' => 世界交換への')); print $english[index][h1]; print $japanese[index][h2]; 

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

Solutions Collecting From Web of «PHP – как перевести веб-сайт на несколько языков?»

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

Лично я только делал переводы с помощью системы Symfony. Они используют комбинацию расширения таблицы i18n в БД для контента и XLIFF-файлы для перевода интерфейса. Он был достаточно прозрачным после его установки, и использование фреймворка позволяет избежать необходимости писать всю эту поддержку вручную.

Я также знаю, что i18n поддерживается в Zend, CakePHP и Code Igniter.

  • Контентная база данных (или файл, я думаю)
  • Запись на страницу для каждого языка
  • Язык, на который ссылается идентификатор
  • Идентификатор, установленный в переменной $ _SESSION
  • Необязательно запоминается в cookie для последующих посещений

Я использовал эту систему с пользовательским CMS @ http://www.grandhall.eu . Это особенно интересно, когда вам нужно принимать во внимание такие вещи, как брошюры и другие загрузки.

Я бы предложил подключить ваш сайт к API Windows Live или API Google Translate. Я не знаю о Google, но API Windows Live кажется очень простым в использовании.

Это, или вы можете выписать весь контент на странице на двух языках, сохранить их как в разных таблицах в базе данных «контент», а затем изменить, какая таблица загружается, когда пользователь нажимает кнопку смены языка. Теперь большая часть вашей тяжелой работы будет заключаться в переписывании контента на обоих языках.

Вы можете просто использовать Google translate api:

Он содержит множество документации, и есть примеры того, как использовать его на игровой площадке Google.

Просто перейдите на ajax> translation

Источник

Читайте также:  Gtaexport cpp line 60
Оцените статью