web-app/src/app/layout/basic/widgets/i18n.component.ts (55 lines of code) (raw):

import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core'; import { I18NService } from '@core'; import { ALAIN_I18N_TOKEN, SettingsService } from '@delon/theme'; import { BooleanInput, InputBoolean } from '@delon/util/decorator'; @Component({ selector: 'header-i18n', template: ` <div *ngIf="showLangText" nz-dropdown [nzDropdownMenu]="langMenu" nzPlacement="bottomRight"> <i nz-icon class="mr-sm" nzType="global"></i> {{ 'menu.lang' | i18n }} <i nz-icon nzType="down"></i> </div> <i style="font-size: 25px; color: #b421cc" *ngIf="!showLangText" nz-dropdown [nzDropdownMenu]="langMenu" nzPlacement="bottomRight" nz-icon nzType="global" ></i> <nz-dropdown-menu #langMenu="nzDropdownMenu"> <ul nz-menu> <li nz-menu-item class="mr-sm" *ngFor="let item of langs" [nzSelected]="item.code === curLangCode" (click)="change(item.code)"> <span role="img" [attr.aria-label]="item.text" class="pr-xs">{{ item.abbr }}</span> {{ item.text }} </li> </ul> </nz-dropdown-menu> `, changeDetection: ChangeDetectionStrategy.OnPush }) export class HeaderI18nComponent { static ngAcceptInputType_showLangText: BooleanInput; /** Whether to display language text */ @Input() @InputBoolean() showLangText = true; get langs(): Array<{ code: string; text: string; abbr: string }> { return this.i18n.getLangs(); } get curLangCode(): string { return this.settings.layout.lang; } constructor(private settings: SettingsService, @Inject(ALAIN_I18N_TOKEN) private i18n: I18NService, @Inject(DOCUMENT) private doc: any) {} change(lang: string): void { const spinEl = this.doc.createElement('div'); spinEl.setAttribute('class', `page-loading ant-spin ant-spin-lg ant-spin-spinning`); spinEl.innerHTML = `<span class="ant-spin-dot ant-spin-dot-spin"><i></i><i></i><i></i><i></i></span>`; this.doc.body.appendChild(spinEl); this.i18n.loadLangData(lang).subscribe(res => { this.i18n.use(lang, res); this.settings.setLayout('lang', lang); setTimeout(() => this.doc.location.reload()); }); } }