Wie erhalte ich eine übersetzte Zeichenfolge aus einer anderen Sprache als der aktuellen?

9

Ich bin gewandert ... Alle Übersetzungsfunktionen ( __(), _e(), _x()und so weiter) verwenden die aktuelle / aktive Sprache. Gibt es eine Möglichkeit, eine Übersetzung aus einer anderen Sprache als der aktuellen zu erhalten? Zum Beispiel bin ich auf einer französischen Seite und möchte eine englische Übersetzung: wie geht das?

Luca Reghellin
quelle

Antworten:

3

Um die Antwort auf diese Frage zu finden, müssen Sie sich nur ansehen, wie WordPress die Übersetzungen abruft. Letztendlich ist es die load_textdomain()Funktion, die dies tut. Wenn wir uns die Quelle ansehen, stellen wir fest, dass sie ein MOObjekt erstellt und die Übersetzungen aus einer .moDatei in sie lädt . Anschließend wird dieses Objekt in einer globalen Variablen namens $l10ngespeichert, bei der es sich um ein Array handelt, das von einer Textdomäne verschlüsselt wird.

Um ein anderes Gebietsschema für eine bestimmte Domäne zu laden, müssen Sie nur load_textdomain()den Pfad zur .moDatei für dieses Gebietsschema aufrufen :

$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;

Um herauszufinden, mit welcher Logik WordPress ermittelt, wo nach der .moDatei für ein Plugin gesucht werden soll (z. B. wie das aktuelle Gebietsschema abgerufen wird), werfen Sie einen Blick auf die Quelle von load_plugin_textdomain().

JD
quelle
Aber woher kommt die erste $ textdomain?
Luca Reghellin
Woher kommt es eigentlich? Zum Beispiel erhält eine meiner Aktionen / Filter nicht das richtige Gebietsschema, wenn andere dies tun. Wie kann man das herausfinden? Es ist zum Beispiel der Haken "pending_to_publish" ... wenn ich E-Mails dorthin senden möchte, sind sie immer in einer definierten Sprache, während sie im Hook "Transition_post_status" die richtige Sprache erhalten. Irgendwelche Gedanken?
Trainoasis
@trainoasis Ich habe das Beispiel aktualisiert, um Beispielwerte anzuzeigen, aber Sie können sehen, wie Sie das aktuelle Gebietsschema aus der Quelle von abrufen load_plugin_textdomain().
JD
Ich habe den folgenden Code aktualisiert, da ich herausgefunden habe, dass er manchmal $l10n[$textdomain]nicht festgelegt ist, selbst nachdem die Textdomäne in einer after_setup_themeAktion geladen wurde .
Luca Reghellin
0

Dank JD habe ich endlich diesen Code erhalten:

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);
}

Jetzt weiß ich, dass es nicht so sein sollte, wie in diesem berühmten Artikel beschrieben:

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

Aber ich weiß nicht, es funktioniert ... Und Bonus: Angenommen, Sie möchten es in admin verwenden, da die Admin-Sprache x ist, aber Sie möchten Daten in lang y abrufen / speichern und verwenden polylang . Das heißt, Ihr Administrator ist Englisch, aber Sie befinden sich in der spanischen Übersetzung eines Beitrags und müssen spanische Daten von Ihren Themengebieten abrufen:

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