PHP інтернаціоналізація (i18n): практичний посібник для розробників

Yee
Aug 03, 2024

Виводь свій PHP-сайт у світ: ще простіше рішення для інтернаціоналізації
Якщо ти, як і я, підтримуєш «ванільні» PHP-проєкти, які не залежать від великих фреймворків (типу Laravel чи Symfony), то багатомовність (i18n) для тебе, мабуть, постійна, хоч і незначна, морока.
Традиційне рішення — gettext
— хоч і потужне, але дуже морочливе у налаштуванні. Особливо в невеликих проєктах це виглядає як «стріляти з гармати по горобцях». Насправді нам потрібен спосіб, який можна швидко впровадити без зайвої складності.
Після численних спроб і помилок у різних проєктах ми розробили легке рішення для інтернаціоналізації на основі PHP-масивів і онлайн-інструментів перекладу. Цей підхід не лише простий у впровадженні, а й має надзвичайно низькі витрати на підтримку. Сьогодні я ділюся з тобою цим рішенням повністю, без жодних підводних каменів.
Практичний гайд: як я реалізував багатомовність у PHP за допомогою O.Translator
Наша основна ідея дуже проста: кожна мова — це окремий PHP-файл, який містить return
з асоціативним масивом. Метод простий, інтуїтивний і майже не впливає на продуктивність.
Крок 1: Плануй структуру директорій
Чітка структура папок — це вже пів справи. Щоб усе було під контролем, складемо всі мовні файли в одну директорію й назвемо їх за мовними кодами, ось так:
project_root/
├── index.php // Your main logic file
├── i18n/ // Folder for all language files
│ ├── lang.cn.php // Chinese language pack
│ ├── lang.en.php // English language pack
│ └── lang.fr.php // French language pack
Крок 2: Створи свій «мовний арсенал»
Далі створюємо базовий мовний файл. Візьмемо для прикладу китайську й створимо файл lang.cn.php
. Вміст файлу — це простий PHP-масив, де ключі — унікальні ідентифікатори, а значення — відповідні текстові рядки.
lang.cn.php приклад: ключі залишаються незмінними, значення змінюються залежно від мови
Крок 3: Зустрічай чарівника перекладу — O.Translator
Вручну перекладати десятки чи сотні записів? Оце вже та рутина, яку програмісти терпіти не можуть. І тут у гру вступає наш секретний козир — O.Translator.
Це професійна онлайн-платформа для перекладу документів, яка чудово працює з PHP-файлами: вона може напряму зчитувати твій масив і перекладати його більш ніж на 70 мов.
Процес абсурдно простий:
- Зайди на головну сторінку O.Translator і завантаж свій файл базової мови (наприклад,
lang.cn.php
). - Обери цільові мови, наприклад англійську та французьку.
- Натискай «перекласти», зачекай трохи — і твої перекладені файли
lang.en.php
таlang.fr.php
вже готові.
Що мене найбільше вразило — O.Translator дозволяє переглянути частину перекладу безкоштовно. Якщо результат тебе влаштовує, тоді вже вирішуй, чи платити за повний переклад. Як вони самі кажуть: «Ніколи не плати за продукт, який тебе не влаштовує».
Крок 4: Оживляємо код
Все готово; залишився останній штрих. Тепер давай змінимо головний файл index.php
, щоб він міг динамічно підвантажувати потрібний мовний пакет залежно від вибору користувача.
<?php
// 1. Determine the current language (using a GET parameter for demonstration)
$supported_langs = ['en', 'cn', 'fr'];
$default_lang = 'en';
$lang = isset($_GET['lang']) && in_array($_GET['lang'], $supported_langs) ? $_GET['lang'] : $default_lang;
// 2. Load the corresponding language file
// Use a global variable like $_ or a specific variable like $TEXTS to store the strings
$_ = require_once __DIR__ . "/i18n/lang.{$lang}.php";
?>
У своєму HTML-шаблоні ти зможеш легко викликати текстові рядки ось так:
<!DOCTYPE html>
<html lang="<?php echo htmlspecialchars($lang); ?>">
<head>
<meta charset="UTF-8">
<title><?php echo htmlspecialchars($_['heading_home']); ?></title>
</head>
<body>
<header>
<h1><?php echo htmlspecialchars($_['heading_home']); ?></h1>
<nav>
<ul>
<li><?php echo htmlspecialchars($_['heading_about']); ?></li>
<li><?php echo htmlspecialchars($_['button_read_more']); ?></li>
</ul>
</nav>
</header>
</body>
</html>
Ось і все — простий багатомовний сайт готовий!
Що варто врахувати та про що подумати наперед
Хоч це рішення й легке, перед запуском у продакшн є кілька моментів, на які варто звернути увагу:
- Як визначити мову користувача? У прикладі використовується GET-параметр на кшталт
?lang=en
. У реальному застосунку можна також використати$_SESSION
,$_COOKIE
або розпарсити заголовок браузераAccept-Language
для автоматичного визначення. - Питання продуктивності: Для невеликих і середніх сайтів навантаження від
require_once
для PHP-файлу на кожен запит практично не відчутне. Якщо у вас високонавантажений сайт, для додаткової оптимізації варто розглянути технології кешування байткоду, такі як APC або OPcache. - Масштабованість: Коли кількість мов або текстових рядків зростає, керувати файлами вручну стає складніше. У такому випадку варто звернути увагу на більш професійні рішення для i18n, наприклад, розширення PHP gettext або компоненти локалізації, які надають фреймворки.
- Послідовність перекладу: Щоб забезпечити узгодженість назв брендів і термінології у всіх мовних версіях, дуже рекомендуємо скористатися глосарієм від O.Translator.
- Високорівнева стратегія: У цій статті ми зосереджуємося на технічній реалізації. Якщо хочеш дізнатися більше про загальну стратегію інтернаціоналізації сайтів, можеш почитати нашу іншу докладну статтю.