Локализация в CakePHP. Перевести статический текст на казахский язык.

Создать сайт на нескольких языках в СakePHP достаточно легко, используя заранее определенные в библиотеках локали для интернационализации. Список локалей довольно обширен и соответствует стандарту ISO  639-3 (таблица кодов языков), но при этом не содержит определения казахского языка. Как же быть, когда необходимо чтобы сайт поддерживал, к примеру - русский(ru) и казахский (kk) языки. Ведь это один из самых распространенных вариантов сайтов в сети Казнэта.

Реализовать это достаточно просто, пусть и не совсем правильно. После прочтения прошу пирожками не закидывать ...  :)

Итак, в пример возьмем двухязычный сайт - русский и казахский и соответсвенно локали для них ru и kk. Наша задача состоит в том, чтобы заставить заработать локаль kk.

Для начала необходимо расширить список локалей в библиотеке l10n.php. Хоть разработчики Кейка и старалися указать только самые используемые языки, казахский не попал в список. Откройте этот файл в папке <ваш_сайт>/cake/libs/l10n.php и в массиве $__l10nMap (строка 141) после корейского языка, чтобы не нарушать порядок, добавьте следующую строку

/*Kazakh*/ 'kaz' => 'kk',

Локаль определена в соответствии со стандартом ISO 639

Identifier: kaz
Name: Kazakh
Status: Active
Code sets: 639-2 and 639-3
Equivalent: 639-1: kk
Scope: Individual
Type: Living

Теперь необходимо указать расширенные настройки в массиве $__l10nCatalog, чуть ниже, после  опять же корейского языка(строка 278) вставте строку

'kk' => array('language' => 'Kazakh', 'locale' => 'kaz', 'localeFallback' => 'kaz', 'charset' => 'utf-8', 'direction' => 'ltr'),

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

1 шаг - Создайте файл с переводами

Для этого перейдите к каталог <ваш_сайт>/app/locale и создайте в нем следующую структуру "kaz/LC_MESSAGES/default.po". По-умолчанию там будет расположен каталог с переводом на русский язык, а теперь и для казахского. Теперь измените файл и внесите в него конфигурационную информацию и сами переводы, после чего сохраните.

"Project-Id-Version: CakePHP language demon\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2007-09-10 11:01+0200\n"
"Last-Translator: translyator \n"
"Language-Team: company_name \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 16bit\n"
msgid "Добро пожаловать"
msgstr "Қош келдіңіздер"

2 шаг - Установите локаль текущей

Это делается довольно просто, через конфигурацию приложения. В файл <ваш_сайт>/app/config/core.php добавьте в конец настройку

Configure::write('Config.language', 'kk');

3 шаг - Проверьте вывод перевода

В любом вашем контроллере или вьюхе выведите строку следующего содержания:

echo __('Добро пожаловать', true);

Мы получили наш казахский перевод ... Идентификатор у нас является русским языком, а в зависимости от локали, установленной в Config.language мы получаем перевод этого идентификатора. Таким образом русский язык идет по умолчанию, а все остальные достаточно просто добавить.

Подводные камни

1. включенный кэш - при включенном кэше переводы сохраняются в папке <ваш_сайт>/tmp/cache/persistent/core_default_kaz. При добавлении переводов, чтобы увидеть изменения, не забудьте его отчистить.

2. использование параметра true в функции __() позволяет не выводить перевод на экран. Так например функция <?php __('Добро пожаловать');?> перевод сразу выведет на экран без использование echo. Вызов же функции с параметром true позволит же просто вернуть перевод без вывода на экран <?php echo $this->Html->link(__('Добро пожаловать', true), '/');?>.

3. Configure::write('Config.language', 'kk');, если вы прописали установку локали на одно из действий контроллера, то знайте, что при получении следующего запроса, ваше приложение эту локаль не сохранит, а будет использовать дефолтную или ту что вы явно прописали в файле core.php. Чтобы этого избежать, необходимо в app_controller добавить функию beforeFilter

// --- текущий язык интерфейса LANGS --- //
if($this->Session->check('Config.language'))
Configure::write('Config.language', $this->Session->read('Config.language'));
else {
Configure::write('Config.language', 'ru');
$this->Session->write('Config.language', 'ru');
}

и записывать локаль тогда на действие не как Configure::write(‘Config.language’, ‘kk’);; а в сессию, таким образом

$this->Session->write('Config.language', 'kk');
Поделиться @
Parov H., 21 декабря 2016 в 09:49
Если Вы заинтересованы в инструментов для локализации приложений, я рекомендую Вам использовать этот инструмент на базе web: https://poeditor.com/