web-dev-qa-db-fra.com

Quel est l'intérêt de la syntaxe gettext?

Jusqu’à présent, j’ai manipulé des traductions dans Wordpress et essayé de lire la documentation officielle de gettext, mais je n’en ai pas l’intérêt: rien de plus simple. Quelles sont les différences entre ces débuts comme __ (, _e (, etc.? plus: quels sont les autres à côté? Merci d'avance!

Franc

9
Circuit Circus

__ (double trait de soulignement) est la fonction de traduction de base. Il traduit une chaîne et la renvoie sous forme de chaîne.

_e fait la même chose que __, mais renvoie immédiatement le résultat.

_x est la fonction de traduction contextuelle. La deuxième option est de fournir un contexte aux personnes effectuant la traduction.

_ex est identique à _x, mais le résultat est écho.

Exemple d'utilisation 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' );

Parfois, la même chaîne peut être différente dans d'autres langues. Fournir un contexte aux traducteurs peut les aider à choisir les bons mots.

Fonctions de raccourci:

  • esc_attr__: Équivalent à __, mais exécute également le résultat via esc_attr.
  • esc_html__: Équivalent à __, mais exécute également le résultat via esc_html.
  • esc_attr_e: Équivalent à _e, mais exécute également le résultat via esc_attr.
  • esc_html_e: Équivalent à _e, mais exécute également le résultat via esc_html.
  • esc_attr_x: Équivalent à _x, mais exécute également le résultat via esc_attr.
  • esc_html_x: Équivalent à _x, mais exécute également le résultat via esc_html.

_n est le gestionnaire de pluralisation. Exemple:

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

Dans cet exemple, il y a deux façons de dire le nombre de tacos, selon que c'est singulier ou non. La première utilisation de $ number indique à la fonction _n la version à utiliser. La deuxième utilisation de $ number a lieu dans le sprintf, pour remplacer le% d par le nombre réel dans la chaîne.

Il n'y a pas d'équivalent de fonction d'écho pour _n, mais il existe une fonction nommée _nx. C'est une combinaison de _n et _x. Pluralisation et contexte.

_n_noop est un spécial. Il est utilisé pour traduire les chaînes au pluriel, mais pas pour effectuer la traduction immédiatement. Ceci est utile si vous souhaitez centraliser les chaînes mais effectuez le travail ailleurs. La fonction qui fait le travail ailleurs est translate_nooped_plural.

Exemple:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Ce n'est pas beaucoup utilisé, mais peut être pratique pour l'organisation. Si vous mettez toutes vos chaînes dans un seul fichier, par exemple, puis que vous les référenciez ailleurs, cela ne serait pas possible uniquement avec _n, vous avez besoin de quelque chose comme _n_noop pour le faire.

_nx_noop est identique à _n_noop, mais peut également prendre un contexte pour les traducteurs, identique à _x.

Notez que vous pouvez placer le domaine dans l'appel de fonction noop ou dans l'appel de fonction translate_nooped_plural. Selon ce qui convient le mieux à votre organisation. Si les deux ont un domaine, celui qui a été passé à l'appel noop gagne.

number_format_i18n est l'équivalent de number_format intégré de PHP, mais il ajoute des éléments pour le traitement de choses comme les décimales, etc., qui sont différentes dans les autres paramètres régionaux.

date_i18n est l'équivalent de date intégré à PHP, avec toutes les manipulations pertinentes. Noms de mois, noms de jours, etc.

En outre, ne jamais enfreindre les lois . Juste un rappel. :)

12
Otto

__ (), _e () et _x (), _ex ()

__() et _e() sont essentiellement des enveloppes de translate() (ne pas utiliser directement) et presque identiques.

La différence réside dans le fait que __() renvoie la chaîne traduite et _e() le renvoie. Les deux doivent recevoir une chaîne en tant que paramètre obligatoire et généralement, bien que facultatif, également un domaine de texte.

De manière analogue, il y a _x() et _ex() , ce qui vous permet de spécifier un contexte pouvant décrire l'emplacement de la chaîne. Si votre projet comprend plus de quelques dizaines de chaînes traduisibles, utiliser le contexte a beaucoup de sens.

Notez également l’existence de _n() et _nx() pour les pluriels.

Exemple d'usage courant

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

Paramètres

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Tous les paramètres sauf $number sont des chaînes. Tous sauf $domain sont obligatoires.

Davantage de flexibilité avec les variables et sprintf ()

Si vos chaînes contiennent des nombres ou des mots variables, utilisez 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;

Ressources supplémentaires

Quelques ressources supplémentaires pour le prochain WordPress I18n Ninja:

6
Johannes Pille

Je ne suis pas un expert en traduction, mais la page Codex WordPress contient une bonne documentation et explique la raison d'utiliser chaque instance.

À partir des pages de codex:

__()

Est utilisé lorsque le message est passé en tant qu'argument à une autre fonction; _e() est utilisé pour écrire le message directement sur la page. Plus de détails sur ces deux fonctions:

__('message')

Recherche dans le module de localisation la traduction de 'message' et la transmet à l'instruction PHP return. Si aucune traduction n'est trouvée pour 'message', elle renvoie simplement 'message'.

_e('message')

Recherche dans le module de localisation la traduction de 'message' et la transmet à l'instruction PHP echo. Si aucune traduction n'est trouvée pour 'message', cela renvoie simplement 'message'.

Notez que si vous internationalisez un thème ou un plugin, vous devez utiliser a} "Text Domain".

Le framework gettext prend en charge la majeure partie de WordPress. Cependant, il y a quelques endroits dans la distribution WordPress où gettext ne peut pas être utilisé:

  • Le fichier WordPress README principal - il s’agit d’un fichier HTML statique, et non d’un fichier PHP. Il ne peut donc pas être exécuté via les fonctions gettext.
  • Quelques messages d'erreur sont générés très tôt dans le cycle de chargement de WordPress, avant le chargement de gettext.

Lien vers la page du Codex

Informations supplémentaires concernant les cas où gettext ne fonctionne pas

Si tout va bien, cela répond à votre question. Si ce n'est pas le cas, faites-le-nous savoir et peut-être que quelqu'un d'autre pourra vous aider ou je pourrai faire d'autres recherches.

3
Jeremy Jared