Ruby on Rails 6/7, урок #13 | Перевод, интернационализация, локализация (i18n, l10n)

preview_player
Показать описание
В этом уроке по Ruby on Rails 6/7 мы узнаем, как выполнять перевод приложения на несколько языков, то есть внедрять интернационализацию (i18n) и локализацию (l10n). Поговорим о том, как сохранять язык в маршруте, сохранять его при переходе между страницами, переключать язык и "угадывать" язык на основе предпочтений пользователя. Также узнаем, что такое TMS и рассмотрим в качестве примере сервис Lokalise.

Таймкоды:
00:00 Введение
01:38 Поддерживаемые языки и rails-i18n
04:10 Простой перевод текста и "ленивые" переводы
08:50 Локализация даты-времени
10:45 Перевод атрибутов моделей и самих моделей
13:28 Перевод Pagy (постраничная навигация)
14:15 Перевод сообщений flash в контроллере
15:15 Хранение языка в маршрутах (scope)
17:05 Считывание и установка запрошенного языка
19:10 Локаль в ссылках с помощью default_url_options
20:18 Переключение языка в выпадающем меню
23:03 Считывание предпочитаемых языков пользователя
25:00 Парсинг предпочитаемых языков
27:20 Система управления переводами Lokalise
35:00 Заключение

Аккаунт Ethereum (ETH): 0x719C2d2bcC155c85190f20E1Cc3710F90FAFDa16

Рекомендации по теме
Комментарии
Автор

Спасибо Вам огромное за труд! Уже два учебных проекта запилил, пользуясь Вашей инструкцией! Дякую!

rickbacker
Автор

Огромное спасибо! Очень полезный материал! 🔥🔥🔥

ELDAR
Автор

Это просто кайф!
*Впервые в жизни нажал на КОЛОКОЛЬЧИК*

EdritKolotit
Автор

Спасибо за материал и понятное объяснение

gekphoenix
Автор

Спасибо огромное за ваш труд! Суперский материал!

hcyflrn
Автор

Грамотная реализация локализации. Показан нечасто используемый механизм: request.env.fetch('HTTP_ACCEPT_LANGUAGE', '').scan(/[a-z]{2}/).first
У себя использовал чуть более сложный алгоритм определения локали. Создаем в модели пользователя (или в профиле пользователя) record locale, где зарегистрированный пользователь (в панели настроек аккаунта) может сохранить предпочитаемый язык. При определении локали приложение вначале проверяет наличие этой записи и выставляет локализацию. При ее отсутствии предпочтение отдается локали переданной в params, т.е. фактически выбранной пользователем в пункте меню. Если в params нет последнего, то дальше проверяем наличие соответствующей записи в cookies, запись в которую происходит после первого успешного выбора языка. Как вариант можно использовать local storage (session менее предпочтителен, если надо обьясню). Запись в куки необходима чтобы гость мог сохранить предпочитаемый язык независимо от 'HTTP_ACCEPT_LANGUAGE или 18n.default_locale при обновлении страничек или рестарте браузера. Только после этого используется механизм предложенный автором. В качестве эксперимента, использовал последним в данном алгоритме загрузку локали из файла настроек yml. Каждый раз проверяем locale на вхождение в список доступных (для куки  
Кроме того, как альтернативу установки локали в params использовал механизм добавления к url '?lang=' . Ссылка для lвыбора русского языка будет выглядеть так: link_to Соотвественно root_path для английского языка будет иметь такой вид: localhost:3000/index?lang=eng Эта реализация locale params упрощает извлечение локали из params (банальный params[:lang]), не требует изменений в route.rb. В тоже время реализация локали от автора видео - в виде субдомена - выглядит более профессионально. Так что это лишь моя вкусовщина.
Есть также полезный gem i18n-tasks, который позволяет найти неиспользуемые переводы, отсутствующие переводы, перевести ключи в google translate и многое другое (i18n-tasks —help в помощь). Например, автоматом добавить отсутствующие ключи со значениями в другой lang.yml или normilize.
Тема неисчерпаемая. Многое осталось за бортом. В любом случае автору спасибо и лайк.

ledockol
Автор

В Rails 7 бутстраповский dropdown не будет работать после указанных инструкций по установке. Насколько понял, теперь нет метода javascript_pack_tags который раньше добавляет все примочки для js. Теперь видимо прописывается руками или как-то по-другому. Я сделал так - создал файл assets/javascripts/application.js, там добавил зависимости как указано в репозитории bootstrap:
//= require jquery3
//= require popper
//= require bootstrap

Затем в файле assets/config/manifest.js добавил строку:
//= link application.js

После этого выпадающий список заработал.

PS. Спасибо за ваши труды и что делитесь с нами своим опытом.

gfqzvmu
Автор

Хотел спросить для того чтобы сделать перевод к примеру статей это надо создавать поля типа title_en title_ru body_en body_ru и самому их заполнять перед публикацией ? это будет правильное решение ?

dextermd
Автор

Спасибо за классные уроки! что-то я упустил что вы сделали что у вас на 6:19 работает метод t(....), у меня работает только с I18n.t

igorshkuryn
Автор

Спасибо большое. Впервые узнал про lazy переводы. Все на высоте. Единственное, зачем доп гем для переменок окружения? По моему в 5.1-6.* уже есть  secrets.yml для этих целей?

eiipnws
Автор

Для того, чтобы при выборе локали не редиректило каждый раз на главную страницу, вместо root_path использовал url_for(locale: locale) - вроде работает норм.

alexanderyakovlev
Автор

что за синтаксис? scope "(:locale)", locale: /en|ru/ do нигде не нашел документации

gfqzvmu