WP RRZE\Locale class
The snippet can be accessed without any authentication.
Authored by
Rolf Forst
Language functions for WP. Includes a dropdown for available languages.
Locale.php 2.67 KiB
<?php
namespace RRZE\Locale;
defined('ABSPATH') || exit;
class Locale
{
/**
* Dropdown for available languages
*
* @return void
*/
public function langDropdown()
{
$currentLocale = $this->getLocale();
$availableLanguages = $this->getAvailableLanguages();
echo '<label class="screen-reader-text" for="language">' . __('Select a language') . '</label>', PHP_EOL;
echo '<select name="language" id="language">', PHP_EOL;
foreach ($availableLanguages as $locale) {
$translation = $this->getTranslation($locale);
printf('<option value="%1$s"' . selected($currentLocale, $locale, false) . '>%2$s</option>%3$s', $locale, esc_attr($translation['native_name']), PHP_EOL);
}
echo '</select>', PHP_EOL;
}
/**
* Retrieves the current base locale. (i.e. de_DE_formal => de_DE)
*
* @return string
*/
protected function getLocale(): string
{
$locale = get_locale();
return substr($locale, 0, 5);
}
/**
* Get all available base languages (i.e. de_DE_formal => de_DE)
*
* @return array
*/
protected function getAvailableLanguages(): array
{
// Get all available languages based on the presence of *.mo files in WP_LANG_DIR.
$languages = get_available_languages();
foreach ($languages as $k => $lang) {
if (strlen($lang) > 5) {
unset($languages[$k]);
}
}
return array_merge($languages, ['en_US']);
}
/**
* Get available translations from the WordPress.org API
* and add en_US (default) to the available translations.
*
* @return array
*/
protected function getAvailableTranslations(): array
{
require_once(ABSPATH . 'wp-admin/includes/translation-install.php');
// Get available translations from the WordPress.org API.
$translations = wp_get_available_translations();
$english = [
'en_US' => [
'language' => 'en_US',
'english_name' => 'English',
'native_name' => 'English',
'iso' => [
1 => 'en'
]
]
];
return array_merge($translations, $english);
}
/**
* Get a translation from the available translations.
*
* @param string $locale
* @return string
*/
protected function getTranslation(string $locale = 'en_US'): string
{
$translations = $this->getAvailableTranslations();
if ($locale == 'en_EN') {
$locale = 'en_US';
}
return $translations[$locale];
}
}
Please register or sign in to comment