Интернационализация 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.
- Высокоуровневая стратегия: Эта статья посвящена технической реализации. Если вы хотите узнать больше об общей стратегии интернационализации сайтов, рекомендуем прочитать нашу другую подробную статью.