¿Cuál es el punto sobre la sintaxis de gettext?

9

Hasta ahora he estado manejando algunas traducciones en Wordpress y he intentado leer la documentación oficial de gettext, pero no obtendré el punto de una cosa sencilla: ¿Cuáles son las diferencias entre esos comienzos como __ (, _e (, etc.)? ? Y aún más: ¿cuáles otros hay al lado? ¡Gracias de antemano!

Frank

    
pregunta Circuit Circus 07.07.2012 - 19:34

3 respuestas

12

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

_e hace lo mismo que __ , pero el resultado es el inmediato.

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

_ex es lo mismo que _x , pero el resultado es eco.

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, 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 a __ pero también ejecuta el resultado a través de esc_attr .
  • esc_html__ : equivalente a __ pero también ejecuta el resultado a través de esc_html .
  • esc_attr_e : equivalente a _e pero también ejecuta el resultado a través de esc_attr .
  • esc_html_e : equivalente a _e pero también ejecuta el resultado a través de esc_html .
  • esc_attr_x : equivalente a _x pero también ejecuta el resultado a través de esc_attr .
  • esc_html_x : equivalente a _x pero también ejecuta el resultado a través de esc_html .

_n es el controlador de pluralización. Ejemplo:

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

En ese ejemplo, hay dos maneras de decir la cantidad de tacos, dependiendo de si es singular o no. El primer uso de $ number le dice a la función _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 _n y _x . Pluralización y contexto.

_n_noop es especial. Se utiliza para traducir cadenas pluralizadas, pero no para realizar la traducción de forma inmediata. Esto es útil si desea centralizar las cadenas pero hacer 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 pones todas tus cadenas en un archivo, por ejemplo, luego haz referencia a ellas en otro lugar, esto no sería posible con solo _n , necesitas algo como _n_noop para hacer eso.

_nx_noop es lo mismo que _n_noop , pero también puede tomar un contexto para los traductores, igual que _x .

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

number_format_i18n es el equivalente a number_format incorporado de PHP, pero se agrega el manejo de cosas como decimales, etc., que son diferentes en otros lugares.

date_i18n es el equivalente a la fecha incorporada de PHP, con todo lo pertinente manejando allí también. Nombres de meses, nombres de días, etc.

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

    
respondido por el Otto 07.07.2012 - 21:23
6

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

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

La diferencia radica en que __() devuelve la cadena traducida y _e() se hace eco. Ambos deben recibir una cadena como parámetro requerido y, por lo general, aunque opcional, también un dominio de texto.

De forma análoga, 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.

También, tenga en cuenta la existencia de _n() y _nx() para 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 $number son cadenas. Se requieren todos excepto $domain .

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:

respondido por el Johannes Pille 07.07.2012 - 20:28
3

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

Desde las páginas del códice:

__()

Se usa cuando el mensaje se pasa como un 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 devolución de PHP. Si no se encuentra ninguna traducción para 'mensaje', simplemente 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 de PHP. Si no se encuentra ninguna traducción para 'mensaje', simplemente se hace eco del 'mensaje'.

Tenga en cuenta que si está internacionalizando un tema o complemento, debe utilizar un "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 puede ejecutarse a través de las funciones de obtención de texto.
  • Algunos mensajes de error se generan muy temprano en el ciclo de carga de WordPress, antes de que se cargue gettext.

Enlace a la página del Codex

Información adicional sobre cuándo no funciona gettext

Espero que eso responda a tu pregunta, si no nos avisa y quizás alguien más pueda ayudar o puedo investigar un poco más.

    
respondido por el Jeremy Jared 07.07.2012 - 20:35

Lea otras preguntas en las etiquetas