Для одного из проектов мне понадобилось использовать мультиязычность. И одно из условий было следующее:вместо полноценных слов использовать ключи для перевода. Например, вместе «Строка для перевода», нужно было использовать «string_to_translate».
В документации к Yii, я не нашел информации по поводу перевода по ключам, и, я начал искать в гуглить и наткнулся на одну интересную запись в Yii2 Cookbook. В этом будет частичный перевод этой записи, а так же мои личные мысли и поправки к ней.
Вступление
Я буду описывать способ перевода использую файловую систему, а точнее yii\i18n\PhpMessageSource
класс. В этой статье не будет описываться перевод через базе данных или другие, похожие способы.
Обычный вариант
В этом случае перевод будет зависеть от строки, которая будет в него внесена. Например, если вы напишите так: Yii:t('Строка для перевода', 'app')
, тогда конечный массив (после генерации) получится следующий:
... return [ 'Строка для перевода' => '' ];
Для этого будет достаточно следующей конфигурации:
'components' => [ // ... 'i18n' => [ 'translations' => [ 'app*' => [ 'class' => 'yii\i18n\PhpMessageSource', 'fileMap' => [ 'app' => 'app.php', 'app/error' => 'error.php', ], ], ], ], ],
Вариант с ключами
Под заголовком «Обычный вариант» рассматривался вариант перевода по словам. Здесь будет рассматриваться вариант с ключами.
Для этого формат Yii:t()
будет следующий: Yii::t('string_to_translate', 'app')
С англ. «string to translate» — переводится как «строка для перевода». Написал на английском, так как ключи лучше всего указывать именно так.
После чего вы получите следующий сгенерированный файл:
... return [ 'string_to_translate' => '' ];
Где уже на каждый ключ вы вбиваете перевод, а не на предложение или слово.
Использовать ключи для перевода легко. Чтобы это сделать укажите sourceLanguage
как ключ для конфига, а так же не забудьте указать forceTranslation
со значением true
. В остальном конфиг остается так же как под заголовком «Обычный вариант».
Значение sourceLanguage должно быть «key» потому что, в данном случае, никакой язык не будет совпадать со значением «key», поэтому всегда будут использоваться ключи.
'components' => [ // ... 'i18n' => [ 'translations' => [ 'app*' => [ 'class' => 'yii\i18n\PhpMessageSource', 'sourceLanguage' => 'key', // <--- тут 'forceTranslation' => true, // <--- и тут 'fileMap' => [ 'app' => 'app.php', 'app/error' => 'error.php', ], ], ], ], ],
Остались вопрос?
Остался вопрос? Задавай его ниже к этому посту и получи ответ. yii