Локализация через БД
Локализация через БД
Добрый день.
Уже 2й день не могу найти нормального примера как локализировать приложение на yii2 через БД. Кто-то может рассказать?
На сайте шикарная документация по методам и свойствам, но нет примера того, как все это собрать вместе и заставить работать.
Спасибо.
Уже 2й день не могу найти нормального примера как локализировать приложение на yii2 через БД. Кто-то может рассказать?
На сайте шикарная документация по методам и свойствам, но нет примера того, как все это собрать вместе и заставить работать.
Спасибо.
Re: Локализация через БД
проблема в чем?
в коде пишете сообщения через Yii:t(..), в конфиге настраиваете компонент i18n с сохранением в бд, в бд соответственно переводите.
https://github.com/zelenin/yii2-i18n-module мое расширение с интерфейсом для перевода из админки
в коде пишете сообщения через Yii:t(..), в конфиге настраиваете компонент i18n с сохранением в бд, в бд соответственно переводите.
https://github.com/zelenin/yii2-i18n-module мое расширение с интерфейсом для перевода из админки
Re: Локализация через БД
Создал 2 таблицы messages и source_messages. Вопрос в том, как настроить конфиг так, чтобы он работал с этими таблицами?
Re: Локализация через БД
в доках гляньтеblink писал(а):Создал 2 таблицы messages и source_messages. Вопрос в том, как настроить конфиг так, чтобы он работал с этими таблицами?
Re: Локализация через БД
Посмотрел. Еще раз - там хорошее описание свойств и методов. Но не нашел, как настроить конфиг через DbMessageSource. Кто-то может поделиться ссылкой?в доках гляньте
Re: Локализация через БД
так в чем проблема? про PhpMessageSource есть в доках, нужно поменять имя класса на DbMessageSource и проверить актуальность остальных атрибутовblink писал(а):Посмотрел. Еще раз - там хорошее описание свойств и методов. Но не нашел, как настроить конфиг через DbMessageSource. Кто-то может поделиться ссылкой?в доках гляньте
https://github.com/yiisoft/yii2/blob/ma ... ce.php#L48
Re: Локализация через БД
Короче, разобрался.
На всякий случай оставляю инструкцию:
0. Ссылка на оф док http://www.yiiframework.com/doc-2.0/yii ... urce.html#
Сайт со списком языковых кодов локалей в формате xx-XX http://www.i18nguy.com/unicode/language ... fiers.html. Возможно, не самый лучший, если есть лучше, пишите ниже.
1. Создать таблицы в БД:
Нюансы: В таблице message поле id без индекса PRIMARY KEY.
Колонка message.language содержит язык перевода в виде 'xx-XX', типа 'ru-RU'. Как по мне можно было бы создать отдельную таблицу Language и этот тип поля сделать language_id со связью language.id.
Пример записи таблицы source_message:
Пример записи таблицы message:
2. Настройки конфига ./common/config/main-local.php (при переносе на сервер возможно нужно будет перенастроить в другой файл. Какой - пока не знаю):
Нюансы: в оф док-и стоти '*'. Переименуйте на 'app*'.
3. В нужном месте, например после редиректа от <select name="language">, пропишите
4. Вывод перевода путем вызова фунции Yii::t('категория', 'сообещение из таблицы source_message');
Например,
На всякий случай оставляю инструкцию:
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.language содержит язык перевода в виде 'xx-XX', типа 'ru-RU'. Как по мне можно было бы создать отдельную таблицу Language и этот тип поля сделать language_id со связью language.id.
Пример записи таблицы source_message:
Код: Выделить всё
...
5 | app | Yes
...
Код: Выделить всё
5 | ru-RU | Да
...
Код: Выделить всё
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,
],
],
],
],
];
3. В нужном месте, например после редиректа от <select name="language">, пропишите
Код: Выделить всё
Yii::$app->language = $_POST['language']; // или же напрямую если надо Yii::$app->language = 'ru-RU';
Например,
Код: Выделить всё
Yii::t( 'app', 'Yes' );
Re: Локализация через БД
Сейчас столкнулся с другой проблемой - переводит только первое сообщение...
Re: Локализация через БД
Заработало... Загадочно как-то... Может нужно поставить параметр 'enableCaching' в false на этапе разработки... Чуть позже буду разбираться.
Re: Локализация через БД
по-любому. Если хотите изменения видеть в реалтаймblink писал(а):Может нужно поставить параметр 'enableCaching' в false на этапе разработки...