
Однажды я уже разбирался в работе i18n для Kohana 3.0. Но прошло время и мне оно снова понадобилось . А поскольку всё забылось то я решил не повторять прежних ошибок, а закрепить в шпаргалочке.
Кстати, я непростительно долго завис на версии 3.0. И это в то время как всё прогрессивное человечество уже штурмует Kohana 3.2. Надеюсь, моё время уже не за горами.
Зачем может понадобиться i18n
=====================================
Вариант 1.
————-
Это собственно и есть локализация. Допустим вам нужно сделать мультиязычный сайт. Берёте i18n и делаете
Вариант 2.
————-
Это когда над текстами ещё будет работать кто-то другой.
Например, вы делаете англоязычный сайт, а кто-то другой потом будет исправлять ваш корявый английский.
Или даже если сайт на вашем родном языке, согласитесь, тексты это имидж, а этим должен заниматься специальный человек. Ну уж точно не программист.
Оба эти варианта объединяет то, что все текстовые вставки вынесены в отдельный файл. Это сделано для облегчения последущей работы непрограммистов над текстом.
Базовые понятия
===================
Библиотека имеет в своём составе два файла:
- /system/classes/i18n.php – Тут описан класс i18n, который собственно всё и делает.
- /system/base.php – Тут описана функция __(), которая и должна собственно использоваться и которая использует вышеописанный класс.
При работе с сайтом достаточно работать с функцией “двойного подчёркивания”
1 | __($string, $values, $lang_source). |
Тут параметр $string это собственно фраза, которую нужно перевести, $value – значения, которые можно подставить в фразу(не делал, но в доках это есть). Параметр $lang_source – язык, с которого нужно перевести фразу
Пример:
1 | __("Привет мир"). |
Что означает желание программиста увидеть тут перевод этой фразы
1 | __('Welcome back, :user', array(':user' => $username)); |
А это, кстати, пример использования параметра $value.
Кстати, надо иметь в виду, что задумывался этот класс для создания переводов с одного языка на другой. Поэтому в любом контексте актуальны ДВА языка – язык источника и язык назначения. То есть язык, с которого переводим, и язык на который переводим.
Для этого у класса есть соответствующие свойства
class Kohana_I18n {
1 2 3 4 5 6 7 8 9 | /** * @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. Везде в тексте программы вместо прямого текста следует поставить нечто подобное
1 | echo __("Ваш прямой текст") |
или если хотите явно указать язык источник текста:
1 | echo __("Ваш прямой текст",null,"ru-RU") |
4. И наконец, создать языковые файлы для языков, на которые вы будете переводить этот оригинал
Вот например файл /application/i18n/en.php
1 2 3 | return array( 'Привет мир.' => 'Hello world.', ); |
Всё. Всё должно работать.
Не работает?
===================
Вы поставили echo __("Ваш прямой текст"), а перевод не показывается?
Расскажу ещё об одной особенности работы функции __(), а точнее о двух:
1. Если в соответствующем языковом файле не удаётся найти нужной фразы, то показывается исходный текст, то есть то что параметрах вызова.
2. Если по какой-то дьявольской причине у вас язык источника совпадает с языком перевода – то перевод не выполнится, независимо от наличия языкового файла.
Теперь точно всё.
Ссылка
===================
- Классный источник по вопросу на блоге Mixu. Текст этого поста фактически является вольным переводом этого источника.
- В том же блоге замечательные рекомендации как автоматизировать процесс сбора языковых файлов.
Посты по теме:
RSS-подписка