Мультиязычность на сайте

198
22 октября 2018, 15:30

Скажите, как реализована мультиязычность на Facebook или в VK? Нужно сделать мультиязычность средствами php.

Answer 1

Попробую внести ясность и свое мнение:

Предисловие:

Начать надо с определения языка. Обычно делаю через куки (либо привязывают к аккаунту если есть авторизация).

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

READ ALSO
Не правильно выполняю запрос MySQL, через PDO

Не правильно выполняю запрос MySQL, через PDO

Я начал только-только начал учить PDO, но дело не в этом, а в том, что я не знаю где и почему я не правильно выполняю MySQL запросВот код функции...

178
Как убрать public из URL в проектах Laravel

Как убрать public из URL в проектах Laravel

У меня есть проект devru

168
Как удалить тег &lt;a&gt; с содержимым из строки в PHP?

Как удалить тег <a> с содержимым из строки в PHP?

Как удалить тег с содержимым из строки в PHP?

169