wiki.techinc.nl/resources/mediawiki.language/mediawiki.language.js

168 lines
4.8 KiB
JavaScript
Raw Normal View History

/**
* Localized Language support attempts to mirror some of the functionality of
* Language.php in MediaWiki.
* This adds methods for transforming message text.
*/
( function ( mw, $ ) {
var 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 && mw.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 = mw.language.convertNumber( template.title, true );
// Do convertPlural call
return mw.language.convertPlural( parseInt( count, 10 ), template.parameters );
}
// Could not process plural return first form or nothing
2010-10-27 15:51:31 +00:00
if ( template.parameters[0] ) {
return template.parameters[0];
}
return '';
},
/**
* Plural form transformations, needed for some languages.
*
* @param count integer Non-localized quantifier
* @param forms array List of plural forms
* @return string Correct form for quantifier in this language
*/
Lint: Go-go-gadget jshint! Passing entire JS code base (again). There were still some files not passing jshint, and for files that did, we managed to screw 'em up again. Added more explicit settings in .jshintrc to avoid relying on a kind of default somewhere. There are too many default-factors: closest(.jshintrc), ~/.jshintrc, IDE/editor, node-jshint.. Added node_modules/ and extensions/ to .jshintignore. Previously "$ jshint ." would recurse over all kinds of unrelated code. Extensions should have their own jshint dotfiles. When linting from Jenkins this won't be a problem as those will be ran per repo (so when linting core it will skip extensions and when in an extension dir, the core dotfiles don't apply as they'll be out of scope). Some of our modules are really messy and should be refactored to be less spaghetti-ish and have more descriptive variable names and more manageable function-level complexity. But for this commit, I'm keeping it as much as-is as possible, because its hard/large enough to review as it is. A few errors are cited below to give an impression of the kind of warnings I addressed (for cases where the diff isn't so obvious): * jquery.hidpi.js: line 110, col 15, Empty block. * mediawiki.jqueryMsg.js: line 34, col 17, Too many var statements. * mediawiki.jqueryMsg.js: line 145, col 33, Strings must use singlequote. * mediawiki.action.edit.js: line 74, col 73, 'selectText' is defined but never used. * startup.js: line 19, col 22, 'isCompatible' is defined but never used. * jquery.byteLength.test.js: line 26, col 9, Identifier 'U_00A2' is not in camel case. * jquery.localize.test.js: line 63, col 29, 'attrs' is defined but never used. * mediawiki.cldr.test.js: line 72, col 27, 'mw' is not defined. * mediawiki.jscompat.test.js: line 6, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 9, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 7, col 15, 'mw' is not defined. * mediawiki.api.parse.test.js: line 14, col 24, '$' is not defined. * mediawiki.api.test.js: line 43, col 28, 'data' is defined but never used. Other fixes: * Add closures fix implied global errors ($, mw and more), and prevents local variables from becoming globals. * Avoid jQ magic map arg etc. (per code conventions). * Fix incorrect usage of jQuery methods (prop instead of attr, prop false instead of removeProp, ..). * Unquote keys in object literals for consistency, and enforce single quotes (no magic quotes in javascript, as much as we might think "\n" and '/n' are really exactly the same). Chose single quotes over double quotes since that's what most code already had and what conventions seemed to prefer (both the old generic ones and the new per-lang ones since 2011/2012). * Enforce camelCase variable names with jshint per code conventions. * $foo.on('x', fn).trigger('x') -> $foo.on('x', fn); fn() (No event simulation overhead, unless intended of course) * Incorrect indentation (ignore whitespace in the diff!). * Avoid proprietary selectors like ':first' when .eq(0) afterwards is just as possible (significantly faster in jQuery due to mostly avoiding the Sizzle engine and going native in modern browsers). * When at it, convert deprecated jQuery methods to new ones. Mostly just .delegate(sel, type, fn) -> .on(type, sel, fn). * Addressed whitespace here and there. Interesting: * mediawiki.js: local function "compare" wasn't used anymore (hasn't been in a while!) removed per jshint warning. * mediawiki.special.recentchanges.js: Was a mess, only a few lines of code, rewritten. Pfew, let's hope it's the last one before we lint from Jenkins! Change-Id: I23ad60a1d804c542d9b91454aaa20ce7be4ff289
2012-09-26 07:14:52 +00:00
convertPlural: function ( count, forms ) {
var pluralRules,
pluralFormIndex = 0;
if ( !forms || forms.length === 0 ) {
return '';
2010-10-27 15:51:31 +00:00
}
Lint: Go-go-gadget jshint! Passing entire JS code base (again). There were still some files not passing jshint, and for files that did, we managed to screw 'em up again. Added more explicit settings in .jshintrc to avoid relying on a kind of default somewhere. There are too many default-factors: closest(.jshintrc), ~/.jshintrc, IDE/editor, node-jshint.. Added node_modules/ and extensions/ to .jshintignore. Previously "$ jshint ." would recurse over all kinds of unrelated code. Extensions should have their own jshint dotfiles. When linting from Jenkins this won't be a problem as those will be ran per repo (so when linting core it will skip extensions and when in an extension dir, the core dotfiles don't apply as they'll be out of scope). Some of our modules are really messy and should be refactored to be less spaghetti-ish and have more descriptive variable names and more manageable function-level complexity. But for this commit, I'm keeping it as much as-is as possible, because its hard/large enough to review as it is. A few errors are cited below to give an impression of the kind of warnings I addressed (for cases where the diff isn't so obvious): * jquery.hidpi.js: line 110, col 15, Empty block. * mediawiki.jqueryMsg.js: line 34, col 17, Too many var statements. * mediawiki.jqueryMsg.js: line 145, col 33, Strings must use singlequote. * mediawiki.action.edit.js: line 74, col 73, 'selectText' is defined but never used. * startup.js: line 19, col 22, 'isCompatible' is defined but never used. * jquery.byteLength.test.js: line 26, col 9, Identifier 'U_00A2' is not in camel case. * jquery.localize.test.js: line 63, col 29, 'attrs' is defined but never used. * mediawiki.cldr.test.js: line 72, col 27, 'mw' is not defined. * mediawiki.jscompat.test.js: line 6, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 9, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 7, col 15, 'mw' is not defined. * mediawiki.api.parse.test.js: line 14, col 24, '$' is not defined. * mediawiki.api.test.js: line 43, col 28, 'data' is defined but never used. Other fixes: * Add closures fix implied global errors ($, mw and more), and prevents local variables from becoming globals. * Avoid jQ magic map arg etc. (per code conventions). * Fix incorrect usage of jQuery methods (prop instead of attr, prop false instead of removeProp, ..). * Unquote keys in object literals for consistency, and enforce single quotes (no magic quotes in javascript, as much as we might think "\n" and '/n' are really exactly the same). Chose single quotes over double quotes since that's what most code already had and what conventions seemed to prefer (both the old generic ones and the new per-lang ones since 2011/2012). * Enforce camelCase variable names with jshint per code conventions. * $foo.on('x', fn).trigger('x') -> $foo.on('x', fn); fn() (No event simulation overhead, unless intended of course) * Incorrect indentation (ignore whitespace in the diff!). * Avoid proprietary selectors like ':first' when .eq(0) afterwards is just as possible (significantly faster in jQuery due to mostly avoiding the Sizzle engine and going native in modern browsers). * When at it, convert deprecated jQuery methods to new ones. Mostly just .delegate(sel, type, fn) -> .on(type, sel, fn). * Addressed whitespace here and there. Interesting: * mediawiki.js: local function "compare" wasn't used anymore (hasn't been in a while!) removed per jshint warning. * mediawiki.special.recentchanges.js: Was a mess, only a few lines of code, rewritten. Pfew, let's hope it's the last one before we lint from Jenkins! Change-Id: I23ad60a1d804c542d9b91454aaa20ce7be4ff289
2012-09-26 07:14:52 +00:00
pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
if ( !pluralRules ) {
// default fallback.
return ( count === 1 ) ? forms[0] : forms[1];
}
pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
return forms[pluralFormIndex];
},
/**
* Pads an array to a specific length by copying the last one element.
*
* @param forms array Number of forms given to convertPlural
* @param count integer 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
* @return {Number|String} formatted number
*/
Lint: Go-go-gadget jshint! Passing entire JS code base (again). There were still some files not passing jshint, and for files that did, we managed to screw 'em up again. Added more explicit settings in .jshintrc to avoid relying on a kind of default somewhere. There are too many default-factors: closest(.jshintrc), ~/.jshintrc, IDE/editor, node-jshint.. Added node_modules/ and extensions/ to .jshintignore. Previously "$ jshint ." would recurse over all kinds of unrelated code. Extensions should have their own jshint dotfiles. When linting from Jenkins this won't be a problem as those will be ran per repo (so when linting core it will skip extensions and when in an extension dir, the core dotfiles don't apply as they'll be out of scope). Some of our modules are really messy and should be refactored to be less spaghetti-ish and have more descriptive variable names and more manageable function-level complexity. But for this commit, I'm keeping it as much as-is as possible, because its hard/large enough to review as it is. A few errors are cited below to give an impression of the kind of warnings I addressed (for cases where the diff isn't so obvious): * jquery.hidpi.js: line 110, col 15, Empty block. * mediawiki.jqueryMsg.js: line 34, col 17, Too many var statements. * mediawiki.jqueryMsg.js: line 145, col 33, Strings must use singlequote. * mediawiki.action.edit.js: line 74, col 73, 'selectText' is defined but never used. * startup.js: line 19, col 22, 'isCompatible' is defined but never used. * jquery.byteLength.test.js: line 26, col 9, Identifier 'U_00A2' is not in camel case. * jquery.localize.test.js: line 63, col 29, 'attrs' is defined but never used. * mediawiki.cldr.test.js: line 72, col 27, 'mw' is not defined. * mediawiki.jscompat.test.js: line 6, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 9, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 7, col 15, 'mw' is not defined. * mediawiki.api.parse.test.js: line 14, col 24, '$' is not defined. * mediawiki.api.test.js: line 43, col 28, 'data' is defined but never used. Other fixes: * Add closures fix implied global errors ($, mw and more), and prevents local variables from becoming globals. * Avoid jQ magic map arg etc. (per code conventions). * Fix incorrect usage of jQuery methods (prop instead of attr, prop false instead of removeProp, ..). * Unquote keys in object literals for consistency, and enforce single quotes (no magic quotes in javascript, as much as we might think "\n" and '/n' are really exactly the same). Chose single quotes over double quotes since that's what most code already had and what conventions seemed to prefer (both the old generic ones and the new per-lang ones since 2011/2012). * Enforce camelCase variable names with jshint per code conventions. * $foo.on('x', fn).trigger('x') -> $foo.on('x', fn); fn() (No event simulation overhead, unless intended of course) * Incorrect indentation (ignore whitespace in the diff!). * Avoid proprietary selectors like ':first' when .eq(0) afterwards is just as possible (significantly faster in jQuery due to mostly avoiding the Sizzle engine and going native in modern browsers). * When at it, convert deprecated jQuery methods to new ones. Mostly just .delegate(sel, type, fn) -> .on(type, sel, fn). * Addressed whitespace here and there. Interesting: * mediawiki.js: local function "compare" wasn't used anymore (hasn't been in a while!) removed per jshint warning. * mediawiki.special.recentchanges.js: Was a mess, only a few lines of code, rewritten. Pfew, let's hope it's the last one before we lint from Jenkins! Change-Id: I23ad60a1d804c542d9b91454aaa20ce7be4ff289
2012-09-26 07:14:52 +00:00
convertNumber: function ( num, integer ) {
var i, tmp, transformTable, numberString, convertedNumber;
// Set the target Transform table:
transformTable = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' );
if ( !transformTable ) {
return num;
}
2010-10-27 15:51:31 +00:00
// Check if the "restore" to Latin number flag is set:
if ( integer ) {
if ( parseInt( num, 10 ) === num ) {
return num;
}
tmp = [];
for ( i in transformTable ) {
tmp[ transformTable[ i ] ] = i;
}
transformTable = tmp;
}
Lint: Go-go-gadget jshint! Passing entire JS code base (again). There were still some files not passing jshint, and for files that did, we managed to screw 'em up again. Added more explicit settings in .jshintrc to avoid relying on a kind of default somewhere. There are too many default-factors: closest(.jshintrc), ~/.jshintrc, IDE/editor, node-jshint.. Added node_modules/ and extensions/ to .jshintignore. Previously "$ jshint ." would recurse over all kinds of unrelated code. Extensions should have their own jshint dotfiles. When linting from Jenkins this won't be a problem as those will be ran per repo (so when linting core it will skip extensions and when in an extension dir, the core dotfiles don't apply as they'll be out of scope). Some of our modules are really messy and should be refactored to be less spaghetti-ish and have more descriptive variable names and more manageable function-level complexity. But for this commit, I'm keeping it as much as-is as possible, because its hard/large enough to review as it is. A few errors are cited below to give an impression of the kind of warnings I addressed (for cases where the diff isn't so obvious): * jquery.hidpi.js: line 110, col 15, Empty block. * mediawiki.jqueryMsg.js: line 34, col 17, Too many var statements. * mediawiki.jqueryMsg.js: line 145, col 33, Strings must use singlequote. * mediawiki.action.edit.js: line 74, col 73, 'selectText' is defined but never used. * startup.js: line 19, col 22, 'isCompatible' is defined but never used. * jquery.byteLength.test.js: line 26, col 9, Identifier 'U_00A2' is not in camel case. * jquery.localize.test.js: line 63, col 29, 'attrs' is defined but never used. * mediawiki.cldr.test.js: line 72, col 27, 'mw' is not defined. * mediawiki.jscompat.test.js: line 6, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 9, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 7, col 15, 'mw' is not defined. * mediawiki.api.parse.test.js: line 14, col 24, '$' is not defined. * mediawiki.api.test.js: line 43, col 28, 'data' is defined but never used. Other fixes: * Add closures fix implied global errors ($, mw and more), and prevents local variables from becoming globals. * Avoid jQ magic map arg etc. (per code conventions). * Fix incorrect usage of jQuery methods (prop instead of attr, prop false instead of removeProp, ..). * Unquote keys in object literals for consistency, and enforce single quotes (no magic quotes in javascript, as much as we might think "\n" and '/n' are really exactly the same). Chose single quotes over double quotes since that's what most code already had and what conventions seemed to prefer (both the old generic ones and the new per-lang ones since 2011/2012). * Enforce camelCase variable names with jshint per code conventions. * $foo.on('x', fn).trigger('x') -> $foo.on('x', fn); fn() (No event simulation overhead, unless intended of course) * Incorrect indentation (ignore whitespace in the diff!). * Avoid proprietary selectors like ':first' when .eq(0) afterwards is just as possible (significantly faster in jQuery due to mostly avoiding the Sizzle engine and going native in modern browsers). * When at it, convert deprecated jQuery methods to new ones. Mostly just .delegate(sel, type, fn) -> .on(type, sel, fn). * Addressed whitespace here and there. Interesting: * mediawiki.js: local function "compare" wasn't used anymore (hasn't been in a while!) removed per jshint warning. * mediawiki.special.recentchanges.js: Was a mess, only a few lines of code, rewritten. Pfew, let's hope it's the last one before we lint from Jenkins! Change-Id: I23ad60a1d804c542d9b91454aaa20ce7be4ff289
2012-09-26 07:14:52 +00:00
numberString = '' + num;
convertedNumber = '';
for ( i = 0; i < numberString.length; i++ ) {
if ( transformTable[ numberString[i] ] ) {
convertedNumber += transformTable[numberString[i]];
} else {
convertedNumber += numberString[i];
}
}
return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
},
/**
* Provides an alternative text depending on specified gender.
* Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
* If second or third parameter are not specified, masculine is used.
*
* These details may be overriden per language.
*
* @param gender string male, female, or anything else for neutral.
* @param forms array List of gender forms
*
* @return string
*/
Lint: Go-go-gadget jshint! Passing entire JS code base (again). There were still some files not passing jshint, and for files that did, we managed to screw 'em up again. Added more explicit settings in .jshintrc to avoid relying on a kind of default somewhere. There are too many default-factors: closest(.jshintrc), ~/.jshintrc, IDE/editor, node-jshint.. Added node_modules/ and extensions/ to .jshintignore. Previously "$ jshint ." would recurse over all kinds of unrelated code. Extensions should have their own jshint dotfiles. When linting from Jenkins this won't be a problem as those will be ran per repo (so when linting core it will skip extensions and when in an extension dir, the core dotfiles don't apply as they'll be out of scope). Some of our modules are really messy and should be refactored to be less spaghetti-ish and have more descriptive variable names and more manageable function-level complexity. But for this commit, I'm keeping it as much as-is as possible, because its hard/large enough to review as it is. A few errors are cited below to give an impression of the kind of warnings I addressed (for cases where the diff isn't so obvious): * jquery.hidpi.js: line 110, col 15, Empty block. * mediawiki.jqueryMsg.js: line 34, col 17, Too many var statements. * mediawiki.jqueryMsg.js: line 145, col 33, Strings must use singlequote. * mediawiki.action.edit.js: line 74, col 73, 'selectText' is defined but never used. * startup.js: line 19, col 22, 'isCompatible' is defined but never used. * jquery.byteLength.test.js: line 26, col 9, Identifier 'U_00A2' is not in camel case. * jquery.localize.test.js: line 63, col 29, 'attrs' is defined but never used. * mediawiki.cldr.test.js: line 72, col 27, 'mw' is not defined. * mediawiki.jscompat.test.js: line 6, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 9, col 17, Strings must use singlequote. * mediawiki.api.parse.test.js: line 7, col 15, 'mw' is not defined. * mediawiki.api.parse.test.js: line 14, col 24, '$' is not defined. * mediawiki.api.test.js: line 43, col 28, 'data' is defined but never used. Other fixes: * Add closures fix implied global errors ($, mw and more), and prevents local variables from becoming globals. * Avoid jQ magic map arg etc. (per code conventions). * Fix incorrect usage of jQuery methods (prop instead of attr, prop false instead of removeProp, ..). * Unquote keys in object literals for consistency, and enforce single quotes (no magic quotes in javascript, as much as we might think "\n" and '/n' are really exactly the same). Chose single quotes over double quotes since that's what most code already had and what conventions seemed to prefer (both the old generic ones and the new per-lang ones since 2011/2012). * Enforce camelCase variable names with jshint per code conventions. * $foo.on('x', fn).trigger('x') -> $foo.on('x', fn); fn() (No event simulation overhead, unless intended of course) * Incorrect indentation (ignore whitespace in the diff!). * Avoid proprietary selectors like ':first' when .eq(0) afterwards is just as possible (significantly faster in jQuery due to mostly avoiding the Sizzle engine and going native in modern browsers). * When at it, convert deprecated jQuery methods to new ones. Mostly just .delegate(sel, type, fn) -> .on(type, sel, fn). * Addressed whitespace here and there. Interesting: * mediawiki.js: local function "compare" wasn't used anymore (hasn't been in a while!) removed per jshint warning. * mediawiki.special.recentchanges.js: Was a mess, only a few lines of code, rewritten. Pfew, let's hope it's the last one before we lint from Jenkins! Change-Id: I23ad60a1d804c542d9b91454aaa20ce7be4ff289
2012-09-26 07:14:52 +00:00
gender: function ( gender, forms ) {
if ( !forms || forms.length === 0 ) {
return '';
}
forms = mw.language.preConvertPlural( forms, 2 );
if ( gender === 'male' ) {
return forms[0];
}
if ( gender === 'female' ) {
return forms[1];
}
return ( forms.length === 3 ) ? forms[2] : forms[0];
},
/**
* Grammatical transformations, needed for inflected languages.
* Invoked by putting {{grammar:form|word}} in a message.
* The rules can be defined in $wgGrammarForms global or grammar
* forms can be computed dynamically by overriding this method per language
*
* @param word {String}
* @param form {String}
* @return {String}
*/
convertGrammar: function ( word, form ) {
var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
return grammarForms[form][word] || word;
}
return word;
},
// Digit Transform Table, populated by language classes where applicable
digitTransformTable: mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' )
};
$.extend( mw.language, language );
}( mediaWiki, jQuery ) );