Многоязычный сайт php twig — как лучше реализовать?
Добрый вечер!
Делаю многоязычный сайт.
Основа backend реализован на php + шаблонизатор twig
Как лучше реализовать мультиязычность?
Вариант использовать i18n twig extension - коллега говорит что gettext на основе которого не очень хороший вариант по ряду неких причин)
Вариант использовать подключаемые словари в зависимости от языка - и преобразовывать их в twig массив
Может ещё какие варианты кто подскажет?)
Локализация (хорошая) всегда держится на кастомных наборах переводов, обычно это или таблица в бд, либо файлик с массивом, который правят по ходу наполнения сайта. Как конкретно реализовывать зависит от многих параметров, в том числе и от наличия готовых решений для используемого фреймворка. Ну или свое что-то пишут. Но смысл всегда примерно один - итоговый массив с ключами типа
Григорий, Собсно в чем разница? Где-то во вьюшках передать в твиг как переменную, а где-то в контроллере или в моделях с твигом не прокатит, например текст пользовательской ошибки аяксом вернуть... Хотя и тут можно возвращать шаблон, но тут уже как проще заморачиваться.
Я всегда держу в файлах ini ключи для слов.
У меня есть папка lang_pack
В ней имеются подкаталоги de,ru,en,uk и тд.
В каждой из этих папок имеются файлы .ini в которых есть ключи для слов
title=Мой сайт
link_index=Главная страница
И так далее.
Кстати, я делаю для каждого модуля отдельный такой файл.
А на самом сайте использую что-то подобное.
ThunderCat, разве не лучше словари хранить в каждом отдельном файле
Чисто гипотетически вероятность 40 языков крайне мала
2-3 максимум
А если 40 словарей в одном файле, или даже таблице это будет затруднительно и тяжело обрабатывать, мне кажется)
ThunderCat, в реальности можно конечно завести отдельный словарь для часто встречающихся слов, но никто обычно этим не заморачивается. Слишком муторно все время менять домен. Плюс в зависимости от контекста, слово жеппа может переводиться как dork, ass, bum, buttocks, bottom и так далее
налетев на другую трактовку один раз, быстро избавляешься от идеи иметь только один перевод для каждого слова.
ThunderCat, Зря иронизируете )
В ларавел такой же подход – словари можно разбивать на разные файлы.
И вот прямо сейчас у меня в разных контекстах слово simple переводится по разному: Простой и Легкая форма
и ещё раз. какое отношение этот винегрет имеет к Twig?
в приведённой выше цитате автор говорит от отказе от одного определенного расширения.
но нигде не говорит о том что собирается поменять нормальный шаблонизатор на ваш,извиняюсь, говнокод.
Ипатьев, переводу будут подвержены только ui-элементы - больше ничего
Остальное в зависимости от локации это текст из базы в зависимости от языка
Вопрос собственно в том как лучше реализовать используя связку php + twig
Twig потому как все он шаблонизатор и весь ui выводится через него (не считая js подгрузок всяких - но это совсем другая история)
Вопрос в том какой способ выбрать для интернационализации сайта, мне просто хотелось бы услышать варианты) Наводки, направление для реализации) Не более
Плюс в зависимости от контекста, слово жеппа может переводиться как dork, ass, bum, buttocks, bottom и так далее
Собсно именно в этом и есть суть кастомных переводов, именно это я и имел в виду говоря что готовые словари не подходят для качественного перевода и на каждый разный перевод должен быть свой ключ, типа ass=>жеппа, bum=> попец,...
И вот прямо сейчас у меня в разных контекстах слово simple переводится по разному: Простой и Легкая форма
И они же имеют разные ключи, верно? Вопрос был о том стоит ли для каждого модуля делать отдельный файл переводов, если в нем может повторяться один и тот же перевод.
Григорий, Речь шла не количестве языков, а о количестве модулей, которых на сайте много, и в которых будет куча дублей, которые при изменении 1 перевода нужно будет поменять в 40 местах...
ThunderCat, возможно я вас не так понял.
Сам принцип множества словарей удобен. Можно группировать переводы по каким-то критериям. Соглашусь, что группировка по модулям не очень хороший выбор.
Опять же, если говорить о ларавел, то там ключ уникален в пределах файла, а в приложении вызывается с префиксом имени файла. __('common.simple') __('medical.simple'). Не нужно выдумывать ключи simple1, simple_for_med и т.п.
Если говорить про Twig, а не просто вспоминать былые денёчки, как в пятом классе на коленке переводил мамкин сайт для бижутерии, то для переводов в нем используется фильтр.
То есть берется готовый или делается кастомный фильтр. Который и занимается поиском соответствия для переводимой фразы. Которая выводится, как {{ message|trans }}
Если же говорить про переводы вообще, то хранить как угодно, но при деплое писать в массив в пхп файл. Который лежит себе спокойно в опкеше, и подключается тем самым фильтром.