Интернационализация 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

Рекомендуемое чтение