Я работаю с Yii2 Framework и уже настроил компонент i18n, используя это руководство:
http://thecodeninja.net/2014/12/i18n-with-yii-2-advanced-template/
Итак, теперь я могу переводить строки в моих файлах php, используя Yii::t()
функция. Переводимые строки извлекаются с использованием $ ./yii message/extract
консольная команда, которая генерирует правильные файлы перевода.
Теперь мне нужно отобразить переводы для строк, хранящихся в базе данных.
Я мог бы использовать Yii:t()
с переменной вместо строки в качестве аргумента, как это
echo Yii:t('app', $some_string_from_db );
и создайте новый php-файл с таким кодом
<?php
function dbStringsToTranslate() {
$o = Yii::t('app','db english string 1');
$o.= Yii::t('app','db english string 2');
$o.= Yii::t('app','db english string 3');
return $o;
}
Сюда $ ./yii message/extract
Команда найдет нужные переводы.
Это работает хорошо, но, конечно, $ ./yii message/extract
бросает некоторые предупреждения везде, где я использую Yii:t()
с переменными.
Skipping line 39. Make sure both category and message are static strings.
Я думаю, что это не имеет большого значения, но хорошо, вот мой вопрос:
Это правильный способ перевода строк, хранящихся в базе данных?
Есть ли лучший способ сделать это?
Вы можете проверить это расширение. https://github.com/creocoder/yii2-translateable это позволяет привязывать поведение к моделям для поддержки нескольких языков.
Я использую его сейчас в проектах, и он прост в использовании.
У меня была такая же проблема, и я нашел решение с этот модуль. В конфигурации модуля у вас есть массив таблиц, в котором вы можете указать, какие поля из какой таблицы должны быть переведены.
Затем модуль имеет свое собственное действие «сканирование» (эквивалентное сообщению / извлечению), с помощью которого он добавляет все переводимые строки в базу данных (используя DbMessageSource): все Yii :: t, указанные поля базы данных и многое другое (даже javascript, проверьте документы). Он также имеет приятный пользовательский интерфейс для выполнения переводов, это потрясающе!
Например, при следующей конфигурации имя поля из таблицы национальности будет отсканировано и добавлено для его перевода (т.е. названия стран):
'modules' => [
'translatemanager' => [
'class' => 'lajax\translatemanager\Module',
...
'tables' => [ // Properties of individual tables
[
'connection' => 'db', // connection identifier
'table' => 'nationality', // table name
'columns' => ['name'], // names of multilingual fields
'category' => 'database-table-name',// the category is the database table name
'categoryPrefix' => 'lx-' //
]
]
],
],