Локализация через БД

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
blink
Сообщения: 26
Зарегистрирован: 2015.01.09, 00:28

Локализация через БД

Сообщение blink »

Добрый день.
Уже 2й день не могу найти нормального примера как локализировать приложение на yii2 через БД. Кто-то может рассказать?
На сайте шикарная документация по методам и свойствам, но нет примера того, как все это собрать вместе и заставить работать.
Спасибо.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Локализация через БД

Сообщение zelenin »

проблема в чем?
в коде пишете сообщения через Yii:t(..), в конфиге настраиваете компонент i18n с сохранением в бд, в бд соответственно переводите.
https://github.com/zelenin/yii2-i18n-module мое расширение с интерфейсом для перевода из админки
blink
Сообщения: 26
Зарегистрирован: 2015.01.09, 00:28

Re: Локализация через БД

Сообщение blink »

Создал 2 таблицы messages и source_messages. Вопрос в том, как настроить конфиг так, чтобы он работал с этими таблицами?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Локализация через БД

Сообщение zelenin »

blink писал(а):Создал 2 таблицы messages и source_messages. Вопрос в том, как настроить конфиг так, чтобы он работал с этими таблицами?
в доках гляньте
blink
Сообщения: 26
Зарегистрирован: 2015.01.09, 00:28

Re: Локализация через БД

Сообщение blink »

в доках гляньте
Посмотрел. Еще раз - там хорошее описание свойств и методов. Но не нашел, как настроить конфиг через DbMessageSource. Кто-то может поделиться ссылкой?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Локализация через БД

Сообщение zelenin »

blink писал(а):
в доках гляньте
Посмотрел. Еще раз - там хорошее описание свойств и методов. Но не нашел, как настроить конфиг через DbMessageSource. Кто-то может поделиться ссылкой?
так в чем проблема? про PhpMessageSource есть в доках, нужно поменять имя класса на DbMessageSource и проверить актуальность остальных атрибутов
https://github.com/yiisoft/yii2/blob/ma ... ce.php#L48
blink
Сообщения: 26
Зарегистрирован: 2015.01.09, 00:28

Re: Локализация через БД

Сообщение blink »

Короче, разобрался.

На всякий случай оставляю инструкцию:

0. Ссылка на оф док http://www.yiiframework.com/doc-2.0/yii ... urce.html#
Сайт со списком языковых кодов локалей в формате xx-XX http://www.i18nguy.com/unicode/language ... fiers.html. Возможно, не самый лучший, если есть лучше, пишите ниже.

1. Создать таблицы в БД:

Код: Выделить всё

CREATE TABLE source_message (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    category VARCHAR(32),
    message TEXT
);

CREATE TABLE message (
    id INTEGER,
    language VARCHAR(16),
    translation TEXT,
    PRIMARY KEY (id, language),
    CONSTRAINT fk_message_source_message FOREIGN KEY (id)
        REFERENCES source_message (id) ON DELETE CASCADE ON UPDATE RESTRICT
);
Нюансы: В таблице message поле id без индекса PRIMARY KEY.
Колонка message.language содержит язык перевода в виде 'xx-XX', типа 'ru-RU'. Как по мне можно было бы создать отдельную таблицу Language и этот тип поля сделать language_id со связью language.id.

Пример записи таблицы source_message:

Код: Выделить всё

...
5 | app | Yes
...
Пример записи таблицы message:

Код: Выделить всё

5 | ru-RU | Да
...
2. Настройки конфига ./common/config/main-local.php (при переносе на сервер возможно нужно будет перенастроить в другой файл. Какой - пока не знаю):

Код: Выделить всё

return [
    'components' => [
        'db' => [
            //...
        ],
        //...
        'i18n' => [
            'translations' => [
                'app*' => [
                    'class' => 'yii\i18n\DbMessageSource',
                    'db' => 'db',
                    'sourceLanguage' => 'en-EN', // Developer language
                    'sourceMessageTable' => 'source_message',
                    'messageTable' => 'message',
                    'cachingDuration' => 86400,
                    'enableCaching' => true,
                ],
            ],
        ],
    ],
];
Нюансы: в оф док-и стоти '*'. Переименуйте на 'app*'.

3. В нужном месте, например после редиректа от <select name="language">, пропишите

Код: Выделить всё

Yii::$app->language = $_POST['language']; // или же напрямую если надо Yii::$app->language = 'ru-RU';
4. Вывод перевода путем вызова фунции Yii::t('категория', 'сообещение из таблицы source_message');
Например,

Код: Выделить всё

Yii::t( 'app', 'Yes' );
blink
Сообщения: 26
Зарегистрирован: 2015.01.09, 00:28

Re: Локализация через БД

Сообщение blink »

Сейчас столкнулся с другой проблемой - переводит только первое сообщение...
blink
Сообщения: 26
Зарегистрирован: 2015.01.09, 00:28

Re: Локализация через БД

Сообщение blink »

Заработало... Загадочно как-то... Может нужно поставить параметр 'enableCaching' в false на этапе разработки... Чуть позже буду разбираться.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Локализация через БД

Сообщение zelenin »

blink писал(а):Может нужно поставить параметр 'enableCaching' в false на этапе разработки...
по-любому. Если хотите изменения видеть в реалтайм
Ответить