User Tools

Site Tools


ru:plugins:i18n

This is an old revision of the document!


Интернационализация (I18N) и плагины

Самый простой способ вывода текстовых сообщений в плагине – жестко прописать их в коде, например, вот так:

<input type="submit" name="save" value="Save Settings"/>

Этот метод, безусловно, работает. Но ведь при создании плагина вы предполагаете, что он может использоваться по всему миру, поэтому следует подумать об его интернационализации (I18N), чтобы интерфейс административной панели и интерфейс плагина был доступен и на родном языке очередного пользователя.

В целях интернационализации плагина можно использовать уже существующие файлы переводов GetSimple. Их можно найти в папке /Путь_к_GetSimple/admin/lang или загрузить из секции Extend. В нашем примере мы бы использовали ключ BTN_SAVESETTINGS:

<input type="submit" name="save" value="<?php i18n("BTN_SAVESETTINGS"); ?>"/>

Если ваш плагин поддерживает и GetSimple 2.03, используйте следующий код:

<?php global $i18n; ?>
<input type="submit" name="save" value="<?php $i18n["BTN_SAVESETTINGS"]; ?>"/>

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

Если вы хотите добавить в файл перевода собственные ключи, отсутствующие в файлах GetSimple, добавьте их в свой языковой файл с переводом самостоятельно, например, для русского языка (ru_RU.php) это будет выглядеть так:

$i18n = array(
  'BTN_SAVEMYSETTINGS' => 'Моя кнопка для сохранения изменений',
  'MYHEADER' => 'Мой заголовок'
);

Все языковые файлы размещаются в директории мой_плагин/lang/, структура файлов плагина должна выглядеть следующим образом:

- мой_плагин.php
- мой_плагин (директория)
   - .htaccess (с одной строкой: Deny from all)
   - lang (directory) 
      - .htaccess (с одной строкой: Deny from all)
      - en_US.php
      - de_DE.php (если есть такой файл)
      - ru_RU.php

Начиная с версии GetSimple 3.0 строки перевода из языкового файла легко подгружаются с помощью следующего кода:

i18n_merge('мой_плагин') || i18n_merge('мой_плагин ','en_US');

Система пытается получить перевод для текущего языка системы, установленного в административной панели в GetSimple. Если попытка не удается, то загружаются строки из английского языкового файла вашего плагина. Разумеется, такой файл для английского языка по умолчанию под именем en_US.php должен находиться в папке Мой_плагин/lang/en_US.php вашего плагина.

Доступ к языковому файлу вашего плагина очень похож на стандартный код GetSimple для такого случая, вы только должны добавить наименование плагина как префикс к ключу:

<input type="submit" name="save" value="<?php i18n("мой_плагин/BTN_SAVEMYSETTINGS"); ?>"/>

Обратите внимание, что функция i18n() выводит результат перевода на экран. Если вам необходимо использовать переведенный текст в PHP-коде, используйте функцию i18n_r(), которая возвращает переведенную строку, например:

$msg = '<div style="display: block;" class="updated">' . i18n_r("мой_плагин/MSG_UPDATED") . '.</div>';
echo $msg;

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

Языковые файлы без кода страны

Если вы в плагине применяете языковые файлы без кода страны, т.е. en.php, de.php, и.т.д., используйте для подгрузки перевода следующий код:

global $LANG;
i18n_merge('мой_плагин', substr($LANG,0,2)) || i18n_merge('мой_плагин','en');

Front-end

If your plugin has to display texts on the front-end (the internet site itself) and you just support typical GetSimple installations, where the content is displayed in one language and the admin back-end is set to this language, you do it the same way as described above.

The only difference is that you must provide language support, because where it might be acceptable for administrators and editors to see some information in english instead of their own language, it is unacceptable on the front-end. Without language support you basically limit your plugin to use in countries with the same language as your's.

GetSimple 3.0:

In the frontend the variable $LANG is always en_US (due to the multi-user capabilities introduced with 3.0). The user should be encouraged to enter a line

$LANG = 'de_DE';

or similar into gsconfig.php. As an alternative the plugin can offer a functionality to set the frontend language.

Multi-language Front-end

Some internet sites implemented with GetSimple support multiple languages. The language is determined from the user's preferences (his operating system language resp. the browser language) and he might be allowed to switch between the supported languages.

As multi-language sites are not supported natively by GetSimple, there currently exists one plugin, I18N.

If your plugin should support multi-language sites using the I18N plugin, you must load the texts only after the I18N initialization (in the pretemplate hook) - in your function(s) that output text on the front end, with

global $LANG;
if (function_exists('i18n_load_texts')) {
  i18n_load_texts('my_plugin');
} else {  
  i18n_merge('my_plugin', substr($LANG,0,2)) || i18n_merge('my_plugin', 'en');
}

If you need back end template texts directly when loading the plugin, you need to check, if the plugin is loaded in the backend:

if (basename($_SERVER['PHP_SELF']) != 'index.php') { // back end only - or do you know a better condition?
  i18n_merge('my_plugin', substr($LANG,0,2)) || i18n_merge('my_plugin', 'en');
}
add_action('plugins-sidebar', 'createSideMenu', array($thisfile, i18n_r('my_plugin/CONFIGURE'))); 

This code will work (with GetSimple 3.0+), whether the I18N plugin is present or not.

Note: the function i18n_load_texts is available in the I18N plugin 1.0+.

Note: The I18N plugin currently only supports language codes without country, so you must have language files like en.php, de.php etc. instead of en_US.php, etc.

ru/plugins/i18n.1381317444.txt.gz · Last modified: 2013/10/09 11:17 by Arkady