From 76e82e4a9cd2e73e60806343066aad5d9fbdfbea Mon Sep 17 00:00:00 2001 From: Santhosh Thottingal Date: Mon, 4 Nov 2013 16:15:07 +0530 Subject: [PATCH] ResourceLoader Module for serving json based localization messages ApiULSLocalization is still present since we have to provide live language preview feature. Moved the loading of json file to includes/JsonMessageLoader.php Also moved all RL modules to includes folder. Bug: 56509 Change-Id: Ic39dec1c484982fb07edd167e83794c0b5f470ee --- Resources.php | 6 +- UniversalLanguageSelector.php | 5 +- api/ApiULSLocalization.php | 37 +-------- includes/JsonMessageLoader.php | 79 +++++++++++++++++++ .../ResourceLoaderULSJsonMessageModule.php | 63 +++++++++++++++ .../ResourceLoaderULSModule.php | 0 resources/js/ext.uls.i18n.js | 14 +++- 7 files changed, 165 insertions(+), 39 deletions(-) create mode 100644 includes/JsonMessageLoader.php create mode 100644 includes/ResourceLoaderULSJsonMessageModule.php rename ResourceLoaderULSModule.php => includes/ResourceLoaderULSModule.php (100%) diff --git a/Resources.php b/Resources.php index 41ae36d3..7edce262 100644 --- a/Resources.php +++ b/Resources.php @@ -15,6 +15,10 @@ $wgResourceModules['ext.uls.languagenames'] = array( 'class' => 'ResourceLoaderULSModule' ); +$wgResourceModules['ext.uls.messages'] = array( + 'class' => 'ResourceLoaderULSJsonMessageModule' +); + $wgResourceModules['ext.uls.buttons'] = array( 'styles' => 'resources/css/ext.uls.buttons.css', ) + $resourcePaths; @@ -68,7 +72,7 @@ $wgResourceModules['ext.uls.init'] = array( 'jquery.json', 'jquery.cookie', 'jquery.uls', - 'ext.uls.i18n', + 'ext.uls.messages', ), 'position' => 'top', ) + $resourcePaths; diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php index 35a39c84..5334d28c 100644 --- a/UniversalLanguageSelector.php +++ b/UniversalLanguageSelector.php @@ -152,9 +152,12 @@ $wgExtensionMessagesFiles['UniversalLanguageSelector'] = // Register auto load for the page class $wgAutoloadClasses += array( 'UniversalLanguageSelectorHooks' => __DIR__ . '/UniversalLanguageSelector.hooks.php', - 'ResourceLoaderULSModule' => __DIR__ . '/ResourceLoaderULSModule.php', + 'ResourceLoaderULSModule' => __DIR__ . '/includes/ResourceLoaderULSModule.php', + 'ResourceLoaderULSJsonMessageModule' => + __DIR__ . '/includes/ResourceLoaderULSJsonMessageModule.php', 'ApiLanguageSearch' => __DIR__ . '/api/ApiLanguageSearch.php', 'ApiULSLocalization' => __DIR__ . '/api/ApiULSLocalization.php', + 'JsonMessageLoader' => __DIR__ . '/includes/JsonMessageLoader.php', 'LanguageNameSearch' => __DIR__ . '/data/LanguageNameSearch.php', ); diff --git a/api/ApiULSLocalization.php b/api/ApiULSLocalization.php index 17504acb..ff96ce04 100644 --- a/api/ApiULSLocalization.php +++ b/api/ApiULSLocalization.php @@ -32,47 +32,12 @@ class ApiULSLocalization extends ApiBase { if ( !Language::isValidCode( $language ) ) { $this->dieUsage( 'Invalid language', 'invalidlanguage' ); } - - $contents = array(); - // jQuery.uls localization - $contents += $this->loadI18nFile( __DIR__ . '/../lib/jquery.uls/i18n', $language ); - // mediaWiki.uls localization - $contents += $this->loadI18nFile( __DIR__ . '/../i18n', $language ); - + $contents = JsonMessageLoader::getMessages( $language ); // Output the file's contents raw $this->getResult()->addValue( null, 'text', json_encode( $contents ) ); $this->getResult()->addValue( null, 'mime', 'application/json' ); } - /** - * Load messages from the jquery.i18n json file and from - * fallback languages. - * @param string $dir Directory of the json file. - * @param string $language Language code. - * @return array - */ - protected function loadI18nFile( $dir, $language ) { - $languages = Language::getFallbacksFor( $language ); - // Prepend the requested language code - // to load them all in one loop - array_unshift( $languages, $language ); - $messages = array(); - - foreach ( $languages as $language ) { - $filename = "$dir/$language.json"; - - if ( !file_exists( $filename ) ) { - continue; - } - - $contents = file_get_contents( $filename ); - $messagesForLanguage = json_decode( $contents, true ); - $messages = array_merge( $messagesForLanguage, $messages ); - } - - return $messages; - } - public function getCustomPrinter() { return new ApiFormatRaw( $this->getMain(), diff --git a/includes/JsonMessageLoader.php b/includes/JsonMessageLoader.php new file mode 100644 index 00000000..0c509a65 --- /dev/null +++ b/includes/JsonMessageLoader.php @@ -0,0 +1,79 @@ +getLanguage(); + if ( !Language::isValidCode( $code ) ) { + $code = 'en'; + } + + $mtimes = array_map( + 'filemtime', + JsonMessageLoader::getFilenames( $code ) + ); + // Make sure we have at least one entry + $mtimes[] = 1; + + return max( $mtimes ); + } + + /** + * Get the message strings for the current UI language. Uses + * mw.uls.loadLocalization to register them on the frontend. + * @param ResourceLoaderContext $context + * @return string JavaScript code. + */ + function getScript( ResourceLoaderContext $context ) { + $code = $context->getLanguage(); + if ( !Language::isValidCode( $code ) ) { + $code = 'en'; + } + + $params = array( $code, JsonMessageLoader::getMessages( $code ) ); + + return Xml::encodeJsCall( 'mw.uls.loadLocalization', $params ); + } +} diff --git a/ResourceLoaderULSModule.php b/includes/ResourceLoaderULSModule.php similarity index 100% rename from ResourceLoaderULSModule.php rename to includes/ResourceLoaderULSModule.php diff --git a/resources/js/ext.uls.i18n.js b/resources/js/ext.uls.i18n.js index 72ba46f4..c9f51642 100644 --- a/resources/js/ext.uls.i18n.js +++ b/resources/js/ext.uls.i18n.js @@ -34,10 +34,22 @@ // ApiULSLocalization handles fallback in ULS $.i18n.fallbacks = {}; - mw.uls.loadLocalization = function ( locale ) { + /** + * Load localization messags for a locale to the jquery.i18n + * messagestore. + * Also called by RL module ResourceLoaderULSJsonMessageModule + * @param {string} locale the language code + * @param {Object} [messages] + * @return {jQuery.Deferred} + */ + mw.uls.loadLocalization = function ( locale, messages ) { var i18n = $.i18n(); i18n.locale = locale; + if ( messages ) { + i18n.load( messages, locale ); + return $.Deferred().resolve(); + } if ( i18n.messageStore.messages[locale] ) { return $.Deferred().resolve(); }