Создать сайт на нескольких языках в С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'),
Сохраняем файл и теперь у вас есть локаль казахского языка, которую вы можете использовать. Теперь проверим, так ли это на самом деле и заговорит ли ваш сайт на казахском языке. Для этого выполните три шага:
Для этого перейдите к каталог <ваш_сайт>/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 "Қош келдіңіздер"
Это делается довольно просто, через конфигурацию приложения. В файл <ваш_сайт>/app/config/core.php добавьте в конец настройку
Configure::write('Config.language', 'kk');
В любом вашем контроллере или вьюхе выведите строку следующего содержания:
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');