Какой смысл в синтаксисе gettext?

9

До сих пор я занимался некоторыми переводами в Wordpress и пытался прочитать официальную документацию по gettext, но не пойму одну, может быть, простую вещь: каковы различия между этими начинаниями, такими как __ (, _e (и т. Д.?) И даже подробнее: какие еще есть рядом? Заранее спасибо!

Фрэнк

Цирк Цирк
источник
Спасибо всем за ваши сложные ответы! Я действительно ценю это здесь!
Цирковой цирк
... Может быть, еще один вопрос к этому: можно ли пропустить запись текстового домена? Я начал приводить ее к каждой строке, которую хотел перевести, но затем узнал некоторые примеры в кодексе Wordpress, которые вообще не содержат ее ...
Цирковой цирк
... Хорошо, теперь я наткнулся на это на этой странице кодекса - извините за этот лишний вопрос :-)
Цирковой цирк

Ответы:

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 );

В этом примере есть два способа сказать количество тако, в зависимости от того, является ли он единственным или нет. Первое использование $ number сообщает _nфункции, какую версию использовать. Второе использование $ number происходит в 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 number_format , но он добавляет в обработку такие вещи, как десятичные дроби и т. д., которые отличаются в других локалях.

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
& это место, где встречаются wp-полиглоты .
brasofilo
@Johannes Pille: я не заметил твой ответ, пока не опубликовал свой, должен ли я удалить свой пост?
Джереми Джаред
@JeremyJared Нет, почему? Дальнейшая информация не может быть плохой вещью, не так ли ?! Я думаю, что ваш ответ хорошо продуман. +1 от меня.
Йоханнес Пилле
@TheDeadMedic Отредактировано в «дополнительные ресурсы».
Йоханнес Пилле
3

Я не специалист по переводам, но на странице Кодекса WordPress есть хорошая документация и объясняется причина использования каждого экземпляра.

Со страниц кодекса:

__()

Используется, когда сообщение передается в качестве аргумента другой функции; _e()используется для написания сообщения прямо на страницу. Более подробно об этих двух функциях:

__('message')

Ищет в модуле локализации перевод «сообщения» и передает перевод в оператор возврата PHP. Если перевод «message» не найден, он просто возвращает «message».

_e('message')

Ищет в модуле локализации перевод 'message' и передает перевод в оператор PHP echo. Если перевод «сообщение» не найден, он просто повторяет «сообщение».

Обратите внимание, что если вы интернационализируете тему или плагин, вы должны использовать "Text Domain" .

Фреймворк gettext заботится о большей части WordPress. Однако в дистрибутиве WordPress есть несколько мест, где нельзя использовать gettext:

  • Основной файл WordPress README - это статический HTML-файл, а не PHP-файл, поэтому его нельзя запустить с помощью функций gettext.
  • Несколько сообщений об ошибках генерируются очень рано в цикле загрузки WordPress, до загрузки gettext.

Ссылка на страницу Кодекса

Дополнительная информация о том, когда gettext не работает

Надеюсь, что это ответит на ваш вопрос, если не сообщите нам, и, возможно, кто-то еще может помочь, или я могу провести еще какое-то исследование.

Джереми Джаред
источник