Istnieje kilka fantastycznych wielojęzycznych wtyczek do WordPressa, jednak w przypadku jednego projektu klienta potrzebowałem czegoś znacznie bardziej elastycznego, ponieważ ten konkretny klient musiał obsługiwać kilka krajów, z których każdy mówił kilkoma językami.
Krótko mówiąc, klient musiał mieć instancję wielostanowiskową, która miała ustawiony domyślnie kraj i język, a także możliwość nadpisania kraju i języka na każdej stronie / poście.
Tworzenie wtyczki wielojęzycznej
Jeśli wystarczająco dużo osób mnie wkurzy, mogę rozważyć wydanie całości jako samodzielnej wtyczki, jednak serce tworzonej przeze mnie wielojęzycznej wtyczki opiera się na localefiltrze WordPress, a serce wtyczki znajduje się w następującym fragmencie kodu:
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! Twój język jest teraz ustawiony, a Twoja wielojęzyczna witryna powinna teraz przełączać języki na podstawie meta strony/witryny.
Czekać! Moje domyślne tłumaczenia WordPress Core nie działają!
To jest problem, na który natknąłem się i nie mogłem go rozgryźć. Mój motyw został idealnie przetłumaczony po dodaniu odpowiednich plików .mo i .po, jednak domyślne tłumaczenia WordPress (takie jak wiadomość „Zostaw odpowiedź" w szablonie komentarzy) nie były tłumaczone.
Okazuje się, że rozwiązanie było dość proste! Chociaż zajmowałem się niestandardowymi tłumaczeniami domen, zapomniałem wstawić do motywu jednego prostego fragmentu kodu: load_default_textdomain().
load_default_textdomain();
Jeśli skróciłem twoje debugowanie o kilka godzin dzięki tej „jednej dziwnej wskazówce”, nie ma za co!