i18n с DbMessageSource.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
mrbighokage
Сообщения: 28
Зарегистрирован: 2014.02.21, 10:33
Откуда: ua

i18n с DbMessageSource.

Сообщение mrbighokage »

Здраствуйте. Ненашол неодной записи о том ка правильно юзать переводы с DbMessageSource. Верней как использовать понятно а вот как добавлять это вопрос?
Еще я хочу сделать в админке возможность редактировать добавлять новые переводы/языки.
1) Например гдето в коде пишем.

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

echo \Yii::t('app', 'test message'); 
2) Заходим в админку и видим что нам добавилась новая фраза  'test message' которую нужно перевести на русский.
3) Переводим.
4) Далее заходим на страничку с текстом и видим:

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

тестовое сообщение
Как мне ипользовать i18n и DbMessageSource чтобы реализовать это?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: i18n с DbMessageSource.

Сообщение samdark »

2) Сейчас новые строки добавляет команда yii message. Она и с базой работать умеет. Можно запустить из веб или продублировать логику.
3) Обычный CRUD.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: i18n с DbMessageSource.

Сообщение zelenin »

а что быстрее будет работать: грузить переводы с файловой системы или делать например 10-15 запросов в базу (а то и больше)? Или запросы каким-то образом оптимизированы и все извлекается одним запросом?
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: i18n с DbMessageSource.

Сообщение maleks »

zelenin писал(а): Или запросы каким-то образом оптимизированы и все извлекается одним запросом?
Вряд ли оно как то оптимизировано на уровне фреймворка.
Если в Базе хранятся сообщения то подразумевается что их там много.
Насчет сообщений вряд ли для каждой страницы рационально делать запрос на такой объем данных.
Проблема не нова.
В друпале переводы хранятся в БД и там делается по отдельному запросу.

Как вариант - кэшировать запрошенные переводы на уровне страницы , но это уже придется дописывать самому.
Аватара пользователя
mrbighokage
Сообщения: 28
Зарегистрирован: 2014.02.21, 10:33
Откуда: ua

Re: i18n с DbMessageSource.

Сообщение mrbighokage »

Sam Dark писал(а):2) Сейчас новые строки добавляет команда yii message.
Непонял. А точнее:

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

Yii:$app->message
нет такого
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: i18n с DbMessageSource.

Сообщение zelenin »

mrbighokage писал(а):
Sam Dark писал(а):2) Сейчас новые строки добавляет команда yii message.
Непонял. А точнее:

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

Yii:$app->message
нет такого
yii message - консольная команда
Аватара пользователя
mrbighokage
Сообщения: 28
Зарегистрирован: 2014.02.21, 10:33
Откуда: ua

Re: i18n с DbMessageSource.

Сообщение mrbighokage »

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

$ php yii message 
Error: Missing required arguments: configFile
main.php components

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

'i18n' => [
            'translations' => [
                'app' => [
                    'class' => 'yii\i18n\DbMessageSource',
                    'sourceLanguage' => 'en_US',
                ],
            ]
        ]
Что не так?
Последний раз редактировалось mrbighokage 2014.06.05, 12:43, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: i18n с DbMessageSource.

Сообщение zelenin »

mrbighokage писал(а):

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

$ php yii message 
Error: Missing required arguments: configFile

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

'i18n' => [
            'translations' => [
                'app' => [
                    'class' => 'yii\i18n\DbMessageSource',
                    'sourceLanguage' => 'en_US',
                ],
            ]
        ]
методом тыка? документацию уже почитайте.
Аватара пользователя
mrbighokage
Сообщения: 28
Зарегистрирован: 2014.02.21, 10:33
Откуда: ua

Re: i18n с DbMessageSource.

Сообщение mrbighokage »

Я ж не против. Ссылку дайте. Ну ненашол я документацию о том кау юзать переводы с БД.

http://stuff.cebe.cc/yii2docs/yii-i18n- ... ource.html
Невижу тут ничего такого!

Меня интересует:
1) как добавить новую категорию
2) как добавить новое сообщение с переводом в категорию
3) чтобы

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

Yii::t('app', 'test)
добавил 'test' в базу c дефолтным языком

создал я таблички:

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

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
);
Добавил компонент

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

'i18n' => [
            'translations' => [
                'app' => [
                    'class' => 'yii\i18n\DbMessageSource',
                    'sourceLanguage' => 'en_US',
                ],
            ]
        ]
 
Что делать дальше? Мне переопределить DbMessageSource и дописать свой функционал? Мне непонятно.
Надо для DbMessageSource какой-то пример использование сделать как вот с авторизацией http://stuff.cebe.cc/yii2docs/guide-sec ... ation.html - тут сразу все понятно.
Последний раз редактировалось mrbighokage 2014.06.05, 13:07, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: i18n с DbMessageSource.

Сообщение zelenin »

mrbighokage писал(а):Я ж не против. Ссылку дайте. Ну ненашол я документацию о том кау юзать переводы с БД.

http://stuff.cebe.cc/yii2docs/
http://stuff.cebe.cc/yii2docs/yii-i18n- ... ource.html
Невижу тут ничего такого!
https://github.com/yiisoft/yii2/blob/ma ... config.php
https://github.com/yiisoft/yii2/blob/ma ... roller.php

создаете конфиг по примеру по первой ссылке, пользуетесь командами из второй ссылки.
команда просканирует директории из кофига, найдет все упоминания функции, описанно в конфиге (Yii::t), все недостающие фразы внесет в БД.
Для перевода нужно создать CRUD.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: i18n с DbMessageSource.

Сообщение zelenin »

сам с DB не работал, поэтому могу упустить каике-то нюансы.
Аватара пользователя
mrbighokage
Сообщения: 28
Зарегистрирован: 2014.02.21, 10:33
Откуда: ua

Re: i18n с DbMessageSource.

Сообщение mrbighokage »

спасибо!
Аватара пользователя
mrbighokage
Сообщения: 28
Зарегистрирован: 2014.02.21, 10:33
Откуда: ua

Re: i18n с DbMessageSource.

Сообщение mrbighokage »

Кому еще будет интересно вот мне помогло
http://yii2-api.yupe.ru/class-yii.conso ... oller.html
https://github.com/tonydspaniard/yii2-g ... er/i18n.md
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: i18n с DbMessageSource.

Сообщение zelenin »

mrbighokage писал(а):Кому еще будет интересно вот мне помогло
http://yii2-api.yupe.ru/class-yii.conso ... oller.html
https://github.com/tonydspaniard/yii2-g ... er/i18n.md
все ресурсы перерыли кроме официальных.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: i18n с DbMessageSource.

Сообщение zelenin »

модуль для перевода интерфейса viewtopic.php?f=9&t=18380
artem2708
Сообщения: 1
Зарегистрирован: 2016.01.14, 15:42

Re: i18n с DbMessageSource.

Сообщение artem2708 »

1) Создаем таблички как в доке source_message и message

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

class m160114_111811_translate_message_tables extends Migration
{
    public function up()
    {
        $this->createTable('source_message', [
            'id' => 'INT(11) AUTO_INCREMENT',
            'category' => 'VARCHAR(32)',
            'message' => 'TEXT',
            'PRIMARY KEY (id)',
        ]);
        $this->createTable('message', [
            'id' => 'INT(11)',
            'language' => 'VARCHAR(16)',
            'translation' => 'TEXT',
            'PRIMARY KEY (id,language)',
        ]);

        $this->addForeignKey('fk_message_source_message', 'message', 'id', 'source_message', 'id','CASCADE','RESTRICT');
    }

    public function down()
    {
        $this->dropTable('source_message');
        $this->dropTable('message');
    }
}
+ в конфиге

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

'i18n' => [
            'translations' => [
                'app' => [
                    'class' => 'yii\i18n\DbMessageSource',
                    'sourceMessageTable'=>'{{%source_message}}',
                    'messageTable'=>'{{%message}}',
                    'enableCaching' => true,
                    'cachingDuration' => 10,
                    'forceTranslation'=>true,
                ]
            ],
        ], 
2) Создаем папку message в app/ (Или где вам удобно). Запускаем консольную команду

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

php yii message/config @app/message/config.php

3) Правим созданный конфиг файлик. Раскомменчиваем конфигурации для БД.
4)

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

php yii message/extract @app/message/config.php
для создания записей в БД (Вешается на CRON)
5) Создаем CRUD
Ответить