You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
6.8 KiB
190 lines
6.8 KiB
/** |
|
* In CLDR, there are some special locales with abnormal hierarchy. |
|
* |
|
* E.g.zh-hk.xml is aliased to zh-hant-hk.xml for all the calendar/number/currency data. |
|
* So after CLDR transformation, JSON bundles under zh-hk is totally the same as those under zh-hant-hk. |
|
* Problems will occur when dojo loads zh-hk bundle, as dojo will flatten it with the following sequence: |
|
* Root -> zh -> zh-hk, but the right sequence should be Root -> zh -> zh-hant -> zh-hk(zh-hant-hk) |
|
* so the bundles under zh-hant locale is missing. |
|
* |
|
* This script is used to process all the special locales so that after CLDR transformation, |
|
* zh-hk bundle will be flatted both with zh-hant and zh-hant-hk, nothing will be lost then. |
|
* Please see the following SPECIAL_LOCALES_MAP for detail mapping info. |
|
* |
|
* Note: Here for simplification, we name zh-hk as source locale,and name zh-hant-hk as alias locale. |
|
*/ |
|
|
|
djConfig={baseUrl: "../../../dojo/", paths: {"dojo/_base/xhr": "../util/buildscripts/cldr/xhr"}}; |
|
|
|
load("../../../dojo/dojo.js"); |
|
load("../jslib/logger.js"); |
|
load("../jslib/fileUtil.js"); |
|
load("cldrUtil.js"); |
|
|
|
dojo.require("dojo.i18n"); |
|
|
|
var dir/*String*/ = arguments[0];// ${dojo}/dojo/cldr/nls |
|
|
|
//locales that are generated by ${dojo}/util/buildscripts/cldr/build.xml |
|
var allLocalesStr/*String*/ = arguments[1];//e.g. "ar,ar-eg,en-au,en-ca,en-gb,en-us,de-de,es-es,fr-fr,..." |
|
|
|
var logDir = arguments[2]; |
|
|
|
//related bundles, currently only 'number','currency','gregorian' bundles |
|
//TBD - 'buddhist','chinese','coptic','currency','ethiopic','gregorian','hebrew','islamic','islamic-civil','japanese','persian' |
|
var BUNDLE_MAP = ['number','currency','gregorian']; |
|
|
|
//headers for generated bundle files |
|
var NLS_JSON_HEAD = ['// generated from ldml/main/*.xml, xpath: ldml/numbers\n', |
|
'// generated from ldml/main/*.xml, xpath: ldml/numbers/currencies\n', |
|
'// generated from ldml/main/*.xml, xpath: ldml/calendars/calendar-gregorian\n']; |
|
|
|
var SPECIAL_LOCALES_MAP = { |
|
//Mapping info for some special locales with abnormal hierarchy. |
|
//Currently for CLDR 1.6, will be updated with latest CLDR release. |
|
|
|
'zh-hk':'zh-hant-hk', |
|
'zh-mo':'zh-hant-mo', |
|
'sh':'sr-latn', |
|
'mo':'ro-md', |
|
'pa-pk':'pa-arab-pk',//pa-pk and pa-arab-pk don't exist, but pa-arab exists |
|
'zh-tw':'zh-hant-tw',//zh-tw and zh-hant-tw don't exist, but zh-hant exists |
|
'uz-af':'uz-arab-af',//uz-af and uz-arab-af don't exist, but uz-arab exists |
|
'ha-sd':'ha-arab-sd',//ha-sd and ha-arab-sd don't exist, but ha-arab exists |
|
'ku-tr':'ku-latn-tr' //ku-tr and ku-latn-tr don't exist, but ku-latn exists |
|
|
|
/* The following locales don't have any bundles currently (CLDR 1.6), |
|
* listed here for CLDR future release. |
|
* |
|
'az-az':'az-latn-az', |
|
'ha-gh':'ha-latn-gh', |
|
'ha-ne':'ha-latn-ne', |
|
'ha-ng':'ha-latn-ng', |
|
'kk-kz':'kk-cyrl-kz', |
|
'ku-iq':'ku-latn-iq', |
|
'ku-ir':'ku-latn-ir', |
|
'ku-sy':'ku-latn-sy', |
|
'pa-in':'pa-guru-in', |
|
'sr-cs':'sr-cyrl-cs', |
|
'sr-me':'sr-cyrl-me', |
|
'sr-rs':'sr-cyrl-rs', |
|
'sr-yu':'sr-cyrl-rs', |
|
'uz-uz':'uz-cyrl-uz', |
|
'zh-sg':'zh-hans-sg', |
|
'zh-cn':'zh-hans-cn', |
|
'mn-cn':'mn-mong-cn', |
|
'mn-mn':'mn-cyrl-cn', |
|
'pa-in':'pa-guru-in', |
|
|
|
*/ |
|
|
|
/* Don't need to process the following locale alias |
|
* only listed here for futher comparison |
|
* |
|
//sh is already aliased to sr-latn |
|
'sh-cs':'sr-latn-rs', |
|
'sh-yu':'sr-latn-rs', |
|
'sh-ba':'sr-latn-ba',//sh-ba and sr-latn-ba don't exist, but sr-latn exists |
|
|
|
//has the same parent |
|
'sr-cyrl-cs':'sr-cyrl-rs', |
|
'sr-cyrl-yu':'sr-cyrl-rs', |
|
|
|
'sr-cs':'sr-cyrl-cs', |
|
'sr-me':'sr-cyrl-me', |
|
'sr-rs':'sr-cyrl-rs', |
|
'sr-yu':'sr-cyrl-rs', |
|
'sr-ba':'sr-cyrl-ba',//sr-cyrl is null |
|
'tg-tj':'tg-cyrl-tj',//tg-cyrl is null |
|
'ug-cn':'ug-arab-cn',//ug-arab is null |
|
'uz-uz':'uz-cyrl-uz',//uz-cyrl is null |
|
'zh-cn':'zh-hans-cn',//zh-hans is null |
|
'zh-sg':'zh-hans-sg',//zh-hans is null |
|
*/ |
|
}; |
|
|
|
print('specialLocale.js...'); |
|
|
|
var srcLocaleList = [];//source locale file paths |
|
for(x in SPECIAL_LOCALES_MAP){ |
|
if(allLocalesStr == '${locales}' //no $locales parameter,all locales required |
|
|| (allLocalesStr && 0 <= allLocalesStr.indexOf(x))){ |
|
//only if this locale is required |
|
srcLocaleList.push(dir + '/' + x); |
|
} |
|
} |
|
|
|
/* |
|
* Get and compare the flattened bundles(using dojo.i18n) of each source locale and its alias |
|
* Copy those bundles that alias has but source locale doesn't to source locale, |
|
* and also update new items in source locale bundle |
|
*/ |
|
var logStr = ""; |
|
for(var i= 0; i < srcLocaleList.length; i++){ |
|
var srcLocalePath = srcLocaleList[i];//source locale path |
|
var srcPathSegments = srcLocalePath.split("/"); |
|
var srcLocale = srcPathSegments[srcPathSegments.length - 1]; |
|
var aliasLocale = SPECIAL_LOCALES_MAP[srcLocale]; |
|
|
|
//iterate each bundle |
|
for(var len = 0; len < BUNDLE_MAP.length; len++){ |
|
try{ |
|
//declare bundles |
|
// dojo.i18n._requireLocalization('dojo.cldr', BUNDLE_MAP[len], srcLocale); |
|
// dojo.i18n._requireLocalization('dojo.cldr', BUNDLE_MAP[len], aliasLocale); |
|
|
|
//get bundles |
|
var srcBundle = dojo.i18n.getLocalization('dojo.cldr', BUNDLE_MAP[len], srcLocale); |
|
var aliasBundle = dojo.i18n.getLocalization('dojo.cldr', BUNDLE_MAP[len], aliasLocale); |
|
}catch(e){/* logStr+="specialLocale: an exception occurred: "+e; /* it's ok if no bundle found*/} |
|
|
|
if(!aliasBundle && !srcBundle){ |
|
break; |
|
}else if(!aliasBundle && srcBundle){ |
|
//should be an error case |
|
//logStr += 'specialLocale.js error: source locale has more bundles than alias locale\n'; |
|
break; |
|
}else if(aliasBundle && !srcBundle){ |
|
//add the new bundle to source locale |
|
validateDir(srcLocalePath); |
|
fileUtil.saveUtf8File(srcLocalePath + '/' + BUNDLE_MAP[len] + '.js', NLS_JSON_HEAD[len] + '(' + dojo.toJson(aliasBundle, true) + ')'); |
|
//logStr += "specialLocale.js : copied " + BUNDLE_MAP[len] + '.js to ' + srcLocalePath + '\n'; |
|
}else if(aliasBundle && srcBundle){ |
|
var isUpdated = false; |
|
//get native bundle whose content is not flattened |
|
try{ |
|
var nativeSrcBundle = getNativeBundle(srcLocalePath + '/' + BUNDLE_MAP[len] + '.js'); |
|
}catch(e){ |
|
//if no nativeSrcBundle |
|
nativeSrcBundle = {}; |
|
} |
|
|
|
for(p in aliasBundle){ |
|
if(!isLocaleAliasSrc(p, aliasBundle) // p is not the source of a 'locale' alias mapping |
|
&& (!srcBundle[p] || !compare(srcBundle[p], aliasBundle[p]))){ |
|
//inherit |
|
nativeSrcBundle[p] = aliasBundle[p]; |
|
//logStr += "copied " + p + "=" + aliasBundle[p] + "\n"; |
|
isUpdated = true; |
|
} |
|
} |
|
|
|
if(isUpdated){ |
|
validateDir(srcLocalePath); |
|
fileUtil.saveUtf8File(srcLocalePath + '/' + BUNDLE_MAP[len] + '.js', NLS_JSON_HEAD[len] + '(' + dojo.toJson(nativeSrcBundle, true) + ')'); |
|
//logStr += 'specialLocale.js : updated ' + BUNDLE_MAP[len] + '.js in ' + srcLocalePath + '\n'; |
|
} |
|
} |
|
} |
|
} |
|
|
|
//fileUtil.saveUtf8File(logDir + '/specialLocale.log',logStr+'\n'); |
|
|
|
function validateDir(/*String*/dirPath){ |
|
// summary: |
|
// make sure the dir exists |
|
var dir = new java.io.File(dirPath); |
|
if(!dir.exists()){ |
|
dir.mkdir(); |
|
} |
|
} |