Skip to content

Commit a9cc7c5

Browse files
clmathJCEmmons
authored andcommitted
Add the possibility to build the cldr data to have only one file per
locale to download.
1 parent e24559d commit a9cc7c5

File tree

6 files changed

+85
-20
lines changed

6 files changed

+85
-20
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ for number formatting ( Intl.NumberFormat ) and date and time formatting ( Intl.
55
Collation ( Intl.Collator ) is not currently supported.
66

77
## Status
8-
No official release yet. Relatively stable development release at 0.2.0-dev.
8+
No official release yet. Relatively stable development release at 0.2.1-dev.
99

1010
## Licensing
1111

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ecma402",
3-
"version": "0.2.0-dev",
3+
"version": "0.2.1-dev",
44
"dependencies": {
55
"requirejs": ">=2.1.14",
66
"requirejs-text": ">=2.0.12",

impl/common.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ define(["./List", "./Record",
254254
*/
255255
DefaultLocale : function () {
256256
var result;
257+
var global = (function () {return this; })();
258+
var navigator = global.navigator;
257259
if (navigator && this.isStructurallyValidLanguageTag(navigator.language)) {
258260
result = this.BestFitAvailableLocale(this.availableLocalesList, this
259261
.CanonicalizeLanguageTag(navigator.language));

impl/load.js

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ define([
77
"./calendars",
88
"./common",
99
"require",
10+
"module",
1011
"requirejs-text/text" // just so builder knows we will be using that module
11-
], function (calendars, common, require) {
12+
], function (calendars, common, require, module) {
1213
return {
13-
load: function (locale, callerRequire, onload) {
14+
id: module.id,
15+
16+
load: function (locale, callerRequire, onload, loaderConfig) {
1417
// Compute dependencies to require().
1518
// For specified locale, load JSON files for its "currencies", "numbers" data.
1619
var jsonElements = ["currencies", "numbers"];
@@ -19,36 +22,53 @@ define([
1922
var supportedCalendars = common._getSupportedCalendars(region);
2023
supportedCalendars.forEach(function (calendar) {
2124
var calendarName = "ca-" + (calendar === "gregory" ? "gregorian" : calendar);
22-
if (jsonElements.indexOf(calendarName) === -1) {
23-
jsonElements.push(calendarName);
24-
}
25+
// Add json data
26+
jsonElements.push(calendarName);
27+
// Add calendar module
2528
if (calendar !== "gregory") {
2629
calendarsToLoad.push(calendar);
2730
}
2831
});
2932

30-
var dependencies = jsonElements.map(function (element) {
31-
return "requirejs-text/text!../cldr/" + locale + "/" + element + ".json";
32-
});
33+
var dependencies;
34+
35+
// Check if there is a layer
36+
var config = module.config();
37+
if (config[locale]) {
38+
dependencies = jsonElements = [config._layerMid + "_" + locale];
39+
} else {
40+
dependencies = jsonElements.map(function (element) {
41+
return "requirejs-text/text!../cldr/" + locale + "/" + element + ".json";
42+
});
43+
}
3344

3445
var calendarDependencies = calendarsToLoad.map(function (calendar) {
3546
return "../calendars/" + calendars.dependencies[calendar].calendar;
3647
});
3748

38-
calendarDependencies.forEach(function (dep) {
39-
dependencies.push(dep);
40-
});
49+
dependencies = dependencies.concat(calendarDependencies);
4150

4251
// Load all the JSON files requested, and any non-gregorian calendars
43-
// that are required. Return the locale data in a hash
52+
// that are required. Return the locale data in a hash
4453
require(dependencies, function () {
4554
var dataAsArray = arguments, dataAsHash = {};
4655
jsonElements.forEach(function (element, idx) {
47-
dataAsHash[element] = JSON.parse(dataAsArray[idx]);
56+
if (config[locale]) {
57+
dataAsHash = dataAsArray[0];
58+
} else {
59+
dataAsHash[element] = JSON.parse(dataAsArray[idx]);
60+
}
4861
});
4962
calendarsToLoad.forEach(function (cal, idx) {
5063
calendars.calendarMap[cal] = dataAsArray[idx + jsonElements.length];
5164
});
65+
66+
if (loaderConfig.isBuild) {
67+
dataAsHash.calendars = calendarsToLoad.map(function (calendar) {
68+
return calendars.dependencies[calendar].calendar;
69+
});
70+
}
71+
5272
onload(dataAsHash);
5373
});
5474
}

locales.js

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ define([
1111
"module",
1212
"require",
1313
"./impl/common",
14-
"./impl/load" // just so builder knows we will be using that module
15-
], function (module, require, common) {
14+
"./impl/load"
15+
], function (module, require, common, loadCss) {
16+
// Build variable
17+
var writeFile;
18+
1619
// Compute locales to pre-load. Use hash to remove duplicates.
1720
var localeHash = {};
1821
localeHash.root = true;
@@ -38,20 +41,60 @@ define([
3841
}
3942
}
4043
var locales = Object.keys(localeHash);
44+
var localeDataHash = {};
4145

4246
// Compute dependencies to require()
43-
var dependencies = locales.map(function (locale) { return "./impl/load!" + locale; });
47+
function getDependency(locale) {
48+
return loadCss.id + "!" + locale;
49+
}
4450

4551
return {
4652
load: function (path, callerRequire, onload) {
53+
var dependencies = locales.map(getDependency);
4754
// Load the locale data for every requested locale, and then return it in a hash
4855
require(dependencies, function () {
49-
var localeDataArray = arguments, localeDataHash = {};
56+
var localeDataArray = arguments;
5057
locales.forEach(function (locale, idx) {
5158
localeDataHash[locale] = localeDataArray[idx];
5259
});
5360
onload(localeDataHash);
5461
});
62+
},
63+
64+
writeFile: function (pluginName, resource, callerRequire, write) {
65+
writeFile = write;
66+
},
67+
68+
addModules: function (pluginName, resource, addModules) {
69+
var modulesToAdd = [];
70+
locales.forEach(function (locale) {
71+
var localeData = localeDataHash[locale];
72+
var calendarsDeps = localeData.calendars.map(function (cal) {return "./calendars/" + cal; });
73+
modulesToAdd = modulesToAdd.concat(calendarsDeps);
74+
delete localeData.calendars;
75+
});
76+
addModules(modulesToAdd);
77+
},
78+
79+
onLayerEnd: function (write, data) {
80+
// Calculate layer path
81+
var match = data.path.match(/^(.*\/)?(.*)\.js$/);
82+
var partialLayerPath = (match[1] || "") + "cldr/" + match[2] + "_";
83+
84+
// Calculate layer mid
85+
match = data.name.match(/^(.*\/)?(.*)$/);
86+
var layerMid = (match[1] || "") + "cldr/" + match[2];
87+
88+
locales.forEach(function (locale) {
89+
var path = partialLayerPath + locale + ".js";
90+
writeFile(path, "define(" + JSON.stringify(localeDataHash[locale]) + ")");
91+
});
92+
93+
localeHash._layerMid = layerMid;
94+
write("require.config({config:{'" + loadCss.id + "':" + JSON.stringify(localeHash) + "}});");
95+
96+
// Reset
97+
localeDataHash = {};
5598
}
5699
};
57100
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ecma402",
3-
"version": "0.2.0-dev",
3+
"version": "0.2.1-dev",
44
"dependencies": {
55
"requirejs": ">=2.1.14",
66
"requirejs-dplugins": ">=0.2.2-dev"

0 commit comments

Comments
 (0)