summaryrefslogtreecommitdiff
path: root/resources/src/mediawiki.language/mediawiki.language.js
blob: 78e391910eb0e5371d2ca9efb4c5b3e841fab814 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 * Methods for transforming message syntax.
 */
( function ( mw, $ ) {

/**
 * @class mw.language
 */
$.extend( mw.language, {

	/**
	 * Process the PLURAL template substitution
	 *
	 * @private
	 * @param {Object} template Template object
	 * @param {string} template.title
	 * @param {Array} template.parameters
	 * @return {string}
	 */
	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
		if ( template.parameters[0] ) {
			return template.parameters[0];
		}
		return '';
	},

	/**
	 * Plural form transformations, needed for some languages.
	 *
	 * @param {number} count Non-localized quantifier
	 * @param {Array} forms List of plural forms
	 * @param {Object} [explicitPluralForms] List of explicit plural forms
	 * @return {string} Correct form for quantifier in this language
	 */
	convertPlural: function ( count, forms, explicitPluralForms ) {
		var pluralRules,
			pluralFormIndex = 0;

		if ( explicitPluralForms && explicitPluralForms[count] ) {
			return explicitPluralForms[count];
		}

		if ( !forms || forms.length === 0 ) {
			return '';
		}

		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.
	 *
	 * @private
	 * @param {Array} forms Number of forms given to convertPlural
	 * @param {number} 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;
	},

	/**
	 * Provides an alternative text depending on specified gender.
	 *
	 * Usage in message text: `{{gender:[gender|user object]|masculine|feminine|neutral}}`.
	 * If second or third parameter are not specified, masculine is used.
	 *
	 * These details may be overridden per language.
	 *
	 * @param {string} gender 'male', 'female', or anything else for neutral.
	 * @param {Array} forms List of gender forms
	 * @return string
	 */
	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 computed
	 * dynamically by overriding this method per language.
	 *
	 * @param {string} word
	 * @param {string} form
	 * @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;
	},

	/**
	 * Turn a list of string into a simple list using commas and 'and'.
	 *
	 * See Language::listToText in languages/Language.php
	 *
	 * @param {string[]} list
	 * @return {string}
	 */
	listToText: function ( list ) {
		var text = '',
			i = 0;

		for ( ; i < list.length; i++ ) {
			text += list[i];
			if ( list.length - 2 === i ) {
				text += mw.msg( 'and' ) + mw.msg( 'word-separator' );
			} else if ( list.length - 1 !== i ) {
				text += mw.msg( 'comma-separator' );
			}
		}
		return text;
	},

	setSpecialCharacters: function ( data ) {
		this.specialCharacters = data;
	}
} );

}( mediaWiki, jQuery ) );