Kohana 3.0. Библиотека локализации i18n

Pozor_na_hlavu
Однажды я уже разбирался в работе i18n для Kohana 3.0. Но прошло время и мне оно снова понадобилось . А поскольку всё забылось то я решил не повторять прежних ошибок, а закрепить в шпаргалочке.

Кстати, я непростительно долго завис на версии 3.0. И это в то время как всё прогрессивное человечество уже штурмует Kohana 3.2. Надеюсь, моё время уже не за горами.

Зачем может понадобиться i18n
=====================================
Вариант 1.
————-
Это собственно и есть локализация. Допустим вам нужно сделать мультиязычный сайт. Берёте i18n и делаете :)

Вариант 2.
————-
Это когда над текстами ещё будет работать кто-то другой.
Например, вы делаете англоязычный сайт, а кто-то другой потом будет исправлять ваш корявый английский.
Или даже если сайт на вашем родном языке, согласитесь, тексты это имидж, а этим должен заниматься специальный человек. Ну уж точно не программист.

Оба эти варианта объединяет то, что все текстовые вставки вынесены в отдельный файл. Это сделано для облегчения последущей работы непрограммистов над текстом.

Базовые понятия
===================
Библиотека имеет в своём составе два файла:

  • /system/classes/i18n.php – Тут описан класс i18n, который собственно всё и делает.
  • /system/base.php – Тут описана функция __(), которая и должна собственно использоваться и которая использует вышеописанный класс.

При работе с сайтом достаточно работать с функцией «двойного подчёркивания»

__($string, $values, $lang_source).

Тут параметр $string это собственно фраза, которую нужно перевести, $value — значения, которые можно подставить в фразу(не делал, но в доках это есть). Параметр $lang_source — язык, с которого нужно перевести фразу

Пример:

__("Привет мир").

Что означает желание программиста увидеть тут перевод этой фразы

 __('Welcome back, :user', array(':user' => $username));

А это, кстати, пример использования параметра $value.

Кстати, надо иметь в виду, что задумывался этот класс для создания переводов с одного языка на другой. Поэтому в любом контексте актуальны ДВА языка — язык источника и язык назначения. То есть язык, с которого переводим, и язык на который переводим.

Для этого у класса есть соответствующие свойства
class Kohana_I18n {

	/**
	 * @var  string   target language: en-us, es-es, zh-cn, etc
	 */
	public static $lang = 'en-us';

	/**
	 * @var  string  source language: en-us, es-es, zh-cn, etc
	 */
	public static $source = 'en-us';

По-умолчанию оба языка английские. Чтобы их изменить можно создать класс наследник с нужными свойствами.
Язык назначения можно менять из кода с помощью функции I18n::lang($lang = NULL).

Как делать
===================
1. Перво-наперво надо определиться, какой у нас язык источника и на какой язык, или какие языки, будут выполняться переводы.
Например вы имеете англоязычный сайт и переводите его на пачку других языков.

2. После того как это решено нужно озаботиться чтобы в нужных ситуациях I18n::lang и I18n::source были именно такими как надо.

Source стоит как-то жёстко указать в коде, а lang можно помнить, например в cookie, и потом при каждом вызове устанавливать, например в bootstrap.php

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

echo __("Ваш прямой текст")

или если хотите явно указать язык источник текста:

echo __("Ваш прямой текст",null,"ru-RU")

4. И наконец, создать языковые файлы для языков, на которые вы будете переводить этот оригинал
Вот например файл /application/i18n/en.php

return array(
    'Привет мир.' => 'Hello world.',
);

Всё. Всё должно работать.

Не работает?
===================

Вы поставили echo __("Ваш прямой текст"), а перевод не показывается?

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

Теперь точно всё. :)

Ссылка
===================