Remove duplication of Langauge digitTransformTable in javascript.
[lhc/web/wiklou.git] / resources / mediawiki.language / mediawiki.language.js
1 /**
2 * Localized Language support attempts to mirror some of the functionality of
3 * Language.php in MediaWiki.
4 * This adds methods for transforming message text.
5 */
6 ( function( $, mw ) {
7
8 var language = {
9
10 /**
11 * Process the PLURAL template substitution
12 *
13 * @param {object} template Template object
14 * @format template
15 * {
16 * 'title': [title of template],
17 * 'parameters': [template parameters]
18 * }
19 * @example {{Template:title|params}}
20 */
21 'procPLURAL': function( template ) {
22 if ( template.title && template.parameters && mw.language.convertPlural ) {
23 // Check if we have forms to replace
24 if ( template.parameters.length === 0 ) {
25 return '';
26 }
27 // Restore the count into a Number ( if it got converted earlier )
28 var count = mw.language.convertNumber( template.title, true );
29 // Do convertPlural call
30 return mw.language.convertPlural( parseInt( count, 10 ), template.parameters );
31 }
32 // Could not process plural return first form or nothing
33 if ( template.parameters[0] ) {
34 return template.parameters[0];
35 }
36 return '';
37 },
38 /**
39 * Plural form transformations, needed for some languages.
40 *
41 * @param count integer Non-localized quantifier
42 * @param forms array List of plural forms
43 * @return string Correct form for quantifier in this language
44 */
45 'convertPlural': function( count, forms ){
46 if ( !forms || forms.length === 0 ) {
47 return '';
48 }
49 return ( parseInt( count, 10 ) == 1 ) ? forms[0] : forms[1];
50 },
51 /**
52 * Pads an array to a specific length by copying the last one element.
53 *
54 * @param forms array Number of forms given to convertPlural
55 * @param count integer Number of forms required
56 * @return array Padded array of forms
57 */
58 'preConvertPlural': function( forms, count ) {
59 while ( forms.length < count ) {
60 forms.push( forms[ forms.length-1 ] );
61 }
62 return forms;
63 },
64 /**
65 * Converts a number using digitTransformTable.
66 *
67 * @param {num} number Value to be converted
68 * @param {boolean} integer Convert the return value to an integer
69 */
70 'convertNumber': function( num, integer ) {
71 if ( !mw.language.digitTransformTable ) {
72 return num;
73 }
74 // Set the target Transform table:
75 var transformTable = mw.language.digitTransformTable;
76 // Check if the "restore" to Latin number flag is set:
77 if ( integer ) {
78 if ( parseInt( num, 10 ) == num ) {
79 return num;
80 }
81 var tmp = [];
82 for ( var i in transformTable ) {
83 tmp[ transformTable[ i ] ] = i;
84 }
85 transformTable = tmp;
86 }
87 var numberString = '' + num;
88 var convertedNumber = '';
89 for ( var i = 0; i < numberString.length; i++ ) {
90 if ( transformTable[ numberString[i] ] ) {
91 convertedNumber += transformTable[numberString[i]];
92 } else {
93 convertedNumber += numberString[i];
94 }
95 }
96 return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
97 },
98 /**
99 * Provides an alternative text depending on specified gender.
100 * Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
101 * If second or third parameter are not specified, masculine is used.
102 *
103 * These details may be overriden per language.
104 *
105 * @param gender string male, female, or anything else for neutral.
106 * @param forms array List of gender forms
107 *
108 * @return string
109 */
110 'gender': function( gender, forms ) {
111 if ( !forms || forms.length === 0 ) {
112 return '';
113 }
114 forms = mw.language.preConvertPlural( forms, 2 );
115 if ( gender === 'male' ) {
116 return forms[0];
117 }
118 if ( gender === 'female' ) {
119 return forms[1];
120 }
121 return ( forms.length === 3 ) ? forms[2] : forms[0];
122 },
123
124 /**
125 * Grammatical transformations, needed for inflected languages.
126 * Invoked by putting {{grammar:form|word}} in a message.
127 * The rules can be defined in $wgGrammarForms global or grammar
128 * forms can be computed dynamically by overriding this method per language
129 *
130 * @param word {String}
131 * @param form {String}
132 * @return {String}
133 */
134 convertGrammar: function ( word, form ) {
135 var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
136 if ( grammarForms && grammarForms[form] ) {
137 return grammarForms[form][word] || word;
138 }
139 return word;
140 },
141
142 // Digit Transform Table, populated by language classes where applicable
143 'digitTransformTable': mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' )
144 };
145
146 $.extend( mw.language, language );
147
148 } )( jQuery, mediaWiki );