¿Qué sentido tiene la sintaxis gettext?
-
-
¡Gracias atodospor suselaboradas respuestas!¡Realmente aprecioesto aquí!Thank all of you for your elaborate answers! I really appreciate this here!
- 0
- 2012-07-09
- Circuit Circus
-
... Quizás unapreguntamás aesto: ¿Sepuede omitir laentrada del dominio detexto?Enposición vertical comencé a llevarlo a cada cadena que queríatraducir,pero luego reconocí algunosejemplosen el códice de Wordpress queno lo contienenen absoluto ......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
-
... Bien,ahora loencontréen estapágina del códice,lo sientoporestapregunta redundante :-)... Okay, now I came across it in this codex page - sorry for this redundant question :-)
- 0
- 2012-07-09
- Circuit Circus
-
3 respuestas
- votos
-
- 2012-07-07
__
(doble subrayado)es lafunción detraducciónbásica. Traduce una cadena y la devuelve como una cadena._e
hace lomismo que__
,peroechoesel resultado deinmediato._x
es lafunción detraducción contextual. Tiene una segunda opciónparaproporcionar contexto a laspersonas que realizan latraducción._ex
es lomismo que_x
,peroechoesel resultado.Ejemplo de uso de
_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' );
A veces,lamisma cadenapuede ser diferenteen otrosidiomas. Brindar contexto a lostraductorespuede ayudarlos aelegir laspalabras adecuadas.
Funciones de acceso directo:
-
esc_attr__
: Equivalente a__
perotambiénejecutael resultado através deesc_attr
. -
esc_html__
: Equivalente a__
perotambiénejecutael resultado através deesc_html
. -
esc_attr_e
: Equivalente a_e
perotambiénejecutael resultado através deesc_attr
. -
esc_html_e
: Equivalente a_e
perotambiénejecutael resultado através deesc_html
. -
esc_attr_x
: Equivalente a_x
perotambiénejecutael resultado através deesc_attr
. -
esc_html_x
: Equivalente a_x
perotambiénejecutael resultado através deesc_html
.
_n
esel controlador depluralización. Ejemplo:$string = sprintf( _n( 'You have %d taco.', 'You have %d tacos.', $number, 'plugin-domain'), $number );
Eneseejemplo,hay dosformas de decir la cantidad detacos,dependiendo de sies singular ono. Elprimer uso de $number le dice a lafunción
_n
qué versión usar. El segundo uso de $number ocurreen el sprintf,para reemplazar% d conelnúmero realen la cadena.No hay unafunción deecoequivalentepara
_n
,pero hay unafunción llamada_nx
. Es una combinación de_n
y_x
. Pluralización y contexto._n_noop
esespecial. Se utilizaparatraducir cadenaspluralizadas,peroen realidadno realiza latraducción deinmediato. Estoes útil si desea centralizar las cadenasperoen realidad hacereltrabajoen otro lugar. Lafunción que realmente haceeltrabajoen otros lugaresestranslate_nooped_plural
.Ejemplo:
$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain'); // ... later ... $string = sprintf( translate_nooped_plural( $holder, $count ), $count );
No se utilizamucho,peropuede resultar útilpara la organización. Siponestodastus cadenasen un archivo,porejemplo,luego las haces referenciaen otro lugar,estono seríaposible con solo
_n
,necesitas algo como_n_noop
para hacereso ._nx_noop
es lomismo que_n_noop
,perotambiénpuedetomar un contextopara lostraductores,igual que_x
.Tengaen cuenta quepuedeponerel dominioen la llamada a lafunciónnoop oen la llamada a lafuncióntranslate_nooped_plural. El quetengamás sentidopara su organización. Si ambostienen un dominio,ganael que sepasa a la llamadanoop.
number_format_i18n
eselequivalente al number_format integrado de PHP,pero agregaelmanejo de cosas como decimales y demás,que son diferentesen otras configuraciones regionales.date_i18n
eselequivalente a la fecha incorporada de PHP,contodoelmanejopertinente allítambién. Nombres demeses,nombres de días,etc.Además,nuncainfrinja las leyes . Simplemente un recordatorio. :)
__
(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. :)
-
¡Vaya,estaes realmente unabuenaexplicación!¡Muchasgraciaspor ayudar!Ahora lo veo claro.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 () y _x (),_ex ()
__()
y_e()
sonesencialmente un contenedor detranslate()
(no usar directamente) y casi lomismo.La diferencia radicaen que
__()
devuelveel string y_e()
lo repite. Ambos deben recibir una cadena comoparámetro obligatorio y,por logeneral,aunque opcional,también un dominio detexto.Demanera análoga,hay
_x()
y_ex()
,que lepermiteespecificar un contexto quepuede describir dónde aparece la cadena. Si suproyectoincluyemás de unaspocas decenas de cadenastraducibles,usarel contextotiene mucho sentido.Además,tengaen cuenta laexistencia de
_n()
y < a href="http://codex.wordpress.org/Function_Reference/_nx" rel="nofollow">_nx()
paraplurales.Ejemplo de uso común
$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;
Parámetros
__( $text, $domain ) _e( $text, $domain ) _x( $text, $context, $domain ) _ex( $text, $context, $domain ) _n( $single, $plural, $number $domain ) _nx( $single, $plural, $number, $context, $domain )
Todos losparámetrosexcepto
$number
son cadenas. Todosmenos$domain
son obligatorios.Mayorflexibilidad con variables y sprintf ()
Si sus cadenas van a contenernúmeros opalabras variables,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;
Recursos adicionales
Algunos recursos adicionalesparaelpróximo 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:
-
Consultetambién ["Localización"en "Varios"en el códice] (http://codex.wordpress.org/Function_Reference/#Misiverse_Functions)para obtener un desglose completo de lasfunciones yexplicaciones detalladas.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
-
&esteesel lugar [donde seencuentran wp-polyglots] (http://wppolyglots.wordpress.com/).& this is the place [where wp-polyglots meet](http://wppolyglots.wordpress.com/).
- 0
- 2012-07-07
- brasofilo
-
@Johannes Pille: Nonotétu respuesta hasta quepubliqué lamía,¿deberíaborrarmi publicación?@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 No,¿por qué?Másinformaciónnopuede sermala,¿verdad?Creo quetu respuestaestábien pensada.+1 demi parte.@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 Editadoen "recursos adicionales".@TheDeadMedic Edited into "additional resources".
- 0
- 2012-07-07
- Johannes Pille
-
- 2012-07-07
No soy unexpertoen traducciones,pero lapágina del Codex de WordPresstiene buena documentación yexplica la razónpara usar cadainstancia.
De laspáginas del códice:
__()
Se usa cuandoelmensaje sepasa como argumento a otrafunción;
_e()
se utilizaparaescribirelmensaje directamenteen lapágina. Más detalles sobreestas dosfunciones:__('message')
Buscaen elmódulo de localización latraducción de 'mensaje' ypasa latraducción a la declaración de retorno de PHP. Sino seencuentraningunatraducciónpara 'mensaje',solo devuelve 'mensaje'.
_e('message')
Buscaen elmódulo de localización latraducción de 'mensaje' ypasa latraducción a la declaración deeco de PHP. Sino seencuentraningunatraducciónpara 'mensaje',simplemente se haceeco de 'mensaje'.
Tengaen cuenta que siestáinternacionalizando untema o complemento,debe utilizar un
"Text Domain"
.Elmarcogettext seencarga de lamayorparte de WordPress. Sinembargo,hay algunos lugaresen la distribución de WordPress dondeno sepuede usargettext:
- El archivo READMEprincipal de WordPress:es un archivo HTMLestático,no un archivo PHP,por lo queno sepuedeejecutar através de lasfuncionesgettext.
- Segeneran algunosmensajes deerrormuytempranoen el ciclo de carga de WordPress,antes de que se carguegettext.
Información adicional sobre cuandogettextnofunciona
Con suerte,eso responde a supregunta,sino,avísenos ytal vez alguienmáspueda ayudar opuedoinvestigar unpocomás.
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.
Hasta ahora heestadomanejando algunastraduccionesen Wordpress ytraté de leer la documentación oficial degettext,peronoentiendoelpunto de una cosa quizás simple: ¿Cuáles son las diferenciasentreesos comienzos como __ (,_e (,etc.)? Y aúnmás: ¿qué otros hay al lado? ¡Gracias de antemano!
Frank