| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | /** * @license RequireJS i18n 2.0.4 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/requirejs/i18n for details *//*jslint regexp: true *//*global require: false, navigator: false, define: false *//** * This plugin handles i18n! prefixed modules. It does the following: * * 1) A regular module can have a dependency on an i18n bundle, but the regular * module does not want to specify what locale to load. So it just specifies * the top-level bundle, like "i18n!nls/colors". * * This plugin will load the i18n bundle at nls/colors, see that it is a root/master * bundle since it does not have a locale in its name. It will then try to find * the best match locale available in that master bundle, then request all the * locale pieces for that best match locale. For instance, if the locale is "en-us", * then the plugin will ask for the "en-us", "en" and "root" bundles to be loaded * (but only if they are specified on the master bundle). * * Once all the bundles for the locale pieces load, then it mixes in all those * locale pieces into each other, then finally sets the context.defined value * for the nls/colors bundle to be that mixed in locale. * * 2) A regular module specifies a specific locale to load. For instance, * i18n!nls/fr-fr/colors. In this case, the plugin needs to load the master bundle * first, at nls/colors, then figure out what the best match locale is for fr-fr, * since maybe only fr or just root is defined for that locale. Once that best * fit is found, all of its locale pieces need to have their bundles loaded. * * Once all the bundles for the locale pieces load, then it mixes in all those * locale pieces into each other, then finally sets the context.defined value * for the nls/fr-fr/colors bundle to be that mixed in locale. */(function () {    'use strict';    //regexp for reconstructing the master bundle name from parts of the regexp match    //nlsRegExp.exec("foo/bar/baz/nls/en-ca/foo") gives:    //["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"]    //nlsRegExp.exec("foo/bar/baz/nls/foo") gives:    //["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""]    //so, if match[5] is blank, it means this is the top bundle definition.    var nlsRegExp = /(^.*(^|\/)nls(\/|$))([^\/]*)\/?([^\/]*)/;    //Helper function to avoid repeating code. Lots of arguments in the    //desire to stay functional and support RequireJS contexts without having    //to know about the RequireJS contexts.    function addPart(locale, master, needed, toLoad, prefix, suffix) {        if (master[locale]) {            needed.push(locale);            if (master[locale] === true || master[locale] === 1) {                toLoad.push(prefix + locale + '/' + suffix);            }        }    }    function addIfExists(req, locale, toLoad, prefix, suffix) {        var fullName = prefix + locale + '/' + suffix;        if (require._fileExists(req.toUrl(fullName + '.js'))) {            toLoad.push(fullName);        }    }    /**     * Simple function to mix in properties from source into target,     * but only if target does not already have a property of the same name.     * This is not robust in IE for transferring methods that match     * Object.prototype names, but the uses of mixin here seem unlikely to     * trigger a problem related to that.     */    function mixin(target, source, force) {        var prop;        for (prop in source) {            if (source.hasOwnProperty(prop) && (!target.hasOwnProperty(prop) || force)) {                target[prop] = source[prop];            } else if (typeof source[prop] === 'object') {                if (!target[prop] && source[prop]) {                    target[prop] = {};                }                mixin(target[prop], source[prop], force);            }        }    }    define(['module'], function (module) {        var masterConfig = module.config ? module.config() : {};        return {            version: '2.0.4',            /**             * Called when a dependency needs to be loaded.             */            load: function (name, req, onLoad, config) {                config = config || {};                if (config.locale) {                    masterConfig.locale = config.locale;                }                var masterName,                    match = nlsRegExp.exec(name),                    prefix = match[1],                    locale = match[4],                    suffix = match[5],                    parts = locale.split("-"),                    toLoad = [],                    value = {},                    i, part, current = "";                //If match[5] is blank, it means this is the top bundle definition,                //so it does not have to be handled. Locale-specific requests                //will have a match[4] value but no match[5]                if (match[5]) {                    //locale-specific bundle                    prefix = match[1];                    masterName = prefix + suffix;                } else {                    //Top-level bundle.                    masterName = name;                    suffix = match[4];                    locale = masterConfig.locale;                    if (!locale) {                        locale = masterConfig.locale =                            typeof navigator === "undefined" ? "root" :                            (navigator.language ||                             navigator.userLanguage || "root").toLowerCase();                    }                    parts = locale.split("-");                }                if (config.isBuild) {                    //Check for existence of all locale possible files and                    //require them if exist.                    toLoad.push(masterName);                    addIfExists(req, "root", toLoad, prefix, suffix);                    for (i = 0; i < parts.length; i++) {                        part = parts[i];                        current += (current ? "-" : "") + part;                        addIfExists(req, current, toLoad, prefix, suffix);                    }                    req(toLoad, function () {                        onLoad();                    });                } else {                    //First, fetch the master bundle, it knows what locales are available.                    req([masterName], function (master) {                        //Figure out the best fit                        var needed = [],                            part;                        //Always allow for root, then do the rest of the locale parts.                        addPart("root", master, needed, toLoad, prefix, suffix);                        for (i = 0; i < parts.length; i++) {                            part = parts[i];                            current += (current ? "-" : "") + part;                            addPart(current, master, needed, toLoad, prefix, suffix);                        }                        //Load all the parts missing.                        req(toLoad, function () {                            var i, partBundle, part;                            for (i = needed.length - 1; i > -1 && needed[i]; i--) {                                part = needed[i];                                partBundle = master[part];                                if (partBundle === true || partBundle === 1) {                                    partBundle = req(prefix + part + '/' + suffix);                                }                                mixin(value, partBundle);                            }                            //All done, notify the loader.                            onLoad(value);                        });                    });                }            }        };    });}());
 |