Yii::t как решить проблему с редактируемыми текстами в view проектов?

Есть задача, чтобы определённые тексты на страницах проекта (нескольких проектов) могли редактироваться.
Пример: заголовок виджета "С этим товаром так же покупают".

Изначально подобные фразы оборачивались в Yii::t для интернационализации и никто не парился. Однако, возникло несколько проблем:
1. Русские тексты (sourceLanguage='ru') фраз должны быть изменяемыми
2. Одинаковые фразы типа "Купить", на разных страницах должны быть разными записями для разных страниц. В принципе решаемо через разные словари.
3. При большом количестве переводимых фраз, не делать по 1 запросу за каждым словом на неродном языке. Если разбивать тексты по словарям в зависимости от rout'а страницы, вроде норм, но как заставить yii::t делать предзапрос всего словаря?

Главной проблемой является 1 пункт. Самое тупое решение пришедшее в голову, сделать sourceLanguage - мандаринский диалект (or any) и запретить переключение языка на него для пользователей, а языком по умолчанию сделать русский. В итоге русские фразы будут редактируемыми... Есть идеи?
  • Вопрос задан
  • 2577 просмотров
Решения вопроса 1
karneds
@karneds
Первая проблема решается установкой forceTranslation true в конфиге

'components' => array(
        'messages' => array(
            'forceTranslation' => true,
        ),
...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
дело конечно ваше, но делая приложение с интернационализацией, я бы следовал стандарту и рекомендациям разработчиков, и делал бы на основе английского языка.
У меня весь словарь получается одним запросом и кэшируется в переменную. В смысле, это поведение по умолчанию для yii2.
Ответ написан
@kfuntov
Переопределением CMessageSource::loadMessages можно сделать всё что угодно.
Например в одном проекте не использовались категории, но в зависимости от текущего параметра в Request надо было по-разному переводить одни и те же слова (в рамках одного и того же языка) (вроде как у Вас похожая проблема). Так вот там был примерно такой код:
<?php
class MessageSource extends CMessageSource
{
    protected function loadMessages($category, $language)
    {
        $config = require(Yii::getPathOfAlias('application.messages') . '/' . $language . '/default.php');

        $childConfig = Yii::getPathOfAlias('application.messages') . '/' . $language . '/children/' . Yii::app()->request->getChildrenTranslateId() . '.php';
        if (file_exists($childConfig)) {
            $vocab = require($childConfig);
            if (is_array($vocab)) {
                $config = array_merge($config, $vocab);
            }
        }

        return $config;
    }
}


Таким образом порядок перевода в функции t был такой - сначала ищем в дочернем словеаре, если нет там - ищем в дефолтном для языка.
Если нужно использовать категории - можно соответствующим образом изменить метод loadMessages.
Основная идея этого метода в любом случае будет в том, что array_merge перезаписывает значения, если ключи одинаковые. Таким образом можно сделать как бы наследование файлов с сообщениями.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы