Есть несколько фантастических многоязычных плагинов для WordPress, однако для одного клиентского проекта мне нужно было что-то гораздо более гибкое, так как этот конкретный клиент должен был обслуживать несколько стран, каждая из которых говорила на нескольких языках.
Короче говоря, клиент должен был иметь многосайтовый экземпляр, в котором страна и язык были установлены по умолчанию, а также возможность переопределять страну и язык на каждой странице/сообщении.
Создание многоязычного плагина
Если достаточное количество людей заставит меня это сделать, я могу рассмотреть возможность выпуска всего этого в виде отдельного плагина, однако сердце многоязычного плагина, который я создаю, опирается на localeфильтр WordPress, а сердце плагина находится в следующем фрагменте кода:
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 );
Тада! Ваша локаль теперь установлена, и ваш многоязычный сайт теперь должен переключать языки в зависимости от метаданных вашей страницы/сайта.
Ждать! Мои стандартные переводы ядра WordPress не работают!
Это проблема, с которой я столкнулся, и не мог в жизни понять это. Моя тема отлично переводится после того, как я добавил соответствующие файлы .mo и .po, однако основные переводы WordPress по умолчанию (например, сообщение «Оставить ответ» в шаблоне комментариев) не переводились.
Оказывается, решение было довольно простым! Хотя я обслуживал переводы пользовательских доменов, я забыл поместить в свою тему один простой код: load_default_textdomain().
load_default_textdomain();
Если я сэкономил пару часов на вашей отладке с помощью этого «одного странного совета», добро пожаловать!