Скажите, как реализована мультиязычность на Facebook или в VK? Нужно сделать мультиязычность средствами php.
Попробую внести ясность и свое мнение:
Предисловие:
Начать надо с определения языка. Обычно делаю через куки (либо привязывают к аккаунту если есть авторизация).
Предположим, что кука будет называться lang, Тогда в скрипте смотрим: если такой куки нет, то язык - стандартный (который мы укажем в качестве стандартного), если существует: то смотрим значение этой куки, если такой язык существует в нашем пуле, то значит значение валидно язык известен, иначе опять стандартную.
С определением языка - определились. Идем дальше: на беке обычно реализуют одним из следующих способов:
1) Языковые файлы
Т.е. у нас есть директория language в которой есть языковые папки а в них файлы с текстами:
language
-english
--tpl_1.php
--tpl_2.php
-russian
--tpl_1.php
--tpl_2.php
Идея в том, что каждый файл содержит в себе массив [key1 => value1, key2 => value2], Где value - Наш текст, а key - уникальный идентификатор, по которому мы и будем запрашивать наш локализованный конкретный текст. (ну думаю логика понятна).
Почему я написал tpl_ - ? Потому что архитектурно правильней текст формировать на последнем этапе (views), т.е. контроллер - только собирает необходимые данные.
В общем случае схема такая: контроллер знает какие вьюхи он подргрузит, поэтому подгружает сперва массивы языковых файлов (наши tpl_), потом эти массивы передает в views там они уще шаблонизатором вставляются - profit!
В процессе прочтения вы небось подумали что лажа какая-то, соглашусь. Поэтому такой подход чаще всего используется когда нам ВСЕ ТАКИ НАДО чтобы в контроллере к нашим данным прикрепить какие-то языковые строки.
2) Шаблонный
Зачем контроллеру передавать массивы с шаблонами и так заморачиваться, если просто можно создать 2 одинаковых шаблона с разными языками? Гениально!
2+1) Шаблонно-файловый
Собсна 2 способ не менее костыльный, чем первый, потому что вам придется поддерживать 2 шаблона, т.е. любую правку дублировать и т.д. Морока. Дайте проще!
Поэтому самый правильный способ: совместить. Т.е. каждый шаблон будет содержать в себе функцию для получения языкового текста, пример:
Пусть у нас есть шаблон tpl_home:
<html>
<head>
<title>{% lang('tpl_home.title') %}</title>
</head>
<body>
{% lang('tpl_home.body') %}
</body>
</html>
Задача нашего шаблонизатора: Найти все наши {% lang(...) %} и заменить их на текст.
Например {% lang('tpl_home.title') %} , тут tpl_home - это файл с шаблоном,
title - ключ самого массива внутри файла.
Значит получается, что мы запрашиваем language/russian/tpl_home.php получаем от туда наш массив (пусть будет например $array), и теперь заменяем {% lang('tpl_home.title') %} в шаблоне на значение $array['title']. (Откуда взяли russian? Ну язык мы определили в предисловии)
P.S. Вообще правильная и гибкая логика очень сложная. У вас должна быть отдельная логика Локализации и отдельная логика Шаблонизатора и при этом они должны взаимодействовать между собой и понимать друг друга. Так просто описать не получится, но в целом описал, как толчок - самое-то. Либо используйте фреймворки, там уже это все есть :)
P.S.2. Тут мы уже коснулись темы шаблонизатора, что в свою очередь - является еще целой горой проблем. И при нагруженных проектах, шаблонизатор должен уметь грамотно кешировать такие файлы. Но это отдельная история... Лукас если дочитал.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости