Перевод PHP-скриптов (сайтов, CMS, фреймворков) требует правильного подхода к локализации. Рассмотрим основные методы перевода PHP-кода с поддержкой мультиязычности.
1. Использование Gettext (рекомендуемый способ)
Стандарт Gettext — самый мощный и гибкий вариант для локализации PHP.
Как работает?
-
Текст в коде оборачивается в функции (
_()
,gettext()
). -
Переводы хранятся в
.po
/.mo
файлах.
Пример кода:
echo _("Hello, world!"); // Будет искать перевод в .mo файле
Настройка:
-
Установите php-gettext (если не включено по умолчанию).
-
Создайте файлы переводов:
-
messages.pot (шаблон) →
xgettext -d messages -o messages.pot *.php
-
ru_RU.po (перевод) → редактируем в Poedit.
-
ru_RU.mo → компилируем через
msgfmt
.
-
-
Подключите в PHP:
$locale = 'ru_RU'; putenv("LC_ALL=$locale"); setlocale(LC_ALL, $locale); bindtextdomain("messages", "./locale"); textdomain("messages");
Плюсы:
✔ Поддержка множества языков.
✔ Высокая производительность (бинарный .mo
).
✔ Стандарт для WordPress, Drupal, Laravel.
2. Массивы переводов (простейший метод)
Подходит для небольших проектов.
Пример:
$translations = [ 'en' => ['hello' => 'Hello!'], 'ru' => ['hello' => 'Привет!'], ]; $lang = 'ru'; echo $translations[$lang]['hello']; // "Привет!"
Плюсы:
✔ Простота реализации.
✔ Не требует сторонних библиотек.
Минусы:
✖ Не масштабируется для больших проектов.
✖ Нет поддержки плюральных форм (например, «1 сообщение» vs «5 сообщений»).
3. JSON-файлы для переводов
Удобно для SPA и API-ориентированных проектов.
Структура:
// lang/ru.json { "welcome": "Добро пожаловать!", "items": { "apple": "Яблоко" } }
Использование в PHP:
$lang = json_decode(file_get_contents('lang/ru.json'), true); echo $lang['welcome']; // "Добро пожаловать!"
Плюсы:
✔ Удобно для фронтенда (JavaScript может использовать те же файлы).
✔ Читаемый формат.
Минусы:
✖ Медленнее Gettext (парсинг JSON).
4. База данных для переводов
Подходит для динамического контента (например, CMS).
Структура БД:
id | key | lang | value |
---|---|---|---|
1 | «welcome» | «ru» | «Добро пожаловать!» |
Пример кода:
function translate($key, $lang = 'ru') { $query = "SELECT value FROM translations WHERE `key` = '$key' AND lang = '$lang'"; // ... выполнить запрос и вернуть перевод } echo translate("welcome"); // "Добро пожаловать!"
Плюсы:
✔ Можно редактировать переводы через админку.
✔ Поддержка динамических строк.
Минусы:
✖ Медленнее, чем статические файлы.
✖ Сложнее в обслуживании.
5. Локализация в фреймворках
Популярные PHP-фреймворки предлагают встроенные решения:
Laravel
Использует файлы в resources/lang/
:
echo __('messages.welcome'); // Ищет в resources/lang/ru/messages.php
Symfony
Работает с XLIFF или YAML:
# translations/messages.ru.yaml welcome: "Добро пожаловать!"
Yii2
Поддержка .po и .php-файлов:
echo Yii::t('app', 'Hello'); // Ищет в messages/ru/app.php
6. Плагины и библиотеки
-
Loco Translate – для интеграции с WordPress/Drupal.
-
PHP-Intl – расширение для форматирования дат/чисел.
-
Symfony/Translation – можно использовать отдельно от фреймворка.
Вывод: какой метод выбрать?
Метод | Когда использовать? |
---|---|
Gettext | Крупные проекты, CMS, высокие нагрузки. |
JSON/Массивы | Небольшие сайты, SPA-фронтенд. |
База данных | Динамический контент (блоги, магазины). |
Фреймворки | Laravel/Symfony/Yii-разработка. |
Совет: Для максимальной гибкости комбинируйте методы (например, статичные строки через Gettext, а пользовательский контент — в БД).
Если нужна помощь с конкретным случаем — спрашивайте в комментариях! 🚀