%PDF- %PDF-
Direktori : /www/varak.net/wiki.varak.net/extensions/cldr/ |
Current File : /www/varak.net/wiki.varak.net/extensions/cldr/LanguageNames.body.php |
<?php /** * A class for querying translated language names from CLDR data. * * @author Niklas Laxström * @author Ryan Kaldari * @copyright Copyright © 2007-2011 * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later */ class LanguageNames extends CldrNames { private static $cache = array(); const FALLBACK_NATIVE = 0; // Missing entries fallback to native name const FALLBACK_NORMAL = 1; // Missing entries fallback through the fallback chain const LIST_MW_SUPPORTED = 0; // Only names that have localisation in MediaWiki const LIST_MW = 1; // All names that are in Names.php const LIST_MW_AND_CLDR = 2; // Combination of Names.php and what is in cldr /** * Get localized language names for a particular language, using fallback languages for missing * items. * * @param $code string * @param $fbMethod int * @param $list int * @throws Exception * @return array an associative array of language codes and localized language names */ public static function getNames( $code, $fbMethod = self::FALLBACK_NATIVE, $list = self::LIST_MW ) { $xx = self::loadLanguage( $code ); $native = Language::fetchLanguageNames( null, $list === self::LIST_MW_SUPPORTED ? 'mwfile' : 'mw' ); if ( $fbMethod === self::FALLBACK_NATIVE ) { $names = array_merge( $native, $xx ); } elseif ( $fbMethod === self::FALLBACK_NORMAL ) { // Load missing language names from fallback languages $fb = $xx; if ( is_callable( array( 'Language', 'getFallbacksFor' ) ) ) { // MediaWiki 1.19 $fallbacks = Language::getFallbacksFor( $code ); foreach ( $fallbacks as $fallback ) { // Overwrite the things in fallback with what we have already $fb = array_merge( self::loadLanguage( $fallback ), $fb ); } } else { // MediaWiki 1.18 or earlier $fallback = $code; while ( $fallback = Language::getFallbackFor( $fallback ) ) { // Overwrite the things in fallback with what we have already $fb = array_merge( self::loadLanguage( $fallback ), $fb ); } } /* Add native names for codes that are not in cldr */ $names = array_merge( $native, $fb ); /* As a last resort, try the native name in Names.php */ if ( !isset( $names[$code] ) && isset( $native[$code] ) ) { $names[$code] = $native[$code]; } } else { throw new Exception( "Invalid value for 2:\$fallback in " . __METHOD__ ); } switch ( $list ) { case self::LIST_MW: case self::LIST_MW_SUPPORTED: /* Remove entries that are not in fb */ $names = array_intersect_key( $names, $native ); /* And fall to the return */ case self::LIST_MW_AND_CLDR: return $names; default: throw new Exception( "Invalid value for 3:\$list in " . __METHOD__ ); } } /** * Load currency names localized for a particular language. Helper function for getNames. * * @param $code string The language to return the list in * @return array an associative array of language codes and localized language names */ private static function loadLanguage( $code ) { if ( isset( self::$cache[$code] ) ) { return self::$cache[$code]; } self::$cache[$code] = array(); if ( !Language::isValidBuiltInCode( $code ) ) { return array(); } /* Load override for wrong or missing entries in cldr */ $override = __DIR__ . '/LocalNames/' . self::getOverrideFileName( $code ); if ( file_exists( $override ) ) { $languageNames = false; require $override; if ( is_array( $languageNames ) ) { self::$cache[$code] = $languageNames; } } $filename = __DIR__ . '/CldrNames/' . self::getFileName( $code ); if ( file_exists( $filename ) ) { $languageNames = false; require $filename; if ( is_array( $languageNames ) ) { if ( isset( self::$cache[$code] ) ) { // Add to existing list of localized language names self::$cache[$code] = self::$cache[$code] + $languageNames; } else { // No list exists, so create it self::$cache[$code] = $languageNames; } } } else { wfDebug( __METHOD__ . ": Unable to load language names for $filename\n" ); } return self::$cache[$code]; } /** * @param $names array * @param $code string * @return bool */ public static function coreHook( &$names, $code ) { $names += self::getNames( $code, self::FALLBACK_NORMAL, self::LIST_MW_AND_CLDR ); return true; } }