Как использовать ссылки в интернационализации i18n

Yii2
article image

В этой статье я покажу один из способов как можно использовать ссылки в механизме перевода текстов и фраз во фрейморке Yii2

Базовое использование

Самое простое использование функции перевода выглядит так:

1
echo \Yii::t('app', 'Эта строка будет переведена на английский язык');

Вторым аргументом передается строка на языке, который установлен основным. В нашем случае - это русский. Далее Yii ищет соответствие этой строке в файле @app/messages/en/app.php и выводит его. Ниже представлен пример простого файла с переводом:

1
2
3
return [
  'Привет! Меня зовут Тимур' => 'Hi! My name is Timur' 
]);

Ключи данного массива являются оригиналами, а значения - переводами.

Ссылки в переводах

Недавно я столклулся с задачей, в которой мне нужно было вывести на странице текст, содержащий ссылки на другие страницы. Первое, что приходит в голову - это конечно написать html прямо в файле перевода.

Сразу скажу почему это плохая идея: Во-первых - это просто нечитаемо. Во-вторых - ссылки могут меняться и запомнить, что ты где-то когда-то вставил ссылку в файл с переводами - проблемотично.

Напомню, что если метод Yii::t() не находит соответствий, то он возвращает исходную строку.

В-третьих, если вы даете текст на перевод другому человеку, то крайне сложно и долго будет объяснять, где и какие символы можно изменять, а какие лучше не трогать.

Для примера возьму текст со страницы видипедии о Yii

История Yii началась 1 января 2008 года, как проект по исправлению некоторых изъянов во фреймворке PRADO (PHP Rapid Application Development Object-oriented), ставшего в 2004 победителем « Zend PHP 5 coding contest».

В данном тексте у нас две ссылки, ведущие на другие страницы.

В методе Yii::t() третьим параметром предусмотрена передача массива, ключами которого являются метки, которые мы можем вставлять строку в фигурных скобках:

1
2
3
echo \Yii::t('app', 'Привет! Меня зовут {name}', [
  'name' => 'Тимур'
]);

Этим то мы и воспользуемся.

Используя параметры, мы можем определить некий шаблон для ссылок и избавиться от необходмости вставлять в перевод html разметку. Пишем следующий код:

1
2
3
4
5
6
7
8
9
echo \Yii::t('app', 'История Yii началась 1 января 2008 года, как проект по исправлению некоторых изъянов во фреймворке 
{link:begin}{link:src1}PRADO{link:end} (PHP Rapid Application Development Object-oriented), ставшего в 2004 победителем «
{link:begin}{link:src2}Zend{link:end} PHP 5 coding contest».', 
[
  'link:begin' => '<a href="',  //Распечатает открывающий тег <a> и атрибут href
  'link:src1' => '/site/link1">', //Сама ссылка на ресурс, закрывающая ковычка и скобка ">
  'link:src2' => '/site/link2">', //Другая ссылка
  'link:end' => '</a>' // Закрывающий тег </a>
]);

Что тут вообще происходит?

Происходит то, что мы избавились от тегов в тексте, оставив только метки. Обратите внимание на строки 6 и 7. В данном случае можно было бы избавиться от меток link:src1 и link:src2 и использовать вместо них метки, которые содержали бы в себе не только открывающий тег и атрибут, но и саму ссылку. И такой способ имеет право на жизнь, но описанный мною метод мне показался более элегантным и с разделением на логические составляющие.

Примечание: при реальной разработке, переносы в тексте лучше не ставить, так как метод крайне капризный и любой лишний пробел или перенос может нарушить корректную работу локализации

Данные шаблоны можно менять как угодно. Можно вынести, например, атрибут href в метку link:src. Главное правильно расставить все ковычки скобки.

Читать еще: