bixi
Version:
企业级中后台前端解决方案
107 lines (86 loc) • 3 kB
text/typescript
import { Injectable } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core';
import { en_US, NzI18nService, zh_CN } from 'ng-zorro-antd/i18n';
import { Subject } from 'rxjs';
import { ENUS } from './en-US';
import { BixiI18NService } from './service.type';
import { ZHCN } from './zh-CN';
export type LangType = 'en-US' | 'zh-CN';
export class I18NService implements BixiI18NService {
private change$: Subject<LangType> = new Subject<LangType>();
private _langs = [
{ code: 'en-US', text: 'English' },
{ code: 'zh-CN', text: '中文' }
];
constructor(private zorroI18n: NzI18nService, private translate: TranslateService, private dom: DomSanitizer) {
this.translate.setTranslation('en-US', ENUS);
this.translate.setTranslation('zh-CN', ZHCN);
this.translate.setDefaultLang('en-US');
// from browser
const lang = (this.getBrowserLang() || this.defaultLang) as LangType;
this.use(lang, false);
}
private getBrowserLang(): string | undefined {
// tslint:disable-next-line:no-any
const winNav: any = window.navigator;
if (typeof window === 'undefined' || typeof winNav === 'undefined') {
return undefined;
}
// tslint:disable-next-line:no-any
let browserLang: any = winNav.languages ? winNav.languages[0] : null;
browserLang = browserLang || winNav.language || winNav.browserLanguage || winNav.userLanguage;
if (browserLang.indexOf('-') !== -1) {
browserLang = browserLang.split('-')[0];
}
if (browserLang.indexOf('_') !== -1) {
browserLang = browserLang.split('_')[0];
}
return this.getFullLang(browserLang);
}
get change() {
return this.change$.asObservable();
}
use(lang: LangType, emit = true) {
this.translate.use(lang);
this.zorroI18n.setLocale(lang === 'en-US' ? en_US : zh_CN);
if (emit) this.change$.next(lang);
}
// tslint:disable-next-line:no-any
getLangs(): any[] {
return this._langs;
}
get defaultLang(): LangType {
return 'zh-CN';
}
get lang() {
return this.translate.currentLang;
}
get zone() {
return this.translate.currentLang.split('-')[0];
}
get langs() {
return ['zh-CN', 'en-US'];
}
fanyi(key: string, interpolateParams?: {}, isSafe?: boolean) {
const res = this.translate.instant(key, interpolateParams);
if (isSafe === true) {
return this.dom.bypassSecurityTrustHtml(res);
}
return res;
}
// tslint:disable-next-line:no-any
get(i: any) {
return typeof i === 'string' ? i : i[this.lang] || i[this.defaultLang] || '';
}
getFullLang(lang: string) {
const res = this._langs.filter(l => l.code.split('-')[0] === lang);
return res.length > 0 ? res[0].code : this.defaultLang;
}
getRealUrl(url: string) {
const arr = url.split('#')[0].split('?')[0].split('/');
arr.splice(-1);
return arr.join('/');
}
}