web-dev-qa-db-fra.com

__ (): Et si je devais passer une variable?

Dans la documentation de la fonction de traduction __( $text, $domain ), il est indiqué que vous devez mettre la chaîne directement à la place de $ text, que vous ne pouvez pas faire quelque chose d'intelligent tel que __( $my_text, 'text-domain' );.

Cependant, j'écris une méthode qui prend une chaîne et doit la transmettre à __( ... ) en quelque sorte. Y a-t-il un moyen, par exemple via printf ou sprintf que je puisse contourner ce problème?

Quelque chose comme...

function print_description( $text ) {
    echo '<p>' . __( printf( '%s', $text ), 'text-domain' ) . '</p>';
}
3
geoff

Vous pouvez le faire avec printf().

Par exemple.

printf( __( 'We deleted %d spam messages.', 'my-text-domain' ), $count );
8
Ahmad Awais

Non

Les outils qui aident à générer une traduction ne peuvent pas analyser votre code et décider quelles sont les chaînes qui nécessitent une traduction lorsque les chaînes transmises aux routines de traduction sont totalement dynamiques.

dans votre exemple, la manière appropriée de coder cette fonction est

function print_description( $text ) {
    echo '<p>' . $text . '</p>';
}

et l'appelle

print_description(__('specific description','text_domain));
3
Mark Kaplun

Non, car on ne peut pas traduire le texte quand on ne sait pas vraiment ce que c'est.

La traduction fonctionne essentiellement via un grand tableau. Vous prenez votre code, trouvez toutes les chaînes qu'il contient, puis créez une grande liste de chaînes. Un traducteur les traduit dans une autre langue. Ensuite, les différentes fonctions de traduction effectuent une recherche dans un grand tableau et renvoient la chaîne traduite.

Si vous utilisez une variable pour contenir la chaîne de texte, il est alors impossible de savoir ce qu’elle est à l’avance et de la placer dans la liste initiale des chaînes à traduire.

Les variables ne peuvent pas être utilisées dans les fonctions de traduction, car cela n’a aucun sens. Vous ne pouvez pas traduire une variable.

2
Otto

Pour traduire une chaîne dans WordPress, comme dans la plupart des CMS utilisant PHP, vous devez l'envelopper dans une fonction de traduction GetText (c'est-à-dire __ (), _e (), _n (), _x () ... etc.).

La chaîne doit également être incluse dans un fichier PO (fichiers GetText Portable Object, norme de l'industrie pour les sites Web multilingues dans PHP - https://www.gnu.org/software/gettext/manual/ html_node/PO-Files.html ). Ce fichier comprend des paires de chaînes, l'une d'entre elles est la chaîne dans la langue d'origine et l'autre, sa traduction dans la langue cible.

Afin de construire ces fichiers PO pour chaque langue (par exemple, my-text-domain-es_ES.po pour l’espagnol, my-text-domain-fr_FR.po pour le français, etc.) dans lesquels nous devons traduire le plugin ou thème, le traducteur utilisera un fichier POT (modèle PO) contenant toutes les chaînes à traduire dans la langue d'origine et ajoutera une chaîne traduite pour chacune d’elles. Les fichiers PO sont compilés en fichiers binaires MO, qui peuvent être traités beaucoup plus rapidement.

Au moment de l'exécution, les chaînes à traduire sont extraites des fichiers MO et remplacées par leur traduction.

Les fichiers POT sont généralement générés à l'aide d'outils spéciaux qui analysent les fichiers de code source et extraient les chaînes traduisibles.

Si nous écrivons un code comme celui-ci:

    $translated_text = __( $text, 'my_text_domain');

Lorsque le code est analysé par les outils spéciaux, la valeur de la chaîne à traduire ($ text) n'est pas encore définie et n'est donc pas présente dans le code. En conséquence, les outils de recherche automatique n'incluent pas cette chaîne dans le fichier POT et ne sont donc pas inclus dans les fichiers PO ni MO.

Au moment de l'exécution, lorsque la valeur de la chaîne $ text sera probablement déjà définie, il n'y aura pas de correspondance pour cette valeur dans les fichiers de traduction et la traduction ne sera pas possible.

Cependant, si l'ensemble des valeurs possibles pour cette variable est limité et que nous les connaissons, nous avons deux options pour résoudre ce problème:

Option 1: Editez manuellement le fichier POT pour ajouter les entrées avec les valeurs possibles de $ text. Cette option est simple et facile à mettre en œuvre. Tout éditeur de code et une connaissance minimale du format POT suffiront. Mais il y a un inconvénient. Chaque fois que nous utilisons les outils de recherche automatique pour mettre à jour les traductions après avoir modifié notre code, les modifications que nous avons apportées seraient perdues et nous devions les inclure à nouveau manuellement.

Option 2: inclut dans notre code toutes les valeurs possibles de $ text encapsulées par les fonctions de traduction. Voyons un exemple. Supposons que $ text puisse prendre les valeurs: Apple, orange, banane, pêche et poire. Nous aurions besoin d'écrire le code suivant:

    // this variable is used only to include as parameters in
    // translation functions all the possible values of $text 
    $locale = __('Apple', 'my_text_domain') .
              __('orange', 'my_text_domain') .
              __('banana', 'my_text_domain') .
              __('Peach', 'my_text_domain') .
              __('pear', 'my_text_domain');

    $translated_text = __( $text, 'my_text_domain');

Cette option est également facile à mettre en œuvre et présente l’avantage de ne pas être perdue lorsque nous utilisons les outils de recherche automatique pour mettre à jour les traductions.

Si nous avons, dans notre thème ou notre plugin, plusieurs variables que nous souhaitons traduire et qu’elles ont un ensemble limité de valeurs possibles connues, nous pourrions toutes les inclure dans un fichier séparé qui doit se trouver dans le dossier racine ou dans un sous-dossier. (c.-à-d. le dossier 'includes' ou 'assets') du thème ou du plugin, comme indiqué ci-dessous:

    <?php
    //values of the variables to be translated
    $locale_var1 = __('text-of-var1_val1', 'my_text_domain') .
                   __('text-of-var1_val2', 'my_text_domain') .
                   __('text-of-var1_val3', 'my_text_domain') .
                   .......
                   __('text-of-var1_valn', 'my_text_domain');

    $locale_var2 = __('text-of-var2_val1', 'my_text_domain') .
                   __('text-of-var2_val2', 'my_text_domain') .
                   .......
                   __('text-of-var2_valn', 'my_text_domain');

    .............

    $locale_varn = __('text-of-varn_val1', 'my_text_domain') .
                   __('text-of-varn_val2', 'my_text_domain') .
                   .......
                   __('text-of-varn_valn', 'my_text_domain');

Il s'agit d'une approche propre et maintenable qui conserve la définition de ces chaînes dans un fichier séparé pouvant être modifié sans affecter les autres fichiers de code.

0
Juan Guerrero

Pour une raison quelconque, cela fonctionne pour moi de passer des variables à _e ():

$string = 'ciao';
_e($string, 'textdomain'); // put your own textdomain..
// will output 'ciao' or 'hello', based on current language

Évidemment, vous devez créer votre domaine text avant avant, idéalement dans yourtheme/functions.php:

add_action( 'after_setup_theme', 'theme_setup' );
function theme_setup() {
  load_theme_textdomain( 'yourtextdomain', TEMPLATEPATH . '/languages' );
  // [...] other init code
}

Si je traduis le mot 'ciao' sur le fichier .po, il sera correctement traduit en interface. Utilisez Poedit ou similaire pour compiler le fichier .mo. Les deux fichiers .po et .mo doivent être placés dans/wp-content/yourtheme/languages ​​(conformément au code ci-dessus).

#. Test en_EN.po
msgid "ciao"
msgstr "hello"

Pas sûr de la raison pour laquelle ça marche, mais ça marche, il va sortir 'ciao' en italien et 'hello' en anglais.

0
Luca Reghellin

Comme je le mentionne ici http://www.westofwonder.com/2013/12/whats-with-all-the-double-underscores-everywhere/ (veuillez excuser le thème, j'ai apporté des améliorations pas encore poussé), une solution possible est de créer une fonction pour le texte:

function yourtheme_thisisthetext() {
    return __( 'This is the text.', 'yourthemetextdomain' );
}

Laide en soi, mais pour une chaîne de traduction longue ou fréquemment utilisée, le compromis peut en valoir la peine pour la lisibilité du code.

(Est-ce autorisé? Pour créer un lien vers mon blog en réponse directe à une question? Sinon, je m'excuse et je ne le referai pas.)

0
LindaJeanne