Псевдолокализация в CakePHP / 2 - PullRequest
0 голосов
/ 24 августа 2018

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

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

... выделиться:

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

... чтобы я мог быстро находить упущения и обнаруживать потенциальные проблемы с макетом.

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

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

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

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

1 Ответ

0 голосов
/ 24 августа 2018

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

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 всегда будет использовать файл, когда он присутствует.

...