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

| Автор: / School-PHPSchool-PHP.com | Количество просмотров: 2156
Практически все уважающие себя и популярные CMS или FrameWork имеют функционал мультиязычность. Главная цель i18n как и мультиязычности - предоставить сайт посетителям на удобном им языке. Давайте эту тему более подробно рассмотрим.

i18n переводится как интернационализация (internationalization) и включает в себя такие понятия как:
  • Язык (текста, видео, изображения) - мультиязычность или как ещё называют локализация
  • Формат даты и времени, Россия - 12.18.2016, США 18-12-2016
  • Часовой пояс
  • Валюта: доллары, гривны, рубли
  • измерение весов и мер

Как видите, мультиязычность представляет одну составную часть из i18n, давайте разберёмся как это работает на уровне кода.

Определение языка и страны пользователя

Страну пользователя можно определить по IP через geoip. Язык пользователя в элементе массива $_SERVER, а именно:
$_SERVER['HTTP_ACCEPT_LANGUAGE'] => ru,en-US;q=0.8,en;q=0.6

Где мы видим, что первым располагается именно ru (русский язык). При первом открытии сайта необходимо сохранить эти данные о пользователе для дальнейшей работе на сайте, лучшим местом будет COOKIE, но не стоит забывать о новом-старом Законе для европейских стран, где требуют уведомлять пользователя, что используются куки на сайте для европейцев!
Определив язык пользователя теперь можно перенаправить его на нужную ему страницу. Из курса второго уровня по верстке многие из Вас уже знают, что для каждого языка одной страницы должен быть отдельный URL, это значит, что если пользователь открыл впервые сайт и его язык отличается от языка по умолчанию, то его необходимо перенаправить на нужную страницу. Используются либо поддомены, либо отдельным параметром в URL. В движке FW данной школы (изучается на втором уровне курса) применяется указание языка через первый параметр: site.com/LANGUAGE/module/page , где язык можно не указывать в том случае, если он является языком по умолчанию в списке языков, то есть URL будет формата: site.com/module/page . Чтобы активировать язык в FW необходимо в конфиге обратить внимание на следующие строчки:
static $LANGUAGE = array(
		'status' => false, // Включен ли язык
		'lang' => 'ru', // Нынешний язык
		'html_locale' => 'ru-RU', // Нынешний locale (для верстки)
		'default' => 'ru', // Язык по умолчанию
		'allow' => array('ru','en'), // Допустимые языки
	);

Конечно же если кто-то приходит на определённую ссылку по определённому URL надо ещё трижды подумать делать ли специально для него переадресацию, и не будет ли автоматическая переадресация вредить индексации сайта, ведь открыв впервые URL гугл.бот ожидает увидеть страницу определённого языка, а не прописанного у него в HTTP_ACCESS_LANGUAGE, параметра которого может и не быть вовсе, ведь перед нами HTTP_.

Хотелось бы так же добавить популярную ошибку с языками, если человек открывает страницу с отсутствующим языком на сайте по причине того, что язык в конфиге был прописан, а вот в локализации библиотек он отсутствует, то надо выводить язык по умолчанию, данный приём используется на многих сайтах включая php.net.

Хранение и вывод указанного языка

Вот тут полная свобода мысли и огромная вариация решений. Если у нас товары или новости, то можно хранить отдельные колонки в таблице news/goods в отдельной колонке. Если это элемент меню или дизайна, то можно хранить в отдельном файле языковые настройки. Так, допустим, на примере движка FW скажу, что у нас в распоряжении есть папка /languages/ с файлами локализации ru.php , где записываем содержание, а вот выводим просто: . Формат вывода всегда можно подогнать до более красивого и элегантного, пусть даже i18n::language('menu_home'), но суть остаётся та же. Для библиотек создаём папку language, подобные примеры есть в schoolphp/myErrorHandler или phpmailer/phpmailer.

Язык

Первый этап через который проходят многие заказчики - давайте переведём через Google Translate. Просто вбейте в гугле смешной перевод гугл переводчика и насладитесь перлами :) . Демонстрация существующей ошибки вот уже более нескольких лет, данный пример взят лишь потому, что он не исправляется:



Просто пояснение, М - это не только Михаил, но и Максим, Мартин, Макар, Марат и другие. Отсюда вывод прост, что нельзя пользоваться автоматическим переводчиком. А если нет в штате переводчика, то лучше и вовсе не переводить, чем делать это лишь бы как.

Часовой пояс

Если взять тему формата времени, то ничего сложного в этом нет, прописали в выводе формата времени вызов второго класса - определение страны по IP, и формат времени автоматом будет выводить нужный вариант. А вот с часовым поясом проблема другая, дело в том, что определить часовой пояс поможет лишь JavaScript:
(new Date().getTimezoneOffset()/60)*(-1)
или
(new Date().getTimezoneOffset()/60)*(-1)+5 // для смещенного часового пояса сервера

Как Вы уже догадались, определять часовой пояс необходимо через 3 значения: дата записи на сервере (зависит от формата и часового пояса), часовой пояс у клиента, и "+5" смещение часового пояса сервера. Вот таким не сложным образом я произвожу смещение времени:
Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}
var idate = '2016-05-05 05:05:05';
var userTimeZone = (new Date().getTimezoneOffset()/60)*(-1);
console.log(idate);
console.log(new Date(idate.replace(/-/g,"/")).addHours(userTimeZone));

Но этот способ имеет и минусы, дело в том, что часовой пояс меняется. Так, допустим, РФ отменил переход часового пояса, а значит не обновляемые системы будут давать неправильный часовой пояс, а значит и неправильное время. Так же кривизна рук пользователя, который не смог корректно настроить часовой пояс на своём компьютере, из-за чего будут у него проблемы и на других сайтах. Пути решения парочку, первый рассказывать и обучать людей как правильно настраивать часовой пояс на его компьютере, именно этим и занимаются в тех.поддерже Google, Microsoft и FaceBook, иначе почему они не рассматривают мои заявки о неправильной работе их фильтров :) . Второй более популярный и грамотный - давать возможность пользователю самому выбрать свой часовой пояс, то есть смещение будет идти не относительно getTimezoneOffset у клиента, а на уровне сервера в зависимости от настройки в его личном кабинете. Но по умолчанию ставится всё равно часовой пояс клиента.

Работы много, но работа не сложная. Тут нужна внимательность и усидчивость, удачи!

Комментарии на странице(0):

Напишите свой комментарий:
Имя:
E-mail:
на него отправится ответ
Skype Станислава:
напишите мой скайп
(есть вверху страницы)
Введите комментарий:

* Комментарий при отправке отправляется на пре-модерацию. Вынужденная защита от спама, чтобы сайт был чистым.

Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Делимся практикой трудоустройства Проверь свои знания Задачи по PHP MySQL Блог Отзывы