HTML dans la chaîne de traduction de la langue __ () ou _e ()


24

Quelle est la bonne approche pour créer des chaînes de traduction?

Par exemple,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Est-il correct d'ajouter les chaînes et / ou HTML ou doit-il être fait en premier et ensuite exécuter la traduction comme:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

Réponses:


41

Il y a un deuxième argument dans la __()fonction. Il doit être défini sur le domaine que vous utilisez pour votre plugin ou votre thème. Dans les exemples ci-dessous, j'utilise 'text_domain'. Votre chaîne de domaine doit être unique. Il ne doit correspondre à aucune autre chaîne de domaine. Ne pas utiliser d'argument de domaine de texte par défaut sur 'default'le nom de domaine WordPress. Voir le lien pour plus de détails.

Utilisez toujours la chaîne ( 'text_domain'). N'utilisez jamais une variable, une fonction ou une constante contenant la chaîne. La plupart (tous?) Des programmes de traduction ne le verront pas sans la chaîne.

Votre code:

echo __( 'Hello ' . $first . ' you own me money.' );

N'incluez pas de variables dans la chaîne.

Une meilleure façon:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Ou juste:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

L' %sespace réservé indique au traducteur humain qu'une chaîne y entre. Utilisez %dpour les nombres. Il existe également d' autres espaces réservés .

(Cette phrase est grammaticalement incorrecte en anglais. Utilisez soit 'Hello %s, you owe me money.'ou 'Hello %s, you own my money.'selon la signification que vous vouliez.)


Votre code:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

Ne traduisez pas HTML. C'est la même chose dans toutes les langues.

Une meilleure façon:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Ou divisez-le en plusieurs lignes:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Si vous ne savez pas quels sont le haut et le bas, vous pouvez utiliser le _x()pour expliquer le contexte de ces termes.


Vous pouvez trouver d'autres cas de traduction ici: Internationalisation: vous vous trompez probablement


Vous dites ne traduisez pas HTML. Puis-je souligner qu'il n'est pas traduit, il est recherché dans une table / s existante de chaînes pré-traduites. La présence de HTML dans la chaîne ne fait aucune différence à condition que le traducteur ne les ait pas supprimés. En fait, dans certaines situations, cela permet de meilleures performances que la recherche et le remplacement d'expressions régulières.
Twifty

Indépendant, mais notant: la textdomaindoit être une chaîne littérale, elle ne peut pas être une variable / constante / propriété.
brasofilo

@brasofilo, cet avis est écrit dans la réponse près du haut, mais mérite d'être répété. J'ai fait cette erreur dans plusieurs plugins personnalisés que j'ai écrits pour les clients.
Charles Clarkson

+1 pour sprintf(). C'est vraiment le moyen d'avoir HTML dans la chaîne traduisible.
helgatheviking

Je ne vois pas comment l'utilisation de l' sprintf()aide en aucune façon autre que peut-être un look plus propre. Si vous avez une phrase avec HTML à l'intérieur comme Some text with a <strong>strong</strong> word inside.comment est-il possible de traduire la phrase dans son ensemble et de ne pas traduire Some text with a, stronget word insideindividuellement (ce qui n'a aucun sens).
phpheini

4

Je n'aborderai pas le problème des variables dans la chaîne car il a déjà été dit.

Vous voulez garder votre chaîne statique, ce qui signifie que le contenu ne changera pas. Vous souhaitez également supprimer le code HTML inutile.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Ce qui précède prendra deux lignes dans votre tableau pour ce qui est essentiellement le même texte. Ils peuvent être réécrits comme:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Le réduire à une seule ligne.

Parfois, le HTML dans le texte est inévitable. Prends pour exemple:

__( 'You currently owe <b>%s</b> dollars' );

Étant donné que les langues sont grammaticales, la division du texte entraînerait des problèmes pour quiconque traduit.

Règle générale. Les balises de formatage de texte HTML au milieu de la phrase sont OK. Les phrases commençant et se terminant par HTML ne font que gaspiller de l'espace.


Dans le dernier exemple, vous pouvez encapsuler les balises en gras autour de l'argument inséré "<b>$string</b>". Ensuite, vous pouvez utiliser 'You currently owe %s dollars'. Mais il peut être nécessaire de le conserver si vous l'utilisez avec la _n()fonction qui nécessite un %despace réservé.
Charles Clarkson

@CharlesClarkson Bon appel. J'aurais peut-être dû laisser de côté le %spour être un peu plus clair.
Twifty
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.