Як у WordPress отримати поточну локаль (код мови) сайту

Привіт:) У цьому пості покажу різні варіанти отримати поточну локаль (код мови) WordPress-сайту. Наприклад, en_US, en або en-US.

Код локалі встановлюється на кожній сторінці сайту та задається як параметр lang у тезі <html>:

<html lang="uk">

Така задача зазвичай виникає на багатомовному сайті. Для цього використовуються, наприклад, плагіни Polylang або WPML. В залежності від поточної мови, буває необхідно виконати якусь дію чи показати потрібний блок. Наприклад, сторінку налаштувань в адмін-панелі відповідно до мови сайту.

Способів вирішення цієї задачі є декілька.

до змісту ↑

Вбудовані інструменти WordPress

У ядрі ВордПрес вже вбудовані функції для перевірки поточної мови:

// код мови у форматі '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'];
	}
	
} );
Цей спосіб спрацює незалежно від встановленого плагіну багатомовності.
до змісту ↑

Через плагін Polylang

У плагіні присутня функція, яка працює як для користувацької, так і для адмін-частини сайту:

// код мови у форматі '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();
	}

} );

Якщо встановлений WPML

У цьому випадку:

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' ) ),
		        )),
	    ));
});

Михайло Петров
Михайло Петров

Мене звати Михайло. Я — WordPress-розробник. Створюю візитки, корпоративні сайти, блоги на WordPress.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *