Більшість багатомовних сайтів використовують технологію автоматичного визначення мови користувача. Виглядає це так: користувач, заходячи на ресурс, бачить перед собою сторінки з контентом на рідному для нього мовою. Найпростіший метод визначення - по IP кожного відвідувача. Технологія проста і багато в чому зручна для відвідувачів. Але в ній є свої нюанси.
Використання IP або, точніше, GeoIP - найбільш доступний і простий спосіб. Але в той же час часто він буває неточним. Багато користувачів скаржаться: коли вони знаходяться за пределаміУкаіни, то спочатку всі сайти завантажуються на мові країни, в якій вони перебувають. Це дико незручно, і найцікавіше, що цим грішать і такі великі майданчики, як Facebook.
- легке застосування, можливість реалізації на різних мовах
- якщо не брати до уваги описані вище проблеми - висока точність визначення;
- висока (миттєва) швидкість - для отримання результату досить одного запиту до бази.
До недоліків методу визначення мови по IP відносять:
- необхідність постійно актуалізувати базу IP;
- неможливо перевірити, наскільки достовірні дані;
- дані IP поУкаіни не завжди точні.
Перший і найпростіший спосіб - використання безкоштовної бібліотеки. Наприклад, для сайтів на PHP можна застосовувати розширення GeoIP. За посиланням доступна докладна інструкція по установці і інші рекомендації.
У PHP є стандартні елементи супеглобального масиву $ _SERVER для визначення IP-адреси і перемикання на потрібну мовну версію. Ось конкретно використовуваний елемент
Він відповідає за передачу сервера даних про мову користувача, повертаючи значення ru, en або будь-яке інше. Ось так приблизно виглядають ці дані:
Перше значення - мова, друге - регіон, а коефіцієнт вказує на пріоритет (те, яку мову користувач віддає перевагу більше). Завдяки подібній логіці, наприклад, стартова сторінка Google для російськомовного користувача, який знаходиться в Україні, завантажиться російською, але з сервера Google.com.ua.
Щоб установити мову можна використовувати наступний код:
preg_match_all ( '/ ([az] (?: - [az])?) (?:; q = ([0-9.] +))? /', strtolower ($ _ SERVER [ "HTTP_ACCEPT_LANGUAGE"]), $ matches); // обчислюємо відповідності з масивом $ matches
$ Langs = array_combine ($ matches [1], $ matches [2]); // Створюємо масив з ключами $ matches [1] і значеннями $ matches [2]
foreach ($ langs as $ n => $ v)
$ Langs [$ n] = $ v. $ V. 1; // Якщо немає q, то ставимо значення 1
arsort ($ langs); // Сортуємо по спадаючій q
echo key ($ langs); // Виводимо мову за замовчуванням
>
Досить встановити код на сайт - і відвідувачі будуть отримувати завантажені сторінки на потрібному їм мовою, не здійснюючи жодних додаткових дій. Ось ще один подібний метод:
preg_match ( '/ ^ \ w /', $ _ SERVER [ 'HTTP_ACCEPT_LANGUAGE'], $ matches);
switch (strtolower ($ matches [0]))
case "ru": $ accept_lang = "ru"; break; // якщо український
case "de": $ accept_lang = "de"; break; // якщо німецький
case "en": case "uk": case "us": $ accept_lang = "en"; break; // якщо англійська
case "ua": $ accept_lang = "ua"; break; // якщо український
default: $ accept_lang = "en"; break; // якщо немає збігів, то за замовчуванням, наприклад, англійський
echo $ accept_lang;
>
$ Sites = array (
// отримуємо мову
$ Lang = substr ($ _ SERVER [ 'HTTP_ACCEPT_LANGUAGE'], 0, 2); // вирізаємо перші дві букви
// перевіряємо мову
if (! in_array ($ lang, array_keys ($ sites)))
$ Lang = 'ru';
// перенаправлення на субдомен
header ( 'Location:'. $ sites [$ lang]);
Щоб застрахуватися від можливих помилок у визначенні, передбачайте легку і зрозумілу можливість ручної зміни мовного інтерфейсу - щоб навіть на сайті з ієрогліфами російськомовний відвідувач розібрався, як змінити мову.