WordPress-Sprache programmgesteuert einstellen?

Lesezeit: 4 Minuten

Ich habe eine benutzerbasierte Website mit WordPress und über ihre Profileinstellungen können sie die Sprache auswählen, diese Informationen und andere Einstellungen werden für jeden Benutzer in user_meta festgelegt.

Ich kann übersetzen, aber gibt es eine Möglichkeit, die Themensprache programmgesteuert festzulegen?

Vielen Dank!

Bearbeiten: Bitte keine Plugins, ich muss das so einfach wie möglich machen.

Benutzeravatar von kris
kris

Seit WP 4.7 können Sie verwenden:

switch_to_locale('en_US');

Bezug: https://developer.wordpress.org/reference/functions/switch_to_locale/

  • Wo soll das eingesetzt werden? Ich habe es in den ‘init’-Hook gesteckt, aber es funktioniert nicht (es hat tatsächlich ein paar Mal funktioniert und dann seltsamerweise angehalten)

    – gilad905

    8. Juli um 14:36 ​​Uhr

Benutzeravatar von Vlad.P
Vlad.P

Ich habe eine andere Lösung gefunden:

// Set user selected language by loading the lang.mo file
if ( is_user_logged_in() ) {

    // add local filter
    add_filter('locale', 'language');

    function language($locale) {
        /* Note: user_meta and user_info are two functions made by me,
           user_info will grab the current user ID and use it for
           grabbing user_meta */

        // grab user_meta "lang" value
        $lang = user_meta(user_info('ID', false), 'lang', false); 

        // if user_meta lang is not empty
        if ( !empty($lang) ) {
           $locale = $lang; /* set locale to lang */
        }

        return $locale; 
    }

    // load textdomain and .mo file if "lang" is set
    load_theme_textdomain('theme-domain', TEMPLATEPATH . '/lang');

}

Über: http://codex.wordpress.org/Function_Reference/load_theme_textdomain

  • Ich habe festgestellt, dass ich die Textdomain in meiner Situation entladen musste, bevor ich die Textdomain erneut geladen habe. Was mir den folgenden Code gab (und ich verwende ihn für ein Plugin, also heißt es für mich load_plugin_textdomain. unload_textdomain('my-plugin-txt-domain'); load_plugin_textdomain('my-plugin-txt-domain', __DIR__ . '/../../languages');

    – Neuschnee

    22. August 2018 um 18:59 Uhr


Ich habe mir folgende Lösung ausgedacht, da ich im Rahmen derselben Anfrage Rechnungen aus einem Plugin in verschiedenen Sprachen generieren musste:

    global $locale;

    $locale="en_CA";
    load_plugin_textdomain('invoice', false, 'my-plugin/languages/');
    generateInvoice(); // produce the English localized invoice

    $locale="fr_CA";
    load_plugin_textdomain('invoice', false, 'my-plugin/languages/');
    generateInvoice(); // produce the French localized invoice

Benutzeravatar von vmassuchetto
vmassuchetto

Ich vermute, du suchst die override_load_textdomain filter, genannt nur am Anfang von a load_textdomain Funktionsaufruf.

Das wäre so etwas wie:

function my_load_textdomain ($retval, $domain, $mofile) {

    if ($domain != 'theme_domain')
        return false;

    $user = get_currentuserinfo()
    $user_lang = get_user_lang($user);

    if ($new_mofile = get_my_mofile($user_lang)) {
        load_textdomain('theme_domain', $new_mofile);
        return true;
    }

    return false;
}
add_filter('override_load_textdomain', 'my_load_textdomain');

Code vom Gehirn zur Tastatur, nicht getestet. Sie sollten einige weitere Validierungen durchführen und so.

Bei mir funktionierten nur diese beiden Lösungen zusammen.

switch_to_locale($locale);
load_textdomain('example_domain', $mo_file_full_path);

A hatte die gleiche Frage, ich habe es so gelöst:

Im ersten Schritt müssen Sie eine .mo mit einer Textdomain erstellen. Sie können das loco translate-Plugin verwenden: https://br.wordpress.org/plugins/loco-translate/

Laden Sie Ihre Text-Domain-Linking-.mo-Datei:

load_textdomain('your_text_domain', '/your/file.mo');

Ändern Sie den WordPress-Standort per Hook. Erstellen Sie eine Funktion, die den gewünschten Ort zurückgibt. Verwenden Sie immer die WordPress-Gebietsschema-ID, Sie können alle Gebietsschema-IDs hier sehen: https://wpastra.com/docs/complete-list-wordpress-locale-codes/

Schreiben wir die Funktion:

function wpsx_redefine_locale($locale){
  
  return 'ja';
}
add_filter('locale','wpsx_redefine_locale',10);

Sie können nach Benutzerstandort wechseln. Auf diese Weise legt WordPress dieselbe Sprache fest, die vom Benutzer in seinem Bedienfeld eingestellt wurde:

$user_locale = get_user_locale();
function wpsx_redefine_locale($locale){
  global $user_locale;
  return $user_locale;
}
add_filter('locale','wpsx_redefine_locale',10);

Anmerkung: Meine WordPress-Version ist 5.7. Auf diese Weise kann in anderen Versionen nicht gearbeitet werden. Gut aussehen!

Benutzeravatar von The_Switch
Der Schalter

Ich hatte ein ähnliches Problem und habe es so gelöst:

  1. In meinem Fall wollte ich das Gebietsschema mithilfe des Benutzergebietsschemas abrufen: $userLocale = get_user_locale($userObject->ID);

  2. Ich habe eine benutzerdefinierte Funktion erstellt, um die richtige theme_textdomain mit dynamischem Gebietsschema zu laden. Es ist fast dasselbe wie die WP-Funktion, aber Sie können eine Locale-Variable hinzufügen:

    /**
     * Loads text domain by custom locale
     * Based on a WP function, only change is the custom $locale
     * parameter so we can get translated strings on demand during runtime
     */
    function load_theme_textdomain_custom_locale($domain, $path = false, $locale)
    {
        /**
         * Filter a theme's locale.
         *
         * @since 3.0.0
         *
         * @param string $locale The theme's current locale.
         * @param string $domain Text domain. Unique identifier for retrieving translated strings.
         */
        $locale = apply_filters('theme_locale', $locale, $domain);
    
        if (!$path) {
            $path = get_template_directory();
        }
    
        // Load the textdomain according to the theme
        $mofile = "{$path}/{$locale}.mo";
        if ($loaded = load_textdomain($domain, $mofile)) {
            return $loaded;
        }
    
        // Otherwise, load from the languages directory
        $mofile = WP_LANG_DIR . "/themes/{$domain}-{$locale}.mo";
        return load_textdomain($domain, $mofile);
    }
    

Bezogen auf:
http://queryposts.com/function/load_theme_textdomain/

1402010cookie-checkWordPress-Sprache programmgesteuert einstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy