web-dev-qa-db-fra.com

Pourquoi ne puis-je pas utiliser une constante de classe en tant que domaine de texte?

Qu'est-ce qui fait que Wordpress.org internationalise un plugin approuvé?

J'ai créé mon premier plugin et voici le code principal:

https://plugins.trac.wordpress.org/browser/mastercurrency-wp/trunk/mastercurrencywp.php?rev=1374404

J'utilise une constante pour le domaine de texte:

class mastercurrencywp {
    const plugin_textdomain = 'mcwpww';
}

Et plus tard dans la même classe, je l'utilise comme ceci:

$curr_desc['EUR'] = __('Euro', self::plugin_textdomain);

J'ai testé cela localement et ensuite l'internationalisation du plugin a fonctionné, j'ai également ajouté une traduction suédoise (qui fonctionne sur mon serveur local) mais wordpress.org indique:

This plugin is not properly prepared 
  for localization. If you would like to 
  translate this plugin, please contact the author.

( https://translate.wordpress.org/projects/wp-plugins/mastercurrency-wp )

Pourquoi? (Qu'est-ce qui manque?)

Je viens de mettre à jour le plugin, donc il faudra peut-être un peu de temps avant que wordpress.org mette à jour sa déclaration?

La valeur d'une constante ou d'une variable ne peut être évaluée que par un analyseur PHP. L'outil utilisé pour extraire les chaînes traduisibles est écrit en PHP, mais n'est qu'un analyseur de chaîne. Il n'exécute pas votre code, car ce serait trop lent et sujet aux erreurs.

Voici un exemple montrant à quel point cela pourrait être complexe:

interface FooTranslate
{
    const TEXT_DOMAIN = 'foo';
}
interface BarTranslate extends FooTranslate {}

class FooBar implements BarTranslate
{
    public function greeting()
    {
        _e( 'hello!', self::TEXT_DOMAIN );
    }
}

(new FooBar)->greeting();

Maintenant, trouvez la valeur de chaîne correcte pour le domaine de texte sans exécuter PHP. Difficile.


Vous devez utiliser une simple chaîne pour tous les appels aux fonctions de traduction.

Le manuel du développeur nous le dit très clairement, malheureusement dans le style d'un message d'erreur et avec des guillemets incorrects:

N'utilisez pas de noms de variables pour la partie de domaine de texte d'une fonction gettext. Ne faites pas cela comme un raccourci: __( ‘Translate me.’ , $text_domain );

Sur une deuxième note: S'il vous plaît , ne chargez pas vos fichiers de traduction sur init. Cela coûte cher: ces fichiers sont maintenant chargés à chaque appel de AJAX demandes, de soumissions de commentaires et de tous les autres fichiers qui pourraient même ne pas être liés à votre plugin. Vérifiez le contexte actuel de la demande avant de demander à WordPress d'inclure un fichier.

5
fuxia