Skip to content
Snippets Groups Projects

WP RRZE\Locale class

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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];
        }
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment