Какой смысл в синтаксисе gettext?
-
-
Спасибо всем за подробные ответы!Я очень ценю это здесь!Thank all of you for your elaborate answers! I really appreciate this here!
- 0
- 2012-07-09
- Circuit Circus
-
... Может быть,еще один вопрос к этому: можно ли исключить запись текстового домена?Я прямо начал подносить его к каждой строке,которую хотел перевести,но затем распознал некоторые примеры в кодексе Wordpress,которые его вообще не содержат ......Maybe one further question to this: Can the entry of the text-domain be left out? I upright started bring it to every string I wanted to translate but then recognized some examples in the Wordpress codex which don't contain it at all...
- 0
- 2012-07-09
- Circuit Circus
-
... Хорошо,теперь я наткнулся на это на этой странице кодекса - извините за повторяющийся вопрос :-)... Okay, now I came across it in this codex page - sorry for this redundant question :-)
- 0
- 2012-07-09
- Circuit Circus
-
3 ответ
- голосов
-
- 2012-07-07
__
(двойное подчеркивание) - это базовая функция перевода. Он переводит строку и возвращает ее как строку._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 дате .,со всей необходимой обработкой там же. Названия месяцев,дней и т. Д.Кроме того, никогда не нарушайте законы . Просто напоминание. :)
__
(double underscore) is the base translate function. It translates a string and returns it as a string._e
does the same as__
, but echo's the result immediately._x
is the contextual translate function. It has a second option to provide context to people doing the translation._ex
is the same as_x
, but echo's the result.Example of using
_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' );
Sometimes the same string can be different in other languages. Providing context to the translators can help them pick the right words.
Shortcut functions:
esc_attr__
: Equivalent to__
but also runs the result throughesc_attr
.esc_html__
: Equivalent to__
but also runs the result throughesc_html
.esc_attr_e
: Equivalent to_e
but also runs the result throughesc_attr
.esc_html_e
: Equivalent to_e
but also runs the result throughesc_html
.esc_attr_x
: Equivalent to_x
but also runs the result throughesc_attr
.esc_html_x
: Equivalent to_x
but also runs the result throughesc_html
.
_n
is the pluralization handler. Example:$string = sprintf( _n( 'You have %d taco.', 'You have %d tacos.', $number, 'plugin-domain'), $number );
In that example, there's two ways to say the number of tacos, depending on if it's singular or not. The first use of $number tells the
_n
function which version to use. The second use of $number happens in the sprintf, to replace the %d with the actual number in the string.There is no echo function equivalent for
_n
, but there is a function named_nx
. It's a combination of_n
and_x
. Pluralization and context._n_noop
is a special one. It's used for translating pluralized strings, but not actually performing the translation immediately. This is useful if you want to make the strings centralized but actually do the work elsewhere. The function that actually does the work elsewhere istranslate_nooped_plural
.Example:
$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain'); // ... later ... $string = sprintf( translate_nooped_plural( $holder, $count ), $count );
This isn't used much, but can be handy for organization. If you put all your strings in one file, for example, then reference them elsewhere, this wouldn't be possible with just
_n
, you need something like_n_noop
to do that._nx_noop
is the same as_n_noop
, but also can take a context for the translators, same as_x
.Note that you can put the domain into either the noop function call, or into the translate_nooped_plural function call. Whichever makes more sense for your organization. If both have a domain, then the one passed to the noop call wins.
number_format_i18n
is the equivalent to PHP's built-in number_format, but it adds in the handling for things like decimals and so on, which are different in other locales.date_i18n
is the equivalent to PHP's built-in date, with all the pertinent handling there as well. Month names, day names, etc.Also, never break the laws. Just a reminder. :)
-
Вау,это действительно хорошее объяснение!Большое спасибо за помощь!Теперь все ясно.Wow, this is really a good explanation of it! Thank you very much for helping! Now I see clear.
- 0
- 2012-07-09
- Circuit Circus
-
- 2012-07-07
__ (),_e () и _x (),_ex ()
__()
и_e()
,по сути,являются оболочкой дляtranslate()
(не использовать напрямую) и почти то же самое.Разница в том,что
__()
возвращает переведенный строка и_e()
повторяет ее. Обоим необходимо передать строку в качестве обязательного параметра и обычно,хотя и необязательно,также текстовый домен.Аналогично,есть
_x()
и_ex()
,позволяющий указать контекст,описывающий место появления строки. Если ваш проект включает в себя более нескольких десятков переводимых строк,использование контекста имеет большой смысл.Также обратите внимание на существование
_n()
и < a href="http://codex.wordpress.org/Function_Reference/_nx" rel="nofollow">_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:
__(), _e() and _x(), _ex()
__()
and_e()
are essentially both a wrapper oftranslate()
(do not use directly) and almost the same.The difference lies in that
__()
returns the translated string and_e()
echoes it. Both need to be fed a string as a required parameter and usually, though optional, also a textdomain.Analogously, there's
_x()
and_ex()
, which let you specify a context that can describe where the string appears. If your project includes more than a few tens of translatable strings, using context makes a lot of sense.Also, note the existence of
_n()
and_nx()
for plurals.Example of common usage
$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;
Parameters
__( $text, $domain ) _e( $text, $domain ) _x( $text, $context, $domain ) _ex( $text, $context, $domain ) _n( $single, $plural, $number $domain ) _nx( $single, $plural, $number, $context, $domain )
All parameters but
$number
are strings. All but$domain
are required.Further flexibility with variables and sprintf()
If your strings will contain variable numbers or words, use
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;
Additional resources
Some additional resources for the upcoming WordPress I18n Ninja:
-
Также ознакомьтесь с ["Локализация" в разделе "Разное" в кодексе] (http://codex.wordpress.org/Function_Reference/#Miscellaneous_Functions) для полного разбора функций и подробных объяснений.Also check out ["Localization" under "Miscellaneous" in the codex](http://codex.wordpress.org/Function_Reference/#Miscellaneous_Functions) for a complete breakdown of functions & detailed explanations.
- 0
- 2012-07-07
- TheDeadMedic
-
& это место [где встречаются wp-полиглоты] (http://wppolyglots.wordpress.com/).& this is the place [where wp-polyglots meet](http://wppolyglots.wordpress.com/).
- 0
- 2012-07-07
- brasofilo
-
@Johannes Pille: Я не заметил вашего ответа,пока не опубликовал свой,мне удалить свой пост?@Johannes Pille: I didn't notice your answer until I'd posted mine, should I delete my post?
- 0
- 2012-07-07
- Jeremy Jared
-
@JeremyJared Нет,почему?Дополнительная информация не может быть плохой,не так ли?Думаю,ваш ответ хорошо продуман.+1 от меня.@JeremyJared No, why? Further info can't be a bad thing, can it?! I think your answer is well thought through. +1 from me.
- 0
- 2012-07-07
- Johannes Pille
-
@TheDeadMedic Отредактировано как «дополнительные ресурсы».@TheDeadMedic Edited into "additional resources".
- 0
- 2012-07-07
- Johannes Pille
-
- 2012-07-07
Я не специалист по переводам,но на странице кодекса WordPress есть хорошая документация и объясняется причина использования каждого экземпляра.
Со страниц кодекса:
__()
Используется,когда сообщение передается в качестве аргумента другой функции;
_e()
используется для записи сообщения прямо на страницу. Подробнее об этих двух функциях:__('message')
Выполняет поиск в модуле локализации перевода слова "message" и передает перевод в оператор возврата PHP. Если для «message» не найден перевод,он просто возвращает «message».
_e('message')
Выполняет поиск в модуле локализации перевода слова "message" и передает перевод в PHP-операторecho. Если для «message» не найден перевод,он просто повторяет «message».
Обратите внимание,что если вы переводите тему или подключаемый модуль на международный уровень,вам следует использовать
"Text Domain"
.Фреймворкgettext заботится о большей части WordPress. Однако в дистрибутиве WordPress есть несколько мест,где нельзя использоватьgettext:
- Основной файл README WordPress - это статический HTML-файл,а не PHP-файл,поэтому его нельзя запустить с помощью функцийgettext.
- Несколько сообщений об ошибках генерируются очень рано в цикле загрузки WordPress,до загрузкиgettext.
Дополнительная информация о том,когдаgettext не работает
Надеюсь,это ответит на ваш вопрос,если не дайте нам знать,и,возможно,кто-то еще может помочь или я смогу провести дополнительное исследование.
I'm not an expert on translations, but the WordPress Codex Page has good documentation and explains the reason to use each instance.
From the codex pages:
__()
Is used when the message is passed as an argument to another function;
_e()
is used to write the message directly to the page. More detail on these two functions:__('message')
Searches the localization module for the translation of 'message', and passes the translation to the PHP return statement. If no translation is found for 'message', it just returns 'message'.
_e('message')
Searches the localization module for the translation of 'message', and passes the translation to the PHP echo statement. If no translation is found for 'message', it just echoes 'message'.
Note that if you are internationalizing a Theme or Plugin, you should use a
"Text Domain"
.The gettext framework takes care of most of WordPress. However, there are a few places in the WordPress distribution where gettext cannot be used:
- The main WordPress README file -- it's a static HTML file, not a PHP file, so it cannot be run through the gettext functions.
- A few error messages are generated very early in the WordPress loading cycle, before gettext is loaded.
Additional info regarding when gettext doesn't work
Hopefully that answers your question, if not let us know and maybe someone else can help or I can do some more research.
До сих пор я обрабатывал некоторые переводы в Wordpress и пытался прочитать официальную документацию поgettext,но не понял одной,может быть,простой вещи: в чем разница между этими начинаниями,такими как __ (,_e (и т. д.)? И даже больше: какие еще есть рядом? Заранее спасибо!
Фрэнк