wikimedia/mediawiki-extensions-MobileFrontend

View on GitHub
src/mobile.startup/LanguageInfo.js

Summary

Maintainability
A
0 mins
Test Coverage
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;