Ändern der Oberflächensprache ohne Multisite

Ich möchte die Oberflächensprache des Themas ändern, ohne Multisite zu machen, indem ich den Parameter langauage in die URL übergebe.

<a href="https://wordpress.stackexchange.com/questions/144364/changing-interface-language-without-multisite/">Bengali 

Mein Gedanke ist, den folgenden Code zu verwenden:

 if(get_query_var('bn')) { /** * CHANGE THE 'WPLANG' IN wp-config.php TO bn_BD ON THEME SWITCHING * Thanks: toscho * Source: http://wordpress.stackexchange.com/a/121136/22728 * -------------------------------------------------- */ add_filter( 'locale', 'toscho_change_language' ); function toscho_change_language( $locale ) { return 'bn_BD'; } } 

Mit dem Überprüfen von isset() des Parameters in URL, Laden dieses Codeblocks. Und mit der bn_BD des Themas bn_BD .

Aber ich bin eigentlich neugierig auf das logische Vorgehen:

  • Ist dieses Konzept Ok?
  • Wird die Sprachdatei des Designs erfolgreich geladen?

Solutions Collecting From Web of "Ändern der Oberflächensprache ohne Multisite"

2 Notizen zu Ihrer eigenen Antwort :

  • Versuchen Sie nicht direkt auf super globale Variablen zuzugreifen, sondern filter_input
  • Ihr Code wirft einen Hinweis, wenn $_GET['lang'] nicht gesetzt ist

So kann Ihr Code verbessert werden:

 function toscho_change_language() { return 'bn_BD'; } if ( filter_input( INPUT_GET, 'lang', FILTER_SANITIZE_STRING ) === 'bn' ) { add_filter( 'locale', 'toscho_change_language' ); } 

Oder wenn Ihr Server PHP 5.3+ hat

 if ( filter_input( INPUT_GET, 'lang', FILTER_SANITIZE_STRING ) === 'bn' ) { add_filter( 'locale', function() { return 'bn_BD'; } ); } 

Wenn Sie in Zukunft weitere Sprachen unterstützen möchten, können Sie die function leicht erweiterbar schreiben:

 function gm_change_language( $locale ) { $langs = array( 'bn' => 'bn_BD', 'sw' => 'sw_TZ' // Tanzania Swahili ); $l = strtolower( filter_input( INPUT_GET, 'lang', FILTER_SANITIZE_STRING ) ); return $l && array_key_exists( $l, $langs ) ? $langs[$l] : $locale; } add_filter( 'locale', 'gm_change_language' ); 

Problem mit diesem Code ist, dass beim Klicken auf einen inneren Link der Sprachparameter verloren geht. Eine mögliche Lösung besteht darin, ein Cookie zum Speichern der Sprache zu verwenden.

Ich werde diese Verbesserung auf das letzte Snippet anwenden, kann aber auch im vorherigen Snippet verwendet werden.

 function gm_change_language( $locale ) { $langs = array( 'bn' => 'bn_BD', 'sw' => 'sw_TZ' // Tanzania Swahili ); $l = filter_input( INPUT_GET, 'lang', FILTER_SANITIZE_STRING ); if ( ! empty( $l ) ) { setcookie ( 'my_theme_lang', $l, 0 ); } else { $l = filter_input( INPUT_COOKIE, 'my_theme_lang', FILTER_SANITIZE_STRING ); } return $l && array_key_exists( $l, $langs ) ? $langs[$l] : $locale; } add_filter( 'locale', 'gm_change_language' ); 

Und wie Sie bereits gesagt haben, müssen Sie Ihr Thema übersetzen und laden Sie die Textdomäne mit load_theme_textdomain .

Und, nur eine Anmerkung für zukünftige Leser, um Strings in einem Thema zu übersetzen, müssen alle mit i18n-functionen geschrieben werden .

Auslöser in Vorlage:

 BN|EN 

Code in den functions.php :

 function toscho_change_language( $locale ) { return 'bn_BD'; } if( $_GET['lang'] && $_GET['lang'] == 'bn' ) add_filter( 'locale', 'toscho_change_language' ); 

Um mein Thema übersetzen zu lassen:

 load_theme_textdomain( 'your-theme', get_template_directory() . '/lang' ); 

Und ich habe meine Übersetzungsdatei bn_BD.po (mit Poedit ) in den lang Ordner meines Themes gestellt. Und Yala!