array( 'English', 'en_US', '🇬🇧', false ), 'uk' => array( 'Українська', 'uk', '🇺🇦', false ), 'pl' => array( 'Polski', 'pl_PL', '🇵🇱', false ), 'de' => array( 'Deutsch', 'de_DE', '🇩🇪', false ), 'fr' => array( 'Français', 'fr_FR', '🇫🇷', false ), 'es' => array( 'Español', 'es_ES', '🇪🇸', false ), 'it' => array( 'Italiano', 'it_IT', '🇮🇹', false ), 'pt' => array( 'Português', 'pt_PT', '🇵🇹', false ), 'nl' => array( 'Nederlands', 'nl_NL', '🇳🇱', false ), 'cs' => array( 'Čeština', 'cs_CZ', '🇨🇿', false ), 'ro' => array( 'Română', 'ro_RO', '🇷🇴', false ), 'tr' => array( 'Türkçe', 'tr_TR', '🇹🇷', false ), 'ja' => array( '日本語', 'ja', '🇯🇵', false ), 'zh' => array( '中文', 'zh_CN', '🇨🇳', false ), 'ar' => array( 'العربية', 'ar', '🇸🇦', true ), 'he' => array( 'עברית', 'he_IL', '🇮🇱', true ), ); /** @return array code => language */ public function all(): array { $out = array(); foreach ( array_keys( self::PRESETS ) as $code ) { $out[ $code ] = $this->make( $code ); } return $out; } public function get( string $code ): ?Language { return isset( self::PRESETS[ $code ] ) ? $this->make( $code ) : null; } /** * Language for a WordPress locale: the preset with that locale, else the * preset for its language part (de_AT -> Deutsch with locale de_AT), else * a generic entry named after the locale. */ public function from_locale( string $locale, bool $rtl = false ): Language { $locale = '' !== $locale ? $locale : 'en_US'; foreach ( self::PRESETS as $code => $p ) { if ( $p[1] === $locale ) { return $this->make( $code ); } } $code = strtolower( (string) preg_replace( '/[^a-z]/i', '', (string) strtok( $locale, '_-' ) ) ); $code = '' === $code ? 'en' : $code; $preset = $this->get( $code ); if ( $preset ) { return new Language( $code, $code, $preset->name, $locale, $preset->flag, $preset->rtl ); } return new Language( $code, $code, $locale, $locale, '', $rtl ); } private function make( string $code ): Language { list( $name, $locale, $flag, $rtl ) = self::PRESETS[ $code ]; return new Language( $code, $code, $name, $locale, $flag, $rtl ); } }