web-dev-qa-db-fra.com

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

Quelle est la bonne approche pour construire 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 le code HTML ou faut-il le faire en premier, puis exécuter la traduction comme suit:

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

Il existe un second argument dans la fonction __() . Il devrait ê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 devrait correspondre à aucune autre chaîne de domaine. Si vous n'utilisez pas d'argument de domaine de texte, 'default' correspond par défaut au nom de domaine WordPress. Voir le lien pour plus de détails.

Toujours utiliser la chaîne ('text_domain'). Ne jamais utiliser une variable, fonction ou constante avec la chaîne en elle. La plupart des programmes de traduction (tous?) 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'espace réservé %s indique au traducteur humain qu'une chaîne y est insérée. Utilisez %d pour les nombres. Il y a aussi autres espaces réservés .

(Cette phrase est grammaticalement incorrecte en anglais. Utilisez 'Hello %s, you owe me money.' ou 'Hello %s, you own my money.' en fonction du sens que vous vouliez utiliser.)


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 n'importe quelle langue.

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 le diviser 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 voyez pas ce que Top et Bottom utilisez le _x() pour expliquer le contexte de ces termes.


Vous pouvez trouver d’autres cas de traduction ici: Internationalisation: vous le faites probablement mal

37
Charles Clarkson

Je ne vais pas aborder le problème des variables dans la chaîne, car cela a déjà été dit.

Vous voulez garder votre chaîne statique, ce qui signifie que le contenu ne changera pas. Vous souhaitez également éviter les pages HTML inutiles.

__( '<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 en tant que:

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

Réduire à une seule ligne.

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

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

Puisque les langues sont grammaticales, la scission du texte causerait des problèmes à quiconque traduira.

Règle de base. Le texte HTML le formatage les balises au milieu de la phrase sont OK. Les phrases commençant et se terminant par HTML ne font que gaspiller de l’espace.

4
Twifty