Не звертати уваги на інші мови при розробці вашої теми WordPress дуже просто, але це погана звичка, і вона миттєво відкидає цілий ринок WordPress користувачів, і потенційні тисячі доларів втраченого прибутку. З ТОП-10 країн, які шукають WordPress теми в Google, лише одна англомовна (США), решти – 9. У момент написання цієї статті в базі даних тем WordPress з більш ніж 1500 тем було всього 269, які позначені як готові до перекладу Тобто всього 18%. Я покажу вам, як зробити вашу тему однією з них.
Як це працює
Зазвичай, коли ви створюєте тему, ви просто пишете безпосередньо в коді будь-який текст теми, наприклад, повідомлення про 404 помилки у файлі 404.php або мітки типу «Коментарі:» aбо «автор». Якщо користувач теми, наприклад, німець або російська, ці частини теми все одно відображатимуться англійською.
Вирішення цього питання – повертати або показувати ці тексти, використовуючи одну з чотирьох функцій WordPress, які розроблені для відсилання до мовному файлу за потрібним текстом. Коли ваш текст містить ці функції, ви можете створити файл, який містить усі переклади, і до якого будуть звертатися щоразу, коли тема завантажується.
Ось три файли перекладів, які ми використовуємо:
- .горщик (Portable Object Template) – шаблон, який містить посилання на кожний рядок тексту у вашій темі, яка потребує перекладу. Файл не містить перекладу. Це типовий текстовий файл.
- .po (Portable Object) – створений з .pot файлу, .po містить усі рядки та їх переклади однією конкретну мову. Це також текстовий файл, який можна редагувати.
- .mo (Machine Object) – бінарна версія .po файлу. При використанні машинного коду файл може використовуватися набагато швидше, ніж текстовий його варіант.
Крок 1. Чотири функції
Кожна з чотирьох функцій вимагає щонайменше один аргумент – текст, який потрібно перекласти. Функції:
- __ () – (два нижні підкреслення) базова функція, яку ви будете використовувати в більшості випадків. Повертає текст правильною мовою.
- _e () – те саме ,що __() , але вона виводить текст замість того, щоб повертати його.
- _n() – використовується, коли текст може бути у множині, наприклад, якщо ви хочете показати, скільки коментарів було залишено, ви можете захотіти вивести «Х відгук» aбо «Х відгуків», Залежно від того, скільки буде коментарів.
- _x() – корисна функція у разі, якщо переклад слова залежить від контексту. «пошта» може означати запис або «розмістити», Залежно від контексту. Для перекладача важливо знати, що ви маєте на увазі, щоб переклад був точним. _x() в основному використовується для окремих слів.
__ () и _e ()
Це найпростіші функції перекладу, які може запропонувати WordPress. Давайте розглянемо приклад для кожної функції:
<?php if( is_single() ) { //If this is a "post" echo __( 'This is a post.' ); } ?>
<?php if( is_single() ) { //If this is a "post" _e( 'This is a post.' ); } ?>
Обидві ці функції роблять те саме. Твердження "this is a postперевіряється на наявність у файлі .mo та повертається результат.
__ () и _e () вимагають лише один аргумент, який їм потрібно передати, – текст для перекладу. Єдина різниця між цими функціями — для __ () потрібен вираз нудьгувати. Давайте розглянемо приклад, де __ () працює краще, ніж _e ():
<?php the_content( __( 'Click here to read more' ) ); ?>
Замість передавати рядок функції _content(), ми використали __ (), щоб текст можна було перекласти. Якби ми використовували натомість _e ()замість того, щоб передати текст у the_content (), Переведення тексту було б виведено в документ, що могло б викликати різного роду неприємності.
_n()
Що, якщо у вас ситуація, коли текст, який ви виводите, може мати множину чи одиничне число, якХ відгуків» у прикладі вище? Замість того, щоб давати два рядки тексту для перекладу, ви можете сказати, що у вас є частина тексту, для якого потрібен переклад у поодинокій і множинні. Наступні два приклади виводять для користувача один і той самий результат:
<?php if(get_comments_number() == 1) { _e( 'There is a comment' ); } else { _e( 'There are comments' ); } ?>
<?php echo _n( 'There is a comment' , 'There are comments' , get_comments_number() ); ?>
_n() вимагає три аргументи. Перший – версія тексту в поодинокій кількості, другий – у множині, а третій – кількість, до якої він належить. В даному випадку, get_comments_number() визначає, скільки коментарів є до поста і потім _n() вибирає відповідний текст.
_x() и _ex()
Припустимо, ви перекладаєте .горщик файл і ви проходите повз слово "прокруткиВи інтерпретуєте його як «шматок скрученого паперу» або «прокрутити сайт»? Ви можете використовувати контекст, щоб пояснити, як його потрібно перекладати. Ці функції дадуть вам таку можливість своїм другим обов'язковим атрибутом, який вимагає короткий опис фрази або слова. наприклад:
<?php echo _x( 'post link' , 'A link to the post' ); _ex( 'post link' , 'Submit a link' ); ?>
Приклад показує вам різницю між _x() и _ex(). Це теж e, як у функції _eщо змушує функцію виводити результат замість того, щоб повертати його. Для обох функцій перший параметр – наш текст, який потрібно перекласти, а другий – коментар або замітка про текст, що перекладається, щоб позначити точно, про що йдеться.
Просунуті методики
Припустимо, у нас ситуація, коли текст, який ви хочете генерувати, складається з текстового рядка, який є результатом функції або значення змінної десь усередині неї. Вам, можливо, захочеться написати щось на кшталт такого:
<?php $color = the_color(); _e( "You have chosen the $color theme" ); ?>
Коли ви створюватимете ваш .горщик файл, POEdit проігнорує це, оскільки не хоче використовувати змінну всередині пропозиції. У .горщик файл додасться You have chosen the $color theme, але коли відбуватиметься пошук перекладу, коли скрипт виконується, шукатиметься рядок You have chosen the blue theme, яка не буде знайдена. Ось що ми зробимо:
<?php $color = the_color(); echo __( 'You have chosen the ' ) . $color . __( ' theme.' ); ?>
Таким чином, скрипт зможе отримувати переклади, але тепер стало складніше перекладати, оскільки пропозиція розбита. Ця пропозиція може навіть не мати перекладу деякими мовами, які сильно відрізняються синтаксисом, наприклад, німецькою, де їх переклад слова “вибраний” має бути наприкінці пропозиції. Вам потрібно пояснити, що ці два окремі текстові рядки є частиною одного, і що “тема” може не перекладатися як “тема".
Рішення – використовувати один текстовий рядок. Тут знадобляться функції printf () або sprintf (). Давайте подивимося, на що має бути схожий наш код:
<?php echo sprintf( __( 'You have chosen the %s theme.' ) , the_color() ); printf( __( 'You have chosen the %s theme.' ) , the_color() ); ?>
Це не тільки вирішить нашу проблему, але й буде набагато акуратнішим за виконанням, а також використовує лише один рядок коду. Перший аргумент функцій printf () або sprintf () – рядок для виведення, який включає щонайменше один заповнювач, у даному випадку %s (що означає малий тип “рядок”), а всі інші аргументи – змінні, які треба вставити до початкового рядка.
Є багато різних заповнювачів, які ви можете використовувати всередині рядки, ви можете знайти повний список по спринт в PHP керівництві. Зверніть увагу, що відмінність між printf () и sprintf () подібно до відмінності між _e () и __ () відповідно.
Крок 2. Введення у POEdit
Тепер, коли ви правильно помітили весь текст, що виводиться у вашій темі, вам потрібно зібрати цю інформацію в .горщик файл. POEdit - фантастична програма, яка дає можливість створювати ваш .горщик файл і також надає простий у використанні GUI, який можна використовувати для створення ваших .po і, що ще важливіше, також .mo файлів.
По-перше, вам потрібно скачати POEdit, який ви можете знайти для Windows, Mac і Linux за цій за посиланням.
Коли POEdit встановлено, ви можете створити файл .горщик. Щоб зробити це, перейдіть до File → New Catalog. Ви побачите діалогове вікно, де потрібно буде ввести базові дані. У вкладці "Інформація про проект" - назва проекту та ваша мова/країна. Ви також можете ввести в блоці "Форми множини"наступне:
Форми множини: nplurals = 2; plural=n != 1;
У вкладці "Шляхивведіть шлях, де можуть бути знайдені файли, по відношенню до місця, де лежить цей файл.горщик файл. Наприклад, якщо ви розміщуєте файл .горщик в кореневій папці теми, введіть . (Точку). Якщо ви бажаєте розмістити .горщик файл у папці "мовавсередині кореневої папки теми, введіть .. (Дві точки).
Тепер вам потрібно повідомити POEditякі ключові слова шукати при скануванні наших файлів. Введіть наступне:
- __
- _e
- _n:1,2
- _x:1,2c
- _ex:1,2c
: 1,2 - Вказує POEdit, що ці ключові слова складаються з двох частин. За замовчуванням, другий аргумент – множина, якщо ви не включили c, що означає, що другий аргумент - коментар.
Тепер натискайте «ОК» та вибирайте місце для збереження вашого .горщик файлу. Запам'ятайте, що він повинен співвідноситися із шляхом, який ви визначили раніше. POEdit тепер просканує ваші файли, щоб знайти всі місця, де зустрічаються ваші функції перекладу та збереже їх без перекладу у ваш .горщик файл.
Якщо ви хочете забезпечити мінімальну підтримку міжнародного перекладу, ви можете надати ваш .горщик файл разом з темою та на цьому зупинитися, але якщо ви можете перекласти тему іншою мовою самостійно, ви можете надати свою тему з підготовленим перекладом, як описано на кроці 3.
Крок 3. Переклад та створення свого .po файлу
- Список всіх рядків для перекладу.
- Поточний рядок, що перекладається.
- Ваш переклад рядка.
- Єдине та множина поточного рядка.
- Вкладки для перемикання між одниною та множиною.
- Ваш переклад.
Коли ви переклали всі рядки в .горщик файл, ви можете зберегти це у вашому .po файл. Будь-який рядок, для якого ви не зробили переклад, відображатиметься оригінальною мовою під час перегляду теми.
Назви файлу .po має ключове значення. Отримати текст використовує стандарт ISO 639 для абревіатур мов та ISO 3166 для локалізацій. Якщо ваш переклад зроблено американською англійською, наприклад, ваше ім'я буде виглядати за типом en-US.po. Великі букви у разі теж важливі. Повний список мов та кодів країн є за посиланнями:
- Gettext коди мов
- Gettext коди країн
Як тільки ви зберігаєтеся, POEdit за замовчуванням автоматично створює .mo файл крім .po файлу. Рекомендується включати всі три файли на вашу тему, щоб люди могли створити свої переклади і легко редагувати існуючі.
Крок 4. Налаштування WordPress
Давайте підіб'ємо підсумок, що ви вже зробили. Ви сказали WordPress про весь текст, який ви хочете зробити доступним для перекладу, потім ви використовували POEdit для збору всіх рядків та поміщення їх у файл .горщик, який може бути переведений у файлах .po и .mo. Ці файли потім були включені до файлів теми.
Останній крок – це запакувати вашу тему, встановити її та дати WordPress зрозуміти, .mo файл якої мови ви хочете використати. Це дуже проста процедура, де ви звертаєтесь до файлу WP-config.php у кореневій папці вашого WordPress.
/** * WordPress Localized Language, defaults to English. * * Change this to localize WordPress. A corresponding MO file for the chosen * language must be installed to wp-content/languages. For example, install * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German * language support. */ define('WPLANG', '');
Ваш файл має вже містити define('WPLANG', ''); але якщо цього немає, ви можете додати. Вам просто потрібно додати свою мову та код локалізації в визначати. Якщо ви перекладали вашу тему російською, у вас буде наступне:
define('WPLANG', 'ru_RU');
Вашу роботу закінчено! Не забудьте додати ваш .горщик файл у вашу тему, і якщо ви можете перекласти вашу тему іншою мовою, включити також файли .po и .mo.
Коментарі до запису: 25
Такий ось попит: А якщо ручками всі тексти у файлах шаблону змінив на мову, яка потрібна (наприклад російська), то чи можна видалити папку – languages з теми? Або якщо її просто видалити, щось порушиться? Раптом вона якось, десь у якомусь файлі прописана і якщо її не буде, то в движку буде помилка.
Або як?
Якщо видалити папку languages, то завжди буде використовуватися мова, яка прописана в коді файлів самої теми. Нічого не порушить.
Спасибі вам за відповідь.
Просто цікаво чи впливає на швидкість роботи блогу ця папка (її присутність чи відсутність) languages чи ні?
Ось уже є готовий до перекладу файл en_US.po у складі теми. Як цією бісовою прогою його перекласти? Відкриваю цей файл у програмі – бачу відповідно список усіх слів. Перекладаю внизу будь-яке слово, зберігаю. Видає купу помилок!
Все взагалі написано правильно, тільки працювати це не буде :-) Тут пропущений досить важливий крок без якого WordPress не буде дивитися на всі ваші мовні файли.
Я знайшов цей опис, в якому не пропущено крок з реєстрацією «load_theme_textdomain»
Дякую! Корисна стаття!
Вітаю!
Все робив за Вашою інструкцією. Нічого не вийшло.
Робив через POEdit, все перевів, зайшов до себе на хостинг (ру-центр)
файловий менеджер і додав файл .mo, оновив сайт, все також нічого не
перевелося. Також, додавав і .po, не вийшло. Підкажіть, як правильно
перекласти, тому що робив все за інструкцією і не вийшло
:(
Файл додавав до папки з темою, в корінь.
Після збереження перекладу у вас на виході має бути 2 файли: .po та .mo. Причому вони повинні мати специфічне закінчення в назві, так для російської файли повинні називатися ru_RU.po і ru_RU.mo. Далі заливати їх потрібно не в корінь з темою, а в папку languages, що в корені теми. Якщо такої папки немає, її потрібно створити.
Спасибі за відповідь!
Так, такі файли з'явилися, обидва файли я закинув через файловий менеджер на свій хостинг, /themes/моя тема/languages. Обидва файли туди злив, там вже був файл .pot З ним я так зрозумів нічого робити не потрібно було. Оновив тему, все одно нічого не перевелося, скажіть, у чому може бути проблема? Я не зовсім фахівець у цьому, робив урок, але нічого не вийшло. Переклад до того ж вийшов, все вийшло. Я відкривав одразу в POEdit і перекладав кілька десятків слів та фраз. Я вичитав в інтернеті, що після всього цього потрібно в темі знайти functions.php здається і вставити цей рядок для виклику load_theme_textdomain(domain-name) через Notepad, щоб тема змогла підключитись до цієї мови, це правда? Так я ще не куштував, бо не зовсім зрозумів куди, що й навіщо вставляти. Якщо просто додати ці два файли в папку languages самої теми, повторюся, то нічого не відбувається, всі фрази в темі залишаються англійською, хоча тема була готова до перекладу, я її знайшов якраз на вашому сайті з посиланням на themeforest :)
Допоможіть, будь ласка, дуже вже хочеться щоб вона запахала російською, так як переклад готовий, але мабуть щось потрібно підключити кудись!
Нічого додатково прописувати у функціях не потрібно. Переконайтеся, що у файлі wp-config.php у корені сайту прописаний правильний ідентифікатор define('WPLANG', 'ru_RU');
Знову перевів, на руках ru_RU.mo і ru_RU.po, обидва файли додав у папці з темою, а саме в папку languages, там був уже .pot рідний файлик. Перевірив wp-config, там уже так було. Перезапустив сайт, навіть тему заново залив (не через фтп-клієнт, а всередині адмінки вордпресу), все одно всі фрази залишилися англійською, не конектить він щось. Написав розробникам цим, вони відповіли, що тема готова до перекладу. Загалом плутанина повна, дякую за відповіді та допомогу, мабуть я зовсім криворукий, все роблю за схемами, толку немає :(
Ось, до речі, та тема, знайшов на вашому сайті в стрічці новин і відразу перейшов купити:
http://themeforest.net/item/super-agency-responsive-wordpress-single-page/3617215
Знаєте, зробив все з 0, начебто вийшло!
Вкотре дякую вашому чудовому сайту, інфу черпаю тільки з нього!! Дякую!
Єдине перевелося частинами якось щось залишилося на англ, 130 фраз перекладав, а вперше вийшло менше 30-40. Мабуть, того разу директорію вказав неправильно. Переклав і два файли скину в потрібну папку, принаймні все меню налаштування теми стало російською, а те, що відображається відвідувачам, місцями чомусь, хоча б вже щось.
У PoEdit відкрийте ваш ru_UA.po і натисніть Каталог - Оновити з .pot файлу - повинні завантажитися всі пропущені локалізації.
Спасибі!
Дітлахів, таке питання, тему вдалося перекласти і справді, встановив, вже все працює. Але якщо вийшов апдейті на преміум тему, наприклад, днями (меня поштою встановили), але в адмінці не пропонується оновити цю тему. Як її тоді можна оновити? Не зміг знайти тут жодної статті з оновлення тем. Підкажіть, будь ласка, дуже вдячний. Не хотілося б втратити налаштування усі мої, які зробив. Я повинен просто завантажити нову версію і перекинути в цю ж папку, мабуть, старі файли заміняться на нові? Або як краще зробити? Головне нічого не втратити з налаштувань :) Бекап папочки з темою зберегти на комп'ютер я так зрозумів на всякий треба.
Просто скачайте оновлену тему та завантажте файли за ФТП. Усі налаштування теми зберігаються у БД вашого сайту, а не у файлах теми. Якщо нічого не змінювалося в коді вихідної теми, потрібно зберегти тільки файл локалізації з папки languages
WPcafe, ви THE BEST!)
Дякую за оперативну відповідь, то вже й роблю! Качаю обнову і закидатиму по фтп в папку з темою. Цього не знав, дякую. Файл зберіг локалізації, мій переклад :)
у мене та сама проблема. перевела до Poedit – але на сайті нічого не змінилося. Запитання 2:
"зробив все з 0" - перезаливали двигун і тему, заново переводили в poedit?
«Мабуть, того разу директорію вказав неправильно» — яку директорію потрібно вказати, може, я теж не вірно прописую.
заздалегідь дякую!
Автор розповів про те, як самому локалізувати тему та багатьом ця стаття дуже допоможе. Але є люди, які не хочуть на це витрачати свій час і розумітися на всіх тонкощах цього не хвилинного процесу. Якщо ви відносите себе до цієї другої групи, тоді пропоную свої послуги з русифікації тем для WordPress.
Переклав шаблон і створив ru_Ru.po та ru_Ru.mo. Закинув їх у каталог шаблону в папку language, в /wp-content/languages/themes, перейменувавши файли в назву шаблону-ru_Ru.po/.mo.
Додав wp-config рядок define( 'WPLANG', 'ru_RU' );
Додав безліч варіантів у шаблоні functions.php.
Нічого не допомогло. Що робити?
А у каталозі безпосередньо вашої теми є така папка? /wp-content/themes/вашатема/language ? Зазвичай туди потрібно поміщати файли локалізації, тому що в тій папці, що ви вказали - зберігаються локалізації від штатних тем типу twentyfifteen і т.д.
Доброго дня! Є така проблема: придбав тему Avada, у файлі wp-config.php немає рядка define('WPLANG', ''); Додав після define('WP_DEBUG', true); Завантажив файли .po та .mo в директорії теми. Перевелося, та не все. Хоча у файлі .po переклад є. Що я не правильно зробив?
Підкажіть. Все зробив як годиться. Все перевелося. Але при перевірці сайту на валідність виходить помилка про те, що сайт використовує en_EN, а у вас в коді прописано ru_RU. Ось вирізка помилки.
його документ appears для написання в англійській але html start tag має цей документ appears для отримання в англійській but html start tag ha lang = «ru_RU». Consider using lang = "en" (або варіант) instead.
А ось мій код.
↩
↩ — — — Ось саме за це він і свариться.
↩
↩
У чому може бути проблема. Навіть коли заходиш із телефону
https://yadi.sk/i/9h9pQ5RLwySXH
Дякую, дуже якісна стаття. Допомогла розібратися у перекладі потрібної теми.