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

21

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 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 ); 
    
posée Jason 15.09.2013 - 05:19
la source

2 réponses

35

Il existe un deuxième 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 au nom de domaine WordPress. Voir le lien pour plus de détails.

Utilisez toujours 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.

Un meilleur moyen:

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

Ou simplement:

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 existe également des autres espaces réservés .

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

Votre code:

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

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

Un meilleur moyen:

$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 les haut et du bas ne sont pas visibles, vous pouvez utiliser le _x() pour expliquer le contexte de ces termes.

Vous trouverez d'autres cas de traduction ici: Internationalisation: vous le faites probablement mal

    
réponse donnée Charles Clarkson 15.09.2013 - 06:09
la source
4

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 comme suit:

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

Réduire à une seule ligne.

Parfois, HTML dans le texte est inévitable. Prenons par exemple:

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

Les langues étant grammaticales, la scission du texte causerait des problèmes à quiconque traduira.

Règle de base. Les balises de mise en forme du 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.

    
réponse donnée Twifty 15.09.2013 - 09:43
la source

Lire d'autres questions sur les étiquettes