UNPKG

bixi

Version:

企业级中后台前端解决方案

107 lines (86 loc) 3 kB
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'; @Injectable({ providedIn: 'root' }) 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('/'); } }