From ec0ea0407d0431bc27c33d6f19b5cb44af45345a Mon Sep 17 00:00:00 2001 From: Santhosh Thottingal Date: Tue, 4 Jun 2013 14:25:36 +0530 Subject: [PATCH] Introduce Api for loading jquery.i18n json files To avoid CORS issue with old browsers Bug: 45958 Change-Id: I37638e06f21ab573c9ce37a4e9fb20bc763ac98f --- UniversalLanguageSelector.php | 6 ++- api/ApiULSLocalization.php | 98 +++++++++++++++++++++++++++++++++++ resources/js/ext.uls.init.js | 19 ++----- 3 files changed, 107 insertions(+), 16 deletions(-) create mode 100644 api/ApiULSLocalization.php diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php index c68047b5..3b761d16 100644 --- a/UniversalLanguageSelector.php +++ b/UniversalLanguageSelector.php @@ -19,7 +19,7 @@ */ if ( !defined( 'MEDIAWIKI' ) ) { - echo( "This file is an extension to the MediaWiki software and cannot be used standalone.\n" ); + echo "This file is an extension to the MediaWiki software and cannot be used standalone.\n"; die( -1 ); } /** @@ -125,6 +125,7 @@ $wgExtensionMessagesFiles['UniversalLanguageSelector'] = "$dir/UniversalLanguage $wgAutoloadClasses['UniversalLanguageSelectorHooks'] = "$dir/UniversalLanguageSelector.hooks.php"; $wgAutoloadClasses['ResourceLoaderULSModule'] = "$dir/ResourceLoaderULSModule.php"; $wgAutoloadClasses['ApiLanguageSearch'] = "$dir/api/ApiLanguageSearch.php"; +$wgAutoloadClasses['ApiULSLocalization'] = "$dir/api/ApiULSLocalization.php"; $wgAutoloadClasses['LanguageNameSearch'] = "$dir/data/LanguageNameSearch.php"; $wgHooks['BeforePageDisplay'][] = 'UniversalLanguageSelectorHooks::addModules'; @@ -133,6 +134,7 @@ $wgHooks['ResourceLoaderTestModules'][] = 'UniversalLanguageSelectorHooks::addTe $wgHooks['ResourceLoaderGetConfigVars'][] = 'UniversalLanguageSelectorHooks::addConfig'; $wgHooks['MakeGlobalVariablesScript'][] = 'UniversalLanguageSelectorHooks::addVariables'; $wgAPIModules['languagesearch'] = 'ApiLanguageSearch'; +$wgAPIModules['ulslocalization'] = 'ApiULSLocalization'; $wgHooks['UserGetLanguageObject'][] = 'UniversalLanguageSelectorHooks::getLanguage'; $wgHooks['SkinTemplateOutputPageBeforeExec'][] = 'UniversalLanguageSelectorHooks::onSkinTemplateOutputPageBeforeExec'; @@ -152,4 +154,4 @@ $wgExtensionFunctions[] = function() { return true; }; -require( "$dir/Resources.php" ); +require "$dir/Resources.php"; diff --git a/api/ApiULSLocalization.php b/api/ApiULSLocalization.php new file mode 100644 index 00000000..e49a7202 --- /dev/null +++ b/api/ApiULSLocalization.php @@ -0,0 +1,98 @@ +getMain()->setCacheMode( 'public' ); + $this->getMain()->setCacheMaxAge( 300 ); + + $params = $this->extractRequestParams(); + $language = $params['language']; + $namespace = $params['namespace']; + if ( !Language::isValidCode( $language ) ) { + $this->dieUsage( 'Invalid language', 'invalidlanguage' ); + } + + if ( $namespace === 'uls' ) { + $filename = "lib/jquery.uls/i18n/$language.json"; + } else { + $filename = "i18n/$language.json"; + } + + $localPath = __DIR__ . "/../$filename"; + if ( !file_exists( $localPath ) ) { + $this->getResult()->addValue( null, 'text', '{}' ); + $this->getResult()->addValue( null, 'mime', 'text/json' ); + } else { + $contents = file_get_contents( $localPath ); + // Output the file's contents raw + $this->getResult()->addValue( null, 'text', $contents ); + $this->getResult()->addValue( null, 'mime', 'text/json' ); + } + } + + public function getCustomPrinter() { + return new ApiFormatRaw( + $this->getMain(), + $this->getMain()->createPrinterByName( 'json' ) + ); + } + + public function getAllowedParams() { + return array( + 'language' => array( + ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_TYPE => 'string', + ), + 'namespace' => array( + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_REQUIRED => false, + ApiBase::PARAM_DFLT => 'ext-uls', + ), + ); + } + + public function getParamDescription() { + return array( + 'language' => 'Language string', + 'namespace' => 'Namespace string.', + ); + } + + public function getDescription() { + return 'Get the localization of ULS in given language'; + } + + public function getExamples() { + return array( + 'api.php?action=ulslocalization&language=ta', + 'api.php?action=ulslocalization&language=hi', + 'api.php?action=ulslocalization&language=or&namespace=ext-uls', + ); + } + + public function getVersion() { + return __CLASS__ . ': ' . ULS_VERSION; + } +} diff --git a/resources/js/ext.uls.init.js b/resources/js/ext.uls.init.js index 95c48384..217a1d6d 100644 --- a/resources/js/ext.uls.init.js +++ b/resources/js/ext.uls.init.js @@ -122,34 +122,25 @@ * i18n initialization */ function i18nInit() { - var extensionPath, locales, i18n; - if ( window.XDomainRequest ) { - // IE8 and IE9 does not support ajax with CORS. So make sure they - // load json files from same domain ( http://bugs.jquery.com/ticket/8283 ) - extensionPath = mw.config.get( 'wgScriptPath' ) + - '/extensions/UniversalLanguageSelector/'; - } else { - extensionPath = mw.config.get( 'wgExtensionAssetsPath' ) + - '/UniversalLanguageSelector/'; - } + var jsonLoader, locales, i18n; + + jsonLoader = mw.util.wikiScript( 'api' ) + '?action=ulslocalization&language='; locales = mw.config.get( 'wgULSi18nLocales' ); i18n = $.i18n( { locale: currentLang, messageLocationResolver: function ( locale, messageKey ) { // Namespaces are not available in jquery.i18n yet. Developers prefix // the message key with a unique namespace like ext-uls-* - if ( messageKey.indexOf( 'uls' ) === 0 ) { if ( $.inArray( locale, locales.uls ) >= 0 ) { - return extensionPath + 'lib/jquery.uls/i18n/' + locale + '.json'; + return jsonLoader + locale + '&namespace=uls'; } return false; } - if ( messageKey.indexOf( 'ext-uls' ) === 0 ) { if ( $.inArray( locale, locales['ext-uls'] ) >= 0 ) { - return extensionPath + 'i18n/' + locale + '.json'; + return jsonLoader + locale + '&namespace=ext-uls'; } return false;