Для сайтов на WordPress часто требуется реализовать многоязычность, но стандартные решения, такие как плагины Polylang или WPML, не всегда подходят или вызывают сложности с производительностью и совместимостью. В этой статье мы рассмотрим, как можно создать собственный языковой переводчик для WordPress, который позволит гибко управлять переводами и интегрировать их напрямую в темы и плагины.
Почему стоит создавать собственный языковой переводчик для WordPress
Готовые плагины имеют много функций, но они могут быть избыточными для небольших проектов. Собственный переводчик даст полный контроль над процессом, минимизирует нагрузку и позволит оптимизировать работу под конкретные задачи. Кроме того, это отличный способ глубже понять внутренние механизмы локализации в WordPress.
Основные преимущества собственного решения:
- Минимум лишнего кода и зависимостей.
- Гибкая структура хранения переводов (например, в базе данных или JSON-файлах).
- Возможность интегрировать перевод непосредственно в шаблоны.
- Легкость расширения функционала под свои нужды.
Далее мы опишем основные этапы создания такого переводчика.
Как хранить переводы: базы данных, файлы или API?
Самый простой вариант — хранить переводы в JSON-файлах, где ключ — уникальный идентификатор текста, а значение — перевод на нужном языке. Это удобно для небольших сайтов и простых фраз.
Для более масштабных проектов лучше использовать собственные таблицы в базе данных с полями: key, language, translation. Это позволит быстро обновлять переводы и делать их динамическими.
Также можно интегрировать сторонние API переводов, например, Google Translate, для автоматического получения перевода. Но в этом случае важно предусмотреть кеширование и проверку качества перевода.
Создаем базовую функцию перевода для WordPress — wplangs_translate()
Начнем с создания простой функции, которая будет получать ключ и язык, а возвращать нужный перевод. Для примера используем JSON-файл с переводами, хранящийся в папке темы.
function wplangs_translate($key, $lang = 'ru') {
static $translations = null;
if ($translations === null) {
$file = get_template_directory() . '/languages/' . $lang . '.json';
if (file_exists($file)) {
$content = file_get_contents($file);
$translations = json_decode($content, true);
} else {
$translations = [];
}
}
return isset($translations[$key]) ? $translations[$key] : $key;
}Эта функция загружает перевод один раз и кеширует его в статической переменной. Если перевод для ключа не найден, возвращается сам ключ, что удобно для отладки.
Пример структуры JSON-файла перевода
Файл ru.json в папке /languages/ может выглядеть так:
{
"welcome_message": "Добро пожаловать на сайт!",
"contact_us": "Свяжитесь с нами",
"read_more": "Читать далее"
}Интеграция собственного переводчика в темы и плагины WordPress
Для применения перевода в теме достаточно заменить статичные строки вызовом wplangs_translate(). Например, вместо:
<h1>Добро пожаловать на сайт!</h1>пишем:
<h1><?php echo wplangs_translate('welcome_message', 'ru'); ?></h1>Для переключения языка можно добавить параметр lang в URL или настроить выбор языка через пользовательский интерфейс, сохраняя выбор в сессии или cookie.
Создаем простой переключатель языка
Добавим в тему следующий код для смены языка через параметр URL:
function wplangs_get_current_lang() {
if (isset($_GET['lang']) && in_array($_GET['lang'], ['ru', 'en'])) {
setcookie('wplangs_lang', $_GET['lang'], time() + 3600 * 24 * 30, '/');
return $_GET['lang'];
} elseif (isset($_COOKIE['wplangs_lang'])) {
return $_COOKIE['wplangs_lang'];
} else {
return 'ru';
}
}Теперь функцию перевода можно вызывать с текущим языком:
$lang = wplangs_get_current_lang();
echo wplangs_translate('welcome_message', $lang);Расширяем функционал: поддержка плейсхолдеров и параметров в переводах
Часто в переводах нужны динамические данные, например, имя пользователя. Добавим поддержку шаблонов с плейсхолдерами через функцию sprintf.
function wplangs_translate($key, $lang = 'ru', ...$args) {
static $translations = null;
if ($translations === null) {
$file = get_template_directory() . '/languages/' . $lang . '.json';
if (file_exists($file)) {
$content = file_get_contents($file);
$translations = json_decode($content, true);
} else {
$translations = [];
}
}
$text = isset($translations[$key]) ? $translations[$key] : $key;
if (!empty($args)) {
$text = sprintf($text, ...$args);
}
return $text;
}В JSON-файле можно писать такие строки:
{
"greeting_user": "Привет, %s! Добро пожаловать на сайт."
}И использовать их так:
echo wplangs_translate('greeting_user', 'ru', 'Анна'); // Выведет: Привет, Анна! Добро пожаловать на сайт.Как добавить поддержку перевода в плагины WordPress
Если вы разрабатываете собственный плагин и хотите использовать этот переводчик, просто подключите функции в начале плагина и используйте wplangs_translate() для всех текстов. Можно сделать универсальный класс для управления переводами и подключать его как зависимость.
Вот базовый пример класса для плагина:
class WPLangs_Translator {
private $lang;
private $translations = [];
public function __construct($lang = 'ru') {
$this->lang = $lang;
$this->load_translations();
}
private function load_translations() {
$file = plugin_dir_path(__FILE__) . 'languages/' . $this->lang . '.json';
if (file_exists($file)) {
$content = file_get_contents($file);
$this->translations = json_decode($content, true);
}
}
public function translate($key, ...$args) {
$text = isset($this->translations[$key]) ? $this->translations[$key] : $key;
if (!empty($args)) {
$text = sprintf($text, ...$args);
}
return $text;
}
}Использование:
$translator = new WPLangs_Translator('ru');
echo $translator->translate('welcome_message');Выводы и рекомендации по созданию собственного переводчика
Создание собственного переводчика — отличный способ получить полный контроль над многоязычностью на сайте WordPress. Это позволяет избежать сложностей с совместимостью плагинов и оптимизировать работу под свои задачи.
Рекомендации:
- Используйте кеширование переводов для повышения производительности.
- Выбирайте способ хранения переводов в зависимости от размера сайта и количества языков.
- Добавьте удобный интерфейс для управления переводами, если планируете масштабировать проект.
- Обязательно тестируйте вывод на разных языках, чтобы избежать ошибок форматирования.
Таким образом, вы сможете создавать гибкие и легкие решения для многоязычных WordPress-сайтов без лишних зависимостей.