128 lines
4.5 KiB
JavaScript
128 lines
4.5 KiB
JavaScript
|
/**
|
||
|
* The CLDR represents some lists, like month names, as separate entries, and our JSON uses arrays to express them.
|
||
|
* For some variants, the best our XSLT can do is translate this to a sparse array with 'undefined' entries.
|
||
|
* These entries need to be picked up from the parent locale(s) and copied into the array as necessary(only when the item
|
||
|
* is not the source of a locale alias mapping, like 'months-format-abbr' should be ignored if it is the source of
|
||
|
* locale alias mapping like 'months-format-abbr@localeAlias' :{'target':"months-format-wide",'bundle':"gregorian"}).
|
||
|
* So, this script is responsible for taking all the generated JSON files, and for values which are of type
|
||
|
* array and not the source of locale alias mapping, mixing in the parent values with the undefined ones, recursing
|
||
|
* all the way to the 'root' locale,and replacing the contents of the file.
|
||
|
*
|
||
|
* this script traverses all locales dir in the given root dir
|
||
|
*
|
||
|
* E.g.(Just for example, the contents are not applicable)
|
||
|
* parent locale - "en":
|
||
|
* // generated from ldml/main/ *.xml, xpath: ldml/calendars/calendar-ethiopic
|
||
|
* ({
|
||
|
* 'months-format-abbr':["1","2","3","4","5","6","7","8","9","10","11","12"],
|
||
|
* 'dateFormat-long': "yyyy MMMM d",
|
||
|
* 'dateTimeFormat': "{1} {0}"
|
||
|
* })
|
||
|
*
|
||
|
* child locale - "en-us":
|
||
|
* // generated from ldml/main/ *.xml, xpath: ldml/calendars/calendar-ethiopic
|
||
|
* ({
|
||
|
* 'months-format-abbr':[undefined,undefined,"March",undefined,undefined,"June"],
|
||
|
* 'dateFormat-long': "yyyy-MMMM-d"
|
||
|
* })
|
||
|
*
|
||
|
* After process, the result will be:
|
||
|
* child locale - "en-us":
|
||
|
* // generated from ldml/main/ *.xml, xpath: ldml/calendars/calendar-ethiopic
|
||
|
* ({
|
||
|
* 'months-format-abbr':["1","2","March","4","5","June","7","8","9","10","11","12"],
|
||
|
* 'dateFormat-long': "yyyy-MMMM-d"
|
||
|
* })
|
||
|
*/
|
||
|
|
||
|
djConfig={baseUrl: "../../../dojo/"};
|
||
|
|
||
|
load("../../../dojo/dojo.js");
|
||
|
load("../jslib/logger.js");
|
||
|
load("../jslib/fileUtil.js");
|
||
|
load("../jslib/buildUtil.js");
|
||
|
load("cldrUtil.js");
|
||
|
|
||
|
dojo.require("dojo.i18n");
|
||
|
|
||
|
var dir = arguments[0];
|
||
|
var logDir = arguments[1];
|
||
|
var logStr = "";
|
||
|
|
||
|
print('arrayInherit.js...');
|
||
|
|
||
|
// limit search to gregorian.js files, which are the only ones to use Array as data type
|
||
|
var fileList = fileUtil.getFilteredFileList(dir, /\/gregorian\.js$/, true);
|
||
|
|
||
|
for(var i= 0; i < fileList.length; i++){
|
||
|
//Use new String so we get a JS string and not a Java string.
|
||
|
var jsFileName = new String(fileList[i]);
|
||
|
var data = null;
|
||
|
var jsPath = jsFileName.split("/");
|
||
|
var localeIndex = jsPath.length-2;
|
||
|
var locale = jsPath[localeIndex];
|
||
|
if(locale=="nls"){continue;} // don't run on ROOT resource
|
||
|
var hasChanged = false;
|
||
|
|
||
|
try{
|
||
|
dojo.i18n._requireLocalization('dojo.cldr', 'gregorian', locale);
|
||
|
var bundle = dojo.i18n.getLocalization('dojo.cldr', 'gregorian', locale); //flattened bundle
|
||
|
}catch(e){print(e);/* simply ignore if no bundle found*/}
|
||
|
|
||
|
dojo.i18n._searchLocalePath(locale, true, function(variant){
|
||
|
var isComplete = false;
|
||
|
var path = jsPath;
|
||
|
if(variant=="ROOT"){
|
||
|
path = path.slice(0, localeIndex);
|
||
|
path.push(jsPath[localeIndex+1]);
|
||
|
}else{
|
||
|
path[localeIndex] = variant;
|
||
|
}
|
||
|
var contents;
|
||
|
try{
|
||
|
contents = new String(readFile(path.join("/"), "utf-8"));
|
||
|
}catch(e){
|
||
|
print(e); //TODO: should we be catching this?
|
||
|
return false;
|
||
|
}
|
||
|
var variantData = dojo.fromJson(contents);
|
||
|
if(!data){
|
||
|
data = variantData;
|
||
|
}else{
|
||
|
isComplete = true;
|
||
|
//logStr += locale + "===============================================\n";
|
||
|
for(prop in data){
|
||
|
if(dojo.isArray(data[prop])){
|
||
|
//ignore if the property is an alias source, for alias.js and specialLocale.js
|
||
|
if(isLocaleAliasSrc(prop, bundle)){
|
||
|
//logStr += prop + " is alias, ignored\n";
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
var variantArray = variantData[prop];
|
||
|
dojo.forEach(data[prop], function(element, index, list){
|
||
|
if(element === undefined && dojo.isArray(variantArray)){
|
||
|
list[index] = variantArray[index];
|
||
|
//logStr += prop + "[" + index + "] undefined, is replaced with " + list[index] + "\n";
|
||
|
hasChanged = true;
|
||
|
if(!("index" in list)){
|
||
|
isComplete = false;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
if(dojo.isArray(variantArray) && variantArray.length > data[prop].length){
|
||
|
data[prop] = data[prop].concat(variantArray.slice(data[prop].length));
|
||
|
hasChanged = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//logStr += "\n";
|
||
|
}
|
||
|
return isComplete;
|
||
|
});
|
||
|
if(hasChanged){
|
||
|
fileUtil.saveUtf8File(jsFileName, "(" + dojo.toJson(data, true) + ")");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//fileUtil.saveUtf8File(logDir + '/arrayInherit.log',logStr+'\n');
|