Comment obtenir une chaîne traduite à partir d'une langue autre que la langue actuelle?

9

Je me promenais ... Toutes les fonctions de traduction ( __(), _e(), _x()et ainsi de suite) utilisent la langue actuelle / active. Existe-t-il un moyen d'obtenir une traduction d'une autre langue que la langue actuelle? Par exemple, je suis sur une page en français et je veux une traduction en anglais: comment faire?

Luca Reghellin
la source

Réponses:

3

Pour trouver la réponse à cette question, il vous suffit de regarder comment WordPress récupère les traductions. En fin de compte, c'est la load_textdomain()fonction qui fait cela. Lorsque nous examinons sa source, nous constatons qu'il crée un MOobjet et y charge les traductions d'un .mofichier. Il stocke ensuite cet objet dans une variable globale appelée $l10n, qui est un tableau indexé par domaine de texte.

Pour charger une locale différente pour un domaine particulier, nous avons juste besoin d'appeler load_textdomain()avec le chemin d'accès au .mofichier pour cette locale:

$textdomain = 'your-textdomain';

// First, back up the default locale, so that we don't have to reload it.
global $l10n;

$backup = $l10n[ $textdomain ];

// Now load the .mo file for the locale that we want.
$locale  = 'en_US';
$mo_file = $textdomain . '-' . $locale . '.mo';

load_textdomain( $textdomain, $mo_file );

// Translate to our heart's content!
_e( 'Hello World!', $textdomain );

// When we are done, restore the translations for the default locale.
$l10n[ $textdomain ] = $backup;

Pour savoir quelle logique WordPress utilise pour déterminer où rechercher le .mofichier d'un plugin (comme comment obtenir les paramètres régionaux actuels), jetez un œil à la source de load_plugin_textdomain().

JD
la source
Mais d'où vient le premier domaine $ text?
Luca Reghellin
En effet, d'où vient-il? Par exemple, une de mes actions / filtres n'obtiendra pas les paramètres régionaux corrects, alors que d'autres le font. Comment comprendre celui-ci? C'est le hook "pending_to_publish" par exemple ... si je veux y envoyer des emails, ils sont toujours dans une langue définie alors que dans le hook "transition_post_status" il obtient la langue correcte. Des pensées?
trainoasis
@trainoasis J'ai mis à jour l'exemple pour afficher des exemples de valeurs, mais vous pouvez voir comment obtenir les paramètres régionaux actuels à partir de la source de load_plugin_textdomain().
JD
J'ai mis à jour le code ci-dessous, car j'ai découvert que parfois ce $l10n[$textdomain]n'est pas réglé, même après avoir chargé le domaine de texte dans une after_setup_themeaction.
Luca Reghellin
0

Donc grâce à JD, je me suis finalement retrouvé avec ce code:

function __2($string, $textdomain, $locale){
  global $l10n;
  if(isset($l10n[$textdomain])) $backup = $l10n[$textdomain];
  load_textdomain($textdomain, get_template_directory() . '/languages/'. $locale . '.mo');
  $translation = __($string,$textdomain);
  if(isset($bkup)) $l10n[$textdomain] = $backup;
  return $translation;
}


function _e2($string, $textdomain, $locale){
  echo __2($string, $textdomain, $locale);
}

Maintenant, je sais que cela ne devrait pas l'être, selon ce célèbre article:

http://ottopress.com/2012/internationalization-youre-probably-doing-it-wrong/

Mais, je ne sais pas, ça marche ... Et en bonus: disons que tu veux l'utiliser en admin, parce que la langue d'administration est x, mais tu veux récupérer / sauvegarder des données en lang y, et tu utilises polylang . Donc, votre administrateur est anglais, mais vous êtes sur la traduction espagnole d'un article, et vous devez obtenir des données espagnoles à partir des paramètres régionaux de votre thème:

global $polylang;
$p_locale = $polylang->curlang->locale; // will be es_ES
_e2('your string', 'yourtextdomain', $p_locale)
Luca Reghellin
la source