Реализация многоязычности в PHP?

Доброго времени суток! Недавно начал работать над одной идеей, основа которой — PHP + MVC. Недавно задумался о поддержке второго языка (первый русский, второй, соответственно, английский) и понял, что не знаю, как оптимально это реализовать. Моя знания по этой тебе находятся на уровне 00-ых годов, когда повсеместно использовали просто константы, gettext, ну и что-то подобное.


Буду рад, если кто-то раскроет глаза на современные методы реализации многоязычности на сайте и подскажет куда копать. Заранее спасибо.
  • Вопрос задан
  • 7947 просмотров
Пригласить эксперта
Ответы на вопрос 9
FrostMoon
@FrostMoon
Лично я предпочитаю i18n. Для каждого модуля создаем свой языковой файл, содержащий все слова\фраз\надписи используемые в данном модуле.
ru.ini:
[first]
0 = «Привет Мир!»
en.ini:
[first]
0 = «Hello World!»
непосредственно в самом шаблоне (к примеру смарти) пишем:

{_ first}

Не забываем через .htaccess обрабатывать префикс в урле:
site.ru/ru/
site.ru/en/
или иным способом отслеживать выбранную локаль.
В результате видим фразу на нужном нам языке.
Ответ написан
alekciy
@alekciy
Вёбных дел мастер
А с 00 лет ни чего кардинально не изменилось. Если прочесть каменты, то становиться очевидным, что часть народ изобретает велосипед в своих проекта и выходит у них в итоге gettext. В общем делали-делали, а модуль i18n получился gettext.

Я бы рекомендовал так. gettext использовать для редко изменяющийся информации. Меню, различные надписи делать через него. При этом получаем ряд плюсов:

1) Формат существующий много лет и работающий на огромном множестве платформ. А это означает, что он понятен будет любого кто знает о нем, даже если человек не знаком с тем языком на котором пишется система. Т.е. все преимущества стандартов. С велосипедами же приходится еще разбиратся как оно работает.

2) Кэширование. gettext активно кэшиться в ОЗУ.

3) Обилие софта для переводчиков.

4) Поддержка множественных чисел. Не во всех велосипедах об этом думают в том виде, как это сделано в gettext-е.

5) Поддержка gettext в шаблонных движках.

6) С gettext-ом можно работать не только из PHP. Актуально на гетерогенных проектах.

Ну а контентную часть рекомендую вынести на уровень БД. Лично я использую для каждого языка отдельную таблицу. Плюс по сравнению с хранение в отдельном столбце — отсутствие ALTER-ов при добавление/удалении языка.
Ответ написан
@max_rip
мне нравится вариант когда
$lang['mTitle']='Главная';
$lang['mAbout']='О нас';

Сначала вызывается язык оригинала, а потом текущий язык, если он отличается от оригинала. Таким образом, если перевода и не будет, то можно получить хоть что-то.
Хотя в php успешно используют gettext(например в phpmyadmine), но его более сложно ввести. Требуются утилиты, коих предостаточно для различных систем.
Ответ написан
@Push_Ok
посмотрите как в yii это сделано. там подключаеться файл нужного языка. а вывод сделан через

yii::t(' file_name','лексема',array_replacements);
Ответ написан
Lachezis
@Lachezis
Я приверженец строковых констант, т.е. конструкций вида i18n::get('Hello %s!',$username), либо сокращенно l('Hello %s',$username). Но я использую неймспейсы для строк, а не глобальное хранилище. Реализуется очень просто (открыли, прочитали, добавили, сохранили), и удобно что новая строка автоматически добавляется в неймспейс и сохраняется.


Лично для себя, в любом i18n считаю важным возможность экспорта и импорта локализаций (раньше использовал CSV, но из-за проблем с UTF перехожу на PO), поддержка словообразования для различных языков (1 яблоко, 2 яблока, 6 яблок), кеширование и ускоренную (через мета конструкцию) локализацию view файлов.


К сожалению, все это часть фреймворка, но по запросу могу выслать файлы с пояснениями.
Ответ написан
StraNNikk
@StraNNikk
Плюс один к gettext! Помоему это самый что ни на есть unix-way. Поддержка множественного числа посредством формул, удобное редактирование текстовых контант, реализация, отвязанная от конкретного языка программирования. Единственное — придется ставить дополнительный PHP экстеншен.
Кстати, gettext-овые PO-файлы с переводом могут быть заюзаны и в JavaScript посредством расширения: jsgettext.berlios.de/
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Есть множество реализаций решения данной проблемы, лучшего среди них нету. Мне допустим, если говорить о PHP, больше остальных понравилась реализация i18n в Yii. Там ест ьстатический метод t(), на вход которого подается контекст перевода (считай название файла содержащего переводы строк), и второй параметр — непосредственно строка. Дальше идет поиск по массиву строк, где хэшем является строка на оригинальном языке… ну суть собственно ясна. Хранить в таком случае файлы переводов можно где угодно.

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

Советую пройтись по готовым решениям данной проблемы и выбрать для себя лучшее для вашего проекта.
Ответ написан
selitskas
@selitskas
Если хотите детально исследовать этот вопрос, обратите внимание на то, как реализуется интернационализация в MediaWiki. 350 языков, поддержка сложных множественных форм существительных, грамматических форм (склонений и пр.), гендерный контекст, дата/время и т. д.
Ответ написан
Eternalko
@Eternalko
Тут на хабре было много статей на тему. Я так понимаю вы их пересмотрели все?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы