Принципи створення багатомовних сайтів

322

Від автора: у даному уроці ми з Вами розглянемо принципи створення багатомовних сайтів, так як сайт, в якого є можливість відображення контенту на різних мовах, може зацікавити більшу кількість відвідувачів.

Принципи створення багатомовних сайтівПринципи створення багатомовних сайтів

1. Постановка задачі

Для сьогоднішнього уроку я підготував ось такий сайт (вихідний у даній статті я наводити не буду, Ви його зможете подивитися в исходниках до даного уроку):

Принципи створення багатомовних сайтів

Завдання цього уроку – це реалізація багатомовності даного сайту, зокрема підтримка російської та англійської. І перед тим як перейти до вирішення даної задачі, давайте розглянемо складові даного сайту.

Отже, дивіться, даний сайт складається з контенту, який міститься в базі даних. Це статті, а також вертикальне і горизонтальне меню. Та додаткових спеціальних елементів, які інформують користувача про призначення блоків, або є різними заголовками. Наприклад, це заголовок сайту (TITLE), девіз (THE BEST CAR FOR YOU), рядок МЕНЮ і т. д.

З контентом все просто, так як він міститься в базі даних, наприклад, в моєму випадку статті наведено в таблиці statti, то для кожної статті Вашого сайту або заголовку меню категорії і т. д., необхідно зберігати копію, але вже на іншій мові. І, звичайно ж, копій повинно бути стільки, скільки мов у Вас буде на сайті. Але виникає питання, як визначити мову, який вибирає користувач? Відповідь на дане питання ми з Вами розберемо далі по ходу уроку.

Але що ж робити з додатковими елементами, так як вони не зберігаються в базі даних, а виводяться або з файлу конфігурації, або просто виводяться з шаблону, звичайним HTML. Цим ми з Вами далі й займемося.

2. Вибір мови

Якщо подивитися на наш тестовий сайт, то ми з Вами побачимо, що в шапці сайту є два посилання English та Російська, які будуть перемикати мову сайту. Використовуючи дані посилання, ми будемо передавати через адресний рядок параметр lang. Значення en буде відповідати англійській мові, значення ru – російській.

Тому для визначення мови ми повинні перевіряти клітинку lang суперглобального масиву GET. Отже давайте додамо наступний код у файл index.php (звичайно, Ви ж будете створювати свій сайт, і цей код необхідно додати в те місце де Ви обробляєте параметри з адресного рядка):

if($_GET[‘lang’]) {
$_SESSION[‘lang’] = trim(strip_tags($_GET[‘lang’]));
setcookie(‘lang’,trim(strip_tags($_GET[‘lang’])),$date);
}
else if ($_COOKIE[‘lang’]) {
$_SESSION[‘lang’] = $_COOKIE[‘lang’];
}
else {
$_SESSION[‘lang’] = ‘en’;
}

Першим ділом перевіряємо чи є в суперглобальном масиві GET, осередок lang. Якщо ж є ця комірка, значить користувач вибрав мову, тому значення даної клітинки ми зберігаємо в сесію, що б у будь-якому місці нашого скрипта ми могли дізнатися яка мова вибрав користувач. Також дуже зручно зберігати вибрана мова в куках. Так як при наступних відвідинах Вашого сайту, користувачеві не доведеться заново вибирати мову. Тому після того як ми зберегли українську мову в сесії – створюємо куку і записуємо в неї мова.

Якщо ж у суперглобальном масиві GET немає осередку lang, то виконуємо перевірку наявності cookie з ім’ям lang, якщо ж дана кука є у сесію записуємо її значення.

Якщо ж у суперглобальном масиві GET немає осередку lang і немає cookie з ім’ям lang, значить, користувач не вибрав мову і в сесію записуємо мову за замовчуванням. Давайте домовимося — що це англійська мова.

3. Де і як зберігати словник для виведення елементів сайту

Тепер необхідно визначитися, як же виводити спеціальні елементи сайту, використовуючи різні мови. Реалізувати даний функціонал можна різними способами, ми ж у цьому уроці розглянемо два варіанти. Взагалі, ідея створення багатомовного сайту полягає в тому, що в шаблонах ми проставляємо спеціальні мітки (мітками можуть служити змінні, константи, виклик функції з різними параметрами тощо), які в подальшому будуть замінені на рядки (словосполучення, речення, слова тощо) вже тієї мови, який вибрав користувач.

Обидва ці варіанти передбачають зберігання словників в звичайних текстових файлах. Словник — це текстовий файл певного формату, в якому пов’язані рядки певної мови з мітками, які ми будемо використовувати на сайті. Отже, словники для першого варіанту. Файл en.php:

‘Title’,
‘SLOGO’ => ‘The best car for you’,
‘SLANG’ => ‘Language’,
‘SMENU’ => ‘Menu’
);
?>

Файл ru.php:

‘Заголовок сайту’,
‘SLOGO’ => ‘Кращі автомобілі для Вас’,
‘SLANG’ => ‘Мова’,
‘SMENU’ => ‘Меню’
);
?>

Як Ви бачите по першому варіанту в словниках, міститься масив. Ключі даного масиву – це мітки, які будуть проставлені в шаблонах, а значення клітинок – це власне ті рядки, які будуть виведені в браузер замість позначок. Звичайно, для кожного словника ключі масиву повинні бути однаковими, так як вони будуть прописані в шаблоні.

Словники для другого варіанту. Файл en.ini:

STITLE = Title
SLOGO = The best car for you
SLANG = Language
SMENU = Menu

Файл ua.ini:

STITLE = Заголовок сайту
SLOGO = Кращі автомобілі для Вас
SLANG = Мову
SMENU = Меню

По другому варіанту ми вже використовуємо ini файли в якості словників – так як їх дуже легко прочитати стандартними засобами мови PHP і при цьому отримати масив, який надалі можна використовувати.

4. Перший варіант створення багатомовного сайту

Перший варіант передбачає словники у вигляді файлів php. Тому давайте у файлі index.php підключимо даний файл відразу ж після перевірки наявності в суперглобальном масиві GET осередку lang:

$dict = include $_SESSION[‘lang’].’.php’;

Тепер у нас в змінній $dict – міститься масив словника. Хочу помітити, що імена словників збігаються зі значенням сесійного змінної $_SESSION[‘lang’] – це я вибрав для зручності.

Далі давайте створимо новий файл (dict.php), в якому буде міститися допоміжний клас Dict. В цьому класі буде міститися метод повертає значення чисел масиву $dict:

Як Ви бачите це дуже простий клас, з єдиним статичним методом _(), даний метод не приймає параметром ключ масиву dict і якщо цей ключ дійсно існує в масиві, то метод повертає його значення. Якщо ж цього ключа немає, буде повернуто ім’я ключа. Якщо ж Ви створюєте сайт за допомогою процедурного підходу, то клас Dict замініть звичайною функцією, тіло якої точно таке ж як і методу _(). Тепер цей файл необхідно підключити до нашого сайту.

require_once(“classes/dict.php”);

Тепер в нашому шаблоні, у тих місцях, де Вам потрібно вивести слово зі словника, потрібно викликати метод _(). У моєму випадку, для шапки сайту це буде виглядати ось так:

Якщо Ви використовуєте процедурний підхід, то замість класу і методу, просто вкажіть свою функцію. Тепер давайте перевіримо що у нас вийшло. Мову за замовчуванням:

Принципи створення багатомовних сайтів

Російська мова:

Принципи створення багатомовних сайтів

5. Другий варіант

Отже по другому варіанту ми з Вами використовуємо ini файли в якості словників. Отже, додатковий клас на не потрібний і тому, видаляємо підключення файлу dict.php, а також видаляємо підключення файлу словників, одразу після визначення мови.

Тепер для того що б прочитати ini файл ми скористаємося функцією (дану рядок я прописую в фалі ACore.php у методі get_body()):

$dict = parse_ini_file($_SESSION[‘lang’].’.ini’);

При виконанні даного методу, у змінну $dict буде збережений масив з словником. Тепер в шаблоні де Вам необхідно вивести текст замість позначок, пропишіть висновок на екран значень відповідних комірок масиву $dict. Знову ж для даного прикладу, для шапки сайту, необхідно зробити наступне:

Далі можна перевірити результат нашої роботи. Ось ми з Вами розглянули два принципи створення багатомовних сайтів, сподіваюся, цей урок буде Вам корисний.

Всього Вам доброго і вдалого кодування і побачимося в наступних уроках.