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.
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
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');
}
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
Ä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!
Der Schalter
Ich hatte ein ähnliches Problem und habe es so gelöst:
In meinem Fall wollte ich das Gebietsschema mithilfe des Benutzergebietsschemas abrufen: $userLocale = get_user_locale($userObject->ID);
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);
}