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х языках.
Создание английской версии потребовало довольно много времени и сил. К тому же, работы по остальным проектам меньше не стало. Теперь, когда локализация закончена, надеюсь провести небольшой рефакторинг и заняться написанием постов.
На этом пока все. Спасибо за внимание!