Статьи

Закатывать рукава и вдаваться в мелкие мелочи I18n в WordPress

На прошлой неделе я рассказал об основных компонентах i18n в WordPress и о том, как каждая из этих частей сочетается.

Теперь давайте копнем немного глубже и посмотрим на реальный код, не так ли?

Локализация темы в WordPress

При локализации темы вы обычно обращаетесь только к текстовым строкам, которые появляются в разных местах вашей темы.

Поэтому давайте посмотрим на некоторый основной HTML-код, в котором есть несколько строк:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Localization Sample</title>
</head>

<body>
<p>My name is Mick.</p>
<p>I have a dog named Lacie.</p>
<p>My dog's name is Lacie, but we call her Bug.</p>
<p>Sometimes, we call her Buggers.</p>
<p>Lacie has a black coat.</p>

</body>
</html>

Не так много, чтобы увидеть здесь, правда. У нас всего пять различных строк текста, введенных в HTML-документ довольно общим способом. Однако мы можем локализовать эту страницу, просто заключив каждую строку в функцию _e()

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Localization Sample</title>
</head>

<body>
<p><?php _e( 'My name is Mick.', 'our-very-unique-domain' ); ?></p>
<p><?php _e( 'I have a dog named Lacie.', 'our-very-unique-domain' ); ?></p>
<p><?php _e( 'My dog's name is Lacie, but we call her Bug.', 'our-very-unique-domain' ); ?></p>
<p><?php _e( 'Sometimes, we call her Buggers.', 'our-very-unique-domain' ); ?></p>
<p><?php _e( 'Lacie has a black coat.', 'our-very-unique-domain' ); ?></p>

</body>
</html>

Это немного интереснее сейчас. Мы обернули каждую текстовую строку с помощью _e() Обратите внимание, что я использовал константу под названием our-very-unique-domain Когда вы начнете локализовать свои собственные темы и плагины, просто убедитесь, что вы понимаете, что на самом деле не имеет значения, как вы называете этот домен, если он уникален для вас, и вы инициализируете отношения с тем же уникальным именем. Как мы инициализируем отношения в functions.php Давайте посмотрим на код:

 <?php
load_theme_textdomain( 'our-very-unique-domain', TEMPLATEPATH.'/languages' );

$locale = get_locale();
$locale_file = TEMPLATEPATH."/languages/$locale.php";
if ( is_readable($locale_file) )
	require_once($locale_file);
?>

Как вы видите, в строке 1 мы запустили load_theme_textdomain()/languagesWPLANG Пока все хорошо, но теперь мы видим кучу вещей, которые говорят о локали. Локализация темы зависит от константы wp-config.phpwp-config.php

Локаль представляет собой комбинацию кода страны и языка, заданного средой gettext GNU — вы можете найти сокращения страны и языка в руководстве gettext.

Откройте ваш файл wp-config.php Например, если вы используете немецкий в качестве основного языка для своего сайта, вы увидите (или добавите вручную) строку в файле define ( 'WPLANG', 'de_DE');

de_DE

С установленным языковым стандартом WordPress (в данном случае de_DE.mo/languages<?php
/*
Plugin Name: Our Sample Plugin
Plugin URI: http://www.sitepoint.com/our-sample-plugin
Description: Sample localization code demonstration
Version: 1
Author: Mick Olinik
Author URI: http://www.sitepoint.com
License: GPL2
*/

add_action( 'init', 'olin_osp_init' );
function olin_osp_init() {
add_action( 'admin_menu', 'olin_osp_menu' );
}

function olin_osp_menu() {
add_options_page( 'Our Sample Plugin Options', 'Our Sample Plugin', 'manage_options', 'our-sample-plugin', 'olin_osp_settings' );
}

function olin_osp_settings() {
?>
<div class='wrapper'>
<h1>Our Sample Plugin Settings</h1>
<!-- Imagine that there is some really exciting functionality happening here -->
</div>
<?php
}
?>
<?php
/*
Plugin Name: Our Sample Plugin
Plugin URI: http://www.sitepoint.com/our-sample-plugin
Description: Sample localization code demonstration
Version: 1
Author: Mick Olinik
Author URI: http://www.sitepoint.com
License: GPL2
*/

add_action( 'init', 'olin_osp_init' );
function olin_osp_init() {
add_action( 'admin_menu', 'olin_osp_init' );
load_plugin_textdomain( 'our-very-unique-domain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
}

function olin_osp_menu() {
add_options_page( sprintf( __( '%s Options', 'our-very-unique-domain' ), 'Our Sample Plugin' ), 'Our Sample Plugin', 'manage_options', 'our-sample-plugin', 'olin_osp_settings' );
}

function olin_osp_settings() {
?>
<div class='wrapper'>
<h1><?php _e( 'Our Sample Plugin Settings', 'our-very-unique-domain' ); ?></h1>
<!-- Imagine that there is some really exciting functionality happening here -->
</div>
<?php
}
?>
Следовательно, файлы в нашем примере каталога тем могут в конечном итоге иметь структуру, которая выглядит примерно так:

Пример структуры файла локализации темы

Локализация плагина в WordPress

Локализация плагина очень похожа на локализацию темы. Давайте возьмем это сверху, посмотрев на очень простой плагин, который не был локализован.

 

Опять же, не так много, чтобы увидеть здесь действительно. Мы просто регистрируем наш плагин в WordPress, создаем меню администратора для наших пользователей, а затем добавляем страницу администратора для изменения настроек нашего примера плагина.

Однако, когда мы перейдем к локализации плагина, мы захотим внести некоторые ключевые изменения. Давайте посмотрим на тот же плагин с правильно локализованным кодом.

 

Первое, что нам нужно сделать, это инициализировать локализацию, и это концептуально то же самое для плагинов, как и для тем. В действии initload_plugin_textdomain()

Как видите, мы идентифицируем наш уникальный текстовый домен, а также местоположение файлов перевода, в данном случае папку /languages Затем мы можем, как обычно, подготовить строки для локализации в нашем коде, как в случае с темами.

Файлы для нашего примера плагина в конечном итоге могут выглядеть примерно так:

Пример структуры файла локализации плагина

Несколько слов о номенклатуре файлов .MO. Посмотрев на изображение выше, вы можете заметить, что номенклатура наших файлов .MO изменилась в плагине, в отличие от того, как мы пометили его в нашей теме.

При поиске скомпилированных файлов перевода .MO WordPress ищет другой синтаксис для локализаций тем, чем для локализаций плагинов. С локализацией темы вы захотите назвать ваш файл .MO в формате locale.mo Например, при переводе вашей темы на немецкий язык ваш файл перевода темы в каталоге /languagesde_DE.mo

С другой стороны, если вы локализуете плагин, WordPress будет искать файл перевода в указанном вами каталоге /languagespluginname-locale.mo В этом случае имя плагина напрямую соответствует текстовому домену, который вы назначили для локализации в вашем плагине. В соответствии с примерами, которые мы выложили выше, наш файл перевода будет называться our-very-unique-domain-de_DE.mo

Давайте сделаем перевод: Представляем Poedit!

Poedit — это очень популярный инструмент с открытым исходным кодом, который вы можете загрузить и установить на свой компьютер, чтобы помочь вам создавать и поддерживать все необходимые вам файлы.

Poedit автоматически отсортирует весь исходный код вашего плагина или темы и вернет все строки, которые вы определили как локализуемые с помощью функций _e()__() Затем нужно просто просмотреть каждую строку и предоставить перевод для конкретного языка. Давайте начнем с загрузки и установки Poedit с http://www.poedit.net/download.php .

Создание файла .POT

Если вы локализуете свой собственный плагин или тему, первое, что нам нужно сделать, это создать файл .POT. Чтобы освежить вашу память, файл .POT — это просто файл .PO, который не имеет каких-либо определений — он просто определяет строки, которые необходимо перевести. По умолчанию Poedit ищет файлы .POT, которые открываются и работают, когда переводчик впервые пытается локализовать ваш код, но, поскольку у нас его еще нет, нам нужно сделать его первым. Для этого запустите Poedit, нажмите « Файл», а затем выберите « Новый каталог», как показано на скриншоте ниже.

Poedit

При создании нового каталога первое, что вам нужно будет сделать, это вкладка « Информация о проекте ».

Вы можете заполнить это как угодно, но все, что действительно необходимо, это дать нашему новому каталогу имя проекта. Дайте ему имя, а затем нажмите на вкладку Пути .

Poedit

Теперь нам нужно создать путь к нашему файлу перевода. Этот путь относительно файла или файлов, которые переводятся.

Поскольку я считаю, что рекомендуется создавать отдельный каталог для ваших языковых переводов, я предпочитаю добавлять ../

Как только вы установили свой путь, перейдите на вкладку Ключевые слова, чтобы продолжить.

Poedit

На вкладке Ключевые слова нам нужно только определить элементы gettext GNU, которые мы использовали для подготовки наших строк к локализации в нашем коде. Опять же, ___e_n_x

Мне нравится удалять функции, которые мне не нужны, и поэтому я буду удалять каждую из функций, которые я не использую, как на скриншоте ниже.

Poedit

Это стандартная конфигурация ключевых слов, которая очень хорошо подходит для целей нашего обсуждения. Мы добавили только ___e

Сделайте свои дополнения и затем нажмите OK , как показано на скриншоте ниже.

Poedit

После нажатия OK , нам будет предложено сохранить нашу конфигурацию как новый файл .PO.

Перед сохранением файла обязательно перейдите в правильное местоположение в соответствии с тем, что вы указали на вкладке Пути в вашем каталоге. Poedit будет использовать местоположение, в которое вы сохраняете файл, в качестве ориентира при поиске файлов, в которые вы добавили строки локализации.

В нашем примере мы добавили путь ../ В то время как любой подкаталог подойдет, вы также можете использовать что-то описательное, например /languages/lang Сохраните файл .PO с именем, соответствующим вашей цели.

Просто для того, чтобы быть ловко креативным, я пошел дальше и использовал appropriate-name.po

Poedit

После сохранения файла Poedit использует заданный вами параметр пути для поиска и индексирования любых файлов, которые он видит. На этом этапе Poedit проверяет все доступные файлы по списку функций gettext, которые вы определили на вкладке Ключевые слова, и возвращает вам список переводимых строк.

В нашем примере ниже показан короткий список строк, вращающихся вокруг моей собаки и меня. Нажмите OK , и у вас будет пустой .PO-файл с несколькими определениями строк.

Poedit

Это сложная часть, и она необходима для создания файла .POT с помощью Poedit.

Прежде чем делать что-то еще, сохраните файл во второй раз.

Причина, по которой это необходимо, заключается в том, что когда Poedit изначально создает файл .PO, он сначала сохраняет файл, а затем импортирует переводимые строки. Если вам не удастся сохранить файл во второй раз и закрыть его, вы получите пустой .PO-файл, в котором нет переводимых строк, что приведет к поражению цели.

Как только вы сохраните свой файл .PO во второй раз (с добавлением переводимых строк), закройте файл и выйдите из Poedit. Не волнуйся — мы вернемся.

Poedit

Теперь перейдите к структуре каталогов, в которой вы сохранили файл .PO. Вы заметите, что на самом деле у вас есть два доступных файла: файл .PO, который вы создали, и файл .MO, который Poedit автоматически скомпилировал для вас, когда вы сохранили файл .PO.

Поскольку сначала мы хотим создать файл шаблона, нам не нужен файл .MO — просто удалите его. Затем просто переименуйте файл .PO в файл .POT.

Когда вы закончите, у вас будет только один файл .POT в каталоге /languages

Poedit

Теперь у нас есть файл .POT, так что давайте начнем переводить!

Если все, что вы хотите сделать, настроить свою тему или плагин так, чтобы его можно было легко локализовать другими, поздравляем! В этот момент у вас все готово, и вы можете двигаться дальше по жизни! До тех пор, пока вы включите свой новый блестящий файл .POT в правильный каталог, любой сможет работать с вашей темой или плагином и переводить ее на бесконечное количество языков.

Тем не менее, давайте предположим, что вы хотите сделать несколько переводов. Начните с запуска Poedit и вместо « Новый каталог» выберите « Новый каталог из файла POT» .

Poedit

Идите дальше и найдите файл .POT, который вы только что создали, откройте его и нажмите кнопку ОК, чтобы перейти к последующим настройкам каталога (они точно такие же, как вы сами). Затем Poedit спросит вас, что бы вы хотели сохранить как новый файл .PO.

Дайте ему соответствующее имя и сохраните его, как показано на скриншоте ниже.

Poedit

Это действительно ясно, с этого момента.

Просто нажмите на строку, которую вы хотите перевести в Poedit, и введите перевод в поле в нижней части окна Poedit, как показано на рисунке ниже.

Poedit

Мы будем мыть, полоскать и повторять эту процедуру, пока все строки не будут переведены. Редактировать строки так же просто … просто нажмите на строку, которую вы хотите редактировать, и внесите свои изменения.

Помните, что каждый раз, когда вы сохраняете файл .PO, новый файл .MO будет скомпилирован для вас. Это файл .MO, а не файл .PO, который WordPress будет использовать при переводе.

Poedit

Локализация звучит все хорошо и хорошо, но, случайно, нет более простого способа сделать это, не так ли?

WPML

Забавно, ты должен спросить это. Есть довольно крутой инструмент, который разрабатывался уже некоторое время и называется WPML (доступен на wpml.org ). Это премиальный плагин и стоит инвестиций.

WPML значительно сокращает время и усилия, необходимые для локализации вашей темы или плагина, по крайней мере, в контексте одного веб-сайта. Все, что вам нужно сделать, это правильно определить ваши строки локализации в вашем плагине или вашей теме, заключив их в теги __()_e() После того, как вы определите строковые идентификаторы, WPML вступит во владение, избавляя от хлопот настройки файлов .PO, .MO и .POT и выясняя, как добавить их в ваши файлы и темы.

Когда вы изначально запускаете WPML на своем сайте WordPress, WPML действует как Poedit и просматривает все ваши файлы тем и плагинов в поисках переводимых строк. После создания списка строк WPML просит пользователя определить, на какие языки должен переводиться веб-сайт, и автоматически создает необходимые файлы .PO и .MO, необходимые для поддержки каждого из них.

После этого WPML предоставляет действительно удобный интерфейс внутри бэкэнда WordPress, который дает вам возможность переводить как строки, так и целые записи и страницы. Более того, он также создает уникальные переведенные постоянные ссылки, так что ваши сообщения и страницы могут быть проиндексированы на нескольких языках по умолчанию!

Наконец, WPML также интегрирует систему управления переводчиками. Это позволяет вам нанимать профессиональных переводчиков для выполнения переводческих работ прямо на вашем сайте. Кроме того, вы можете использовать их систему управления, чтобы назначать конкретных сотрудников для выполнения перевода на определенный язык.