Использовать ID/ключи вместе слов для перевода в Yii2 (I18N)

· Yii2 и Снипеты · 3 мин чтения

Для одного из проектов мне понадобилось использовать мультиязычность. И одно из условий было следующее:вместо полноценных слов использовать ключи для перевода. Например, вместе «Строка для перевода», нужно было использовать «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