


Блог IT-шника
Блог IT-шника
Привіт:) У цьому пості покажу різні варіанти отримати поточну локаль (код мови) WordPress-сайту. Наприклад, en_US, en або en-US.
lang
у тезі <html>
: <html lang="uk">
Така задача зазвичай виникає на багатомовному сайті. Для цього використовуються, наприклад, плагіни Polylang або WPML. В залежності від поточної мови, буває необхідно виконати якусь дію чи показати потрібний блок. Наприклад, сторінку налаштувань в адмін-панелі відповідно до мови сайту.
Способів вирішення цієї задачі є декілька.
до змісту ↑У ядрі ВордПрес вже вбудовані функції для перевірки поточної мови:
// код мови у форматі 'en_US'
get_locale();
// код мови у форматі 'en-US'
get_bloginfo( 'language' );
Щоб визначити локаль в адмін-частині сайту:
// код мови у форматі 'en'
if ( is_admin() && current_user_can( 'manage_options' ) ) {
echo $_REQUEST['lang'];
}
Наприклад:
add_action( 'init', function() {
echo get_locale();
echo get_bloginfo( 'language' );
if ( is_admin() && current_user_can( 'manage_options' ) ) {
echo $_REQUEST['lang'];
}
} );
У плагіні присутня функція, яка працює як для користувацької, так і для адмін-частини сайту:
// код мови у форматі 'en'
pll_current_language();
У наступному прикладі перевіряю чи активований плагін Polylang. Якщо так, то виводжу код мови:
add_action( 'init', function() {
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'polylang/polylang.php' ) ) {
echo pll_current_language();
}
} );
У цьому випадку:
add_action( 'init', function() {
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'sitepress-multilingual-cms/sitepress.php' ) ) {
$currentLang = '';
$currentLang = apply_filters( 'wpml_current_language', NULL );
// код мови у форматі 'en'
echo $currentLang;
}
} );
В одному проекті мені потрібно було створити сторінку налаштувань в адмін-частині сайту відповідно до мови. Для цього використав плагін Carbon Fields. У ньому, щоб розділити опції за мовою сайту, створював блок параметрів відповідно до коду мови. В результаті написав такий код:
/**
* Визначимо, який плагін багатомовності активований на сайті: Polylang або WPML
*/
if ( ! function_exists( 'mp_get_active_multilingual_plugin' ) ) {
function mp_get_active_multilingual_plugin() {
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'polylang/polylang.php' ) ) {
return 'polylang';
} elseif ( is_plugin_active( 'sitepress-multilingual-cms/sitepress.php' ) ) {
return 'wpml';
}
}
}
if ( ! function_exists( 'mp_get_page_locale_polylang' ) ) {
function mp_get_page_locale_polylang() {
/*
* Тут є проблема. Якщо у WPML при зміні мови в адмінці через перемикач самого плагіну в адмін-барі працює константа ICL_LANGUAGE_CODE, то Polylang завжди показує локаль, задану в Налаштування > Загальне. Але нам потрібно бачити локаль, коли ми перемикаємо мову в адмінці (наприклад, у нашому випадку щоб задати різний контент для різних мов сайту). Тому беремо локаль із адресного рядка. Якщо там його нема, то ставимо локаль за замовчуванням (у Налаштування > Загальне).
*/
// Визначаємо локаль в адмінці
if ( is_admin() && current_user_can( 'manage_options' ) ) {
// Даний спосіб працює некоректно, бо при переключенні посту на відповідну мову тут значення локалі повертається за замовчуванням.
// if ( $_REQUEST['lang'] == 'uk' ) { // $_GET['lang']
// return '_uk';
// } elseif ( $_REQUEST['lang'] == 'en' ) { // $_GET['lang']
// return '_en';
// } else {
// return '_' . get_bloginfo( 'language' );
// }
// АБО
/**
* Якщо в адмін-частині (Polylang) у виборі мов вказано "Показати всі мови", то функція pll_current_language() поверне порожній результат. І опції можна задавати, але ні для якої мови вони працювати не будуть. Тому роблю перевірку: якщо вона порожня, задаю їй значення - локаль адмінки за замовчуванням.
*/
if ( pll_current_language() == '' ) {
return '_' . get_bloginfo( 'language' );
} else {
// Цей спосіб працює ідеально
return '_' . pll_current_language();
}
} else { // Визначаємо локаль у користувацькій частині сайту
if ( get_locale() == 'uk' ) {
return '_uk';
} elseif ( get_locale() == 'en_US' ) {
return '_en';
}
}
}
}
if ( ! function_exists( 'mp_get_page_locale_wpml' ) ) {
function mp_get_page_locale_wpml() {
$prefix = '';
if ( ! defined( 'ICL_LANGUAGE_CODE' ) ) {
return $prefix;
}
$prefix = '_' . ICL_LANGUAGE_CODE;
return $prefix;
}
}
/**
* Результат роботи функції:
*
* uk
* ru
* en
*/
if ( ! function_exists( 'mp_get_page_locale' ) ) {
function mp_get_page_locale() {
if ( mp_get_active_multilingual_plugin() == 'polylang' ) {
return mp_get_page_locale_polylang();
} elseif ( mp_get_active_multilingual_plugin() == 'wpml' ) {
return mp_get_page_locale_wpml();
}
}
}
/**
* Initial Carbon Fields
*
*/
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( ! is_plugin_active( 'carbon-fields/carbon-fields-plugin.php' ) ) {
return;
} else {
/**
* Заборона деактивації Carbon Fields
*/
add_filter( 'plugin_action_links', function( $actions, $plugin_file ) {
// Видаляє дію "Вимкнути (Деактивувати)" у плагіні
$important_plugins = array(
'carbon-fields/carbon-fields-plugin.php',
);
if ( in_array( $plugin_file, $important_plugins ) ) {
unset( $actions['deactivate'] );
$actions['info'] = '<b class="musthave_js">Cannot be deactivated</b>';
}
return $actions;
}, 10, 2 );
}
// Multilingual Options Page with Carbon Fields
use Carbon_Fields\Container;
use Carbon_Fields\Field;
add_action( 'carbon_fields_register_fields', function() {
Container::make( 'theme_options', __( 'MP Page Options (CF)', 'mp-multilingual-options-page' ) )
->add_fields( array(
Field::make( 'complex', 'mp_multilingual_options_page_block' . mp_get_page_locale(), __( 'MP Page Options Block' . mp_get_page_locale(), 'mp-multilingual-options-page' ) )
->add_fields( array(
Field::make( 'text', 'title' . mp_get_page_locale(), __( 'H1' . mp_get_page_locale(), 'mp-multilingual-options-page' ) ),
Field::make( 'rich_text', 'content' . mp_get_page_locale(), __( 'Content' . mp_get_page_locale(), 'mp-multilingual-options-page' ) ),
)),
));
});