readme.txt
Как включить мультиязычность на сайте:
1. Запускаем миграцию: php yii migrate --migrationPath=common/modules/language/migrations
2. Добавляем в файл конфигурации:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'class'=>'common\modules\language\components\LanguageUrlManager',
'rules'=>[
'/' => 'site/index',
'//*'=>'/',
]
],
3. Добавляем в файл конфигурации:
'request' => [
'class' => 'common\modules\language\components\LanguageRequest'
],
4. Добавляем в файл конфигурации:
'language'=>'ru-RU',
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@frontend/messages',
'sourceLanguage' => 'en',
'fileMap' => [
],
],
],
],
5. Переводы писать в файл frontend\messages\{language}\app.php, где {language} - нужный язык, например ru.
6. Для вывода на странице сообщения с переводом используем функцию: Yii::t('app', {message}, $params = [], $language = null),
где {message} - нужное сообщение, $params - массив параметров, $language - нужный язык (по умолчанию используется текущий язык).
7. В наличие также виджет переключения языка: LanguagePicker::widget()
Как использовать мультиязычность для Active Record:
1. Создаем для таблицы {table} таблицу с языками {table_lang}.
2. Создаем для класса {Table} класс с языками {TableLang}.
3. Подключаеи для класса {Table} поведение LanguageBehavior:
public function behaviors() {
return [
'language' => [
'class' => LanguageBehavior::className(),
'object_lang' => {TableLang}::className() // optional, default to {TableLang}::className()
'ownerKey' => {Table}->id //optional, default to {Table}->primaryKey()[0]
'langKey' => {TableLang}->table_id //optional, default to {Table}->tableName().'_id'
],
];
}
3.1. PHPDoc для {Table}:
* * From language behavior *
* @property {TableLang} $lang
* @property {TableLang}[] $langs
* @property {TableLang} $object_lang
* @property string $ownerKey
* @property string $langKey
* @property {TableLang}[] $model_langs
* @property bool $transactionStatus
* @method string getOwnerKey()
* @method void setOwnerKey(string $value)
* @method string getLangKey()
* @method void setLangKey(string $value)
* @method ActiveQuery getLangs()
* @method ActiveQuery getLang( integer $language_id )
* @method {TableLang}[] generateLangs()
* @method void loadLangs(Request $request)
* @method bool linkLangs()
* @method bool saveLangs()
* @method bool getTransactionStatus()
* * End language behavior *
3.2. Убрать language behavior с наследуемых таблиц от {Table} ({TableSearch}...)
4. Доступные полезные методы:
{Table}->getLangs() - получить все текущие {TableLang} для {Table} проиндексированные по language_id
{Table}->getLang($language_id = NULL) - получить {TableLang} для определенного языка (default: текущий язык) для {Table}
{Table}->generateLangs() - получить массив {TableLang} под каждый язык, включая существующие записи, для {Table}
{Table}->loadLangs($request) - заполнить массив {TableLang} данными с POST
{Table}->linkLangs() - связать каждый элемент массива {TableLang} с текущей {Table}
{Table}->saveLangs() - провалидировать и сохранить каждый элемент массива {TableLang}
5. Добавить поля в форму (к примеру через Bootstrap Tabs).
В наличии:
LanguageForm::widget([
'model_langs' => {TableLang}[],
'formView' => string,
'form' => ActiveForm,
]);
6. Обрабатывать данные в контроллере.
1. После создания/поиска {Table} создаем/находим языковые модели {Table}->generateLangs()
2. При POST запросе загружаем данные в языковые модели {Table}->loadLangs(Request $request)
3. После сохранения, если транзанкция успешна, то свойство {Table}->transactionStatus будет true, иначе возникла ошибка в какой то модели.
7. Получать данные на публичной части сайта через {Table}->lang.