Псевдолокализация в CakePHP / 2

Álvaro González спросил: 31 июля 2018 в 09:42 в: cakephp

Я адаптирую существующее приложение для поддержки нескольких языков, и я хотел бы реализовать псевдолокализацию, то есть сделать локализованные строки:

<?php echo h(__('Edit program settings')); ?>

... выделяются:

[!!! εÐiţ Þr0ģЯãm səTτıИğ§ !!!]

... поэтому я могу быстро заметить пропуски и обнаружить потенциальные проблемы с макетом.

Если я ошибаюсь, функция не встроена, и нет третьего плагины. Каковы мои шансы?

Я чувствую, что разумным путем будет расширение I18n и перезапись I18n::translate(). Однако я не особенно знаком с внутренними компонентами CakePHP, и я не уверен, как сделать __(), а семейство использовать мой расширенный класс.

С другой стороны, функции в lib\Cake\basics.php завернуты в вызовы function_exists(), поэтому, я думаю, я мог бы написать свои собственные версии ...

Я бы приветствовал любое предложение.

1 ответ

Есть решение
Álvaro González ответил: 04 августа 2018 в 05:04

Идеальным методом было бы иметь возможность определять собственный класс:

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:

  1. Переписать в файл по вашему выбору функции из 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 коды.

  2. Используйте auto_prepend_file, чтобы загрузить файл перед началом запуска CakePHP. В идеале, установите его в своем блоке разработки.

Преимущество этого способа заключается в том, что он ненавязчив. Вы можете легко включить или отключить auto_prepend_file или позаботиться об этом в своем предварительно подготовленном скрипте.


Кроме того, CakePHP позволяет переопределить большинство классов, чтобы вы могли скопировать /lib/Cake/I18n/I18n.php как /app/Lib/I18n/I18n.php и настройте I18n::translate() по своему вкусу. Однако я нахожу это менее удобным: вам все равно придется сохранять пользовательскую копию системного файла, если вы обновляете CakePHP, и не существует простого механизма для отключения псевдолокализации во время выполнения, поскольку CakePHP всегда будет использовать файл, когда он присутствует.