¿Qué sentido tiene la sintaxis de gettext?

9

Hasta ahora he estado manejando algunas traducciones en Wordpress e intenté leer la documentación oficial de gettext pero no entiendo el punto de una cosa quizás simple: ¿cuáles son las diferencias entre esos inicios como __ (, _e (, etc.? E incluso más: ¿qué otros hay al lado? Gracias de antemano!

Franco

Circuito de circo
fuente
¡Gracias a todos por sus elaboradas respuestas! Realmente aprecio esto aquí!
Circuit Circus
... Tal vez una pregunta más a esto: ¿Se puede omitir la entrada del dominio de texto? Comencé a llevarlo a cada cadena que quería traducir, pero luego reconocí algunos ejemplos en el códice de Wordpress que no lo contienen en absoluto ...
Circuit Circus
... Bien, ahora lo encontré en esta página del códice. Perdón por esta pregunta redundante :-)
Circuit Circus

Respuestas:

13

__(subrayado doble) es la función de traducción base. Traduce una cadena y la devuelve como una cadena.

_ehace lo mismo que __, pero echo es el resultado de inmediato.

_xes la función de traducción contextual. Tiene una segunda opción para proporcionar contexto a las personas que realizan la traducción.

_exes lo mismo que _x, pero echo es el resultado.

Ejemplo de uso _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, la misma cadena puede ser diferente en otros idiomas. Proporcionar contexto a los traductores puede ayudarlos a elegir las palabras correctas.

Funciones de acceso directo:

  • esc_attr__: Equivalente __pero también ejecuta el resultado esc_attr.
  • esc_html__: Equivalente __pero también ejecuta el resultado esc_html.
  • esc_attr_e: Equivalente _epero también ejecuta el resultado esc_attr.
  • esc_html_e: Equivalente _epero también ejecuta el resultado esc_html.
  • esc_attr_x: Equivalente _xpero también ejecuta el resultado esc_attr.
  • esc_html_x: Equivalente _xpero también ejecuta el resultado esc_html.

_nes el manejador de pluralización. Ejemplo:

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

En ese ejemplo, hay dos formas de decir la cantidad de tacos, dependiendo de si es singular o no. El primer uso de $ number le dice a la _nfunción qué versión usar. El segundo uso de $ number ocurre en el sprintf, para reemplazar el% d con el número real en la cadena.

No hay una función de eco equivalente para _n, pero hay una función llamada _nx. Es una combinación de _ny _x. Pluralización y contexto.

_n_noopEs especial. Se usa para traducir cadenas pluralizadas, pero en realidad no realiza la traducción de inmediato. Esto es útil si desea centralizar las cadenas pero realmente hace el trabajo en otro lugar. La función que realmente hace el trabajo en otro lugar es translate_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 );

Esto no se usa mucho, pero puede ser útil para la organización. Si coloca todas sus cadenas en un archivo, por ejemplo, luego las referencia en otro lugar, esto no sería posible con solo _n, necesita algo como _n_noophacer eso.

_nx_noopes igual que _n_noop, pero también puede tomar un contexto para los traductores, igual que _x.

Tenga en cuenta que puede colocar el dominio en la llamada a la función noop o en la llamada a la función translate_nooped_plural. Lo que tenga más sentido para su organización. Si ambos tienen un dominio, entonces el que pasó a la llamada noop gana.

number_format_i18nes el equivalente a la de PHP integrado en Number_format , pero añade en el manejo de cosas como decimales y así sucesivamente, que son diferentes en otros lugares.

date_i18nes el equivalente a la fecha incorporada de PHP , con todo el manejo pertinente allí también. Nombres de mes, nombres de día, etc.

Además, nunca infrinjas las leyes . Simplemente un recordatorio. :)

Otón
fuente
¡Guau, esta es realmente una buena explicación! ¡Muchas gracias por ayudar! Ahora lo veo claro.
Circuit Circus
6

__ (), _e () y _x (), _ex ()

__()y _e()son esencialmente un envoltorio de translate()(no usar directamente) y casi lo mismo.

La diferencia radica en que __()devuelve la cadena traducida y la _e()repite. Ambos necesitan ser alimentados con una cadena como parámetro requerido y generalmente, aunque opcional, también un dominio de texto.

Análogamente, hay _x()y _ex(), que le permite especificar un contexto que puede describir dónde aparece la cadena. Si su proyecto incluye más de unas pocas decenas de cadenas traducibles, usar el contexto tiene mucho sentido.

Además, tenga en cuenta la existencia de _n()y _nx()para los plurales.

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 los parámetros pero $numberson cadenas. Todos pero $domainson obligatorios.

Mayor flexibilidad con variables y sprintf ()

Si sus cadenas contendrán números o palabras 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 adicionales para el próximo WordPress I18n Ninja:

Johannes Pille
fuente
Consulte también "Localización" en "Varios" en el códice para obtener un desglose completo de las funciones y explicaciones detalladas.
TheDeadMedic
& este es el lugar donde se encuentran wp-polyglots .
brasofilo
@Johannes Pille: No noté tu respuesta hasta que publiqué la mía, ¿debería eliminar mi publicación?
Jeremy Jared
@JeremyJared No, ¿por qué? Más información no puede ser algo malo, ¿verdad? Creo que tu respuesta está bien pensada. +1 de mi parte
Johannes Pille
@TheDeadMedic Editado en "recursos adicionales".
Johannes Pille
3

No soy un experto en traducciones, pero la página de WordPress Codex tiene buena documentación y explica la razón para usar cada instancia.

De las páginas del códice:

__()

Se usa cuando el mensaje se pasa como argumento a otra función; _e()se usa para escribir el mensaje directamente en la página. Más detalles sobre estas dos funciones:

__('message')

Busca en el módulo de localización la traducción de 'mensaje' y pasa la traducción a la declaración de retorno de PHP. Si no se encuentra ninguna traducción para 'mensaje', solo devuelve 'mensaje'.

_e('message')

Busca en el módulo de localización la traducción de 'mensaje' y pasa la traducción a la declaración de eco PHP. Si no se encuentra la traducción para 'mensaje', solo hace eco de 'mensaje'.

Tenga en cuenta que si está internacionalizando un tema o complemento, debe usar a "Text Domain" .

El marco gettext se encarga de la mayoría de WordPress. Sin embargo, hay algunos lugares en la distribución de WordPress donde no se puede usar gettext:

  • El archivo README principal de WordPress: es un archivo HTML estático, no un archivo PHP, por lo que no se puede ejecutar a través de las funciones gettext.
  • Algunos mensajes de error se generan muy temprano en el ciclo de carga de WordPress, antes de cargar gettext.

Enlace a la página del Codex

Información adicional sobre cuándo gettext no funciona

Espero que eso responda a su pregunta, si no, háganoslo saber y tal vez alguien más pueda ayudarlo o yo pueda investigar más.

Jeremy Jared
fuente