Version 3.18.1
Show:

File: yui/js/intl-base.js

            /**
             * The Intl utility provides a central location for managing sets of
             * localized resources (strings and formatting patterns).
             *
             * @class Intl
             * @uses EventTarget
             * @static
             */
            
            var SPLIT_REGEX = /[, ]/;
            
            Y.mix(Y.namespace('Intl'), {
            
             /**
                * Returns the language among those available that
                * best matches the preferred language list, using the Lookup
                * algorithm of BCP 47.
                * If none of the available languages meets the user's preferences,
                * then "" is returned.
                * Extended language ranges are not supported.
                *
                * @method lookupBestLang
                * @param {String[] | String} preferredLanguages The list of preferred
                * languages in descending preference order, represented as BCP 47
                * language tags. A string array or a comma-separated list.
                * @param {String[]} availableLanguages The list of languages
                * that the application supports, represented as BCP 47 language
                * tags.
                *
                * @return {String} The available language that best matches the
                * preferred language list, or "".
                * @since 3.1.0
                */
                lookupBestLang: function(preferredLanguages, availableLanguages) {
            
                    var i, language, result, index;
            
                    // check whether the list of available languages contains language;
                    // if so return it
                    function scan(language) {
                        var i;
                        for (i = 0; i < availableLanguages.length; i += 1) {
                            if (language.toLowerCase() ===
                                        availableLanguages[i].toLowerCase()) {
                                return availableLanguages[i];
                            }
                        }
                    }
            
                    if (Y.Lang.isString(preferredLanguages)) {
                        preferredLanguages = preferredLanguages.split(SPLIT_REGEX);
                    }
            
                    for (i = 0; i < preferredLanguages.length; i += 1) {
                        language = preferredLanguages[i];
                        if (!language || language === '*') {
                            continue;
                        }
                        // check the fallback sequence for one language
                        while (language.length > 0) {
                            result = scan(language);
                            if (result) {
                                return result;
                            } else {
                                index = language.lastIndexOf('-');
                                if (index >= 0) {
                                    language = language.substring(0, index);
                                    // one-character subtags get cut along with the
                                    // following subtag
                                    if (index >= 2 && language.charAt(index - 2) === '-') {
                                        language = language.substring(0, index - 2);
                                    }
                                } else {
                                    // nothing available for this language
                                    break;
                                }
                            }
                        }
                    }
            
                    return '';
                }
            });