Переклади (локалізація)

У цій статті поговоримо про те, як створювати та підключати файли перекладу, і як потім перекладати текст у плагінах та темах. Також тут я коротко розглянув деякі теоретичні моменти, часті помилки, як працювати з програмою Poedit. Та й дам деякі поради щодо перекладів.

Список локалей для всіх мов дивіться тут .


Що перекладати?

Перш ніж переходити до перекладу, давайте визначимося, що нам потрібно перекласти, тому що це впливає на те, як потрібно перекладати.

Переклад теми/плагіну з каталогу WordPress

Для такого перекладу потрібно використати сайт translate.wordpress.org . Що потрібно зробити:

  1. Авторизуватись.
  2. Вибрати потрібну мову перекладу
  3. Знайти плагін/тему, яку потрібно перекласти.
  4. І прямий на сайті перекладати.
  5. Після того, як ваш переклад буде перевірено, в адмінці вашого сайту WordPress ви введете оновлення перекладу для плагіна/теми.

    Примітка: оновлення з’явиться не раніше ніж 95% всього перекладу буде готовим. Щоб прискорити перевірку, можете написати на форум у розділ «переклади» або російськомовний slack на канал #translations .

  6. Оновлюємо. Переклад зроблено!

Нотатка: Не всі плагіни з каталогу підтримують переклад через translate.wordpress.org. У таких випадках потрібно перекладати як завжди (читайте наступний пункт).

Переклад теми/плагіна НЕ із каталогу WordPress

У цьому випадку потрібно:

  1. Відкрити папку плагіна і знайти файли перекладу. Це файл .po, .pot, .mo. Зазвичай вони лежать у папках languagesабо lang.
  2. Потім переходьте до “Етап 2” з цієї статті. Тобто. Вам потрібно буде створити .moфайл перекладу. Для створення такого файлу, використовуйте програму Poedit і .pot(якщо є в плагіні) або .poфайл (закидайте цей файл у Poedit і там створюєте переклад своєю мовою, зберігаєте його з правильною назвою). Або для створення .moфайлу можна використовувати плагін Loco Translate, він навіть зручніше (подробиці в цій статті не описані).

Переклад своєї теми/плагіна

Як це робиться і працює описано нижче в «Етап 1» та «Етап 2».

Якщо ви плануєте розміщувати вашу плагін/тему в каталозі WordPress. То рекомендується робити переклад через translate.wordpress.org. Докладніше про це читайте в посібнику (англ.) (подробиці цієї статті не описані).


Як працює переклад у WordPress (теорія)

Почати треба з найголовнішого – це файли перекладу. Їх буває три: .mo .po .pot. PHP працює тільки з .moфайлом, .poі .pot– для людей та програм перекладу.

  • .pot файл (Portable Object Template) – містить оригінальні рядки перекладу (без перекладу). Це шаблон перекладу. POT файл є основою для створення .poфайлу (для створення перекладу будь-якою мовою). POT файл не є обов’язковим файлом, переклад можна робити без нього – це просто шаблон. Як створити .pot файл читайте нижче .

  • .po файл (Portable Object) – містить оригінальні рядки перекладу і сам переклад цих рядків. Його можна змінювати в будь-якому текстовому редакторі або програмі (наприклад Poedit, з нею ми і будемо працювати нижче). З .po файл автоматично створюється .mo файл.

  • .mo файл (Machine Object) – скомпільований варіант PO файлу. Містить бінарні дані, які парсить WordPress і створює дані для перекладу окремих рядків. Використовується для перекладу тем/плагінів та імпортується до GNU gettext .

У WordPress для перекладу використовується лише файл .mo. Під час генерації сторінки цей файл підключається – з нього створюється PHP об’єкт з перекладами рядків і розміщується в пам’яті. Далі, при використанні функцій перекладу в коді, з цього об’єкта береться переклад рядка, що запитується.

Ось так це просто працює.

Таким чином, щоб перекладати рядки у темі/плагіні нам потрібно:

  1. Створити файл .mo та розмістити його у папку теми/плагіна. Або в глобальну папку перекладів .

  2. Підключити цей файл у темі/плагіні за допомогою однієї з функцій: load_plugin_textdomain() . (Якщо розміщується у глобальній папці підключати необов’язково, WP сам це зробить).

  3. Використовувати спеціальні функції перекладу : інші .

Важливо розуміти , що з підключенні .mo файлу йому задається ідентифікатор (параметр $domain ) і такий ідентифікатор (домен) вказується для функцій перекладу рядків. Домен пов’язує файл .mo із функціями перекладу. Тобто. при перекладі, функції ми вказуємо з якого MO файлу потрібно отримати переклад зазначеного рядка. Приклад:

// підключаємо MO файл перекладу та вказуємо йому ID - mydomain:
load_theme_textdomain( 'mydomain', get_template_directory() . '/languages' );

// Переводимо - знову вказуємо ID - mydomain:
_e( 'Comment:', 'mydomain');


Етап 1: Створимо свій плагін і переведемо його

Якщо у вас є готова тема/плагін і її простий потрібно перекласти, переходьте відразу до перекладу (етап 2).

Щоб процес перекладу був зрозумілим, давайте створимо дуже просто плагін і перекладемо його російською мовою. Назвемо плагін my-translation-demo. У нас має вийти така структура плагіна:

  1. У папці плагінів WordPress створимо папку my-translation-demo : /plugins/my-translation-demo.
  2. У цій папці створимо папку lang : /my-translation-demo/lang.
  3. Створимо файл my-translation-demo.php : /my-translation-demo/my-translation-demo.php.
  4. Додамо наступний код у створений php файл:
<?php

/**
 * Plugin Name: Demo WordPress translation
 * Description: Test plugin для розвідки про те, як створювати трансляції в WordPress
 * Автор: Kama
 * Version: 0.1
 * Text Domain: myl10n
 * Domain Path: /lang
 */

// Рядки для перекладу заголовків плагіна, щоб вони потрапили в .po файл.
__( 'Demo WordPress translation', 'myl10n');
__( 'Test plugin for learning how to create translations in WordPress', 'myl10n' );

// Підключення файлу перекладу
// тут .mo файл повинен лежати в папці /lang, що знаходиться в папці поточного файлу
// файл має назватися "$domain-локаль": myl10n-ru_UA.mo
add_action( 'plugins_loaded', function(){
	load_plugin_textdomain( 'myl10n', false, dirname( plugin_basename(__FILE__) ) . '/lang' );
} );

// сторінка адмінки
add_action( 'admin_menu', function(){

	add_options_page( __('Demo translation','myl10n'), __('Demo translation','myl10n'), 'manage_options', 'myl10n_plugin', function(){

		_nx_noop( '%s noop star', '%s noop stars', 'Контекст _nx_noop', 'myl10n' );
		_n_noop( '%s noop star', '%s noop stars', 'myl10n' );

		?>
		<div class="wrap">
			<h2><?php echo get_admin_page_title() ?></h2>
		</div>

		<h3><?= __( 'Different variants of translation in WordPress.','myl10n') ?></h3>
		<p class="description"><?= __( 'WordPress translation functions.','myl10n') ?></p>

		<p>_e() - <?php _e( 'Some translation text.','myl10n' ); ?></p>

		<p>_ex() - <?php _ex( 'Some translation text.','Фраза контексту _ex','myl10n' ); ?></p>

		<p>_x() - <?php echo _x( 'Some translation text.','Контенкст echo _x','myl10n' ); ?></p>

		<p>_n(1) - <?php printf( _n( '%s star', '%s stars', 1, 'myl10n'), 1); ?></p>
		<p>_n(3) - <?php printf( _n( '%s star', '%s stars', 3, 'myl10n' ), 3); ?></p>
		<p>_n(10) - <?php printf( _n( '%s star', '%s stars', 10, 'myl10n'), 10); ?></p>

		<p>_nx(1) — <?php printf( _nx( '%s star','%s stars', 1, 'Фраза контексту для множини _nx','myl10n' ), 1); ?></p>
		<p>_nx(3) — <?php printf( _nx( '%s star','%s stars', 3, 'Фраза контексту для множини _nx','myl10n' ), 3); ?></p>
		<p>_nx(10) — <?php printf( _nx( '%s star','%s stars', 10, 'Фраза контексту для множини _nx','myl10n' ), 10 ); ?></p>

		<p>esc_attr__() — <?php echo esc_attr__('string 1','myl10n') ?></p>
		<p>esc_attr_e() — <?php esc_attr_e('string 2','myl10n') ?></p>
		<p>esc_html__() — <?php echo esc_html__('string 3','myl10n') ?></p>
		<p>esc_html_e() — <?php esc_html_e('string 4','myl10n') ?></p>

		<?php

	} );

} );

Плагін готовий! Зайдемо до адмінки, активуємо плагін, перейдемо на сторінку плагіна.

У плагіні використовуються всі функції перекладу, які є у WordPress. А також підключається ще не існуючий .mo файл перекладу myl10n-ru_RU.mo. Після створення .mo файлу плагін буде переведено (його ми створимо нижче).

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

Зверніть увагу на параметри в заголовках плагіна . Їх потрібно вказати правильно, щоб на сторінці плагінів працював переклад для назви та опису плагіну.

* Text Domain: myl10n
 * Domain Path: /lang

Також для цього ми додаємо Назва та Опис до функцій перекладу, щоб парсер їх знайшов.

// Рядки для перекладу заголовків плагіна, щоб вони потрапили в .po файл.
__( 'Demo WordPress translation', 'myl10n');
__( 'Test plugin for learning how to create translations in WordPress', 'myl10n' );

Також, WordPress використовує параметр Text Domain:для пошуку файлу перекладу в глобальній папці перекладів . Там файл має називатися ДОМЕН-ПЕРЕВОДА_ЛОКАЛЬ.mo.


Етап 2: Переклад. Створення .mo .po файлів (під потрібну локаль)

Щоб створити MO файл нам потрібно мати готовий PO файл, тому вся задача зводитися до створення PO файлу.

Варіантів створити PO файл кілька, тут ми розглянемо роботу з програмою Poedit. Для початку потрібно завантажити Poedit і встановити його (безкоштовна версія дозволяє робити все, що нам потрібно).

Створити PO файл можна через Poedit, але ми створимо його нестандартно – так набагато простіше:

  1. Просто створимо файл з розширенням .po у папці lang нашого плагіна. Файл повинен мати назву ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.po, у нас це myl10n-ru_RU.po. (Створювати файл потрібно в кодуванні UTF-8).

    Саме така назва файлу вимагає функція load_plugin_textdomain() та мова перекладу (російська).

    • myl10n– це назва нашого перекладу (домен), який використовується у функції load_plugin_textdomain() .
    • ru_RU– це мова перекладу (локаль в WordPress, коли ми перемикаємось російською мовою).

    Для теми назва файлу має бути ЛОКАЛЬ.po , докладніше див. нижче.

  2. Відкриємо файл і скопіюємо в нього наступний текст (при збереженні не забуваємо про кодування UTF-8):

    msgid ""
    msgstr ""
    "Project-Id-Version: my-plugin-namen"
    "Last-Translator: Myname <[email protected]>n"
    "Language-Team: My Super Teamn"
    "Language: run"
    "Content-Type: text/plain; charset=UTF-8n"
    "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);n"
    "X-Poedit-SourceCharset: UTF-8n"
    "X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c ;esc_attr__;esc_attr_e;esc_html__;esc_html_en"
    "X-Poedit-Basepath: ..n"
    "X-Poedit-SearchPath-0: .n"
    "X-Poedit-SearchPathExcluded-0: node_modulesn"
    #"X-Poedit-SearchPathExcluded-0: jsn"
    #"X-Poedit-SearchPathExcluded-1: cssn"

    Пояснення щодо параметрів:

    • Project-Id-Version– Назва та версія проекту.
    • Last-Translator– Ім’я та email перекладача.
    • Language-Team– Назва команди перекладачів.
    • Language– мова на яку перекладає файл.
    • Plural-Forms– Форма множини.
    • X-Poedit-KeywordsList– Назви та параметри функцій, рядки з яких будуть взяті для перекладу. (Тут вказані всі можливі функції WordPress).
    • X-Poedit-Basepath– Основна папка. Файли в ній та її підпапках будуть переглядатися на наявність рядків перекладу. ..Дві точки тут означає, що основна папка знаходиться на рівень вище за папку поточного файлу. Так як .po файл у нас лежить у /lang папці, то папка на рівень вище – це коренева папка плагіна.
    • X-Poedit-SearchPath-0— папки (щодо основної), у яких потрібно переглядати файли. .точка тут означає, що потрібно переглядати всі файли.
    • X-Poedit-SearchPathExcluded-0– Тут можна вказати папку (щодо основної), де не потрібно переглядати файли.

      Всі ці параметри можна змінити з програми Poedit у будь-який момент. Для цього зайдіть Каталог > Свойствау Poedit.

      Докладніше про формат PO файлу дивіться у документації .

  3. Відкриємо встановлену програму Poedit і закинемо в неї наш поки що порожній файл .po .

  4. Вибираємо «Вилучити з вихідного коду».

Все, MO файл готовий! При натисканні на «Зберегти» він автоматично створиться поруч із збереженим .po файлом з такою самою назвою.

Переклад готовий та працює. Якщо тепер зайти на сторінку плагіна, всі рядки будуть переведені:

Чому зручно створювати .po файл вручну, а не через програму Poedit?

Тому що так швидше: в цьому випадку не потрібно вказувати ніяких налаштувань, можна просто скопіювати код (з пункту 2) у .po файл, закинути цей файл у Poedit, натиснути “Вилучити з вихідного коду”, потім “ОК” і перекладати. (Параметри можна змінити в самому po файлі, програма для цього не потрібна).

А щоб створити файл через Poedit потрібно:

  1. Відкрити Poedit.
  2. Вибрати: Файл > Создать....
  3. У вікні вибрати мову на яку перекладаємо.
  4. Вікно просто пропаде, а ми сидимо тупим “а що далі щось робити?”.
  5. А далі, потрібно натиснути на кнопку Зберегти , в провіднику, що з’явився, знайти папку теми зайти в папку lang , вписати назву файлу myl10n-ru_RU.po і натиснути ОК.
  6. Вікно знову пропадає, а ми далі тупимо “що тепер робити?”.
  7. А тепер потрібно натиснути кнопку: Вийняти з вихідного коду . Відкриється вікно, де потрібно виставити налаштування для PO файлу. Все те, що написано в коді для PO файлу вище: назва проекту, команда проекту, кодування, папки де збирати рядки перекладу, ключові слова для пошуку рядків перекладу. Загалом, тут треба буде повозитись і не помилитися.

    Після того, як налаштування виставлені тиснем «ОК».

  8. Далі чекаємо поки, що рядки перекладу збираються з файлів проекту і ми потрапляємо у вікно перекладу рядків (скрин вище). Перекладаємо рядки, тиснемо Зберегти .
  9. Переклад та MO файл створені!


Оновлення перекладу (при зміні коду)

Тут все дуже просто:

  1. Відкриваємо Poedit .
  2. Закидаємо в нього будь-який PO файл із проекту і тиснемо «Оновити з коду» (кнопка на панелі).
  3. Перекладаємо нові рядки і тиснемо “Зберегти” (кнопка на панелі).
  4. Переклад оновлено! Можна закрити Poedit.


Створення POT файлу

.pot файл – це шаблон перекладу. Це пряма копія .po файлу, тільки коли не переведено жодного рядка. Тобто. всі рядки перекладу отримані з файлів проекту, але нічого не переведено.

З вищесказаного слід, щоб створити POT файл потрібно пройти всю процедуру створення .po файлу, і під кінець нічого не перекладати, а зайти в Файл > Сохранить какі зберегти файл з розширенням .pot .

Створити файл POT можна ще простіше. Взяти .po файл і змінити йому розширення на .pot . Це грубий метод, але такий файл з перекладеними рядками теж можна використовувати як шаблон для створення перекладу на будь-яку мову (принаймні так працює Poedit).

Навіщо потрібний .pot файл?
Для того, щоб був один файл, в якому завжди актуальні рядки перекладу. Щоб використовувати його як основу для створення перекладу черговою мовою.

Наприклад, якщо PO і MO файли перекладу розміщуються в глобальній папці перекладів, то ми не можемо закинути PO файл у програму і натиснути «Оновити з коду», тому в PO файлі швидше за все шлях до файлів плагіна буде неправильний (або його там взагалі не буде ) та рядки перекладу оновитися не зможуть. У цьому випадку використовується POT файл, який завжди повинен лежати в папці плагіна і при зміні коду в ньому потрібно оновлювати рядки перекладу, тому ми завжди матимемо актуальні рядки перекладу.

Повторюся: якщо PO файл лежить у папці плагіна, то файл POT не потрібен, переклад можна створити з PO файлу.


Підключення .mo файлу перекладу

Як підключити MO файл у плагіні, вже є в коді плагіна вище. А тут я наголосю на функціях WordPress для підключення цього файлу. Функції:

load_plugin_textdomain( $domain, false, $plugin_rel_path )
Підключає MO файл із плагіна. Обгортка для
load_textdomain() . Спочатку шукає MO файл у спільній папці перекладів плагінів:
/wp-content/language/plugins. Файл має називатися
ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo.
load_muplugin_textdomain( $domain, $plugin_rel_path )
Підключає MO файл із
MU плагіна . Обгортка для
load_textdomain() . Спочатку шукає MO файл у спільній папці перекладів плагінів:
/wp-content/language/plugins. Файл має називатися
ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo.
load_theme_textdomain( $domain, $path )
Підключає файл MO з теми. Обгортка для
load_textdomain() . Спочатку шукає MO файл у спільній папці перекладів тем:
/wp-content/language/themes. Файл повинен називатися
ЛОКАЛЬ.mo(коли файл усередині теми) та
ПАПКА_ТЕМЫ-ЛОКАЛ.mo(коли файл у спільній папці).
load_child_theme_textdomain( $domain, $path )
Підключає MO файл із дочірньої теми. Обгортка для
load_theme_textdomain() .
load_textdomain( $domain, $mofile )
Підключає MO файл із будь-якого місця (потрібно вказати повний шлях до MO файлу, разом із назвою файлу).

Розглянемо приклади підключення до MO файлів.

Мається на увазі, що код підключення буде розташований в основному файлі плагіна/теми або у файлі, який знаходиться в кореневій директорії плагіна/теми. Якщо це не так, __FILE__ потрібно замінити на відповідний шлях.

//Файл перекладу плагіна.
// файл має називатися: ДОМЕН-ЛОКАЛЬ.mo, наприклад: myl10n-ru_RU.mo
add_action( 'plugins_loaded', function(){
	load_plugin_textdomain( 'my-plugin', false, dirname(plugin_basename(__FILE__)) . '/languages' ) );
});

// Файл перекладу MU плагіна.
// файл має називатися: ДОМЕН-ЛОКАЛЬ.mo, наприклад: myl10n-ru_RU.mo
load_muplugin_textdomain( 'my-plugin', dirname(plugin_basename(__FILE__)) . '/languages' ) );

//Файл перекладу теми.
// файл повинен мати назву поточної локалі, наприклад: ru_RU.mo
add_action( 'after_setup_theme', function(){
	load_theme_textdomain( 'my_theme', get_template_directory() . '/languages' );
});

// будь-який файл перекладу
// Підключаємо файл .mo (назва файлу: ru_RU.mo або інше залежить від локалі)
add_action( 'plugins_loaded', function(){
	$mo_file_path = dirname(__FILE__) . '/lang/'. get_locale(). '.mo';
	load_textdomain( 'mytranslate', $mo_file_path );
}

Не обов’язково підключати функції на хуки, але в прикладах я все ж таки зробив як рекомендується.

Примітка: якщо файл перекладу розміщується у глобальній папці перекладів , ці функції можна не використовувати. WordPress автоматично підключає файли перекладів із глобальної папки, спираючись на параметр Text Domain:у заголовку плагіна.

Дивіться також всі функції пов’язані з підключенням MO файлів .


Функцій перекладу

Як використовувати функції перекладу, вже є у коді плагіна вище. А тут я опишу кожну функцію (докладний опис читайте у описі функції).

__( $text, $domain )
Перекладає вказаний текст та повертає його для обробки.
_e($text, $domain)
Перекладає вказаний текст та виводить його на екран.
_x( $text, $context, $domain )
Перекладає вказаний текст з урахуванням зазначеного контексту та повертає його для обробки.
_ex( $text, $context, $domain )
Перекладає вказаний текст з урахуванням зазначеного контексту та виводить його на екран.
_n( $single, $plural, $number, $domain )
Отримує рядок перекладу однини або множини, яка відповідає зазначеному числу (1 коментар, 2 коментарі).
_nx( $single, $plural, $number, $context, $domain )
Отримує рядок перекладу однини чи множини з урахуванням зазначеного контексту.
_n_noop( $singular, $plural, $domain )
Функція пустушка. Аналог
_n() . Використовується коли потрібно визначити рядки перекладу для множини, але використовувати їх десь пізніше в коді. Результат, який повертає функцію, потрібно обробляти функцією
translate_nooped_plural() . Результат цієї функції, наприклад, зручно використовувати в параметрах, коли ми заздалегідь не знаємо, яке буде число і потрібно зробити переклад пізніше.
_nx_noop( $singular, $plural, $context, $domain )
Теж що _n_noop(), лише з контекстом.
esc_attr__( $text, $domain )
Переклад значень атрибутів HTML тегів. Скорочення для
esc_attr( __() ).
esc_attr_e( $text, $domain )
Теж що
esc_attr__() тільки відразу виводить результат на екран.
esc_html__( $text, $domain )
Переклад тексту, в якому можуть бути HTML теги. Скорочення для
esc_html( __() ).
esc_html_e( $text, $domain )
Теж що
esc_html__() тільки відразу виводить результат на екран.


Помилки при використанні функцій перекладу

#1 Не можна використовувати змінні/константи у параметрах перекладу

Тому що програми вміють ширяти тільки рядки, але не змінні. Програми не аналізують, що там у вказаній змінній, а просто сканують код як текст і витягують рядки для перекладу.

// Так
_e( 'Hello World!', 'mydomain');

// Ні
_e ($ string, 'mydomain');
_e ( 'Hello World!', $ Domain);
_e ( 'Hello World!', DOMAIN);

#2 Не використовуйте HTML у рядках перекладу (якщо це можливо)

Наприклад, якщо вказати <div> у рядку перекладу і перекладач помилиться, HTML розмітка може «зламатися». Або якщо вказати посилання <a> , перекладач на його місце може поставити свою або просто неправильно її написати. Або будь-який HTML тег можна не закрити і ми спіймаємо дуже неприємний баг верстки.

У 90% випадків HTML теги можна і потрібно виносити за межі рядка перекладу, розглянемо кілька прикладів:

// Так
echo '<h1>'. __( 'Hello World!', 'mydomain' ) .'</h1>';

// Ні
_e( '<h1>Hello World!</h1>', 'mydomain' );
// Так
echo str_replace( '<a>', '<a href="http://example.com/portfolio">'), __( 'See <a>my portfolio</a>', 'mydomain' ) );

// Ні
_e( 'See <a href="http://example.com/portfolio">my portfolio</a>', 'mydomain' );

#3 Не діліть фразу на окремі слова

При перекладі рядків у програмі наскільки можна має бути зрозуміло про що мова. Але якщо розділити рядок на частини, окремі слова можуть стати не зрозумілими:

// Так
echo sprintf( __( 'I am %d today', 'mydomain' ), $years );

// Ні
echo __('I am', 'mydomain'). $years . __( 'today', 'mydomain');

#4 Не залишайте прогалини в кінці/початку рядка (якщо це можливо)

При перекладі прогалини на кінцях часто не помітні і їх можна пропустити, після перекладу буде «залипуха». Тому краще виносити пробіли в код.

// Так
_e( 'Book name:', 'mydomain' ) .' '. $book_name;
// Так
_e( 'Book name:', 'mydomain' ) ." $book_name";

// Ні
_e( 'Book name: ', 'mydomain') . $book_name;


Переклад множини

У плагіні вище вже є приклад як перекладати рядки де використовуються числа. Тут я на цьому зроблю акцент.

Для перекладу рядків з числами, коли потрібно отримати різні переклади в залежності від числа, WordPress використовується функція _nx() (з контекстом). Вона поверне різний варіант рядка, залежно від зазначеного числа. Наприклад:

printf( _n( '%s star', '%s stars', 1, 'myl10n' ), 1); //> 1 зірка

printf( _n( '%s star', '%s stars', 3, 'myl10n' ), 3); //> 3 зірки

printf( _n( '%s star', '%s stars', 10, 'myl10n' ), 10 ); //> 10 зірок

Однак, щоб усе це правильно працювало, потрібно:

  1. У налаштуваннях .po файлу правильно вказати форму множини. Ми її вказали в параметрі Plural-Forms:

    "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);n"

    Варіанти Plural -Forms для різних мов .

  2. У налаштуваннях .po файлу правильно вказати шаблони пошуку функцій:

    • _n:1,2– Для функції _n() . 1 і 2 – це параметри функції для множ. та єдиний. числа.
    • _nx:1,2,4c– Для функції _nx() . Тут 4с – означає, що 4 параметр функції це рядок контексту.

  3. Під час перекладу правильно перекласти рядки. Для російської потрібно вказати три варіанти для перекладу одного рядка.


На закінчення


Розміщення файлу перекладу у глобальній папці

WordPress має спільну папку для файлів перекладу: /wp-content/languages. У ній лежать файли перекладу WordPress, а також можуть лежати файли перекладів тем і плагінів (це працює в WordPress за замовчуванням).

Усі функції підключення MO файлів (крім load_textdomain() ) спочатку перевіряють наявність файлу перекладу в спільній папці, і тільки потім шукають його в папці плагіна або теми. Це чимось схоже на ієрархію файлів шаблону , тільки тут ієрархія файлів перекладу.

Загальна папка перекладів для:

  • плагінів /wp-content/languages/plugins/ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo.
  • тим /wp-content/languages/themes/ДОМЕН_ПЕРЕВОДА-ЛОКАЛЬ.mo.

У такі спільні папки, наприклад, завантажується та оновлюється переклад плагіна, який знаходиться у каталозі плагінів WordPress. Ви напевно бачили перекладені плагіни, в яких немає файлів перекладу (це ця тема). Як я писав на початку статті плагіни з каталогу, можна перекладати через сайт translate.wordpress.org .

Примітка: якщо файл перекладу є у глобальній папці, то в плагіні його підключати через функції load_(plugin/theme)_textdomain() не обов’язково! WordPress автоматично його підключить, спираючись на параметр Text Domain:у заголовку плагіна.


Терміни пов’язані з перекладом

Деякі терміни потрібно знати. Це найголовніші (скороченням цих термінів у WordPress названі деякі функції та хуки):

  • Інтернаціоналізація (internationalization – i18n) — процес зміни програмного забезпечення, щоб воно не було прив’язане до однієї мови. Тобто. це весь комплекс функцій та класів ядра WordPress, що дозволяє перекладати сайт різними мовами.

  • Локалізація (localization – l10n) — процес додавання відповідних ресурсів у програмне забезпечення для підтримки певної мови/локалі. Тобто. це сам процес перекладу різними мовами.

  • Локаль (locale) – це зв’язування мови та діалекту в регіоні. Зазвичай під локаллю розуміється просто мова, скажімо, російська. Але англійська, наприклад, може бути English (US) або English (UK) – мова одна, локалі різні… Локаль визначається як КОД_ЯЗЫКА_КОД_СТРАНЫ(ru_RU) або код мови в стандарті ISO 639-3(rus).


Плагін для перекладу

Loco Translate – відмінний плагін для створення перекладу (.mo файлу). Цей плагін повністю замінює програму Poedit. Він дозволяє створювати переклади для чого завгодно тим, плагінів або окремих MU плагінів. Плагін можна активувати, перекласти що потрібно і деактивувати, щоб не «заважав».

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *