Ändra ditt WordPress-webbplatsspråk (lokal) dynamiskt
Det finns några fantastiska flerspråkiga plugins för WordPress, men för ett kundprojekt behövde jag något mycket mer flexibelt, eftersom just den här klienten behövde tillgodose flera länder som var och en talade flera språk.
Kort sagt behövde klienten ha en multisite-instans som hade ett land och språk inställt som standard, och möjligheten att åsidosätta landet och språket på varje sida/inlägg.
Bygga en flerspråkig plugin
Om tillräckligt många människor buggar mig för att göra det, kan jag överväga att släppa det hela som ett fristående plugin, men hjärtat i det flerspråkiga plugin jag bygger bygger på localeWordPress-filtret, och hjärtat av pluginet finns i följande kodavsnitt:
function wholesomecode_example_redefine_locale( $locale) {
$country = get_post_meta( get_the_id(), '_wholesomecode_example_global_country_override', true );
$lang = get_post_meta( get_the_id(), '_wholesomecode_example_global_language_override', true );
if (( empty( $lang) ||! (is_page() || is_single() || is_singular()) )) {
$country = get_theme_mod( 'wholesomecode_example_multilingual_country', 'gb' );
$lang = get_theme_mod( 'wholesomecode_example_multilingual_language', 'en' );
}
if ('default' !== $country) {
$locale = $lang. '_'. strtoupper( $country );
} else {
$locale = $lang. '-'. $country;
}
return $locale;
}
add_filter( 'locale', 'wholesomecode_example_redefine_locale', 10 );
Tada! Din språkinställning är nu inställd och din flerspråkiga webbplats bör nu byta språk baserat på din sida/webbplats meta.
Vänta! Mina WordPress Core Default-översättningar fungerar inte!
Det här är ett problem jag stötte på, och jag kunde inte för mitt liv ta reda på det. Mitt tema översattes perfekt efter att jag hade lagt till de relevanta .mo- och .po-filerna, men WordPress-standardöversättningarna (som "Lämna ett svar"-meddelandet i kommentarmallen) översattes inte.
Det visade sig att lösningen var ganska enkel! Även om jag hade sörjt för anpassade domänöversättningar, hade jag glömt att lägga in en enkel kodbit i mitt tema: load_default_textdomain().
load_default_textdomain();
Om jag har rakat bort ett par timmar från din felsökning med det där "ett konstiga tipset", är du välkommen!