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.
  • Високорівнева стратегія: У цій статті ми зосереджуємося на технічній реалізації. Якщо хочеш дізнатися більше про загальну стратегію інтернаціоналізації сайтів, можеш почитати нашу іншу докладну статтю.

Тема

Сценарії

Сценарії

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

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