Цитата:
PHP оставляет за собой право все методы, начинающиеся с __, считать "магическими". Не рекомендуется использовать имена методов с __ в PHP, если вы не желаете использовать соответствующий "магический" функционал.
не кошерное у функции название кстати ))
По статье:также не совсем понятно зачем переопределять класс I18n, если __() не его метод, а отдельная функция, можно файл с функцией например можно вставить и в bootstrap. Это скорее общее замечание т.к. многие неопытные программисты всегда тупо следуют мануалам не пытаясь понять зачем так сделано.
Еще забыли осветить задание языка в bootstrap
Цитата:
I18n::lang('ru');
Разбитие языковых файлов на части:1 способ: Если Вы строите систему из модулей, то просто пропишите нужные переводы в I18n папке модулей , тогда данные языковые настройки будут доступны при подключении в bootstrap.
2 способ: Вызываем функцию как:
Код:
__('Hello, world!', array(), 'ru_home');
или
__('Hello, :user', array(':user' => 'WinterSilence'), 'ru_catalog' );
где ru_home и ru_catalog имена языковый файлов т.е. application/i18/ru_home.php и ru_catalog.php
при использовании тире в имени
Код:
__('Hello, world!', array(), 'ru-test-home');
файл будет находится в поддиректории application/i18/ru/test/home.php
Вот мой код переопределенного класса, основная фишка в упрощении перевода скрипта за счет авто генерации языковых файлов
Код:
<?php defined('SYSPATH') or die('No direct script access.');
class I18n extends Kohana_I18n
{
public static function get( $string, $lang = NULL )
{
if( !$lang )
{
$lang = I18n::$lang;
}
$table = I18n::load($lang);
if( isset($table[$string]) )
{
$string = $table[$string];
}
/*
Если скрипт на этапе разработки, то все не переведенные строки будут добавляться в отдельный языковой файл,
например в моем случае application/i18n/ru_need_translated.php.
Это значительно облегчит дальнейшую локализацию скрипта.
*/
elseif( Kohana::$environment == Kohana::DEVELOPMENT )
{
$file = $lang.'_need_translated';
$path = APPPATH .'i18n' . DIRECTORY_SEPARATOR . $file . EXT;
$table = Kohana::load($path);
$table[$string] = ' ';
$text = '<?php defined(\'SYSPATH\') or die(\'No direct script access.\'); return ' . var_export($table, TRUE) . ';';
@file_put_contents($path, $text);
}
return $string;
}
}
function __( $string, array $values = NULL, $lang = NULL, $translate_values = FALSE )
{
if( $lang !== I18n::$lang )
{
$string = I18n::get($string);
// Если задан атрибут $translate_values, то переводим и значения подставляемого массива
if( !empty($values) && $translate_values )
{
foreach( $values as $key => $val )
{
$values[$key] = I18n::get($val);
}
}
}
return empty($values) ? $string : strtr($string, $values);
}
также позднее попалось аналогичное решение от butschster
https://github.com/butschster/kohana-i18n-generator-translations/blob/master/classes/i18n.php