Modifica dinamica della lingua (locale) del tuo sito WordPress
Esistono alcuni fantastici plugin multilingue per WordPress, tuttavia per un progetto client avevo bisogno di qualcosa di molto più flessibile, poiché questo particolare client doveva soddisfare diversi paesi in cui ciascuno parlava diverse lingue.
In breve, il client doveva poter disporre di un’istanza multisito che avesse un paese e una lingua impostati come predefiniti e la possibilità di sovrascrivere il paese e la lingua su ogni pagina/post.
Creazione di un plug-in multilingue
Se un numero sufficiente di persone mi infastidisce per farlo, potrei considerare di rilasciare il tutto come plug-in autonomo, tuttavia il cuore del plug-in multilingue che costruisco si basa sul localefiltro WordPress e il cuore del plug-in risiede nel seguente frammento di codice:
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! La tua lingua è ora impostata e il tuo sito multilingue dovrebbe ora cambiare lingua in base al meta della tua pagina/sito.
Attesa! Le mie traduzioni predefinite di base di WordPress non funzionano!
Questo è un problema in cui mi sono imbattuto e non sono riuscito a risolverlo per tutta la vita. Il mio tema è stato tradotto perfettamente dopo aver aggiunto i file .mo e .po pertinenti, tuttavia le traduzioni predefinite di base di WordPress (come il messaggio "Lascia una risposta" nel modello dei commenti) non stavano traducendo.
Si scopre che la soluzione era piuttosto semplice! Sebbene avessi curato traduzioni di domini personalizzate, avevo dimenticato di inserire un semplice bit di codice nel mio tema: load_default_textdomain().
load_default_textdomain();
Se ho risparmiato un paio d’ore dal tuo debug con quel "suggerimento strano", sei il benvenuto!