From 77d71f743d8a444be28ef9c85b38fa59cf0d655d Mon Sep 17 00:00:00 2001 From: Trevor Parscal Date: Tue, 26 Oct 2010 23:40:26 +0000 Subject: [PATCH] Introducing mediaWiki.language, and mediaWiki.message which are modeled after their PHP counterparts Language and wfMessage respectively. --- resources/Resources.php | 63 ++- resources/mediawiki.language/languages/am.js | 8 + resources/mediawiki.language/languages/ar.js | 38 ++ .../mediawiki.language/languages/bat-smg.js | 18 + .../mediawiki.language/languages/be-tarask.js | 23 + resources/mediawiki.language/languages/be.js | 20 + resources/mediawiki.language/languages/bh.js | 8 + resources/mediawiki.language/languages/bs.js | 20 + resources/mediawiki.language/languages/cs.js | 19 + resources/mediawiki.language/languages/cu.js | 18 + resources/mediawiki.language/languages/cy.js | 15 + resources/mediawiki.language/languages/dsb.js | 18 + resources/mediawiki.language/languages/fr.js | 8 + resources/mediawiki.language/languages/ga.js | 14 + resources/mediawiki.language/languages/gd.js | 18 + resources/mediawiki.language/languages/gv.js | 18 + resources/mediawiki.language/languages/he.js | 14 + resources/mediawiki.language/languages/hi.js | 8 + resources/mediawiki.language/languages/hr.js | 20 + resources/mediawiki.language/languages/hsb.js | 18 + resources/mediawiki.language/languages/hy.js | 8 + resources/mediawiki.language/languages/ksh.js | 14 + resources/mediawiki.language/languages/ln.js | 8 + resources/mediawiki.language/languages/lt.js | 17 + resources/mediawiki.language/languages/lv.js | 8 + resources/mediawiki.language/languages/mg.js | 8 + resources/mediawiki.language/languages/mk.js | 8 + resources/mediawiki.language/languages/mo.js | 14 + resources/mediawiki.language/languages/mt.js | 17 + resources/mediawiki.language/languages/nso.js | 8 + resources/mediawiki.language/languages/pl.js | 21 + .../mediawiki.language/languages/pt-br.js | 8 + resources/mediawiki.language/languages/ro.js | 14 + resources/mediawiki.language/languages/ru.js | 23 + resources/mediawiki.language/languages/se.js | 17 + resources/mediawiki.language/languages/sh.js | 23 + resources/mediawiki.language/languages/sk.js | 14 + resources/mediawiki.language/languages/sl.js | 20 + resources/mediawiki.language/languages/sma.js | 14 + .../mediawiki.language/languages/sr-ec.js | 20 + .../mediawiki.language/languages/sr-el.js | 20 + resources/mediawiki.language/languages/sr.js | 23 + resources/mediawiki.language/languages/ti.js | 8 + resources/mediawiki.language/languages/tl.js | 7 + resources/mediawiki.language/languages/uk.js | 23 + resources/mediawiki.language/languages/wa.js | 8 + .../mediawiki.language/mediawiki.language.js | 99 +++++ .../mediawiki.specials.preferences.js | 0 .../mediawiki.specials.search.js | 0 .../mediawiki.util.js | 0 .../mediawiki.util.test.js} | 0 .../mediawiki.views.history.js | 0 resources/mediawiki/mediawiki.js | 412 ++++++++++-------- skins/common/ajaxwatch.js | 8 +- skins/common/wikibits.js | 6 +- 55 files changed, 1086 insertions(+), 198 deletions(-) create mode 100644 resources/mediawiki.language/languages/am.js create mode 100644 resources/mediawiki.language/languages/ar.js create mode 100644 resources/mediawiki.language/languages/bat-smg.js create mode 100644 resources/mediawiki.language/languages/be-tarask.js create mode 100644 resources/mediawiki.language/languages/be.js create mode 100644 resources/mediawiki.language/languages/bh.js create mode 100644 resources/mediawiki.language/languages/bs.js create mode 100644 resources/mediawiki.language/languages/cs.js create mode 100644 resources/mediawiki.language/languages/cu.js create mode 100644 resources/mediawiki.language/languages/cy.js create mode 100644 resources/mediawiki.language/languages/dsb.js create mode 100644 resources/mediawiki.language/languages/fr.js create mode 100644 resources/mediawiki.language/languages/ga.js create mode 100644 resources/mediawiki.language/languages/gd.js create mode 100644 resources/mediawiki.language/languages/gv.js create mode 100644 resources/mediawiki.language/languages/he.js create mode 100644 resources/mediawiki.language/languages/hi.js create mode 100644 resources/mediawiki.language/languages/hr.js create mode 100644 resources/mediawiki.language/languages/hsb.js create mode 100644 resources/mediawiki.language/languages/hy.js create mode 100644 resources/mediawiki.language/languages/ksh.js create mode 100644 resources/mediawiki.language/languages/ln.js create mode 100644 resources/mediawiki.language/languages/lt.js create mode 100644 resources/mediawiki.language/languages/lv.js create mode 100644 resources/mediawiki.language/languages/mg.js create mode 100644 resources/mediawiki.language/languages/mk.js create mode 100644 resources/mediawiki.language/languages/mo.js create mode 100644 resources/mediawiki.language/languages/mt.js create mode 100644 resources/mediawiki.language/languages/nso.js create mode 100644 resources/mediawiki.language/languages/pl.js create mode 100644 resources/mediawiki.language/languages/pt-br.js create mode 100644 resources/mediawiki.language/languages/ro.js create mode 100644 resources/mediawiki.language/languages/ru.js create mode 100644 resources/mediawiki.language/languages/se.js create mode 100644 resources/mediawiki.language/languages/sh.js create mode 100644 resources/mediawiki.language/languages/sk.js create mode 100644 resources/mediawiki.language/languages/sl.js create mode 100644 resources/mediawiki.language/languages/sma.js create mode 100644 resources/mediawiki.language/languages/sr-ec.js create mode 100644 resources/mediawiki.language/languages/sr-el.js create mode 100644 resources/mediawiki.language/languages/sr.js create mode 100644 resources/mediawiki.language/languages/ti.js create mode 100644 resources/mediawiki.language/languages/tl.js create mode 100644 resources/mediawiki.language/languages/uk.js create mode 100644 resources/mediawiki.language/languages/wa.js create mode 100644 resources/mediawiki.language/mediawiki.language.js rename resources/{mediawiki => mediawiki.specials}/mediawiki.specials.preferences.js (100%) rename resources/{mediawiki => mediawiki.specials}/mediawiki.specials.search.js (100%) rename resources/{mediawiki => mediawiki.util}/mediawiki.util.js (100%) rename resources/{mediawiki/mediawiki.utiltest.js => mediawiki.util/mediawiki.util.test.js} (100%) rename resources/{mediawiki => mediawiki.views}/mediawiki.views.history.js (100%) diff --git a/resources/Resources.php b/resources/Resources.php index d53f33f32b..757822ab6c 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -317,21 +317,71 @@ return array( 'debugRaw' => false ) ), 'mediawiki.specials.preferences' => new ResourceLoaderFileModule( array( - 'scripts' => 'resources/mediawiki/mediawiki.specials.preferences.js', + 'scripts' => 'resources/mediawiki.specials/mediawiki.specials.preferences.js', ) ), 'mediawiki.specials.search' => new ResourceLoaderFileModule( array( - 'scripts' => 'resources/mediawiki/mediawiki.specials.search.js', + 'scripts' => 'resources/mediawiki.specials/mediawiki.specials.search.js', ) ), 'mediawiki.views.history' => new ResourceLoaderFileModule( array( - 'scripts' => 'resources/mediawiki/mediawiki.views.history.js', + 'scripts' => 'resources/mediawiki.views/mediawiki.views.history.js', 'dependencies' => 'mediawiki.legacy.history', ) ), + 'mediawiki.language' => new ResourceLoaderFileModule( array( + 'scripts' => 'resources/mediawiki.language/mediawiki.language.js', + 'languageScripts' => array( + 'am' => 'resources/mediawiki.language/languages/am.js', + 'ar' => 'resources/mediawiki.language/languages/ar.js', + 'bat-smg' => 'resources/mediawiki.language/languages/bat-smg.js', + 'be' => 'resources/mediawiki.language/languages/be.js', + 'be-tarask' => 'resources/mediawiki.language/languages/be-tarask.js', + 'bh' => 'resources/mediawiki.language/languages/bh.js', + 'bs' => 'resources/mediawiki.language/languages/bs.js', + 'cs' => 'resources/mediawiki.language/languages/cs.js', + 'cu' => 'resources/mediawiki.language/languages/cu.js', + 'cy' => 'resources/mediawiki.language/languages/cy.js', + 'dsb' => 'resources/mediawiki.language/languages/dsb.js', + 'fr' => 'resources/mediawiki.language/languages/fr.js', + 'ga' => 'resources/mediawiki.language/languages/ga.js', + 'gd' => 'resources/mediawiki.language/languages/gd.js', + 'gv' => 'resources/mediawiki.language/languages/gv.js', + 'he' => 'resources/mediawiki.language/languages/he.js', + 'hi' => 'resources/mediawiki.language/languages/hi.js', + 'hr' => 'resources/mediawiki.language/languages/hr.js', + 'hsb' => 'resources/mediawiki.language/languages/hsb.js', + 'hy' => 'resources/mediawiki.language/languages/hy.js', + 'ksh' => 'resources/mediawiki.language/languages/ksh.js', + 'ln' => 'resources/mediawiki.language/languages/ln.js', + 'lt' => 'resources/mediawiki.language/languages/lt.js', + 'lv' => 'resources/mediawiki.language/languages/lv.js', + 'mg' => 'resources/mediawiki.language/languages/mg.js', + 'mk' => 'resources/mediawiki.language/languages/mk.js', + 'mo' => 'resources/mediawiki.language/languages/mo.js', + 'mt' => 'resources/mediawiki.language/languages/mt.js', + 'nso' => 'resources/mediawiki.language/languages/nso.js', + 'pl' => 'resources/mediawiki.language/languages/pl.js', + 'pt-br' => 'resources/mediawiki.language/languages/pt-br.js', + 'ro' => 'resources/mediawiki.language/languages/ro.js', + 'ru' => 'resources/mediawiki.language/languages/ru.js', + 'se' => 'resources/mediawiki.language/languages/se.js', + 'sh' => 'resources/mediawiki.language/languages/sh.js', + 'sk' => 'resources/mediawiki.language/languages/sk.js', + 'sl' => 'resources/mediawiki.language/languages/sl.js', + 'sma' => 'resources/mediawiki.language/languages/sma.js', + 'sr-ec' => 'resources/mediawiki.language/languages/sr-ec.js', + 'sr-el' => 'resources/mediawiki.language/languages/sr-el.js', + 'sr' => 'resources/mediawiki.language/languages/sr.js', + 'ti' => 'resources/mediawiki.language/languages/ti.js', + 'tl' => 'resources/mediawiki.language/languages/tl.js', + 'uk' => 'resources/mediawiki.language/languages/uk.js', + 'wa' => 'resources/mediawiki.language/languages/wa.js', + ), + ) ), 'mediawiki.util' => new ResourceLoaderFileModule( array( - 'scripts' => 'resources/mediawiki/mediawiki.util.js', - 'debugScripts' => 'resources/mediawiki/mediawiki.utiltest.js', + 'scripts' => 'resources/mediawiki.util/mediawiki.util.js', + 'debugScripts' => 'resources/mediawiki.util/mediawiki.util.test.js', ) ), - /* MediaWiki Legacy */ + /* mediawiki Legacy */ 'mediawiki.legacy.ajax' => new ResourceLoaderFileModule( array( 'scripts' => 'skins/common/ajax.js', @@ -430,6 +480,7 @@ return array( ) ), 'mediawiki.legacy.wikibits' => new ResourceLoaderFileModule( array( 'scripts' => 'skins/common/wikibits.js', + 'dependencies' => 'mediawiki.language', 'messages' => array( 'showtoc', 'hidetoc' ), ) ), 'mediawiki.legacy.wikiprintable' => new ResourceLoaderFileModule( array( diff --git a/resources/mediawiki.language/languages/am.js b/resources/mediawiki.language/languages/am.js new file mode 100644 index 0000000000..9e1f4dead7 --- /dev/null +++ b/resources/mediawiki.language/languages/am.js @@ -0,0 +1,8 @@ +/** + * Amharic (አማርኛ) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/ar.js b/resources/mediawiki.language/languages/ar.js new file mode 100644 index 0000000000..62a7eac280 --- /dev/null +++ b/resources/mediawiki.language/languages/ar.js @@ -0,0 +1,38 @@ +/** + * Arabic (العربية) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 6 ); + if ( count == 0 ) { + return forms[0]; + } + if ( count == 1 ) { + return forms[1]; + } + if ( count == 2 ) { + return forms[2]; + } + if ( count % 100 >= 3 && count % 100 <= 10 ) { + return forms[3]; + } + if ( count % 100 >= 11 && count % 100 <= 99 ) { + return forms[4]; + } + return forms[5]; +} + +mediaWiki.language.digitTransformTable = { + '0': '٠', // ٠ + '1': 'Ÿ°', // ١ + '2': 'Ÿ¢', // ٢ + '3': 'Ÿ£', // ٣ + '4': '٤', // ٤ + '5': 'Ÿ•', // ٥ + '6': '٦', // ٦ + '7': 'Ÿß', // ٧ + '8': 'Ÿ®', // ٨ + '9': 'Ÿ©', // ٩ + '.': 'Ÿ´', // ٫ wrong table ? + ',': '٬' // ٬ +}; diff --git a/resources/mediawiki.language/languages/bat-smg.js b/resources/mediawiki.language/languages/bat-smg.js new file mode 100644 index 0000000000..ad807863ce --- /dev/null +++ b/resources/mediawiki.language/languages/bat-smg.js @@ -0,0 +1,18 @@ +/** + * Samogitian (≈Ωemaitėška) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + count = Math.abs( count ); + if ( count === 0 || ( count % 100 === 0 || ( count % 100 >= 10 && count % 100 < 20 ) ) ) { + return forms[2]; + } + if ( count % 10 === 1 ) { + return forms[0]; + } + if ( count % 10 === 2 ) { + return forms[1]; + } + return forms[3]; +} diff --git a/resources/mediawiki.language/languages/be-tarask.js b/resources/mediawiki.language/languages/be-tarask.js new file mode 100644 index 0000000000..a2bd9cffb6 --- /dev/null +++ b/resources/mediawiki.language/languages/be-tarask.js @@ -0,0 +1,23 @@ +/** + * Belarusian in Taraškievica orthography (–ë–µ–ª–∞—Ä—É—Å–∫–∞—è —Ç–∞—Ä–∞—à–∫–µ–≤—ñ—Ü–∞) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + if ( forms.length === 2 ) { + return count == 1 ? forms[0] : forms[1]; + } + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/be.js b/resources/mediawiki.language/languages/be.js new file mode 100644 index 0000000000..675c8f1c51 --- /dev/null +++ b/resources/mediawiki.language/languages/be.js @@ -0,0 +1,20 @@ +/** + * Belarusian normative (–ë–µ–ª–∞—Ä—É—Å–∫–∞—è –º–æ–≤–∞) language functions + */ + +mediaWiki.language.convertPlural = function convertPlural( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/bh.js b/resources/mediawiki.language/languages/bh.js new file mode 100644 index 0000000000..d67c5130a6 --- /dev/null +++ b/resources/mediawiki.language/languages/bh.js @@ -0,0 +1,8 @@ +/** + * Bihari (भोजपुरी) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/bs.js b/resources/mediawiki.language/languages/bs.js new file mode 100644 index 0000000000..87d756e60c --- /dev/null +++ b/resources/mediawiki.language/languages/bs.js @@ -0,0 +1,20 @@ +/** + * Bosnian (bosanski) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/cs.js b/resources/mediawiki.language/languages/cs.js new file mode 100644 index 0000000000..0e1837f72b --- /dev/null +++ b/resources/mediawiki.language/languages/cs.js @@ -0,0 +1,19 @@ +/** + * Czech (čeština [subst.], česk√Ω [adj.], česky [adv.]) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + switch ( count ) { + case 1: + return forms[0]; + break; + case 2: + case 3: + case 4: + return forms[1]; + break; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/cu.js b/resources/mediawiki.language/languages/cu.js new file mode 100644 index 0000000000..2f051895f6 --- /dev/null +++ b/resources/mediawiki.language/languages/cu.js @@ -0,0 +1,18 @@ +/** + * Old Church Slavonic (—®–∑—ã–∫—ä —Å–ª–æ–≤—£–Ω—å—Å–∫—ä) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + return forms[1]; + case 3: + case 4: + return forms[2]; + default: + return forms[3]; + } +} diff --git a/resources/mediawiki.language/languages/cy.js b/resources/mediawiki.language/languages/cy.js new file mode 100644 index 0000000000..19a3994a74 --- /dev/null +++ b/resources/mediawiki.language/languages/cy.js @@ -0,0 +1,15 @@ +/** + * Welsh (Cymraeg) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 6 ); + count = Math.abs( count ); + if ( count >= 0 && count <= 3 ) { + return forms[count]; + } + if ( count == 6 ) { + return forms[4]; + } + return forms[5]; +} diff --git a/resources/mediawiki.language/languages/dsb.js b/resources/mediawiki.language/languages/dsb.js new file mode 100644 index 0000000000..e1239e539d --- /dev/null +++ b/resources/mediawiki.language/languages/dsb.js @@ -0,0 +1,18 @@ +/** + * Lower Sorbian (Dolnoserbski) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + switch ( Math.abs( count ) % 100 ) { + case 1: + return forms[0]; + case 2: + return forms[1]; + case 3: + case 4: + return forms[2]; + default: + return forms[3]; + } +} diff --git a/resources/mediawiki.language/languages/fr.js b/resources/mediawiki.language/languages/fr.js new file mode 100644 index 0000000000..13a86c429a --- /dev/null +++ b/resources/mediawiki.language/languages/fr.js @@ -0,0 +1,8 @@ +/** + * French (Français) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/ga.js b/resources/mediawiki.language/languages/ga.js new file mode 100644 index 0000000000..1a53e281fa --- /dev/null +++ b/resources/mediawiki.language/languages/ga.js @@ -0,0 +1,14 @@ +/** + * Irish (Gaeilge) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count == 1 ) { + return forms[0]; + } + if ( count == 2 ) { + return forms[1]; + } + return forms[2]; +} diff --git a/resources/mediawiki.language/languages/gd.js b/resources/mediawiki.language/languages/gd.js new file mode 100644 index 0000000000..21160d2af5 --- /dev/null +++ b/resources/mediawiki.language/languages/gd.js @@ -0,0 +1,18 @@ +/** + * Scots Gaelic (Gàidhlig) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + count = Math.abs( count ); + if ( count === 1 ) { + return forms[0]; + } + if ( count === 2 ) { + return forms[1]; + } + if ( count >= 3 && count <= 10 ) { + return forms[2]; + } + return forms[3]; +} diff --git a/resources/mediawiki.language/languages/gv.js b/resources/mediawiki.language/languages/gv.js new file mode 100644 index 0000000000..774614708f --- /dev/null +++ b/resources/mediawiki.language/languages/gv.js @@ -0,0 +1,18 @@ +/** + * Manx (Gaelg) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + if ( count > 0 && ( count % 20 ) === 0 ) { + return forms[0]; + } + switch ( count % 10 ) { + case 1: + return forms[1]; + case 2: + return forms[2]; + default: + return forms[3]; + } +} diff --git a/resources/mediawiki.language/languages/he.js b/resources/mediawiki.language/languages/he.js new file mode 100644 index 0000000000..a96a918d92 --- /dev/null +++ b/resources/mediawiki.language/languages/he.js @@ -0,0 +1,14 @@ +/** + * Hebrew (עברית) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count == 1 ) { + return forms[0]; + } + if ( count == 2 && forms[2] ) { + return forms[2]; + } + return forms[1]; +} diff --git a/resources/mediawiki.language/languages/hi.js b/resources/mediawiki.language/languages/hi.js new file mode 100644 index 0000000000..7df2cac170 --- /dev/null +++ b/resources/mediawiki.language/languages/hi.js @@ -0,0 +1,8 @@ +/** + * Hindi (हिन्दी) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/hr.js b/resources/mediawiki.language/languages/hr.js new file mode 100644 index 0000000000..27a0886ed2 --- /dev/null +++ b/resources/mediawiki.language/languages/hr.js @@ -0,0 +1,20 @@ +/** + * Croatian (hrvatski) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/hsb.js b/resources/mediawiki.language/languages/hsb.js new file mode 100644 index 0000000000..e3bb9c42fd --- /dev/null +++ b/resources/mediawiki.language/languages/hsb.js @@ -0,0 +1,18 @@ +/** + * Upper Sorbian (Hornjoserbsce) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + switch ( Math.abs( count ) % 100 ) { + case 1: + return forms[0]; + case 2: + return forms[1]; + case 3: + case 4: + return forms[2]; + default: + return forms[3]; + } +} diff --git a/resources/mediawiki.language/languages/hy.js b/resources/mediawiki.language/languages/hy.js new file mode 100644 index 0000000000..6ec0580265 --- /dev/null +++ b/resources/mediawiki.language/languages/hy.js @@ -0,0 +1,8 @@ +/** + * Armenian (Հայերեն) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( Math.abs( count ) <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/ksh.js b/resources/mediawiki.language/languages/ksh.js new file mode 100644 index 0000000000..de46ae7df3 --- /dev/null +++ b/resources/mediawiki.language/languages/ksh.js @@ -0,0 +1,14 @@ +/** + * Ripuarian (Ripoarƒósh) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count == 1 ) { + return forms[0]; + } + if ( count == 0 ) { + return forms[2]; + } + return forms[1]; +} diff --git a/resources/mediawiki.language/languages/ln.js b/resources/mediawiki.language/languages/ln.js new file mode 100644 index 0000000000..d0c9fddfab --- /dev/null +++ b/resources/mediawiki.language/languages/ln.js @@ -0,0 +1,8 @@ +/** + * Lingala (Lingála) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/lt.js b/resources/mediawiki.language/languages/lt.js new file mode 100644 index 0000000000..6b92466a28 --- /dev/null +++ b/resources/mediawiki.language/languages/lt.js @@ -0,0 +1,17 @@ +/** + * Lithuanian (Lietuvi≈≥) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + if ( forms.length == 2 ) { + return count == 1 ? forms[0] : forms[1]; + } + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count % 10 == 1 && count % 100 != 11 ) { + return forms[0]; + } + if ( count % 10 >= 2 && ( count % 100 < 10 || count % 100 >= 20 ) ) { + return forms[1]; + } + return forms[2]; +} diff --git a/resources/mediawiki.language/languages/lv.js b/resources/mediawiki.language/languages/lv.js new file mode 100644 index 0000000000..d1f595cbca --- /dev/null +++ b/resources/mediawiki.language/languages/lv.js @@ -0,0 +1,8 @@ +/** + * Latvian (Latviešu) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( ( count % 10 == 1 ) && ( count % 100 != 11 ) ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/mg.js b/resources/mediawiki.language/languages/mg.js new file mode 100644 index 0000000000..27b833eb46 --- /dev/null +++ b/resources/mediawiki.language/languages/mg.js @@ -0,0 +1,8 @@ +/** + * Malagasy (Malagasy) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/mk.js b/resources/mediawiki.language/languages/mk.js new file mode 100644 index 0000000000..0a8abf1624 --- /dev/null +++ b/resources/mediawiki.language/languages/mk.js @@ -0,0 +1,8 @@ +/** + * Macedonian (Македонски) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count % 10 === 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/mo.js b/resources/mediawiki.language/languages/mo.js new file mode 100644 index 0000000000..c27b955dd6 --- /dev/null +++ b/resources/mediawiki.language/languages/mo.js @@ -0,0 +1,14 @@ +/** + * Moldavian (Молдовеняскэ) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count == 1 ) { + return forms[0]; + } + if ( count == 0 || count % 100 < 20 ) { + return forms[1]; + } + return forms[2]; +} diff --git a/resources/mediawiki.language/languages/mt.js b/resources/mediawiki.language/languages/mt.js new file mode 100644 index 0000000000..1e27383e88 --- /dev/null +++ b/resources/mediawiki.language/languages/mt.js @@ -0,0 +1,17 @@ +/** + * Maltese (Malti) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + if ( count == 1 ) { + return forms[0]; + } + if ( count == 0 || ( count % 100 > 1 && count % 100 < 11 ) ) { + return forms[1]; + } + if ( count % 100 > 10 && count % 100 < 20 ) { + return forms[2]; + } + return forms[3]; +} diff --git a/resources/mediawiki.language/languages/nso.js b/resources/mediawiki.language/languages/nso.js new file mode 100644 index 0000000000..dac6b6c368 --- /dev/null +++ b/resources/mediawiki.language/languages/nso.js @@ -0,0 +1,8 @@ +/** + * Northern Sotho (Sesotho sa Leboa) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/pl.js b/resources/mediawiki.language/languages/pl.js new file mode 100644 index 0000000000..4deb76d446 --- /dev/null +++ b/resources/mediawiki.language/languages/pl.js @@ -0,0 +1,21 @@ +/** + * Polish (polski) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + count = Math.abs( count ); + if ( count == 1 ) { + return forms[0]; + } + switch ( count % 10 ) { + case 2: + case 3: + case 4: + if ( count / 10 % 10 != 1 ) { + return forms[1]; + } + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/pt-br.js b/resources/mediawiki.language/languages/pt-br.js new file mode 100644 index 0000000000..ea511c1540 --- /dev/null +++ b/resources/mediawiki.language/languages/pt-br.js @@ -0,0 +1,8 @@ +/** + * Brazilian Portugese (Portuguêsi do Brasil) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/ro.js b/resources/mediawiki.language/languages/ro.js new file mode 100644 index 0000000000..9ab350c805 --- /dev/null +++ b/resources/mediawiki.language/languages/ro.js @@ -0,0 +1,14 @@ +/** + * Romanian (Română) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count == 1 ) { + return forms[0]; + } + if ( count == 0 || count % 100 < 20 ) { + return forms[1]; + } + return forms[2]; +} diff --git a/resources/mediawiki.language/languages/ru.js b/resources/mediawiki.language/languages/ru.js new file mode 100644 index 0000000000..9da0394346 --- /dev/null +++ b/resources/mediawiki.language/languages/ru.js @@ -0,0 +1,23 @@ +/** + * Russian (—Ä—É—Å—Å–∫–∏–π —è–∑—ã–∫) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + if ( forms.length === 2 ) { + return count == 1 ? forms[0] : forms[1]; + } + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/se.js b/resources/mediawiki.language/languages/se.js new file mode 100644 index 0000000000..002644ff5d --- /dev/null +++ b/resources/mediawiki.language/languages/se.js @@ -0,0 +1,17 @@ +/** + * Northern Sami (Sámegiella) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + if ( count == 0 ) { + return ''; + } + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count == 1 ) { + return forms[1]; + } + if ( count == 2 ) { + return forms[2]; + } + return '' +} diff --git a/resources/mediawiki.language/languages/sh.js b/resources/mediawiki.language/languages/sh.js new file mode 100644 index 0000000000..49af56c9eb --- /dev/null +++ b/resources/mediawiki.language/languages/sh.js @@ -0,0 +1,23 @@ +/** + * Serbo-Croatian (Srpskohrvatski / Српскохрватски) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + if ( forms.length === 2 ) { + return count == 1 ? forms[0] : forms[1]; + } + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/sk.js b/resources/mediawiki.language/languages/sk.js new file mode 100644 index 0000000000..1acd2ecb4f --- /dev/null +++ b/resources/mediawiki.language/languages/sk.js @@ -0,0 +1,14 @@ +/** + * Slovak (Slovenčina) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count == 1 ) { + return forms[0]; + } + if ( count == 2 || count == 3 || count == 4 ) { + return forms[1]; + } + return forms[2]; +} diff --git a/resources/mediawiki.language/languages/sl.js b/resources/mediawiki.language/languages/sl.js new file mode 100644 index 0000000000..27557d4741 --- /dev/null +++ b/resources/mediawiki.language/languages/sl.js @@ -0,0 +1,20 @@ +/** + * Slovenian (Slovenščina) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 5 ); + if ( count % 100 == 1 ) { + return forms[0]; + } + if ( count % 100 == 2 ) { + return forms[1]; + } + if ( count % 100 == 3 || count % 100 == 4 ) { + return forms[2]; + } + if ( count != 0 ) { + return forms[3]; + } + return forms[4]; +} diff --git a/resources/mediawiki.language/languages/sma.js b/resources/mediawiki.language/languages/sma.js new file mode 100644 index 0000000000..59c1dcfe21 --- /dev/null +++ b/resources/mediawiki.language/languages/sma.js @@ -0,0 +1,14 @@ +/** + * Southern Sami (Åarjelsaemien) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 4 ); + if ( count == 1 ) { + return forms[1]; + } + if ( count == 2 ) { + return forms[2]; + } + return forms[3]; +} diff --git a/resources/mediawiki.language/languages/sr-ec.js b/resources/mediawiki.language/languages/sr-ec.js new file mode 100644 index 0000000000..7b92bf6369 --- /dev/null +++ b/resources/mediawiki.language/languages/sr-ec.js @@ -0,0 +1,20 @@ +/** + * Serbian (cyrillic script) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/sr-el.js b/resources/mediawiki.language/languages/sr-el.js new file mode 100644 index 0000000000..f8189f3da5 --- /dev/null +++ b/resources/mediawiki.language/languages/sr-el.js @@ -0,0 +1,20 @@ +/** + * Serbian (latin script) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/sr.js b/resources/mediawiki.language/languages/sr.js new file mode 100644 index 0000000000..25cdc8a20d --- /dev/null +++ b/resources/mediawiki.language/languages/sr.js @@ -0,0 +1,23 @@ +/** + * Serbian (Српски / Srpski) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + if ( forms.length === 2 ) { + return ( count == 1 ) ? forms[0] : forms[1]; + } + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +}; diff --git a/resources/mediawiki.language/languages/ti.js b/resources/mediawiki.language/languages/ti.js new file mode 100644 index 0000000000..ca81a319f4 --- /dev/null +++ b/resources/mediawiki.language/languages/ti.js @@ -0,0 +1,8 @@ +/** + * Tigrinya (ትግርኛ) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural(forms, 2); + return (count <= 1) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/tl.js b/resources/mediawiki.language/languages/tl.js new file mode 100644 index 0000000000..317d57896e --- /dev/null +++ b/resources/mediawiki.language/languages/tl.js @@ -0,0 +1,7 @@ +/** + * Tagalog (Tagalog) language functions + */ +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/languages/uk.js b/resources/mediawiki.language/languages/uk.js new file mode 100644 index 0000000000..651e655262 --- /dev/null +++ b/resources/mediawiki.language/languages/uk.js @@ -0,0 +1,23 @@ +/** + * Ukrainian (—É–∫—Ä–∞—ó–Ω—Å—å–∫–∞ –º–æ–≤–∞) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + if ( forms.length === 2 ) { + return count == 1 ? forms[0] : forms[1]; + } + forms = mediaWiki.language.preConvertPlural( forms, 3 ); + if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) { + return forms[2]; + } + switch ( count % 10 ) { + case 1: + return forms[0]; + case 2: + case 3: + case 4: + return forms[1]; + default: + return forms[2]; + } +} diff --git a/resources/mediawiki.language/languages/wa.js b/resources/mediawiki.language/languages/wa.js new file mode 100644 index 0000000000..c58989c8be --- /dev/null +++ b/resources/mediawiki.language/languages/wa.js @@ -0,0 +1,8 @@ +/** + * Walloon (Walon) language functions + */ + +mediaWiki.language.convertPlural = function( count, forms ) { + forms = mediaWiki.language.preConvertPlural( forms, 2 ); + return ( count <= 1 ) ? forms[0] : forms[1]; +} diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js new file mode 100644 index 0000000000..0c895097f9 --- /dev/null +++ b/resources/mediawiki.language/mediawiki.language.js @@ -0,0 +1,99 @@ +/** + * Base language object + * + * Localized Language support attempts to mirror some of the functionality of Language.php in MediaWiki. This object + * contains methods for loading and transforming message text. + */ + +mediaWiki.language = { + /** + * Process the PLURAL template substitution + * + * @param {object} template Template object + * @format template + * { + * 'title': [title of template], + * 'parameters': [template parameters] + * } + * @example {{Template:title|params}} + */ + 'procPLURAL': function( template ) { + if( template.title && template.parameters && mediaWiki.language.convertPlural) { + // Check if we have forms to replace + if ( template.parameters.length == 0 ) { + return ''; + } + // Restore the count into a Number ( if it got converted earlier ) + var count = mediaWiki.language.convertNumber( template.title, true ); + // Do convertPlural call + return mediaWiki.language.convertPlural( parseInt( count ), template.parameters ); + } + // Could not process plural return first form or nothing + if( template.parameters[0] ) { + return template.parameters[0]; + } + return ''; + }, + /** + * Plural form transformations, needed for some languages. + * + * @param {integer} count Non-localized quantifier + * @param {array} forms List of plural forms + * @return {string} Correct form for quantifier in this language + */ + 'convertPlural': function( count, forms ){ + if ( !forms || forms.length == 0 ) { + return ''; + } + return ( parseInt( count ) == 1 ) ? forms[0] : forms[1]; + }, + /** + * Pads an array to a specific length by copying the last one element. + * + * @param {array} forms Number of forms given to convertPlural + * @param {integer} count Number of forms required + * @return {array} Padded array of forms + */ + 'preConvertPlural': function( forms, count ) { + while ( forms.length < count ) { + forms.push( forms[ forms.length-1 ] ); + } + return forms; + }, + /** + * Converts a number using digitTransformTable. + * + * @param {number} number Value to be converted + * @param {boolean} integer Convert the return value to an integer + */ + 'convertNumber': function( number, integer ) { + if ( !mediaWiki.language.digitTransformTable ) { + return number; + } + // Set the target Transform table: + var transformTable = mediaWiki.language.digitTransformTable; + // Check if the "restore" to Latin number flag is set: + if ( integer ) { + if ( parseInt( number ) == number ) { + return number; + } + var tmp = []; + for ( var i in transformTable ) { + tmp[ transformTable[ i ] ] = i; + } + transformTable = tmp; + } + var numberString = '' + number; + var convertedNumber = ''; + for ( var i = 0; i < numberString.length; i++ ) { + if ( transformTable[ numberString[i] ] ) { + convertedNumber += transformTable[numberString[i]]; + } else { + convertedNumber += numberString[i]; + } + } + return integer ? parseInt( convertedNumber) : convertedNumber; + }, + // Digit Transform Table, populated by language classes where applicable + 'digitTransformTable': null +}; diff --git a/resources/mediawiki/mediawiki.specials.preferences.js b/resources/mediawiki.specials/mediawiki.specials.preferences.js similarity index 100% rename from resources/mediawiki/mediawiki.specials.preferences.js rename to resources/mediawiki.specials/mediawiki.specials.preferences.js diff --git a/resources/mediawiki/mediawiki.specials.search.js b/resources/mediawiki.specials/mediawiki.specials.search.js similarity index 100% rename from resources/mediawiki/mediawiki.specials.search.js rename to resources/mediawiki.specials/mediawiki.specials.search.js diff --git a/resources/mediawiki/mediawiki.util.js b/resources/mediawiki.util/mediawiki.util.js similarity index 100% rename from resources/mediawiki/mediawiki.util.js rename to resources/mediawiki.util/mediawiki.util.js diff --git a/resources/mediawiki/mediawiki.utiltest.js b/resources/mediawiki.util/mediawiki.util.test.js similarity index 100% rename from resources/mediawiki/mediawiki.utiltest.js rename to resources/mediawiki.util/mediawiki.util.test.js diff --git a/resources/mediawiki/mediawiki.views.history.js b/resources/mediawiki.views/mediawiki.views.history.js similarity index 100% rename from resources/mediawiki/mediawiki.views.history.js rename to resources/mediawiki.views/mediawiki.views.history.js diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js index 3d3e82dfca..7bef469744 100644 --- a/resources/mediawiki/mediawiki.js +++ b/resources/mediawiki/mediawiki.js @@ -3,177 +3,199 @@ */ // New fallback String trimming functionality, was introduced natively in JavaScript 1.8.1 -if (typeof String.prototype.trim === 'undefined') { -// Add removing trailing and leading whitespace functionality cross-browser -// See also: http://blog.stevenlevithan.com/archives/faster-trim-javascript - String.prototype.trim = function () { - return this.replace(/^\s+|\s+$/g, ''); +if ( typeof String.prototype.trim === 'undefined' ) { + // Add removing trailing and leading whitespace functionality cross-browser + // See also: http://blog.stevenlevithan.com/archives/faster-trim-javascript + String.prototype.trim = function() { + return this.replace( /^\s+|\s+$/g, '' ); }; } -if (typeof String.prototype.trimLeft === 'undefined') { - String.prototype.trimLeft = function () { - return this.replace(/^\s\s*/, ""); +if ( typeof String.prototype.trimLeft === 'undefined' ) { + String.prototype.trimLeft = function() { + return this.replace( /^\s\s*/, "" ); }; } -if (typeof String.prototype.trimRight === 'undefined') { - String.prototype.trimRight = function () { +if ( typeof String.prototype.trimRight === 'undefined' ) { + String.prototype.trimRight = function() { return this.replace(/\s\s*$/, ""); }; } -// Add array comparison functionality -if (typeof Array.prototype.compare === 'undefined') { - Array.prototype.compare = function (against) { - if (this.length !== against.length) { - return false; - } - for (var i = 0; i < against.length; i++) { - if (this[i].compare) { - if (!this[i].compare(against[i])) { - return false; - } - } - if (this[i] !== against[i]) { - return false; - } - } - return true; - }; -} - -// Make calling .indexOf() on an array work on older browsers -if (typeof Array.prototype.indexOf === 'undefined') { - Array.prototype.indexOf = function (needle) { - for (var i = 0; i < this.length; i++) { - if (this[i] === needle) { - return i; - } - } - return -1; - }; -} - /* * Core MediaWiki JavaScript Library */ + // Attach to window window.mediaWiki = new ( function( $ ) { - + /* Constants */ - + // This will not change until we are 100% ready to turn off legacy globals var LEGACY_GLOBALS = true; - + /* Private Members */ - - var that = this; - + + // List of messages that have been requested to be loaded + var messageQueue = {}; + /* Prototypes */ - - this.prototypes = { - /* - * An object which allows single and multiple get/set/exists functionality on a list of key / value pairs - * - * @param {boolean} global whether to get/set/exists values on the window object or a private object - * @param {function} parser function to perform extra processing; in the form of function( value, options ) - * @param {function} fallback function to format default fallback; in the form of function( key ) - * where value is the data to be parsed and options is additional data passed through to the parser - */ - 'map': function( global, parser, fallback ) { - - /* Private Members */ - - var that = this; - var values = global === true ? window : {}; - - /* Public Methods */ - - /** - * Gets one or more values - * - * If called with no arguments, all values will be returned. If a parser is in use, no parsing will take - * place when calling with no arguments or calling with an array of names. - * - * @param {mixed} selection string name of value to get, array of string names of values to get, or object - * of name/option pairs - * @param {object} options optional set of options which are also passed to a parser if in use; only used - * when selection is a string - * @format options - * { - * // Value to use if key does not exist - * 'fallback': '' - * } - */ - this.get = function( selection, options ) { - if ( typeof selection === 'object' ) { - var results = {}; - for ( var s in selection ) { - if ( selection.hasOwnProperty( s ) ) { - if ( typeof s === 'string' ) { - return that.get( values[s], selection[s] ); - } else { - return that.get( selection[s] ); - } - } - } - return results; - } else if ( typeof selection === 'string' ) { - if ( typeof values[selection] === 'undefined' ) { - if ( typeof options === 'object' && 'fallback' in options ) { - return options.fallback; - } else if ( typeof fallback === 'function' ) { - return fallback( selection ); - } else { - return null; - } - } else { - if ( typeof parser === 'function' ) { - return parser( values[selection], options ); - } else { - return values[selection]; - } - } - } else { - return values; - } - }; - - /** - * Sets one or multiple configuration values using a key and a value or an object of keys and values - * - * @param {mixed} key string of name by which value will be made accessible, or object of name/value pairs - * @param {mixed} value optional value to set, only in use when key is a string - */ - this.set = function( selection, value ) { - if ( typeof selection === 'object' ) { - for ( var s in selection ) { - values[s] = selection[s]; - } - } else if ( typeof selection === 'string' && typeof value !== 'undefined' ) { - values[selection] = value; + + /** + * An object which allows single and multiple get/set/exists functionality on a list of key / value pairs. + * + * @param {boolean} global Whether to get/set/exists values on the window object or a private object + */ + function Map( global ) { + this.values = ( global === true ) ? window : {}; + }; + + /** + * Gets the value of a key, or a list of key/value pairs for an array of keys. + * + * If called with no arguments, all values will be returned. + * + * @param {mixed} selection Key or array of keys to get values for + * @param {mixed} fallback Value to use in case key(s) do not exist (optional) + */ + Map.prototype.get = function( selection, fallback ) { + if ( typeof selection === 'object' ) { + selection = $.makeArray( selection ); + var results = {}; + for ( var i = 0; i < selection.length; i++ ) { + results[selection[i]] = this.get( selection[i], fallback ); + } + return results; + } else if ( typeof selection === 'string' ) { + if ( typeof this.values[selection] === 'undefined' ) { + if ( typeof fallback !== 'undefined' ) { + return fallback; } - }; - - /** - * Checks if one or multiple configuration fields exist - */ - this.exists = function( selection ) { - if ( typeof keys === 'object' ) { - for ( var s = 0; s < selection.length; s++ ) { - if ( !( selection[s] in values ) ) { - return false; - } - } - return true; - } else { - return selection in values; + return null; + } + return this.values[selection]; + } + return this.values; + }; + + /** + * Sets one or multiple key/value pairs. + * + * @param {mixed} selection Key or object of key/value pairs to set + * @param {mixed} value Value to set (optional, only in use when key is a string) + */ + Map.prototype.set = function( selection, value ) { + if ( typeof selection === 'object' ) { + for ( var s in selection ) { + this.values[s] = selection[s]; + } + } else if ( typeof selection === 'string' && typeof value !== 'undefined' ) { + this.values[selection] = value; + } + }; + + /** + * Checks if one or multiple keys exist. + * + * @param {mixed} key Key or array of keys to check + * @return {boolean} Existence of key(s) + */ + Map.prototype.exists = function( selection ) { + if ( typeof keys === 'object' ) { + for ( var s = 0; s < selection.length; s++ ) { + if ( !( selection[s] in this.values ) ) { + return false; } - }; + } + return true; + } else { + return selection in this.values; } }; - - /* Methods */ + + /** + * Message object, similar to Message in PHP + */ + function Message( map, key, parameters ) { + this.format = 'parse'; + this.map = map; + this.key = key; + this.parameters = typeof parameters === 'undefined' ? [] : $.makeArray( parameters ); + }; + + /** + * Appends parameters for replacement + * + * @param {mixed} args First in a list of variadic arguments to append as message parameters + */ + Message.prototype.params = function( parameters ) { + for ( var i = 0; i < parameters.length; i++ ) { + this.parameters[this.parameters.length] = parameters[i]; + } + return this; + }; + + /** + * Converts message object to it's string form based on the state of format + * + * @return {string} String form of message + */ + Message.prototype.toString = function() { + if ( !this.map.exists( this.key ) ) { + // Return if key does not exist + return '<' + key + '>'; + } + var text = this.map.get( this.key ); + var parameters = this.parameters; + text = text.replace( /\$(\d+)/g, function( string, match ) { + var index = parseInt( match, 10 ) - 1; + return index in parameters ? parameters[index] : '$' + match; + } ); + /* This should be fixed up when we have a parser + if ( this.format === 'parse' && 'language' in mediaWiki ) { + text = mediaWiki.language.parse( text ); + } + */ + return text; + }; + + /** + * Changes format to parse and converts message to string + * + * @return {string} String form of parsed message + */ + Message.prototype.parse = function() { + this.format = 'parse'; + return this.toString(); + }; + + /** + * Changes format to plain and converts message to string + * + * @return {string} String form of plain message + */ + Message.prototype.plain = function() { + this.format = 'plain'; + return this.toString(); + }; + + /** + * Checks if message exists + * + * @return {string} String form of parsed message + */ + Message.prototype.exists = function() { + return this.map.exists( this.key ); + }; + + /** + * User object + */ + function User() { + this.options = new Map(); + } + + /* Public Members */ /* * Dummy function which in debug mode can be replaced with a function that does something clever @@ -185,37 +207,38 @@ window.mediaWiki = new ( function( $ ) { * * In legacy mode the values this object wraps will be in the global space */ - this.config = new this.prototypes.map( LEGACY_GLOBALS ); + this.config = new Map( LEGACY_GLOBALS ); /* * Information about the current user */ - this.user = new ( function() { - - /* Public Members */ - - this.options = new that.prototypes.map(); - } )(); - + this.user = new User(); + /* - * Basic parser, can be replaced with something more robust + * Localization system + */ + this.messages = new Map(); + + /* Public Methods */ + + /** + * Gets a message object, similar to wfMessage() + * + * @param {string} key Key of message to get + * @param {mixed} params First argument in a list of variadic arguments, each a parameter for $ replacement */ - this.parser = function( text, options ) { - if ( typeof options === 'object' && typeof options.parameters === 'object' ) { - text = text.replace( /\$(\d+)/g, function( str, match ) { - var index = parseInt( match, 10 ) - 1; - return index in options.parameters ? options.parameters[index] : '$' + match; - } ); + this.message = function( key, parameters ) { + // Support variadic arguments + if ( typeof parameters !== 'undefined' ) { + parameters = $.makeArray( arguments); + parameters.shift(); + } else { + parameters = []; } - return text; + return new Message( mediaWiki.messages, key, parameters ); }; - - /* - * Localization system - */ - this.msg = new that.prototypes.map( false, this.parser, function( key ) { return '<' + key + '>'; } ); - - /* + + /** * Client-side module loader which integrates with the MediaWiki ResourceLoader */ this.loader = new ( function() { @@ -223,7 +246,7 @@ window.mediaWiki = new ( function( $ ) { /* Private Members */ var that = this; - /* + /** * Mapping of registered modules * * The jquery module is pre-registered, because it must have already been provided for this object to have @@ -256,6 +279,23 @@ window.mediaWiki = new ( function( $ ) { /* Private Methods */ + function compare( a, b ) { + if ( a.length != b.length ) { + return false; + } + for ( var i = 0; i < b.length; i++ ) { + if ( $.isArray( a[i] ) ) { + if ( !compare( a[i], b[i] ) ) { + return false; + } + } + if ( a[i] !== b[i] ) { + return false; + } + } + return true; + }; + /** * Generates an ISO8601 "basic" string from a UNIX timestamp */ @@ -275,7 +315,9 @@ window.mediaWiki = new ( function( $ ) { * Recursively resolves dependencies and detects circular references */ function recurse( module, resolved, unresolved ) { - unresolved[unresolved.length] = module; + if ( typeof registry[module] === 'undefined' ) { + throw new Error( 'Unknown dependency: ' + module ); + } // Resolves dynamic loader function and replaces it with it's own results if ( typeof registry[module].dependencies === 'function' ) { registry[module].dependencies = registry[module].dependencies(); @@ -286,8 +328,8 @@ window.mediaWiki = new ( function( $ ) { } // Tracks down dependencies for ( var n = 0; n < registry[module].dependencies.length; n++ ) { - if ( resolved.indexOf( registry[module].dependencies[n] ) === -1 ) { - if ( unresolved.indexOf( registry[module].dependencies[n] ) !== -1 ) { + if ( $.inArray( registry[module].dependencies[n], resolved ) === -1 ) { + if ( $.inArray( registry[module].dependencies[n], unresolved ) !== -1 ) { throw new Error( 'Circular reference detected: ' + module + ' -> ' + registry[module].dependencies[n] ); @@ -296,7 +338,7 @@ window.mediaWiki = new ( function( $ ) { } } resolved[resolved.length] = module; - unresolved.splice( unresolved.indexOf( module ), 1 ); + unresolved.splice( $.inArray( module, unresolved ), 1 ); } /** @@ -391,7 +433,7 @@ window.mediaWiki = new ( function( $ ) { } // Add localizations to message system if ( typeof registry[module].messages === 'object' ) { - mediaWiki.msg.set( registry[module].messages ); + mediaWiki.messages.set( registry[module].messages ); } // Execute script try { @@ -399,7 +441,7 @@ window.mediaWiki = new ( function( $ ) { registry[module].state = 'ready'; // Run jobs who's dependencies have just been met for ( var j = 0; j < jobs.length; j++ ) { - if ( filter( 'ready', jobs[j].dependencies ).compare( jobs[j].dependencies ) ) { + if ( compare( filter( 'ready', jobs[j].dependencies ), jobs[j].dependencies ) ) { if ( typeof jobs[j].ready === 'function' ) { jobs[j].ready(); } @@ -410,7 +452,7 @@ window.mediaWiki = new ( function( $ ) { // Execute modules who's dependencies have just been met for ( r in registry ) { if ( registry[r].state == 'loaded' ) { - if ( filter( ['ready'], registry[r].dependencies ).compare( registry[r].dependencies ) ) { + if ( compare( filter( ['ready'], registry[r].dependencies ), registry[r].dependencies ) ) { execute( r ); } } @@ -421,7 +463,7 @@ window.mediaWiki = new ( function( $ ) { registry[module].state = 'error'; // Run error callbacks of jobs affected by this condition for ( var j = 0; j < jobs.length; j++ ) { - if ( jobs[j].dependencies.indexOf( module ) !== -1 ) { + if ( $.inArray( module, jobs[j].dependencies ) !== -1 ) { if ( typeof jobs[j].error === 'function' ) { jobs[j].error(); } @@ -460,7 +502,7 @@ window.mediaWiki = new ( function( $ ) { // Queue up any dependencies that are undefined or registered dependencies = filter( ['undefined', 'registered'], dependencies ); for ( var n = 0; n < dependencies.length; n++ ) { - if ( queue.indexOf( dependencies[n] ) === -1 ) { + if ( $.inArray( dependencies[n], queue ) === -1 ) { queue[queue.length] = dependencies[n]; } } @@ -493,7 +535,7 @@ window.mediaWiki = new ( function( $ ) { // Only request modules which are undefined or registered if ( !( queue[q] in registry ) || registry[queue[q]].state == 'registered' ) { // Prevent duplicate entries - if ( batch.indexOf( queue[q] ) === -1 ) { + if ( $.inArray( queue[q], batch ) === -1 ) { batch[batch.length] = queue[q]; // Mark registered modules as loading if ( queue[q] in registry ) { @@ -633,7 +675,7 @@ window.mediaWiki = new ( function( $ ) { registry[module].messages = localization; } // Execute or queue callback - if ( filter( ['ready'], registry[module].dependencies ).compare( registry[module].dependencies ) ) { + if ( compare( filter( ['ready'], registry[module].dependencies ), registry[module].dependencies ) ) { execute( module ); } else { request( module ); @@ -660,7 +702,7 @@ window.mediaWiki = new ( function( $ ) { // Resolve entire dependency map dependencies = resolve( dependencies ); // If all dependencies are met, execute ready immediately - if ( filter( ['ready'], dependencies ).compare( dependencies ) ) { + if ( compare( filter( ['ready'], dependencies ), dependencies ) ) { if ( typeof ready === 'function' ) { ready(); } @@ -714,7 +756,7 @@ window.mediaWiki = new ( function( $ ) { // Resolve entire dependency map modules = resolve( modules ); // If all modules are ready, nothing dependency be done - if ( filter( ['ready'], modules ).compare( modules ) ) { + if ( compare( filter( ['ready'], modules ), modules ) ) { return true; } // If any modules have errors return false diff --git a/skins/common/ajaxwatch.js b/skins/common/ajaxwatch.js index 9ee5c08209..e051229b41 100644 --- a/skins/common/ajaxwatch.js +++ b/skins/common/ajaxwatch.js @@ -12,17 +12,17 @@ wgAjaxWatch.setLinkText = function( $link, action ) { if ( action == 'watch' || action == 'unwatch' ) { // save the accesskey from the title var keyCommand = $link.attr( 'title' ).match( /\[.*?\]$/ ) ? $link.attr( 'title' ).match( /\[.*?\]$/ )[0] : ''; - $link.attr( 'title', mediaWiki.msg.get( 'tooltip-ca-' + action ) + ' ' + keyCommand ); + $link.attr( 'title', mediaWiki.message( 'tooltip-ca-' + action ) + ' ' + keyCommand ); } if ( $link.data( 'icon' ) ) { - $link.attr( 'alt', mediaWiki.msg.get( action ) ); + $link.attr( 'alt', mediaWiki.message( action ) ); if ( action == 'watching' || action == 'unwatching' ) { $link.addClass( 'loading' ); } else { $link.removeClass( 'loading' ); } } else { - $link.html( mediaWiki.msg.get( action ) ); + $link.html( mediaWiki.message( action ) ); } }; @@ -110,7 +110,7 @@ $( document ).ready( function() { if( $link.parents( 'li' ).attr( 'id' ) == 'ca-' + action ) { $link.parents( 'li' ).attr( 'id', 'ca-' + otheraction ); // update the link text with the new message - $link.text( mediaWiki.msg.get( otheraction ) ); + $link.text( mediaWiki.message( otheraction ) ); } }; return false; diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index d9dcb802b9..1ae7f62c71 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -156,7 +156,7 @@ window.showTocToggle = function() { toggleLink.href = '#'; addClickHandler( toggleLink, function( evt ) { toggleToc(); return killEvt( evt ); } ); - toggleLink.appendChild( document.createTextNode( mediaWiki.msg.get( 'hidetoc' ) ) ); + toggleLink.appendChild( document.createTextNode( mediaWiki.message( 'hidetoc' ) ) ); outerSpan.appendChild( document.createTextNode( '[' ) ); outerSpan.appendChild( toggleLink ); @@ -198,12 +198,12 @@ window.toggleToc = function() { var toggleLink = document.getElementById( 'togglelink' ); if ( toc && toggleLink && toc.style.display == 'none' ) { - changeText( toggleLink, mediaWiki.msg.get( 'hidetoc' ) ); + changeText( toggleLink, mediaWiki.message( 'hidetoc' ) ); toc.style.display = 'block'; document.cookie = "hidetoc=0"; tocmain.className = 'toc'; } else { - changeText( toggleLink, mediaWiki.msg.get( 'showtoc' ) ); + changeText( toggleLink, mediaWiki.message( 'showtoc' ) ); toc.style.display = 'none'; document.cookie = "hidetoc=1"; tocmain.className = 'toc tochidden'; -- 2.20.1