Запуск английской версии

2 июл. 2020 г.

Всем привет! Сегодня я наконец закончил работу над английской версией блога.

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

В то же время, изначально я решил вести блог на русском. Все предыдущие посты написаны на русском. И, в целом, родной язык очень важен для меня. В итоге решил параллельно вести 2 версии блога, русскую и английскую. Это может немного усложнить и замедлить написание постов. Тем не менее, такой подход мне кажется наиболее правильным.

Также были сомнения, как лучше сделать разделение. Разные домены, поддомен en для английской версии, добавление префикса в url, или какой-то еще способ. Вариант с доменами отклонил сразу, т.к. текущий домен в зоне .me является универсальным. Использование поддомена не очень понравилось, т.к. url английской версии получился бы не очень красивым. К тому же в результате получилось бы 2 раздельных сайта с точки зрения SEO.

В итоге выбрал вариант с префиксом url. В начало всех url добавляется /en/ и тогда открывается английская версия страницы. Либо, если префикс не задан, то открывается русская версия. Сайт работает на Symfony, и подобные изменения роутинга оказалось сделать довольно просто.

Сначала пришлось отказаться от yaml роутинга в пользу аннотаций. Для каждого action добавил подобные аннотации:

/**
 * @Route("/en/", name="en_index", locale="en")
 * @Route("/", name="index", locale="ru")
 */

/**
 * @Route("/en/post/{url}", name="en_post", locale="en")
 * @Route("/post/{url}", name="post", locale="ru")
 */

Далее в коде можно использовать locale для логики, связанной с языком.

$post = $this->postRepository->findByUrl($url, $request->getLocale());

Для всех сущностей добавил отдельные поля с русским и английским текстом. К примеру, поле title превратилось в russian_title, english_title. В геттер title добавил проверку locale.

Также создал src/Helper/LocaleHelper.php, и вынес в него вспомогательный код для работы с locale. И добавил некоторые методы в src/Twig/AppExtension.php для использования в шаблонах.

public function getFunctions()
{
    return [
        new TwigFunction('isLocaleRu', [$this, 'isLocaleRu']),
        new TwigFunction('getLocalePrefix', [$this, 'getLocalePrefix']),
        new TwigFunction('getLanguageIcon', [$this, 'getLanguageIcon']),
        new TwigFunction('getForeignLink', [$this, 'getForeignLink']),
    ];
}

Для переключения версий добавил иконку в header сайта. Выглядит так:

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

Кроме того, при написании каждого поста придется тратить время на перевод на английский. Или, возможно, сразу писать на английском и переводить на русский. Время покажет. Старые посты решил не переводить, т.к. это заняло бы огромное количество времени. И не уверен, что действительно нужно. Несколько последних постов писал сразу на 2х языках.

Создание английской версии потребовало довольно много времени и сил. К тому же, работы по остальным проектам меньше не стало. Теперь, когда локализация закончена, надеюсь провести небольшой рефакторинг и заняться написанием постов.

На этом пока все. Спасибо за внимание!