http://www.mediawiki.org/wiki/Special:Code/MediaWiki/66317
Revision: 66317 Author: dale Date: 2010-05-13 00:24:48 +0000 (Thu, 13 May 2010) Log Message: ----------- * Updated JS2 documentation * Maintenance script for javascript msg JSON -> php localization files * Moved mwEmbed.i18n to match other module conventions Modified Paths: -------------- trunk/extensions/JS2Support/README trunk/extensions/JS2Support/mwEmbed/includes/jsClassLoader.php Added Paths: ----------- trunk/extensions/JS2Support/maintenance/ trunk/extensions/JS2Support/maintenance/MergeJavascriptMsg.php trunk/extensions/JS2Support/mwEmbed/mwEmbed.i18n.php Removed Paths: ------------- trunk/extensions/JS2Support/mwEmbed/languages/mwEmbed.i18n.php Modified: trunk/extensions/JS2Support/README =================================================================== --- trunk/extensions/JS2Support/README 2010-05-12 23:12:20 UTC (rev 66316) +++ trunk/extensions/JS2Support/README 2010-05-13 00:24:48 UTC (rev 66317) @@ -1,10 +1,8 @@ = JS2 Support Extension = -The JS2 Support svn:externals hosts the mwEmbed library. svn does not support -svn:externals on files so mwEmbed.js and jsScriptLoader.php are symbolically linked in the -working directory and updates are manually committed to the JS2extension. +The JS2 Support extension includes a ScriptLoader and associated javascript helper library. -the js2-work branch has been depreciated. +The js2-work branch has been depreciated. The stand-alone mwEmbed support contains all the the stand alone mwEmbed modules and these core mwEmbed libraries. You can learn more about mwEmbed stand alone in @@ -20,10 +18,10 @@ To add the base js2 library support simply add the following to your LocalSettings.php: require_once( "$IP/extensions/JS2Support/JS2Support.php" ); -By default js2 support groups script and css requests, disable script grouping for debugging set: +By default js2 support groups script and css requests. To disable script grouping in your localSettings.php set: $wgEnableScriptLoader = false; -If you want a fresh copy of the scripts ( and to disable minification in when wgEnableScriptLoader= true you can set ) +If you want a fresh copy of all the scripts ( and to disable minification in when wgEnableScriptLoader= true you can set ) $wgDebugJavaScript = true; == LocalSettings.php to enable all js2 extensions == @@ -48,7 +46,7 @@ To add a javascript or css to the named paths ( so that the script loader can load it by name ) $wgScriptLoaderNamedPaths[ 'myExtension' ] = 'extensions/myExtension/myExtension.js'; -Then in your php you can inclue your with the following line: +Then in your php you can include your with the following line: $wgOut->addScriptClass( 'myExtension' /* scriptloader named path */ , 'page'/* group bucket id */ ); This lets you use the named-path for includes and gives you control over script grouping with the grouping argument. If for example your script is included on a set of special pages then you could @@ -71,45 +69,54 @@ == Using JS2 with JS-modules == JS Modules are reusable sets of javascript that can be dynamically configured, loaded and executed in -arbitrary javascript contexts. These libraries should have a clean separation of configuration, +arbitrary application contexts. Javascript modules promote a clean separation of configuration, interface, and application flow. These modules define relative paths for assets and can be hosted -inside extensions or optionally used in stand-alone javascript applications. They provide a means to cleanly -"embed" mediaWiki interfaces into application contexts. +inside extensions or optionally used in stand-alone javascript interfaces. -Examples include embedding a video player with timed text subtitles pulled from an external wiki, to -embedding a wikiEditor toolbar on a view page. The use of "loaders" enables dynamic packaging of -modules with the intent of avoiding multiple requests, at the cost of slightly larger server side cache of -combined resources. +The use of "loaders" enables dynamic packaging of modules with the intent of avoiding multiple requests, +for dynamically loaded interfaces. -It enables the server to deliver static configuration files that drive interface customizations in +JS2 enables the server to deliver static configuration files that drive interface customizations in javascript rather than costly dynamically html output from php. -== JS-module components == +== JS Module Components == The three components of a js-module are "module loaders", "module activators" and "library code and assets". -* "module loaders" build the request set of the javascript and css assets for a given interface "module" -in the context of user preferences or application configuration. +* "module loaders" define named paths and build the request set of the javascript and css assets +for a given interface "module". The set of requested libraries can driven by site configuration, +and user preferences. The requested set of modules can include core libraries like jquery.ui helpers. -* "module activators" call the module loaders in a given application context. For example -an edit page or a view page may call the wikiToolBar with different module configuration. +* "module activators" Call the module loaders in a given application context and then +invoke the interface or application. * "library code and assets" These consist of library code and assets that is the user interface or application. -These libs are driven by a given configuration. +These libraries are driven by a given configuration. == Example Flow and File Contents == -When an application wants to use that interface component it calls the module loader. -The module loader checks relevant configuration and javascript application state for existing -satisfied dependencies or browser specific libraries, then issues a single script-loader -request that retrieves all the needed javascript, css and localized message text for -that interface, the returned javascript will be minfied and gziped and cached on the server. +When an application wants to use a interface component it calls the module loader from its activator. +The module loader checks relevant configuration, it then issues a single script-loader +request that checks javascript application state for existing satisfied dependencies or native browser support +it then retrieves all the needed javascript, css and localized message text for that interface. +The returned javascript will be minfied and gziped and cached on the server. +The activator gets a callback that the interface library is loaded, and can then use that interface. -Example loader.js: +=== Example Loader loader.js: === +Loaders should define named class paths, named "module loader" functions and default configuration +if appropriate. Style sheet assets should be named mw.style[ {styleName} ] this is so we can +register the presence of style sheets in javascript and libraries can dynamically +share style sheet components. + /* * First we define the named script class paths * Each class "mw.myJsModuleUI" defines its class name in the javascript +* Note these named paths should be in "JSON" not javascript +* The scriptLoader will parse these named paths. +* +* By putting these in javascript instead of php we can develop the library +* in "raw" file mode ( by setting wgEnableScriptLoader = false ) */ mw.addClassFilePaths( { "mw.myJsModuleHandler" : "js/mw.myJSModuleHandler.js", @@ -133,13 +140,14 @@ $j( mw ).trigger( 'LoaderMyJsModuleAddFeatures', requestSet ); // Load the request set and run the ModuleLoader callback. - mw.load( requestSet, callback) + mw.load( requestSet, callback ); }); -Example "Activator" +=== Example "Activator" MyModulePage.js === /* -* Anytime we want to use the module we simply call the module loader +* MyModulePage.js is included on pages that we want via normal php extension hooks. +* Once we want to use the module we simply call the module loader */ var myModuleConfig = { 'configOption1' : mw.getConfig( 'myJsModule.configOption1' ) @@ -153,46 +161,76 @@ $j('#targetElement').myJsModule( myModuleConfig ); } -Example Library Code +=== Example Library Code === The key thing to remember about library code is that it defines a named class ie: -mw.load( 'mw.Foo' ... -// will load a file that includes -mw.Foo = function(){ ... +a file by name 'mw.Foo.js' would define a object named 'mw.Foo' ie something like: + +mw.Foo = function( options ){ + this.init( options ); +} +mw.Foo.prototype = { + 'init' : function(){ /* constructor */ } + 'drawUI' : function(){ ... } +} + Library code should operate off of global configuration mw.getConfig( 'configurationOption' ) and or local configuration ( where appropriate ) ie the constructor gets passed an options object that defines named value pairs of configuration or callbacks. +The other key thing to remember about library code is to handle localization in some way. +The localization options are presented bellow + == Localization == -The JS2 Localization system works similar to its php counterpart. -( it includes support for {{PLURAL}} transforms ) +Each javascript module hosts a {moduleName}.i18n.php file that works with the +existing mediaWiki translate system. Note when the script-loader populates +the msg replacements it uses mediaWiki's wfGetMsg function so any database +MediaWiki namespace strings ''will be'' included in your javascript messages. -To get a msg simply issue the call: -gM( 'msg-key', 'replacement1', 'replacement2', 'etc' ); +You have three options for packaging messages in your javascript module -Note you can pass jQuery replacements in the case of links ie: -gM( 'msg-key', $j('<a />').text( gM( 'link-text' ) ); +1) If your javascript module is simple and your interface is mostly set in a single +file you may want to load all your msgs at once. You can get all the msgs in your javascript +module's localization file by simply isssuing the call: +mw.includeAllModuleMsgs(); -For full documentation see: mwEmbed/languages/mw.Language.js function: mw.getMsg +Putting this function call at the top of your primary library code javascript file will be +replaced with all the msgs in your modules php localization file in the current language. +2 ) If your code includes many sub-modules and you may want fine grain control over what msgs +are packaged when. You can define the set of msg keys it at the top of any javascript file. -If you want ~all~ of the msgs for your module php localization file you can simply issue -a call mw.includeAllMsgs() near the top of your primary library code. This will -include be replaced with all the msgs in your php localization file for your selected language. +For example: +mw.addMessegeKeys( ['list', 'of', 'msg-keys' ] ); -If your code includes many sub-modules and you want fine grain control over what msgs -are packaged when you can define the set of msg keys it at the top of any javascript file. +Will be replaced by the script-loader with the localized msgs for every listed key. + +3) If you are doing a lot of stand alone testing it can be faster to use a json array +at the top of your javascript file. +mw.addMesseges( { "msg-key" : "English fallback" } ); -You can use a list of keys: + Your javascript file then becomes your developer reference English messages. A maintenance scripts then +copy your English fallbacks into the php localization file for the translate wiki scripts to work with. +Running the JS2Support maintenance script "mergeJavascriptMsgs.php" will sync javascript into phpt files. -mw.addMessegeKeys( ['list', 'of', 'msg-keys' ] ); +This is the most complicated setup, if your unsure use the first option: +mw.includeAllModuleMsgs(); + +=== Accessing Msgs in Javascript === -or if you are doing a lot of stand alone testing it can be faster and simpler to use a json array: -mw.addMesseges( { "msg-key" : "english fallback" } ); +The JS2 Localization system works similar to its php counterpart. It includes +support for {{PLURAL}} transforms. -Either way the set of messages will be localized by the scriptLoader once the javascript class is requested. +To get a message simply issue the call: +gM( 'msg-key', 'replacement1', 'replacement2', 'etc' ); +Note you can pass jQuery replacements in the case of links ie: +gM( 'msg-key', $j('<a />').text( gM( 'link-text' ) ); +For full documentation see: mwEmbed/languages/mw.Language.js function: mw.getMsg + + + Added: trunk/extensions/JS2Support/maintenance/MergeJavascriptMsg.php =================================================================== --- trunk/extensions/JS2Support/maintenance/MergeJavascriptMsg.php (rev 0) +++ trunk/extensions/JS2Support/maintenance/MergeJavascriptMsg.php 2010-05-13 00:24:48 UTC (rev 66317) @@ -0,0 +1,136 @@ +<?php +/** +* Merges in JavaScript json msgs into respective module i18n.php file +* +* If your script uses JSON msg string with the This script helps merge msgs between javascript and php +* +* +* @file +* @ingroup Maintenance +*/ + +# Abort if called from a web server +if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) { + print "This script must be run from the command line\n"; + exit(); +} +// Change to the core maintenance script directory: +require_once( dirname( __FILE__ ) . '/../../../maintenance/Maintenance.php' ); + + +class MergeJavascriptMsg extends Maintenance { + public function __construct() { + parent::__construct(); + $this->mDescription = "Merge Javascript JSON English messages to PHP"; + } + + public function execute() { + global $wgExtensionJavascriptLoader, $IP; + foreach ( $wgExtensionJavascriptLoader as $loaderPath ){ + + $modulePath = dirname( $loaderPath ); + $i18nFilePath = false; + $moduleAbsoultePath = $IP ."/". $modulePath; + + // Look for the i18n.php file next to the loader + if ( $handle = opendir( $moduleAbsoultePath ) ) { + // Look for the i18n.php file + while (false !== ($file = readdir($handle))) { + if( substr( $file, -8 ) == 'i18n.php' ){ + $i18nFilePath = $moduleAbsoultePath .'/'. $file; + } + } + if( ! $i18nFilePath ) { + $this->error( "Could not find i18n file in directory: $moduleAbsoultePath \n" ); + } + + } else { + $this->error( "Could not read path: $moduleAbsoultePath \n" ); + } + + // Clear the local message var + $this->messages = array(); + + // Load up the messages for the i18n file + require_once( $i18nFilePath ); + + //Update the local messages var + $this->messages = $messages['en']; + + // Recurse on every file in the module directory + $objects = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $moduleAbsoultePath ), RecursiveIteratorIterator::SELF_FIRST ); + foreach ( $objects as $fname => $object ) { + $this->processFilePath( $fname ); + } + + // Merge the msg back into the module php file + $this->mergeModuleMsg( $i18nFilePath ); + } + } + /** + * mergeModuleMsg + */ + function mergeModuleMsg( $i18nFilePath ) { + $mwSTART_MSG_KEY = '$messages[\'en\'] = array('; + $mwEND_MSG_KEY = ', +);'; + + $rawLangFile = file_get_contents( $i18nFilePath ); + $startInx = strpos( $rawLangFile, $mwSTART_MSG_KEY ) + strlen( $mwSTART_MSG_KEY ); + $endInx = strpos( $rawLangFile, $mwEND_MSG_KEY ) + 1; + if ( $startInx === false || $endInx === false ) { + $this->error( "Could not find $mwSTART_MSG_KEY or $mwEND_MSG_KEY in mwEmbed.i18n.php\n" ); + } + $preFile = substr( $rawLangFile, 0, $startInx ); + $postFile = substr( $rawLangFile, $endInx ); + + $outPhp="\n"; + foreach($this->messages as $msgKey => $msgValue ){ + $outPhp .= "\t'{$msgKey}' => '" . str_replace( '\'', '\\\'', $msgValue ) . "',\n"; + } + // update the file and report progress + file_put_contents( $i18nFilePath, $preFile . "\n\t". trim( $outPhp ) . $postFile ); + $this->output( "Updated File: " . $i18nFilePath . "\n" ); + } + + /** + * Process a file path for msgs + */ + function processFilePath( $fname ){ + // Only work on javascript files: + if ( substr( $fname, - 3 ) != '.js' ){ + return false; + } + $jsFileText = file_get_contents( $fname ); + // Grab all the javascript msgs + if ( preg_match( '/mw\.addMessages\s*\(\s*{(.*)}\s*\)\s*/siU', + $jsFileText, + $matches ) ) + { + $jsMsgs = json_decode( '{' . $matches[1] . '}', true ); + // Merge into the English $messages var + if( $jsMsgs ){ + foreach( $jsMsgs as $msgKey => $msgValue ){ + if( isset( $this->messages[$msgKey] ) && + $this->messages[$msgKey] != $msgValue + ) { + $this->output( "Warning:: $msgKey does not match \nphp:" . + $this->messages[$msgKey] . "\n != \njs:" . $msgValue . "\n\n"); + + // NOTE we could force merge from js here + } else { + $this->messages[ $msgKey ] = $msgValue; + } + } + } else { + $this->output( "Error could not decode json in $fname \n"); + } + } else { + // skip file no msgs + } + // Check against module messages + } +} + +$maintClass = "MergeJavascriptMsg"; +require_once( DO_MAINTENANCE ); Modified: trunk/extensions/JS2Support/mwEmbed/includes/jsClassLoader.php =================================================================== --- trunk/extensions/JS2Support/mwEmbed/includes/jsClassLoader.php 2010-05-12 23:12:20 UTC (rev 66316) +++ trunk/extensions/JS2Support/mwEmbed/includes/jsClassLoader.php 2010-05-13 00:24:48 UTC (rev 66317) @@ -37,6 +37,7 @@ return false; } self::$classesLoaded = true; + // Start the profiler if running $fname = 'jsClassLoader::loadClassPaths'; wfProfileIn( $fname ); @@ -44,7 +45,7 @@ $mwEmbedAbsolutePath = ( $wgMwEmbedDirectory == '' ) ? $IP : $IP .'/' .$wgMwEmbedDirectory; // Add the mwEmbed localizations - $wgExtensionMessagesFiles[ 'mwEmbed' ] = $mwEmbedAbsolutePath . '/languages/mwEmbed.i18n.php'; + $wgExtensionMessagesFiles[ 'mwEmbed' ] = $mwEmbedAbsolutePath . '/mwEmbed.i18n.php'; // Load javascript classes from mwEmbed.js @@ -75,6 +76,13 @@ $fileContent ); + // Change to the root mediawiki directory ( loader.js paths are relative to root mediawiki directory ) + // ( helpful for when running maintenance scripts ) + if( defined( 'DO_MAINTENANCE' ) ) { + $initialPath = getcwd(); + chdir( $IP ); + } + // Get all the classes from the enabled mwEmbed modules folder foreach( self::$moduleList as $na => $moduleName){ $relativeSlash = ( $wgMwEmbedDirectory == '' )? '' : '/'; @@ -88,6 +96,10 @@ self::proccessModulePath( $modulePath ); } + if( defined( 'DO_MAINTENANCE' ) ) { + chdir( $initialPath ); + } + wfProfileOut( $fname ); } /** Deleted: trunk/extensions/JS2Support/mwEmbed/languages/mwEmbed.i18n.php =================================================================== --- trunk/extensions/JS2Support/mwEmbed/languages/mwEmbed.i18n.php 2010-05-12 23:12:20 UTC (rev 66316) +++ trunk/extensions/JS2Support/mwEmbed/languages/mwEmbed.i18n.php 2010-05-13 00:24:48 UTC (rev 66317) @@ -1,272 +0,0 @@ -<?php -/** - * Localization file for mwEmbed.js - */ -$messages['en'] = array( - 'mwe-loading_txt' => 'Loading ...', - 'mwe-size-gigabytes' => '$1 GB', - 'mwe-size-megabytes' => '$1 MB', - 'mwe-size-kilobytes' => '$1 K', - 'mwe-size-bytes' => '$1 B', - 'mwe-error_load_lib' => 'Error: JavaScript $1 was not retrievable or does not define $2', - 'mwe-apiproxy-setup' => 'Setting up API proxy', - 'mwe-load-drag-item' => 'Loading dragged item', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Cancel', - 'mwe-enable-gadget' => 'Enable multimedia beta ( mwEmbed ) for all pages', - 'mwe-enable-gadget-done' => 'multimedia beta gadget has been enabled', - 'mwe-must-login-gadget' => 'To enable gadget you must <a target="_new" href="$1">login</a>', - 'mwe-test-plural' => 'I ran {{PLURAL:$1|$1 test|$1 tests}}', -); -$messages['af'] = array( - 'mwe-loading_txt' => 'laai ...', - 'mwe-error_load_lib' => 'Fout: JavaScript $1 kon nie gevind word of definieer nie $2 nie', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Kanselleer', -); -$messages['ar'] = array( - 'mwe-loading_txt' => 'يحمل...', - 'mwe-cancel' => 'ألغِ', -); -$messages['be-tarask'] = array( - 'mwe-loading_txt' => 'загрузка …', - 'mwe-error_load_lib' => 'Памылка: JavaScript $1 не даступны альбо не вызначае $2', - 'mwe-apiproxy-setup' => 'Устаноўка API-проксі', - 'mwe-load-drag-item' => 'Загрузка перанесенага элемэнту', - 'mwe-ok' => 'Добра', - 'mwe-cancel' => 'Адмяніць', -); -$messages['br'] = array( - 'mwe-loading_txt' => 'o kargañ...', - 'mwe-ok' => 'Mat eo', - 'mwe-cancel' => 'Nullañ', -); -$messages['bs'] = array( - 'mwe-loading_txt' => 'učitavam ...', - 'mwe-apiproxy-setup' => 'Postavljanje API proksija', - 'mwe-ok' => 'U redu', - 'mwe-cancel' => 'Odustani', -); -$messages['cs'] = array( - 'mwe-loading_txt' => 'Načítá se …', - 'mwe-cancel' => 'Storno', -); -$messages['cy'] = array( - 'mwe-loading_txt' => 'wrthi\'n llwytho ...', -); -$messages['de'] = array( - 'mwe-loading_txt' => 'lade …', - 'mwe-error_load_lib' => 'Fehler: JavaScript $1 war nicht abrufbar oder lässt $2 nicht zu', - 'mwe-apiproxy-setup' => 'API-Proxy-Konfiguration', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Abbrechen', -); -$messages['diq'] = array( - 'mwe-loading_txt' => 'bar beno...', - 'mwe-error_load_lib' => 'xeta: $1 JavaScript re nêresiyeno ya zi pê $2yi şınasnaye niyo.', - 'mwe-apiproxy-setup' => 'proxyê APIyi eyar beno', - 'mwe-load-drag-item' => 'unsur bar beno', - 'mwe-ok' => 'temam', - 'mwe-cancel' => 'iptal', -); -$messages['dsb'] = array( - 'mwe-loading_txt' => 'zacytujo se ...', - 'mwe-error_load_lib' => 'Zmólka: JavaScript $1 njejo wótwołujobny był abo njedefiněrujo $2', - 'mwe-apiproxy-setup' => 'Proksy API zarědowaś', - 'mwe-load-drag-item' => 'Wlecony zapisk se zacytujo', - 'mwe-ok' => 'W pórědku', - 'mwe-cancel' => 'Pśetergnuś', -); -$messages['el'] = array( - 'mwe-loading_txt' => 'φόρτωση ...', -); -$messages['eo'] = array( - 'mwe-loading_txt' => 'ŝarĝante ...', - 'mwe-cancel' => 'Nuligi', -); -$messages['es'] = array( - 'mwe-loading_txt' => 'cargando ...', - 'mwe-load-drag-item' => 'Cargando el objeto arrastrado', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Cancelar', -); -$messages['eu'] = array( - 'mwe-loading_txt' => 'Kargatzen ...', - 'mwe-ok' => 'Ados', - 'mwe-cancel' => 'Ezeztatu', -); -$messages['fi'] = array( - 'mwe-cancel' => 'Peruuta', -); -$messages['fr'] = array( - 'mwe-loading_txt' => 'chargement ...', - 'mwe-error_load_lib' => 'Erreur : JavaScript $1 n\'a pas pu être trouvé ou ne définit pas $2', - 'mwe-apiproxy-setup' => 'Configuration du proxy API', - 'mwe-load-drag-item' => 'Chargement de l’élément dépose', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Annuler', -); -$messages['gl'] = array( - 'mwe-loading_txt' => 'cargando...', - 'mwe-error_load_lib' => 'Erro: o JavaScript $1 non se puido atopar ou non definía $2', - 'mwe-apiproxy-setup' => 'Configurando o proxy API', - 'mwe-load-drag-item' => 'Cargando o elemento arrastrado', - 'mwe-ok' => 'De acordo', - 'mwe-cancel' => 'Cancelar', -); -$messages['gsw'] = array( - 'mwe-loading_txt' => 'Am Lade ...', - 'mwe-error_load_lib' => 'Fähler: s JavaScript $1 het nit chenne glade wäre oder s losst $2 nit zue', - 'mwe-apiproxy-setup' => 'API-Proxy-Konfiguration', - 'mwe-load-drag-item' => 'Am Lade vu mitgschleipfte Poschte', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Abbräche', -); -$messages['he'] = array( - 'mwe-loading_txt' => 'בטעינה ...', - 'mwe-error_load_lib' => 'שגיאה: לא ניתן היה לטעון את ספריית ה־JavaScript בשם $1 או שהיא אינה מגדירה את $2', -); -$messages['hsb'] = array( - 'mwe-loading_txt' => 'začituje so ...', - 'mwe-size-gigabytes' => '$1 GB', - 'mwe-size-megabytes' => '$1 MB', - 'mwe-size-kilobytes' => '$1 KB', - 'mwe-size-bytes' => '$1 B', - 'mwe-error_load_lib' => 'Zmylk: JavaScript $1 njeda so wotwołać abo njedefinuje $2', - 'mwe-apiproxy-setup' => 'Proksy API zarjadować', - 'mwe-load-drag-item' => 'Wlečeny zapisk so začituje', - 'mwe-ok' => 'W porjadku', - 'mwe-cancel' => 'Přetorhnyć', -); -$messages['hu'] = array( - 'mwe-loading_txt' => 'betöltés…', - 'mwe-error_load_lib' => 'Hiba: a(z) $1 JavaScript-fájl nem elérhető, vagy nem definiálja a(z) $2 osztályt.', - 'mwe-apiproxy-setup' => 'API proxy beállítása', - 'mwe-load-drag-item' => 'Vonszolt elem betöltése', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Mégse', -); -$messages['ia'] = array( - 'mwe-loading_txt' => 'cargamento ...', - 'mwe-error_load_lib' => 'Error: JavaScript $1 non esseva recuperabile o non defini $2', - 'mwe-apiproxy-setup' => 'Configuration del proxy pro le API', - 'mwe-load-drag-item' => 'Cargamento del file trahite', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Cancella', -); -$messages['id'] = array( - 'mwe-loading_txt' => 'memuat...', - 'mwe-error_load_lib' => 'Kesalahan: JavaScript $1 tidak dapat diambil atau tidak mendefinisikan $2', - 'mwe-apiproxy-setup' => 'Menyiapkan proksi API', - 'mwe-load-drag-item' => 'Memuat butir terseret', - 'mwe-ok' => 'Oke', - 'mwe-cancel' => 'Batalkan', -); -$messages['it'] = array( - 'mwe-cancel' => 'Annulla', -); -$messages['ja'] = array( - 'mwe-loading_txt' => '読み込み中 …', - 'mwe-error_load_lib' => 'エラー:JavaScript $1 は参照不能か、$2 を定義していません。', - 'mwe-apiproxy-setup' => 'API プロキシーをセットアップ中', - 'mwe-load-drag-item' => 'ドラッグされた項目を読み込み中', - 'mwe-ok' => 'OK', - 'mwe-cancel' => '中止', -); -$messages['ko'] = array( - 'mwe-loading_txt' => '불러오는 중...', - 'mwe-cancel' => '취소', -); -$messages['ksh'] = array( - 'mwe-loading_txt' => 'aam Laade …', - 'mwe-size-gigabytes' => '$1 GB', - 'mwe-size-megabytes' => '$1 MB', - 'mwe-size-kilobytes' => '$1 KB', - 'mwe-size-bytes' => '$1 Bytes', - 'mwe-error_load_lib' => 'Fähler: Dat JavaSkrep „<code lang="en">$1</code>“ wohr nit ze laade udder et leiht „<code lang="en">$2</code>“ nit faß.', - 'mwe-cancel' => 'Affbräsche', -); -$messages['lb'] = array( - 'mwe-loading_txt' => 'lueden ...', - 'mwe-apiproxy-setup' => 'API-Proxy astellen', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Ofbriechen', -); -$messages['ml'] = array( - 'mwe-loading_txt' => 'ശേഖരിക്കുന്നു ...', - 'mwe-error_load_lib' => 'പിശക്: ജാവാസ്ക്രിപ്റ്റ് $1 ശേഖരിക്കാൻ കഴിഞ്ഞില്ല അല്ലെങ്കിൽ $2 നിർവ്വചിച്ചിട്ടില്ല', - 'mwe-apiproxy-setup' => 'എ.പി.ഐ. പ്രോക്സി സജ്ജീകരിക്കുക', - 'mwe-load-drag-item' => 'വലിച്ചിട്ടത് ശേഖരിക്കുന്നു', - 'mwe-ok' => 'ശരി', - 'mwe-cancel' => 'റദ്ദാക്കുക', -); -$messages['nl'] = array( - 'mwe-loading_txt' => 'bezig met laden ...', - 'mwe-error_load_lib' => 'Fout: JavaScript $1 kon niet opgehaald worden of definieert $2 niet', - 'mwe-apiproxy-setup' => 'Bezig met het opzetten van een API-proxy', - 'mwe-load-drag-item' => 'Bezig met het laden van het gesleepte bestand', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Annuleren', -); -$messages['oc'] = array( - 'mwe-loading_txt' => 'cargament ...', - 'mwe-error_load_lib' => 'Error : JavaScript $1 a pas pogut èsser trobat o definís pas $2', - 'mwe-apiproxy-setup' => 'Configuracion del proxy API', - 'mwe-load-drag-item' => 'Cargament de l’element depausat', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Anullar', -); -$messages['pdc'] = array( - 'mwe-ok' => 'OK', -); -$messages['pl'] = array( - 'mwe-loading_txt' => 'ładowanie ...', - 'mwe-error_load_lib' => 'Błąd – W plik JavaScript $1 brak jest możliwości pobrania oraz definicji $2', -); -$messages['pt'] = array( - 'mwe-loading_txt' => 'A carregar ...', - 'mwe-error_load_lib' => 'Erro: O JavaScript $1 não pode ser importado ou não define $2', - 'mwe-apiproxy-setup' => 'A preparar o \'\'proxy\'\' da API', - 'mwe-load-drag-item' => 'Carregando o objecto arrastado', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Cancelar', -); -$messages['ru'] = array( - 'mwe-loading_txt' => 'загрузка …', - 'mwe-error_load_lib' => 'Ошибка. JavaScript $1 не доступен или не определяет $2', - 'mwe-apiproxy-setup' => 'Настройка API-прокси', - 'mwe-load-drag-item' => 'Загрузка перетащенного элемента', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Отмена', -); -$messages['sk'] = array( - 'mwe-loading_txt' => 'načítava sa ...', - 'mwe-error_load_lib' => 'Error: JavaScript $1 nebolo možné získať alebo neobsahuje definíciu $2', -); -$messages['sv'] = array( - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Avbryt', -); -$messages['te'] = array( - 'mwe-ok' => 'సరే', - 'mwe-cancel' => 'రద్దుచేయి', -); -$messages['tr'] = array( - 'mwe-loading_txt' => 'yükleniyor ...', - 'mwe-error_load_lib' => 'Hata: $1 JavaScripti erişilebilir değil ya da $2 tanımlı değil', - 'mwe-apiproxy-setup' => 'API vekili ayarlanıyor', - 'mwe-load-drag-item' => 'Sürüklenen öğe yükleniyor', - 'mwe-ok' => 'Tamam', - 'mwe-cancel' => 'İptal', -); -$messages['vec'] = array( - 'mwe-loading_txt' => 'so\' drio cargar ...', - 'mwe-ok' => 'Va ben', - 'mwe-cancel' => 'Anula', -); -$messages['vi'] = array( - 'mwe-loading_txt' => 'đang tải …', - 'mwe-size-kilobytes' => '$1 kB', - 'mwe-ok' => 'OK', - 'mwe-cancel' => 'Hủy bỏ', -); Copied: trunk/extensions/JS2Support/mwEmbed/mwEmbed.i18n.php (from rev 66306, trunk/extensions/JS2Support/mwEmbed/languages/mwEmbed.i18n.php) =================================================================== --- trunk/extensions/JS2Support/mwEmbed/mwEmbed.i18n.php (rev 0) +++ trunk/extensions/JS2Support/mwEmbed/mwEmbed.i18n.php 2010-05-13 00:24:48 UTC (rev 66317) @@ -0,0 +1,272 @@ +<?php +/** + * Localization file for mwEmbed.js + */ +$messages['en'] = array( + 'mwe-loading_txt' => 'Loading ...', + 'mwe-size-gigabytes' => '$1 GB', + 'mwe-size-megabytes' => '$1 MB', + 'mwe-size-kilobytes' => '$1 K', + 'mwe-size-bytes' => '$1 B', + 'mwe-error_load_lib' => 'Error: JavaScript $1 was not retrievable or does not define $2', + 'mwe-apiproxy-setup' => 'Setting up API proxy', + 'mwe-load-drag-item' => 'Loading dragged item', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Cancel', + 'mwe-enable-gadget' => 'Enable multimedia beta ( mwEmbed ) for all pages', + 'mwe-enable-gadget-done' => 'multimedia beta gadget has been enabled', + 'mwe-must-login-gadget' => 'To enable gadget you must <a target="_new" href="$1">login</a>', + 'mwe-test-plural' => 'I ran {{PLURAL:$1|$1 test|$1 tests}}', +); +$messages['af'] = array( + 'mwe-loading_txt' => 'laai ...', + 'mwe-error_load_lib' => 'Fout: JavaScript $1 kon nie gevind word of definieer nie $2 nie', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Kanselleer', +); +$messages['ar'] = array( + 'mwe-loading_txt' => 'يحمل...', + 'mwe-cancel' => 'ألغِ', +); +$messages['be-tarask'] = array( + 'mwe-loading_txt' => 'загрузка …', + 'mwe-error_load_lib' => 'Памылка: JavaScript $1 не даступны альбо не вызначае $2', + 'mwe-apiproxy-setup' => 'Устаноўка API-проксі', + 'mwe-load-drag-item' => 'Загрузка перанесенага элемэнту', + 'mwe-ok' => 'Добра', + 'mwe-cancel' => 'Адмяніць', +); +$messages['br'] = array( + 'mwe-loading_txt' => 'o kargañ...', + 'mwe-ok' => 'Mat eo', + 'mwe-cancel' => 'Nullañ', +); +$messages['bs'] = array( + 'mwe-loading_txt' => 'učitavam ...', + 'mwe-apiproxy-setup' => 'Postavljanje API proksija', + 'mwe-ok' => 'U redu', + 'mwe-cancel' => 'Odustani', +); +$messages['cs'] = array( + 'mwe-loading_txt' => 'Načítá se …', + 'mwe-cancel' => 'Storno', +); +$messages['cy'] = array( + 'mwe-loading_txt' => 'wrthi\'n llwytho ...', +); +$messages['de'] = array( + 'mwe-loading_txt' => 'lade …', + 'mwe-error_load_lib' => 'Fehler: JavaScript $1 war nicht abrufbar oder lässt $2 nicht zu', + 'mwe-apiproxy-setup' => 'API-Proxy-Konfiguration', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Abbrechen', +); +$messages['diq'] = array( + 'mwe-loading_txt' => 'bar beno...', + 'mwe-error_load_lib' => 'xeta: $1 JavaScript re nêresiyeno ya zi pê $2yi şınasnaye niyo.', + 'mwe-apiproxy-setup' => 'proxyê APIyi eyar beno', + 'mwe-load-drag-item' => 'unsur bar beno', + 'mwe-ok' => 'temam', + 'mwe-cancel' => 'iptal', +); +$messages['dsb'] = array( + 'mwe-loading_txt' => 'zacytujo se ...', + 'mwe-error_load_lib' => 'Zmólka: JavaScript $1 njejo wótwołujobny był abo njedefiněrujo $2', + 'mwe-apiproxy-setup' => 'Proksy API zarědowaś', + 'mwe-load-drag-item' => 'Wlecony zapisk se zacytujo', + 'mwe-ok' => 'W pórědku', + 'mwe-cancel' => 'Pśetergnuś', +); +$messages['el'] = array( + 'mwe-loading_txt' => 'φόρτωση ...', +); +$messages['eo'] = array( + 'mwe-loading_txt' => 'ŝarĝante ...', + 'mwe-cancel' => 'Nuligi', +); +$messages['es'] = array( + 'mwe-loading_txt' => 'cargando ...', + 'mwe-load-drag-item' => 'Cargando el objeto arrastrado', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Cancelar', +); +$messages['eu'] = array( + 'mwe-loading_txt' => 'Kargatzen ...', + 'mwe-ok' => 'Ados', + 'mwe-cancel' => 'Ezeztatu', +); +$messages['fi'] = array( + 'mwe-cancel' => 'Peruuta', +); +$messages['fr'] = array( + 'mwe-loading_txt' => 'chargement ...', + 'mwe-error_load_lib' => 'Erreur : JavaScript $1 n\'a pas pu être trouvé ou ne définit pas $2', + 'mwe-apiproxy-setup' => 'Configuration du proxy API', + 'mwe-load-drag-item' => 'Chargement de l’élément dépose', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Annuler', +); +$messages['gl'] = array( + 'mwe-loading_txt' => 'cargando...', + 'mwe-error_load_lib' => 'Erro: o JavaScript $1 non se puido atopar ou non definía $2', + 'mwe-apiproxy-setup' => 'Configurando o proxy API', + 'mwe-load-drag-item' => 'Cargando o elemento arrastrado', + 'mwe-ok' => 'De acordo', + 'mwe-cancel' => 'Cancelar', +); +$messages['gsw'] = array( + 'mwe-loading_txt' => 'Am Lade ...', + 'mwe-error_load_lib' => 'Fähler: s JavaScript $1 het nit chenne glade wäre oder s losst $2 nit zue', + 'mwe-apiproxy-setup' => 'API-Proxy-Konfiguration', + 'mwe-load-drag-item' => 'Am Lade vu mitgschleipfte Poschte', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Abbräche', +); +$messages['he'] = array( + 'mwe-loading_txt' => 'בטעינה ...', + 'mwe-error_load_lib' => 'שגיאה: לא ניתן היה לטעון את ספריית ה־JavaScript בשם $1 או שהיא אינה מגדירה את $2', +); +$messages['hsb'] = array( + 'mwe-loading_txt' => 'začituje so ...', + 'mwe-size-gigabytes' => '$1 GB', + 'mwe-size-megabytes' => '$1 MB', + 'mwe-size-kilobytes' => '$1 KB', + 'mwe-size-bytes' => '$1 B', + 'mwe-error_load_lib' => 'Zmylk: JavaScript $1 njeda so wotwołać abo njedefinuje $2', + 'mwe-apiproxy-setup' => 'Proksy API zarjadować', + 'mwe-load-drag-item' => 'Wlečeny zapisk so začituje', + 'mwe-ok' => 'W porjadku', + 'mwe-cancel' => 'Přetorhnyć', +); +$messages['hu'] = array( + 'mwe-loading_txt' => 'betöltés…', + 'mwe-error_load_lib' => 'Hiba: a(z) $1 JavaScript-fájl nem elérhető, vagy nem definiálja a(z) $2 osztályt.', + 'mwe-apiproxy-setup' => 'API proxy beállítása', + 'mwe-load-drag-item' => 'Vonszolt elem betöltése', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Mégse', +); +$messages['ia'] = array( + 'mwe-loading_txt' => 'cargamento ...', + 'mwe-error_load_lib' => 'Error: JavaScript $1 non esseva recuperabile o non defini $2', + 'mwe-apiproxy-setup' => 'Configuration del proxy pro le API', + 'mwe-load-drag-item' => 'Cargamento del file trahite', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Cancella', +); +$messages['id'] = array( + 'mwe-loading_txt' => 'memuat...', + 'mwe-error_load_lib' => 'Kesalahan: JavaScript $1 tidak dapat diambil atau tidak mendefinisikan $2', + 'mwe-apiproxy-setup' => 'Menyiapkan proksi API', + 'mwe-load-drag-item' => 'Memuat butir terseret', + 'mwe-ok' => 'Oke', + 'mwe-cancel' => 'Batalkan', +); +$messages['it'] = array( + 'mwe-cancel' => 'Annulla', +); +$messages['ja'] = array( + 'mwe-loading_txt' => '読み込み中 …', + 'mwe-error_load_lib' => 'エラー:JavaScript $1 は参照不能か、$2 を定義していません。', + 'mwe-apiproxy-setup' => 'API プロキシーをセットアップ中', + 'mwe-load-drag-item' => 'ドラッグされた項目を読み込み中', + 'mwe-ok' => 'OK', + 'mwe-cancel' => '中止', +); +$messages['ko'] = array( + 'mwe-loading_txt' => '불러오는 중...', + 'mwe-cancel' => '취소', +); +$messages['ksh'] = array( + 'mwe-loading_txt' => 'aam Laade …', + 'mwe-size-gigabytes' => '$1 GB', + 'mwe-size-megabytes' => '$1 MB', + 'mwe-size-kilobytes' => '$1 KB', + 'mwe-size-bytes' => '$1 Bytes', + 'mwe-error_load_lib' => 'Fähler: Dat JavaSkrep „<code lang="en">$1</code>“ wohr nit ze laade udder et leiht „<code lang="en">$2</code>“ nit faß.', + 'mwe-cancel' => 'Affbräsche', +); +$messages['lb'] = array( + 'mwe-loading_txt' => 'lueden ...', + 'mwe-apiproxy-setup' => 'API-Proxy astellen', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Ofbriechen', +); +$messages['ml'] = array( + 'mwe-loading_txt' => 'ശേഖരിക്കുന്നു ...', + 'mwe-error_load_lib' => 'പിശക്: ജാവാസ്ക്രിപ്റ്റ് $1 ശേഖരിക്കാൻ കഴിഞ്ഞില്ല അല്ലെങ്കിൽ $2 നിർവ്വചിച്ചിട്ടില്ല', + 'mwe-apiproxy-setup' => 'എ.പി.ഐ. പ്രോക്സി സജ്ജീകരിക്കുക', + 'mwe-load-drag-item' => 'വലിച്ചിട്ടത് ശേഖരിക്കുന്നു', + 'mwe-ok' => 'ശരി', + 'mwe-cancel' => 'റദ്ദാക്കുക', +); +$messages['nl'] = array( + 'mwe-loading_txt' => 'bezig met laden ...', + 'mwe-error_load_lib' => 'Fout: JavaScript $1 kon niet opgehaald worden of definieert $2 niet', + 'mwe-apiproxy-setup' => 'Bezig met het opzetten van een API-proxy', + 'mwe-load-drag-item' => 'Bezig met het laden van het gesleepte bestand', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Annuleren', +); +$messages['oc'] = array( + 'mwe-loading_txt' => 'cargament ...', + 'mwe-error_load_lib' => 'Error : JavaScript $1 a pas pogut èsser trobat o definís pas $2', + 'mwe-apiproxy-setup' => 'Configuracion del proxy API', + 'mwe-load-drag-item' => 'Cargament de l’element depausat', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Anullar', +); +$messages['pdc'] = array( + 'mwe-ok' => 'OK', +); +$messages['pl'] = array( + 'mwe-loading_txt' => 'ładowanie ...', + 'mwe-error_load_lib' => 'Błąd – W plik JavaScript $1 brak jest możliwości pobrania oraz definicji $2', +); +$messages['pt'] = array( + 'mwe-loading_txt' => 'A carregar ...', + 'mwe-error_load_lib' => 'Erro: O JavaScript $1 não pode ser importado ou não define $2', + 'mwe-apiproxy-setup' => 'A preparar o \'\'proxy\'\' da API', + 'mwe-load-drag-item' => 'Carregando o objecto arrastado', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Cancelar', +); +$messages['ru'] = array( + 'mwe-loading_txt' => 'загрузка …', + 'mwe-error_load_lib' => 'Ошибка. JavaScript $1 не доступен или не определяет $2', + 'mwe-apiproxy-setup' => 'Настройка API-прокси', + 'mwe-load-drag-item' => 'Загрузка перетащенного элемента', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Отмена', +); +$messages['sk'] = array( + 'mwe-loading_txt' => 'načítava sa ...', + 'mwe-error_load_lib' => 'Error: JavaScript $1 nebolo možné získať alebo neobsahuje definíciu $2', +); +$messages['sv'] = array( + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Avbryt', +); +$messages['te'] = array( + 'mwe-ok' => 'సరే', + 'mwe-cancel' => 'రద్దుచేయి', +); +$messages['tr'] = array( + 'mwe-loading_txt' => 'yükleniyor ...', + 'mwe-error_load_lib' => 'Hata: $1 JavaScripti erişilebilir değil ya da $2 tanımlı değil', + 'mwe-apiproxy-setup' => 'API vekili ayarlanıyor', + 'mwe-load-drag-item' => 'Sürüklenen öğe yükleniyor', + 'mwe-ok' => 'Tamam', + 'mwe-cancel' => 'İptal', +); +$messages['vec'] = array( + 'mwe-loading_txt' => 'so\' drio cargar ...', + 'mwe-ok' => 'Va ben', + 'mwe-cancel' => 'Anula', +); +$messages['vi'] = array( + 'mwe-loading_txt' => 'đang tải …', + 'mwe-size-kilobytes' => '$1 kB', + 'mwe-ok' => 'OK', + 'mwe-cancel' => 'Hủy bỏ', +); Property changes on: trunk/extensions/JS2Support/mwEmbed/mwEmbed.i18n.php ___________________________________________________________________ Added: svn:mergeinfo + _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs