Интернационализация 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_oncePHP-файла при каждом запросе практически незаметны. Если у вашего сайта высокая посещаемость, рассмотрите возможность использования технологий кэширования байткода, таких как APC или OPcache, для дополнительной оптимизации. - Масштабируемость: По мере увеличения числа языков или текстовых строк ручное управление файлами может усложниться. На этом этапе можно рассмотреть и более профессиональные решения для i18n, например, расширение PHP gettext или компоненты локализации, которые предлагают фреймворки.
- Последовательность перевода: Чтобы сохранить единую терминологию и названия брендов во всех языковых версиях, очень советуем использовать Глоссарий O.Translator.
- Высокоуровневая стратегия: Эта статья посвящена технической реализации. Если хотите подробнее разобраться в общей стратегии интернационализации сайтов, почитайте нашу другую подробную статью.
