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

9

Jusqu'à présent, j'ai géré quelques traductions dans Wordpress et j'ai essayé de lire la documentation officielle de gettext, mais je n'obtiendrai pas le point d'une chose peut-être simple: quelles sont les différences entre ces débuts comme __ (, _e (, etc.? Et même plus: quels autres sont là à côté? Merci d'avance!

Franc

Circuit Circus
la source
Merci à tous pour vos réponses élaborées! J'apprécie vraiment cela ici!
Circuit Circus
... Peut-être une autre question à ceci: l'entrée du domaine de texte peut-elle être omise? J'ai commencé à l'apporter à chaque chaîne que je voulais traduire, mais j'ai ensuite reconnu quelques exemples dans le codex Wordpress qui ne le contiennent pas du tout ...
Circuit Circus
... D'accord, maintenant je suis tombé dessus dans cette page codex - désolé pour cette question redondante :-)
Circuit Circus

Réponses:

13

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

_efait la même chose __, mais résume le résultat immédiatement.

_xest la fonction de traduction contextuelle. Il a une deuxième option pour fournir un contexte aux personnes qui font la traduction.

_exest le même que _x, mais l'écho est le résultat.

Exemple d'utilisation _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__: Équivaut à __mais exécute également le résultat esc_attr.
  • esc_html__: Équivaut à __mais exécute également le résultat esc_html.
  • esc_attr_e: Équivaut à _emais exécute également le résultat esc_attr.
  • esc_html_e: Équivaut à _emais exécute également le résultat esc_html.
  • esc_attr_x: Équivaut à _xmais exécute également le résultat esc_attr.
  • esc_html_x: Équivaut à _xmais exécute également le résultat esc_html.

_nest 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 qu'il est singulier ou non. La première utilisation de $ number indique à la _nfonction la version à utiliser. La deuxième utilisation de $ number se produit dans le sprintf, pour remplacer le% d par le nombre réel dans la chaîne.

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

_n_noopest spécial. Il est utilisé pour traduire des chaînes pluralisées, 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 réellement 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 utile pour l'organisation. Si vous mettez toutes vos chaînes dans un fichier, par exemple, puis les référencez ailleurs, ce ne serait pas possible avec juste _n, vous avez besoin de quelque chose comme _n_noopça.

_nx_noopest 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 est le plus logique pour votre organisation. Si les deux ont un domaine, celui transmis à l'appel noop l'emporte.

number_format_i18nest l'équivalent du nombre_format intégré de PHP , mais il ajoute dans la gestion des choses comme les décimales et ainsi de suite, qui sont différentes dans d'autres paramètres régionaux.

date_i18nest l'équivalent de la date intégrée de PHP , avec également toute la gestion pertinente. Noms de mois, noms de jours, etc.

Aussi, ne violez jamais les lois . Juste un rappel. :)

Otto
la source
Wow, c'est vraiment une bonne explication! Merci beaucoup pour votre aide! Maintenant je vois clair.
Circuit Circus
6

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

__()et _e()sont essentiellement à la fois un wrapper de translate()(ne pas utiliser directement) et presque les mêmes.

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

De façon analogue, il y a _x()et _ex(), qui vous permettent de spécifier un contexte qui peut décrire où la chaîne apparaît. Si votre projet comprend plus de quelques dizaines de chaînes traduisibles, l'utilisation du contexte a beaucoup de sens.

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

Exemple d'utilisation courante

$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 $numbersont des chaînes. Tous mais $domainsont obligatoires.

Plus de flexibilité avec les variables et sprintf ()

Si vos chaînes contiendront 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 additionnelles

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

Johannes Pille
la source
Consultez également "Localisation" sous "Divers" dans le codex pour une ventilation complète des fonctions et des explications détaillées.
TheDeadMedic
& c'est l'endroit où les polyglottes wp se rencontrent .
brasofilo
@Johannes Pille: Je n'ai pas remarqué votre réponse avant d'avoir publié la mienne, dois-je supprimer mon message?
Jeremy Jared
@JeremyJared Non, pourquoi? Plus d'informations ne peuvent pas être une mauvaise chose, n'est-ce pas?! Je pense que votre réponse est mûrement réfléchie. +1 de moi.
Johannes Pille
@TheDeadMedic Edité en "ressources supplémentaires".
Johannes Pille
3

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

Depuis les pages du codex:

__()

Est utilisé lorsque le message est passé en 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 transmet la traduction à l'instruction de retour PHP. 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 transmet la traduction à l'instruction d'écho PHP. Si aucune traduction n'est trouvée pour «message», elle fait simplement écho à «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 plupart de WordPress. Cependant, il y a quelques endroits dans la distribution WordPress où gettext ne peut pas être utilisé:

  • Le fichier principal de WordPress README - c'est un fichier HTML statique, pas 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 le moment où gettext ne fonctionne pas

J'espère que cela répond à votre question, sinon faites-le nous savoir et peut-être que quelqu'un d'autre peut vous aider ou que je peux faire d'autres recherches.

Jeremy Jared
la source