src/mobile.startup/LanguageInfo.js
const util = require( './util.js' ),
actionParams = require( './actionParams' );
/**
* API for providing language data.
*
* @class module:mobile.startup/languages~LanguageInfo
* @param {mw.Api} api
*/
function LanguageInfo( api ) {
this.api = api;
}
LanguageInfo.prototype = {
/**
* Get languageinfo API data from the local wiki, and transform it into a
* format usable by LanguageSearcher.
*
* @memberof module:mobile.startup/languages~LanguageInfo
* @instance
* @returns {jQuery.Deferred}
*/
getLanguages() {
return this.api.get( actionParams( {
meta: 'languageinfo',
liprop: 'code|autonym|name|bcp47'
} ) ).then( ( resp ) => {
const filteredLanguages = [];
// Filter out legacy languages and require an autonym.
// If the bcp47 (https://w.wiki/Y7A) does not match the language
// code, that is in an indication that the language code is outdated
// and should not be used.
Object.keys( resp.query.languageinfo ).forEach( ( key ) => {
const language = resp.query.languageinfo[key];
if ( ( language.code.toLowerCase() === language.bcp47.toLowerCase() ) &&
language.autonym ) {
filteredLanguages.push( language );
}
} );
return filteredLanguages;
}, () => util.Deferred().reject() ).then( ( filteredLanguages ) => ( {
languages: filteredLanguages.map( ( data ) => {
data.url = '#';
data.lang = data.code;
data.langname = data.name;
// FIXME: This isn't a "title" in the sense of a MediaWiki
// Title, and it is rendered as a subheader in the list
// item, so a different name would be wiser, both here and
// in LanguageSearcher's template. Also it would arguably
// be more intuitive for the language name (localized) to
// appear as the main emphasized element of each language
// list element; but instead the autonym has that role.
// A more thorough refactoring of LanguageSearcher to allow
// for generic header/subheader elements is left for a
// follow-up.
data.title = data.name;
return data;
} )
} ), () => util.Deferred().reject() );
}
};
module.exports = LanguageInfo;