Скажите, как реализована мультиязычность на 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. Тут мы уже коснулись темы шаблонизатора, что в свою очередь - является еще целой горой проблем. И при нагруженных проектах, шаблонизатор должен уметь грамотно кешировать такие файлы. Но это отдельная история... Лукас если дочитал.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я начал только-только начал учить PDO, но дело не в этом, а в том, что я не знаю где и почему я не правильно выполняю MySQL запросВот код функции...