Який сенс у синтаксисі gettext?


9

Поки я обробляв кілька перекладів у Wordpress і намагався прочитати офіційну документацію gettext, але не зрозумів однієї, можливо, простої речі: у чому різниця між тими стартами, як __ (, _e (тощо)? І навіть більше: які ще є поруч? Дякую заздалегідь!

Френк


Дякую всім за ваші ретельні відповіді! Я дуже ціную це тут!
Цирк цирку

... Можливо, ще одне запитання до цього: Чи можна залишити введення текстового домену? Я прямо почав підводити його до кожної струни, яку хотів перекласти, але потім розпізнав кілька прикладів у кодексі Wordpress, які зовсім не містять її ...
Circuit Circus

... Гаразд, зараз я натрапив на цю сторінку кодексу - вибачте за це зайве запитання :-)
Circuit Circus

Відповіді:


13

__(подвійне підкреслення) - це основна функція перекладу. Він перекладає рядок і повертає його як рядок.

_eробить те ж саме __, але результат повторюється негайно.

_xє контекстною функцією перекладу. У нього є другий варіант - забезпечити контекст для людей, які роблять переклад.

_exце те саме _x, але результат відлуння.

Приклад використання _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

Іноді одна і та ж струна може бути різною в інших мовах. Надання контексту для перекладачів може допомогти їм підібрати потрібні слова.

Функції швидкого доступу:

  • esc_attr__: Рівносильно, __але також запускає результат esc_attr.
  • esc_html__: Рівносильно, __але також запускає результат esc_html.
  • esc_attr_e: Рівносильно, _eале також запускає результат esc_attr.
  • esc_html_e: Рівносильно, _eале також запускає результат esc_html.
  • esc_attr_x: Рівносильно, _xале також запускає результат esc_attr.
  • esc_html_x: Рівносильно, _xале також запускає результат esc_html.

_nє обробником плюралізації. Приклад:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

У цьому прикладі є два способи сказати кількість тако, залежно від того, чи є однина чи ні. Перше використання числа $ вказує _nфункції, яку версію використовувати. Друге використання числа $ відбувається в sprintf, щоб замінити% d фактичним числом у рядку.

Існує не еквівалентна функція ехо для _n, але є функція з ім'ям _nx. Це поєднання _nі _x. Плуралізація та контекст.

_n_noopє особливим. Він використовується для перекладу множинних рядків, але фактично не виконує переклад відразу. Це корисно, якщо ви хочете зробити рядки централізованими, але насправді виконувати роботу в іншому місці. Функція, яка насправді виконує роботу в іншому місці translate_nooped_plural.

Приклад:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

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

_nx_noopце те саме, що _n_noop, але також може взяти контекст для перекладачів, як _x.

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

number_format_i18nє еквівалентом вбудованого номера_формату PHP , але він додає в обробці такі речі, як десяткові знаки тощо, які відрізняються в інших регіонах.

date_i18nє еквівалентом вбудованої дати PHP , з усіма відповідними обробками і там. Назви місяців, назви днів тощо.

Також ніколи не порушуйте закони . Просто нагадування. :)


Ого, це справді гарне пояснення цього! Дуже дякую за допомогу! Тепер я бачу ясно.
Цирковий цирк

6

__ (), _e () і _x (), _ex ()

__()і _e()по суті є як обгорткою translate()(не використовуйте безпосередньо), так і майже однаковою.

Різниця полягає в тому, що __()повертає перекладений рядок і _e()повторює його. Обом потрібно подавати рядок як необхідний параметр і зазвичай, хоча і необов'язково, також текстовий домен.

Аналогічно, є _x()і _ex(), що дозволяє вам вказати контекст, який може описувати, де відображається рядок. Якщо ваш проект включає більше кількох десятків трансляційних рядків, використання контексту має багато сенсу.

Також зверніть увагу на існування _n()і _nx()для множини.

Приклад загального вживання

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

Параметри

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Усі параметри, але $numberє рядками. Все, але $domainне потрібно.

Подальша гнучкість зі змінними та sprintf ()

Якщо ваші рядки будуть містити змінні числа або слова, використовуйте sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Додаткові ресурси

Деякі додаткові ресурси для майбутнього WordPress I18n Ninja:


Також перегляньте "Локалізація" в розділі "Різне" в кодексі для повного розбиття функцій та детальних пояснень.
TheDeadMedic


@Johannes Pille: Я не помітив вашої відповіді, поки не опублікував свою, чи повинен я видалити своє повідомлення?
Джеремі Джаред

@JeremyJared Ні, чому? Подальша інформація не може бути поганою справою, чи не так ?! Я думаю, що ваша відповідь добре продумана. +1 від мене.
Йоганнес Піл

@TheDeadMedic Змінено на "додаткові ресурси".
Йоганнес Піл

3

Я не фахівець з перекладів, але WordPress Codex Page має гарну документацію і пояснює причину використання кожного примірника.

На сторінках кодексу:

__()

Використовується, коли повідомлення передається як аргумент іншій функції; _e()використовується для запису повідомлення безпосередньо на сторінку. Детальніше про ці дві функції:

__('message')

Шукає модуль локалізації для перекладу 'message' та передає переклад у повернення PHP. Якщо переклад "повідомлення" не знайдено, він просто повертає "повідомлення".

_e('message')

Шукає модуль локалізації для перекладу 'message' і передає переклад в оператор PHP echo. Якщо для "message" не знайдено переклад, це просто перегукується з "message".

Зауважте, що якщо ви інтернаціоналізуєте Тему чи Плагін, вам слід скористатися "Text Domain" .

Рамка gettext піклується про більшість WordPress. Однак у дистрибутиві WordPress є кілька місць, де gettext не може бути використаний:

  • Основний файл WordPress README - це статичний HTML-файл, а не PHP-файл, тому його неможливо запустити через функції gettext.
  • Кілька повідомлень про помилки створюються дуже рано на циклі завантаження WordPress, перед тим, як завантажувати gettext.

Посилання на сторінку Codex

Додаткова інформація щодо того, коли gettext не працює

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.