2010-10-26 23:40:26 +00:00
|
|
|
/**
|
2012-06-02 15:43:04 +00:00
|
|
|
* Base language object
|
|
|
|
|
*
|
2010-11-12 23:10:58 +00:00
|
|
|
* Localized Language support attempts to mirror some of the functionality of
|
2012-06-02 15:43:04 +00:00
|
|
|
* Language.php in MediaWiki. This object contains methods for loading and
|
|
|
|
|
* transforming message text.
|
2010-10-26 23:40:26 +00:00
|
|
|
*/
|
2011-01-31 19:33:16 +00:00
|
|
|
( function( $, mw ) {
|
2010-10-26 23:40:26 +00:00
|
|
|
|
2012-04-02 13:01:10 +00:00
|
|
|
var language = {
|
2012-06-02 15:43:04 +00:00
|
|
|
/**
|
|
|
|
|
* @var data {Object} Language related data (keyed by language,
|
|
|
|
|
* contains instances of mw.Map).
|
|
|
|
|
* @example Set data
|
|
|
|
|
* <code>
|
|
|
|
|
* // Override, extend or create the language data object of 'nl'
|
|
|
|
|
* mw.language.setData( 'nl', 'myKey', 'My value' );
|
|
|
|
|
* </code>
|
|
|
|
|
* @example Get GrammarForms data for language 'nl':
|
|
|
|
|
* <code>
|
|
|
|
|
* var grammarForms = mw.language.getData( 'nl', 'grammarForms' );
|
|
|
|
|
* </code>
|
|
|
|
|
*/
|
|
|
|
|
data: {},
|
2012-04-02 13:01:10 +00:00
|
|
|
|
2012-06-02 15:43:04 +00:00
|
|
|
/**
|
|
|
|
|
* Convenience method for retreiving language data by language code and data key,
|
|
|
|
|
* covering for the potential inexistance of a data object for this langiage.
|
|
|
|
|
* @param langCode {String}
|
|
|
|
|
* @param dataKey {String}
|
|
|
|
|
* @return {mixed} Value stored in the mw.Map (or undefined if there is no map for
|
|
|
|
|
the specified langCode).
|
|
|
|
|
*/
|
|
|
|
|
getData: function ( langCode, dataKey ) {
|
|
|
|
|
var langData = language.data;
|
|
|
|
|
if ( langData[langCode] instanceof mw.Map ) {
|
|
|
|
|
return langData[langCode].get( dataKey );
|
|
|
|
|
}
|
|
|
|
|
return undefined;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convenience method for setting language data by language code and data key.
|
|
|
|
|
* Creates a data object if there isn't one for the specified language already.
|
|
|
|
|
* @param langCode {String}
|
|
|
|
|
* @param dataKey {String}
|
|
|
|
|
* @param value {mixed}
|
|
|
|
|
*/
|
|
|
|
|
setData: function ( langCode, dataKey, value ) {
|
|
|
|
|
var langData = language.data;
|
|
|
|
|
if ( !( langData[langCode] instanceof mw.Map ) ) {
|
|
|
|
|
langData[langCode] = new mw.Map();
|
|
|
|
|
}
|
|
|
|
|
langData[langCode].set( dataKey, value );
|
|
|
|
|
},
|
2010-10-26 23:40:26 +00:00
|
|
|
/**
|
2010-11-12 23:10:58 +00:00
|
|
|
* Process the PLURAL template substitution
|
|
|
|
|
*
|
|
|
|
|
* @param {object} template Template object
|
2010-10-26 23:40:26 +00:00
|
|
|
* @format template
|
|
|
|
|
* {
|
|
|
|
|
* 'title': [title of template],
|
|
|
|
|
* 'parameters': [template parameters]
|
|
|
|
|
* }
|
|
|
|
|
* @example {{Template:title|params}}
|
|
|
|
|
*/
|
|
|
|
|
'procPLURAL': function( template ) {
|
2011-01-31 19:33:16 +00:00
|
|
|
if ( template.title && template.parameters && mw.language.convertPlural ) {
|
2010-10-26 23:40:26 +00:00
|
|
|
// Check if we have forms to replace
|
2012-01-02 09:21:03 +00:00
|
|
|
if ( template.parameters.length === 0 ) {
|
2010-10-26 23:40:26 +00:00
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
// Restore the count into a Number ( if it got converted earlier )
|
2011-01-31 19:33:16 +00:00
|
|
|
var count = mw.language.convertNumber( template.title, true );
|
2010-11-22 23:55:37 +00:00
|
|
|
// Do convertPlural call
|
2011-03-10 00:14:36 +00:00
|
|
|
return mw.language.convertPlural( parseInt( count, 10 ), template.parameters );
|
2010-10-26 23:40:26 +00:00
|
|
|
}
|
|
|
|
|
// Could not process plural return first form or nothing
|
2010-10-27 15:51:31 +00:00
|
|
|
if ( template.parameters[0] ) {
|
2010-10-26 23:40:26 +00:00
|
|
|
return template.parameters[0];
|
|
|
|
|
}
|
|
|
|
|
return '';
|
|
|
|
|
},
|
|
|
|
|
/**
|
|
|
|
|
* Plural form transformations, needed for some languages.
|
2010-11-12 23:10:58 +00:00
|
|
|
*
|
2010-11-30 18:19:27 +00:00
|
|
|
* @param count integer Non-localized quantifier
|
|
|
|
|
* @param forms array List of plural forms
|
|
|
|
|
* @return string Correct form for quantifier in this language
|
2010-10-26 23:40:26 +00:00
|
|
|
*/
|
2010-10-27 15:51:31 +00:00
|
|
|
'convertPlural': function( count, forms ){
|
2012-01-02 09:21:03 +00:00
|
|
|
if ( !forms || forms.length === 0 ) {
|
2010-11-12 23:10:58 +00:00
|
|
|
return '';
|
2010-10-27 15:51:31 +00:00
|
|
|
}
|
2011-03-10 00:14:36 +00:00
|
|
|
return ( parseInt( count, 10 ) == 1 ) ? forms[0] : forms[1];
|
2010-10-26 23:40:26 +00:00
|
|
|
},
|
|
|
|
|
/**
|
|
|
|
|
* Pads an array to a specific length by copying the last one element.
|
2010-11-12 23:10:58 +00:00
|
|
|
*
|
2010-11-30 18:19:27 +00:00
|
|
|
* @param forms array Number of forms given to convertPlural
|
|
|
|
|
* @param count integer Number of forms required
|
|
|
|
|
* @return array Padded array of forms
|
2010-10-26 23:40:26 +00:00
|
|
|
*/
|
|
|
|
|
'preConvertPlural': function( forms, count ) {
|
|
|
|
|
while ( forms.length < count ) {
|
|
|
|
|
forms.push( forms[ forms.length-1 ] );
|
2010-11-12 23:10:58 +00:00
|
|
|
}
|
2010-10-26 23:40:26 +00:00
|
|
|
return forms;
|
|
|
|
|
},
|
|
|
|
|
/**
|
|
|
|
|
* Converts a number using digitTransformTable.
|
2010-11-12 23:10:58 +00:00
|
|
|
*
|
2011-03-17 20:37:32 +00:00
|
|
|
* @param {num} number Value to be converted
|
2010-10-26 23:40:26 +00:00
|
|
|
* @param {boolean} integer Convert the return value to an integer
|
|
|
|
|
*/
|
2011-03-10 00:14:36 +00:00
|
|
|
'convertNumber': function( num, integer ) {
|
2011-01-31 19:33:16 +00:00
|
|
|
if ( !mw.language.digitTransformTable ) {
|
2011-03-10 00:14:36 +00:00
|
|
|
return num;
|
2010-10-26 23:40:26 +00:00
|
|
|
}
|
2010-11-12 23:10:58 +00:00
|
|
|
// Set the target Transform table:
|
2011-01-31 19:33:16 +00:00
|
|
|
var transformTable = mw.language.digitTransformTable;
|
2010-10-27 15:51:31 +00:00
|
|
|
// Check if the "restore" to Latin number flag is set:
|
|
|
|
|
if ( integer ) {
|
2011-03-10 00:14:36 +00:00
|
|
|
if ( parseInt( num, 10 ) == num ) {
|
|
|
|
|
return num;
|
2010-10-26 23:40:26 +00:00
|
|
|
}
|
|
|
|
|
var tmp = [];
|
|
|
|
|
for ( var i in transformTable ) {
|
|
|
|
|
tmp[ transformTable[ i ] ] = i;
|
|
|
|
|
}
|
|
|
|
|
transformTable = tmp;
|
|
|
|
|
}
|
2011-03-10 00:14:36 +00:00
|
|
|
var numberString = '' + num;
|
2010-10-26 23:40:26 +00:00
|
|
|
var convertedNumber = '';
|
|
|
|
|
for ( var i = 0; i < numberString.length; i++ ) {
|
|
|
|
|
if ( transformTable[ numberString[i] ] ) {
|
|
|
|
|
convertedNumber += transformTable[numberString[i]];
|
|
|
|
|
} else {
|
|
|
|
|
convertedNumber += numberString[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-03-17 20:37:32 +00:00
|
|
|
return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
|
2010-10-26 23:40:26 +00:00
|
|
|
},
|
2012-01-02 09:08:23 +00:00
|
|
|
/**
|
|
|
|
|
* Provides an alternative text depending on specified gender.
|
2012-01-02 12:21:34 +00:00
|
|
|
* Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
|
2012-01-02 09:08:23 +00:00
|
|
|
* If second or third parameter are not specified, masculine is used.
|
|
|
|
|
*
|
|
|
|
|
* These details may be overriden per language.
|
|
|
|
|
*
|
2012-01-02 12:21:34 +00:00
|
|
|
* @param gender string male, female, or anything else for neutral.
|
2012-01-02 09:08:23 +00:00
|
|
|
* @param forms array List of gender forms
|
|
|
|
|
*
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
'gender': function( gender, forms ) {
|
2012-01-02 09:21:03 +00:00
|
|
|
if ( !forms || forms.length === 0 ) {
|
2012-01-02 09:08:23 +00:00
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
forms = mw.language.preConvertPlural( forms, 2 );
|
|
|
|
|
if ( gender === 'male' ) {
|
|
|
|
|
return forms[0];
|
|
|
|
|
}
|
|
|
|
|
if ( gender === 'female' ) {
|
|
|
|
|
return forms[1];
|
|
|
|
|
}
|
2012-01-02 09:21:03 +00:00
|
|
|
return ( forms.length === 3 ) ? forms[2] : forms[0];
|
2012-01-02 09:08:23 +00:00
|
|
|
},
|
|
|
|
|
|
2012-04-02 13:01:10 +00:00
|
|
|
/**
|
|
|
|
|
* 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 ) {
|
2012-06-02 15:43:04 +00:00
|
|
|
var grammarForms = language.getData( mw.config.get( 'wgContentLanguage' ), 'grammarForms' );
|
2012-04-02 13:01:10 +00:00
|
|
|
if ( grammarForms && grammarForms[form] ) {
|
|
|
|
|
return grammarForms[form][word] || word;
|
|
|
|
|
}
|
|
|
|
|
return word;
|
|
|
|
|
},
|
|
|
|
|
|
2010-10-26 23:40:26 +00:00
|
|
|
// Digit Transform Table, populated by language classes where applicable
|
|
|
|
|
'digitTransformTable': null
|
|
|
|
|
};
|
2012-04-02 13:01:10 +00:00
|
|
|
|
2012-06-02 15:43:04 +00:00
|
|
|
mw.language = language;
|
2012-04-02 13:01:10 +00:00
|
|
|
|
2011-03-10 00:14:36 +00:00
|
|
|
} )( jQuery, mediaWiki );
|