d55d2fe0
Yarik
Multilanguage
|
1
|
Как включить мультиязычность на сайте:
|
d8c1a2e0
Yarik
Big commit artbox
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
1. Запускаем миграцию: php yii migrate --migrationPath=common/modules/language/migrations
2. Добавляем в файл конфигурации:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'class'=>'common\modules\language\components\LanguageUrlManager',
'rules'=>[
'/' => 'site/index',
'<controller:\w+>/<action:\w+>/*'=>'<controller>/<action>',
]
],
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 - нужный язык (по умолчанию используется текущий язык).
|
d55d2fe0
Yarik
Multilanguage
|
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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'
],
|
fd238f57
Yarik
Admin begin refac...
|
48
49
50
|
'transaction' => [
'class' => TransactionBehavior::className(),
],
|
d55d2fe0
Yarik
Multilanguage
|
51
52
53
54
55
56
57
58
59
|
];
}
3.1. PHPDoc для {Table}:
* * From language behavior *
* @property {TableLang} $lang
* @property {TableLang}[] $langs
* @property {TableLang} $object_lang
* @property string $ownerKey
* @property string $langKey
|
14cd7eed
Yarik
LanguageBehavior ...
|
60
61
|
* @property {TableLang}[] $model_langs
* @property bool $transactionStatus
|
d55d2fe0
Yarik
Multilanguage
|
62
63
64
65
66
67
68
69
70
71
|
* @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, ActiveRecord[] $model_langs)
* @method bool linkLangs(ActiveRecord[] $model_langs)
* @method bool saveLangs(ActiveRecord[] $model_langs)
|
fd238f57
Yarik
Admin begin refac...
|
72
|
* @method bool getTransactionStatus()
|
14cd7eed
Yarik
LanguageBehavior ...
|
73
|
* * End language behavior *
|
d55d2fe0
Yarik
Multilanguage
|
74
75
76
77
78
|
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}
|
14cd7eed
Yarik
LanguageBehavior ...
|
79
80
81
|
{Table}->loadLangs($request) - заполнить массив {TableLang} данными с POST
{Table}->linkLangs() - связать каждый элемент массива {TableLang} с текущей {Table}
{Table}->saveLangs() - провалидировать и сохранить каждый элемент массива {TableLang}
|
d55d2fe0
Yarik
Multilanguage
|
82
83
84
85
86
87
88
89
90
|
5. Добавить поля в форму (к примеру через Bootstrap Tabs).
В наличии:
LanguageForm::widget([
'model_langs' => {TableLang}[],
'formView' => string,
'form' => ActiveForm,
]);
6. Обрабатывать данные в контроллере.
1. После создания/поиска {Table} создаем/находим языковые модели {Table}->generateLangs()
|
14cd7eed
Yarik
LanguageBehavior ...
|
91
92
|
2. При POST запросе загружаем данные в языковые модели {Table}->loadLangs(Request $request)
3. После сохранения, если транзанкция успешна, то свойство {Table}->transactionStatus будет true, иначе возникла ошибка в какой то модели.
|
2f69a481
Yarik
i18n config fix
|
93
|
7. Получать данные на публичной части сайта через {Table}->lang.
|