Динамічна зміна мови (локалі) вашого сайту WordPress
Є кілька фантастичних багатомовних плагінів для 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 Core не працюють!
Це проблема, з якою я зіткнувся, але не міг її зрозуміти. Моя тема була ідеально перекладена після того, як я додав відповідні файли .mo та .po, однак переклади ядра WordPress за замовчуванням (наприклад, повідомлення «Залишити відповідь» у шаблоні коментарів) не перекладалися.
Виявилося, що рішення було досить простим! Хоча я забезпечив власний переклад домену, я забув додати один простий фрагмент коду до своєї теми: load_default_textdomain().
load_default_textdomain();
Якщо я скоротив пару годин вашого налагодження за допомогою цієї «однієї дивної поради», ласкаво просимо!