Browse Source

Merge pull request #5689 from abpframework/feat/4963

Reduced the locale chunks count & improve the locale registering logic
pull/5750/head
Levent Arman Özak 6 years ago
committed by GitHub
parent
commit
8e359144d7
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 11
      docs/en/UI/Angular/Localization.md
  2. 345
      npm/ng-packs/packages/core/src/lib/constants/different-locales.ts
  3. 12
      npm/ng-packs/packages/core/src/lib/constants/included-locales.ts
  4. 1
      npm/ng-packs/packages/core/src/lib/constants/index.ts
  5. 3
      npm/ng-packs/packages/core/src/lib/services/localization.service.ts
  6. 1
      npm/ng-packs/packages/core/src/lib/tokens/index.ts
  7. 14
      npm/ng-packs/packages/core/src/lib/tokens/locale-error-handler.token.ts
  8. 65
      npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts

11
docs/en/UI/Angular/Localization.md

@ -219,7 +219,18 @@ If you see an error like this, you should pass the `cultureNameLocaleFileMap` pr
See [all locale files in Angular](https://github.com/angular/angular/tree/master/packages/common/locales).
## Adding new culture
```js
//app.module.ts
import { storeLocaleData } from '@abp/ng.core';
import(
/* webpackChunkName: "_locale-your-locale-js"*/
/* webpackMode: "eager" */
'@angular/common/locales/your-locale.js'
).then(m => storeLocaleData(m.default, 'your-locale'));
```
## See Also
* [Localization in ASP.NET Core](../../Localization.md)

345
npm/ng-packs/packages/core/src/lib/constants/different-locales.ts

@ -2,32 +2,337 @@
// Key is .NET locale, value is Angular locale
export default {
'ar-sa': 'ar-SA',
aa: 'en',
'aa-DJ': 'en',
'aa-ER': 'en',
'aa-ET': 'en',
'af-ZA': 'af',
'agq-CM': 'agq',
'ak-GH': 'ak',
'am-ET': 'am',
'ar-001': 'ar',
arn: 'en',
'arn-CL': 'en',
'as-IN': 'as',
'asa-TZ': 'asa',
'ast-ES': 'ast',
'az-Cyrl-AZ': 'az-Cyrl',
'az-Latn-AZ': 'az-Latn',
ba: 'ru',
'ba-RU': 'ru',
'bas-CM': 'bas',
'be-BY': 'be',
'bem-ZM': 'bem',
'bez-TZ': 'bez',
'bg-BG': 'bg',
bin: 'en',
'bin-NG': 'en',
'bm-Latn': 'bm',
'bm-Latn-ML': 'bm',
'bn-BD': 'bn',
'bo-CN': 'bo',
'br-FR': 'br',
'brx-IN': 'brx',
'bs-Cyrl-BA': 'bs-Cyrl',
'bs-Latn-BA': 'bs-Latn',
byn: 'en',
'byn-ER': 'en',
'ca-ES': 'ca',
'ca-ES-valencia': 'ca-ES-VALENCIA',
'de-de': 'de',
'es-ES': 'es',
'ce-RU': 'ce',
'cgg-UG': 'cgg',
'chr-Cher': 'chr',
'chr-Cher-US': 'chr',
co: 'en',
'co-FR': 'fr',
'cs-CZ': 'cs',
'cu-RU': 'cu',
'cy-GB': 'cy',
'da-DK': 'da',
'dav-KE': 'dav',
'de-DE': 'de',
'dje-NE': 'dje',
'dsb-DE': 'dsb',
'dua-CM': 'dua',
dv: 'en',
'dv-MV': 'en',
'dyo-SN': 'dyo',
'dz-BT': 'dz',
'ebu-KE': 'ebu',
'ee-GH': 'ee',
'el-GR': 'el',
'en-029': 'en',
'en-ID': 'en',
'en-US': 'en',
'fil-Latn': 'en',
'ku-Arab': 'en',
'ky-Cyrl': 'en',
'mi-Latn': 'en',
'prs-Arab': 'en',
'qut-Latn': 'en',
nso: 'en',
quz: 'en',
'eo-001': 'en',
'es-ES': 'es',
'et-EE': 'et',
'eu-ES': 'eu',
'ewo-CM': 'ewo',
'fa-IR': 'fa',
'ff-Latn-SN': 'ff-Latn',
'ff-NG': 'ff',
'fi-FI': 'fi',
'fil-PH': 'fil',
'fo-FO': 'fo',
'fr-029': 'fr',
'fr-FR': 'fr',
'gd-Latn': 'gd',
'fur-IT': 'fur',
'fy-NL': 'fy',
'ga-IE': 'ga',
'gd-GB': 'gd',
'gl-ES': 'gl',
gn: 'en',
'gn-PY': 'en',
'gsw-CH': 'gsw',
'gu-IN': 'gu',
'guz-KE': 'guz',
'gv-IM': 'gv',
'ha-Latn': 'ha',
'ig-Latn': 'ig',
'it-it': 'it',
'ha-Latn-GH': 'ha-GH',
'ha-Latn-NE': 'ha-NE',
'ha-Latn-NG': 'ha',
'haw-US': 'haw',
'he-IL': 'he',
'hi-IN': 'hi',
'hr-HR': 'hr',
'hsb-DE': 'hsb',
'hu-HU': 'hu',
'hy-AM': 'hy',
'ia-001': 'ia',
'ia-FR': 'ia',
ibb: 'en',
'ibb-NG': 'en',
'id-ID': 'id',
'ig-NG': 'ig',
'ii-CN': 'ii',
'is-IS': 'is',
'it-IT': 'it',
iu: 'en',
'iu-Cans': 'en',
'iu-Cans-CA': 'en',
'iu-Latn': 'en',
'iu-Latn-CA': 'en',
'ja-JP': 'ja',
'jgo-CM': 'jgo',
'jmc-TZ': 'jmc',
'jv-Java': 'jv',
'jv-Java-ID': 'jv',
'jv-Latn': 'jv',
'jv-Latn-ID': 'jv',
'ka-GE': 'ka',
'kab-DZ': 'kab',
'kam-KE': 'kam',
'kde-TZ': 'kde',
'kea-CV': 'kea',
'khq-ML': 'khq',
'ki-KE': 'ki',
'kk-KZ': 'kk',
'kkj-CM': 'kkj',
'kl-GL': 'kl',
'kln-KE': 'kln',
'km-KH': 'km',
'kn-IN': 'kn',
'ko-KR': 'ko',
'kok-IN': 'kok',
kr: 'en',
'kr-NG': 'en',
'ks-Arab': 'ks',
'ks-Arab-IN': 'ks',
'ks-Deva': 'ks',
'ks-Deva-IN': 'ks',
'ksb-TZ': 'ksb',
'ksf-CM': 'ksf',
'ksh-DE': 'ksh',
'ku-Arab': 'ku',
'ku-Arab-IQ': 'ku',
'ku-Arab-IR': 'ku',
'kw-GB': 'kw',
'ky-KG': 'ky',
la: 'en',
'la-001': 'en',
'lag-TZ': 'lag',
'lb-LU': 'lb',
'lg-UG': 'lg',
'lkt-US': 'lkt',
'ln-CD': 'ln',
'lo-LA': 'lo',
'lrc-IR': 'lrc',
'lt-LT': 'lt',
'lu-CD': 'lu',
'luo-KE': 'luo',
'luy-KE': 'luy',
'lv-LV': 'lv',
'mas-KE': 'mas',
'mer-KE': 'mer',
'mfe-MU': 'mfe',
'mg-MG': 'mg',
'mgh-MZ': 'mgh',
'mgo-CM': 'mgo',
'mi-NZ': 'mi',
'mk-MK': 'mk',
'ml-IN': 'ml',
'mn-Cyrl': 'mn',
'mn-MN': 'mn',
'mn-Mong': 'mn',
'mn-Mong-CN': 'mn',
'mn-Mong-MN': 'mn',
mni: 'en',
'mni-IN': 'en',
moh: 'en',
'moh-CA': 'en',
'mr-IN': 'mr',
'ms-MY': 'ms',
'mt-MT': 'mt',
'mua-CM': 'mua',
'my-MM': 'my',
'mzn-IR': 'mzn',
'naq-NA': 'naq',
'nb-NO': 'nb',
'nd-ZW': 'nd',
'ne-NP': 'ne',
'nl-NL': 'nl',
'nmg-CM': 'ngm',
'nn-NO': 'nn',
'nnh-CM': 'nnh',
no: 'en',
nqo: 'en',
'nqo-GN': 'en',
nr: 'en',
'nr-ZA': 'en',
nso: 'en',
'nso-ZA': 'en',
'nus-SS': 'nus',
'nyn-UG': 'nyn',
oc: 'en',
'oc-FR': 'fr',
'om-ET': 'om',
'or-IN': 'or',
'os-GE': 'os',
'pa-Arab-PK': 'pa-Arab',
'pa-IN': 'pa',
pap: 'en',
'pap-029': 'en',
'pl-PL': 'pl',
'prg-001': 'prg',
prs: 'en',
'prs-AF': 'en',
'ps-AF': 'ps',
'pt-BR': 'pt',
'sd-Arab': 'pa-Arab',
'sr-Cyrl-RS': 'sr-Cyrl',
quc: 'en',
'quc-Latn': 'en',
'quc-Latn-GT': 'en',
quz: 'en',
'quz-BO': 'en',
'quz-EC': 'en',
'quz-PE': 'en',
'rm-CH': 'rm',
'rn-BI': 'rn',
'ro-RO': 'ro',
'rof-TZ': 'rof',
'ru-RU': 'ru',
'rw-RW': 'rw',
'rwk-TZ': 'rwk',
sa: 'en',
'sa-IN': 'en',
'sah-RU': 'sah',
'saq-KE': 'saq',
'sbp-TZ': 'en',
'sd-Arab': 'sd',
'sd-Arab-PK': 'sd',
'sd-Deva': 'sd',
'sd-Deva-IN': 'sd',
'se-NO': 'se',
'seh-MZ': 'seh',
'ses-ML': 'ses',
'sg-CF': 'sg',
'shi-Latn-MA': 'shi-Latn',
'shi-Tfng-MA': 'shi-Tfng',
'si-LK': 'si',
'sk-SK': 'sk',
'sl-SI': 'sl',
sma: 'en',
'sma-NO': 'en',
'sma-SE': 'en',
smj: 'en',
'smj-NO': 'en',
'smj-SE': 'en',
'smn-FI': 'en',
sms: 'en',
'sms-FI': 'en',
'sn-Latn': 'sn',
'sn-Latn-ZW': 'sn',
'so-SO': 'so',
'sq-AL': 'so',
'sr-Cyrl-RS': 'sr-Cryl',
'sr-Latn-RS': 'sr-Latn',
ss: 'en',
'ss-SZ': 'en',
'ss-ZA': 'en',
ssy: 'en',
'ssy-ER': 'en',
st: 'en',
'st-LS': 'en',
'st-ZA': 'en',
'sv-SE': 'sv',
'sw-TZ': 'sw',
syr: 'en',
'syr-SY': 'en',
'ta-IN': 'ta',
'te-IN': 'te',
'teo-UG': 'teo',
'tg-Cyrl': 'tg',
'tk-Latn': 'tk',
'tt-Cyrl': 'tt',
'ug-Arab': 'ug',
'yo-Latn': 'yo',
'tg-Cyrl-TJ': 'tg',
'th-TH': 'th',
'ti-ET': 'ti',
tig: 'en',
'tig-ER': 'en',
'tk-TM': 'tk',
tn: 'en',
'tn-BW': 'en',
'tn-ZA': 'en',
'to-TO': 'to',
'tr-TR': 'tr',
ts: 'en',
'ts-ZA': 'en',
'tt-RU': 'tt',
'twq-NE': 'twq',
'tzm-Arab': 'tzm',
'tzm-Arab-MA': 'tzm',
'tzm-Latn': 'tzm',
'tzm-Latn-DZ': 'tzm',
'tzm-Latn-MA': 'tzm',
'tzm-Tfng': 'tzm',
'tzm-Tfng-MA': 'tzm',
'ug-CN': 'ug',
'uk-UA': 'uk',
'ur-PK': 'ur',
'uz-Arab-AF': 'uz-Arab',
'uz-Cyrl-UZ': 'uz-Cyrl',
'uz-Latn-UZ': 'uz-Latn',
'vai-Latn-LR': 'vai-Latn',
'vai-Vaii-LR': 'vai-Vaii',
ve: 'en',
've-ZA': 'en',
'vi-VN': 'vi',
'vo-001': 'vo',
'vun-TZ': 'vun',
'wae-CH': 'wae',
wal: 'en',
'wal-ET': 'en',
'wo-SN': 'wo',
'xh-ZA': 'xh',
'xog-UG': 'xog',
'yav-CM': 'yav',
'yi-001': 'yi',
'yo-NG': 'yo',
'zgh-Tfng': 'zgh',
'zgh-Tfng-MA': 'zgh',
'zh-CN': 'zh',
'zh-HK': 'zh',
'zh-MO': 'zh',
'zh-SG': 'zh',
'zh-TW': 'zh',
'zu-ZA': 'zu',
};

12
npm/ng-packs/packages/core/src/lib/constants/included-locales.ts

@ -0,0 +1,12 @@
export const includedLocales = [
'tr',
'ar',
'cs',
'en',
'fr',
'pt',
'ru',
'sl',
'zh-Hans',
'zh-Hant',
];

1
npm/ng-packs/packages/core/src/lib/constants/index.ts

@ -1 +1,2 @@
export * from './different-locales';
export * from './included-locales';

3
npm/ng-packs/packages/core/src/lib/services/localization.service.ts

@ -48,12 +48,11 @@ export class LocalizationService {
registerLocale(locale: string) {
const router = this.injector.get(Router);
const { cultureNameLocaleFileMap } = this.injector.get(CORE_OPTIONS);
const { shouldReuseRoute } = router.routeReuseStrategy;
router.routeReuseStrategy.shouldReuseRoute = () => false;
router.navigated = false;
return registerLocale(locale, cultureNameLocaleFileMap).then(() => {
return registerLocale(locale, this.injector).then(() => {
this.ngZone.run(async () => {
await router.navigateByUrl(router.url).catch(noop);
router.routeReuseStrategy.shouldReuseRoute = shouldReuseRoute;

1
npm/ng-packs/packages/core/src/lib/tokens/index.ts

@ -1,2 +1,3 @@
export * from './list.token';
export * from './locale-error-handler.token';
export * from './options.token';

14
npm/ng-packs/packages/core/src/lib/tokens/locale-error-handler.token.ts

@ -0,0 +1,14 @@
import { InjectionToken, Injector } from '@angular/core';
export interface LocaleErrorHandlerData {
resolve: any;
reject: any;
error: any;
locale: string;
storedLocales: Record<string, any>;
injector: Injector;
}
export const LOCALE_ERROR_HANDLER = new InjectionToken<(data: LocaleErrorHandlerData) => any>(
'LOCALE_ERROR_HANDLER',
);

65
npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts

@ -1,5 +1,5 @@
import { registerLocaleData } from '@angular/common';
import { Injector } from '@angular/core';
import { Injector, isDevMode } from '@angular/core';
import { Store } from '@ngxs/store';
import { OAuthService } from 'angular-oauth2-oidc';
import { tap } from 'rxjs/operators';
@ -8,6 +8,7 @@ import { ABP } from '../models/common';
import { AuthService } from '../services/auth.service';
import { ConfigState } from '../states/config.state';
import { clearOAuthStorage } from '../strategies/auth-flow.strategy';
import { LocaleErrorHandlerData, LOCALE_ERROR_HANDLER } from '../tokens/locale-error-handler.token';
import { CORE_OPTIONS } from '../tokens/options.token';
import { getRemoteEnv } from './environment-utils';
import { parseTenantFromUrl } from './multi-tenancy-utils';
@ -42,26 +43,66 @@ export function checkAccessToken(store: Store, injector: Injector) {
export function localeInitializer(injector: Injector) {
const fn = () => {
const store: Store = injector.get(Store);
const options = injector.get(CORE_OPTIONS);
const lang = store.selectSnapshot(state => state.SessionState.language) || 'en';
return new Promise((resolve, reject) => {
registerLocale(lang, options.cultureNameLocaleFileMap).then(
() => resolve('resolved'),
reject,
);
registerLocale(lang, injector).then(() => resolve('resolved'), reject);
});
};
return fn;
}
export function registerLocale(locale: string, localeNameMap: ABP.Dictionary<string>) {
return import(
/* webpackChunkName: "_locale-[request]"*/
`@angular/common/locales/${localeNameMap[locale] || locale}.js`
).then(module => {
registerLocaleData(module.default);
export function registerLocale(locale: string, injector: Injector): Promise<any> {
const { cultureNameLocaleFileMap } = injector.get(CORE_OPTIONS, {} as ABP.Root);
const errorHandlerFn = injector.get(LOCALE_ERROR_HANDLER, defaultLocalErrorHandlerFn);
return new Promise((resolve, reject) => {
return import(
/* webpackChunkName: "_locale-[request]"*/
/* webpackInclude: /\/(ar|cs|en|fr|pt|tr|ru|sl|zh-Hans|zh-Hant).js/ */
/* webpackExclude: /\/global|\/extra/ */
`@angular/common/locales/${cultureNameLocaleFileMap[locale] || locale}.js`
)
.then(module => {
registerLocaleData(module.default, locale);
resolve(module.default);
})
.catch(error => {
errorHandlerFn({
resolve,
reject,
error,
injector,
locale,
storedLocales: { ...extraLocales },
});
});
});
}
const extraLocales = {};
export function storeLocaleData(data: any, localeId: string) {
extraLocales[localeId] = data;
}
async function defaultLocalErrorHandlerFn({
locale,
storedLocales,
resolve,
injector,
}: LocaleErrorHandlerData) {
if (storedLocales[locale]) {
registerLocaleData(storedLocales[locale], locale);
resolve();
return;
}
if (isDevMode) {
console.error(`Cannot find the ${locale} locale file. You can check how can add new culture at https://docs.abp.io/en/abp/latest/UI/Angular/Localization#adding-new-culture`);
}
resolve();
}

Loading…
Cancel
Save