我想要用一種簡單而且直覺的方式製作多國語系,想像的用法如下:
user-list.component.html
- <h2>{{lang['T_編輯使用者']}}</h2>
- <div>
- <p *ngIf="lang.id == 'en'">
- Complicated English description...
- </p>
- <p *ngIf="lang.id == 'tw'">
- 複雜的中文描述...
- </p>
- </div>
- <button type="submit">{{lang['B_儲存']}}</button>
- <select [(ngModel)]="lang.id" (change)="lang.change()">
- <option *ngFor="let x of lang.options | keyvalue" [value]="x.key">{{x.value}}</option>
- </select>
我希望能使用中文變數,有熟悉的文字可以讓程式看起來親切一點,對於複雜的文字區段也保留彈性,簡單的切換方式,以及狀態保留,讓 browser 紀錄選擇的語系。
user-list.component.ts
- import { Component, OnInit } from '@angular/core';
- import { AppLang } from 'app/app.lang';
- @Component({
- selector: 'app-user-list',
- templateUrl: './user-list.component.html'
- })
- export class UserListComponent implements OnInit {
- /** 狀態選項 */
- statusItems = {
- 'y': this.lang.E_啟用,
- 'n': this.lang.E_停用,
- };
- constructor(
- public lang: AppLang
- ) { }
- ngOnInit() {
- let msg = String(this.lang.M_請填寫_0_的刻度值).format(3);
- }
- }
已經想好使用情境了,接著來就是完成實作了!
app.lang.ts
- import { Injectable } from '@angular/core';
- /** 多國語言 */
- @Injectable()
- export class AppLang {
- constructor() {
- let _: any = {}; /* 語系字典 */
- let self: any = this;
- let names: string[] = Object.keys(this).filter(n => !'id,options,change'.includes(n));
- /* 重組語系字典 */
- Object.keys(this.options).forEach(id => {
- _[id] = {};
- names.forEach(name => _[id][name] = self[name][id]);
- });
- /* 複寫 change */
- this.change = function () {
- if (!_[this.id]) { this.id = 'tw'; }
- Object.assign(this, _[this.id]);
- localStorage['langId'] = this.id;
- }
- this.change ();
- }
- id: string = localStorage['langId'];
- options: any = {
- tw: '中文',
- en: 'English',
- };
- /** 變更語言 */
- change() { }
- /*=[ Title ]=============================================*/
- T_編輯使用者: any = {
- tw: '編輯使用者',
- en: 'Edit User',
- };
- //...
- /*=[ Field ]=============================================*/
- F_名稱: any = {
- tw: '名稱',
- en: 'Name',
- };
- //...
- /*=[ Button ]=============================================*/
- B_儲存: any = {
- tw: '儲存',
- en: 'Save',
- };
- //...
- /*=[ Enum ]=============================================*/
- E_啟用: any = {
- tw: '啟用',
- en: 'Enable',
- };
- E_停用: any = {
- tw: '停用',
- en: 'Disable',
- };
- //...
- /*=[ Message ]=============================================*/
- M_請填寫_0_的刻度值: any = {
- tw: '請填寫 {0} 的刻度值',
- en: 'Please fill in the scale value of {0}.',
- };
- //...
- }
app.module.ts 配置
- //...
- import { AppLang } from 'app/app.lang';
- @NgModule({
- declarations: [
- //...
- ],
- imports: [
- //...
- ],
- providers: [
- //...
- AppLang
- ],
- bootstrap: [AppComponent]
- })
- export class AppModule { }
0 回應:
張貼留言