WordPressissä on loistavia monikielisiä laajennuksia, mutta yhtä asiakasprojektia varten tarvitsin jotain paljon joustavampaa, koska tämän asiakkaan piti palvella useita maita, joista jokainen puhui useita kieliä.
Lyhyesti sanottuna asiakkaalla piti olla usean sivuston esiintymä, jonka maa ja kieli oli asetettu oletusarvoiksi, ja kyky ohittaa maa ja kieli jokaisella sivulla/viestissä.
Monikielisen laajennuksen rakentaminen
Jos tarpeeksi ihmisiä häiritsee minua tekemään sen, saatan harkita koko jutun julkaisemista erillisenä laajennuksena, mutta rakentamani monikielisen laajennuksen ydin perustuu localeWordPress-suodattimeen, ja laajennuksen ydin on seuraavassa koodinpätkässä:
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! Kieli-asetus on nyt asetettu, ja monikielisen sivustosi pitäisi nyt vaihtaa kieltä sivusi/sivustosi sisällönkuvauksen perusteella.
Odota! WordPressin ydinoletuskäännökseni eivät toimi!
Tämä on ongelma, johon törmäsin, enkä voinut ymmärtää sitä elämäni aikana. Teemani käännettiin täydellisesti, kun olin lisännyt asiaankuuluvat .mo- ja .po-tiedostot, mutta WordPress-ytimen oletuskäännökset (kuten kommenttimallin "Jätä vastaus" -viesti) eivät käännetty.
Kävi ilmi, että ratkaisu oli melko yksinkertainen! Vaikka olin huolehtinut mukautetuista verkkotunnuksen käännöksistä, olin unohtanut lisätä yhden yksinkertaisen koodin teemaan: load_default_textdomain().
load_default_textdomain();
Jos olen saanut pari tuntia pois virheenkorjauksestasi tällä "yhdellä oudolla vinkillä", olet tervetullut!