##// END OF EJS Templates
fixed NlsBundle locale package loading...
fixed NlsBundle locale package loading corrected DjxFragment params and return value fixed regression in DjxWidgetBase attach points processing fixed empty RenditionBase startup

File last commit:

r112:2ccfaae984e9 v1.4.4 default
r112:2ccfaae984e9 v1.4.4 default
Show More
NlsBundle.ts
60 lines | 1.9 KiB | video/mp2t | TypeScriptLexer
cin
Converted to subproject djx, removed dojo-typings
r65 import { MapOf, PromiseOrValue } from "@implab/core-amd/interfaces";
import { argumentNotEmptyString, isPromise, mixin } from "@implab/core-amd/safe";
export type LocaleProvider<T> = () => PromiseOrValue<T | { default: T }>;
function when<T, T2>(value: PromiseOrValue<T>, cb: (v: T) => PromiseOrValue<T2>): PromiseOrValue<T2> {
return isPromise(value) ?
value.then(cb) :
cb(value);
}
cin
fixed NlsBundle locale package loading...
r112 const loadPackage = <T extends object>(localeData: LocaleProvider<Partial<T>> | undefined) =>
localeData ?
when(localeData(), data => data && "default" in data ? data.default : data) :
undefined;
const chainObjects = <T extends object>(o1: T, o2: Partial<T> | undefined): T =>
o2 ? mixin(Object.create(o1) as T, o2) : o1;
cin
linting
r109 export class NlsBundle<T extends object> {
private readonly _locales: MapOf<LocaleProvider<Partial<T>>>;
cin
Converted to subproject djx, removed dojo-typings
r65
cin
linting
r109 private readonly _default: T;
cin
Converted to subproject djx, removed dojo-typings
r65
private _cache: MapOf<PromiseOrValue<T>>;
constructor(defNls: T, locales?: MapOf<LocaleProvider<Partial<T>>>) {
this._default = defNls;
this._locales = locales || {};
this._cache = {};
}
getLocale(locale: string) {
argumentNotEmptyString(locale, "locale");
const _loc = locale;
// en-US => ["en", "en-US"]
const locales = _loc.split(/-|_/).map((x, i, a) => a.slice(0, i + 1).join("-"));
return this._resolveLocale(locales);
}
_resolveLocale(locales: string[]): PromiseOrValue<T> {
if (!locales.length)
return this._default;
const locale = locales.pop();
if (!locale)
throw new Error("The locale can't be empty");
if (this._cache[locale])
return this._cache[locale];
cin
fixed NlsBundle locale package loading...
r112 const data = loadPackage(this._locales[locale]);
cin
Converted to subproject djx, removed dojo-typings
r65 const parent = this._resolveLocale(locales);
return this._cache[locale] = when(data, x => {
return when(parent, y => this._cache[locale] = chainObjects(y, x));
});
}
}