Идеальным способом было бы иметь возможность определить собственный класс:
class CustomI18n extends I18n {
public static function translate($singular, $plural = null, $domain = null, $category = 6, $count = null, $language = null) {
}
}
… и дать CakePHP команду использовать мой пользовательский класс, а не исходный.Это согласуется, например, с тем, как работают помощники вида.
К сожалению, я не думаю, что это невозможно сделать, потому что $this->Html
внутри представления является динамическим свойством, но __()
содержит жесткиезакодированное имя класса: I18n::translate($singular)
.
¹ Да, почти все, что можно сделать .Вы понимаете, что я имею в виду:)
Поскольку это всего лишь вспомогательный инструмент, не предназначенный для Production, вы всегда можете прибегнуть к быстрому и грязному хаку, не относящемуся к CakePHP:
Перепишите в файл по вашему выбору функции из lib\Cake\basics.php
, которые вас интересуют, обычно те, которые начинаются с подчеркивания: __()
, _n()
, ...
function __($singular, $args = null) {
if (!$singular) {
return;
}
$singular = pseudotranslation($singular); // <---------------------
App::uses('I18n', 'I18n');
$translated = I18n::translate($singular);
if ($args === null) {
return $translated;
} elseif (!is_array($args)) {
$args = array_slice(func_get_args(), 1);
}
return vsprintf($translated, $args);
}
Убедитесь, что вы не нарушаете vsprintf
коды.
Используйте auto_prepend_file для загрузки файла перед началом запуска CakePHP.В идеале, установите его в своем блоке разработки.
Преимущество в том, что он ненавязчив.Вы можете включить или отключить auto_prepend_file
довольно легко или позаботиться об этом в своем предварительно подготовленном скрипте.
В качестве альтернативы, CakePHP позволяет переопределять большинства классов, чтобы вы могли скопировать /lib/Cake/I18n/I18n.php
как /app/Lib/I18n/I18n.php
и настроить I18n::translate()
по своему вкусу.Однако я нахожу это менее удобным: вам все равно придется сохранять пользовательскую копию системного файла, если вы обновляете CakePHP, и нет простого механизма для отключения псевдолокализации во время выполнения, поскольку CakePHP всегда будет использовать файл, когда он присутствует.