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

more

Yee

Aug 03, 2024

cover-img

Виводь свій 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 мов.

Процес абсурдно простий:

  1. Зайди на головну сторінку O.Translator і завантаж свій файл базової мови (наприклад, lang.cn.php).
  2. Обери цільові мови, наприклад англійську та французьку.
  3. Натискай «перекласти», зачекай трохи — і твої перекладені файли 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.
  • Високорівнева стратегія: У цій статті ми зосереджуємося на технічній реалізації. Якщо хочеш дізнатися більше про загальну стратегію інтернаціоналізації сайтів, почитай нашу іншу докладну статтю.

Тема

Сценарії

Сценарії

Опубліковані статті13

Рекомендовані матеріали