日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Angular国际化中ngx-translate使用

發(fā)布時(shí)間:2023/12/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Angular国际化中ngx-translate使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Angular國(guó)際化中ngx-translate使用

  • 背景
    • 插件使用
      • 引用

背景

對(duì)于angular的插件我以前的做法就是上網(wǎng)找個(gè)例子然后拿過來就用,用完了框架怎么搭建進(jìn)來的,后期升級(jí)怎么處理就要重新去看去找。而且如果想優(yōu)化時(shí)一頭霧水。
寫代碼就像電視劇請(qǐng)回答1988中的臺(tái)詞一樣,人這一輩子,在自己的人生之紙上涂抹顏料,五彩斑斕、濃墨重彩,最終疊加成一紙漆黑。回憶模糊,再也想不出來當(dāng)時(shí)那些紅粉藍(lán)綠的筆痕,是以怎樣的姿態(tài)劃過白紙,又發(fā)出了何種聲響,沙啞還是清脆。都記不清了。仿佛那些多彩的故事,從來都沒有發(fā)生過,只是我美好的想象。
我理解關(guān)于程序的大意是程序本來就像一張白紙,你畫一些,他畫一些,最終變成一張黑紙,我們都看不清彼此的痕跡。

插件使用

導(dǎo)入ngx-translate
運(yùn)行下面命令安裝@ngx-translate/core和@ngx-translate/http-loader:

npm install @ngx-translate/core --save
npm install @ngx-translate/http-loader --save
然后在根模塊(一般是app.module.ts)下引入TranslateModule

import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import {HttpClient} from "@angular/common/http"; import {TranslateLoader, TranslateModule} from "@ngx-translate/core"; import {TranslateHttpLoader} from "@ngx-translate/http-loader"; import { AppComponent } from './app.component';

// 為AOT(Ahead-of-Time,預(yù)編譯)準(zhǔn)備

export function createTranslateLoader(http: HttpClient) {return new TranslateHttpLoader(http, './assets/i18n/', '.json'); }

這里使用了TranslateHttpLoader 來加載我們定義好的語(yǔ)言文件。"/assets/i18n/[lang].json"這里的lang就是當(dāng)前正在使用的語(yǔ)言。這里"/assets/i18n/[lang].json"在前后分離的項(xiàng)目中,如果想通過訪問后臺(tái)接口,可以在這里替換為以下。

//用于根據(jù)語(yǔ)言類型獲取頁(yè)面所有該語(yǔ)言的鍵值

export function createTranslateLoader(http: HttpClient, configProvider: ConfigProvider) {return new TranslateHttpLoader(http, `${configProvider.getWebApiUri()}api/Translate/GetValues?ValueType=`, ''); }

這里Translate/GetValues替換成你后臺(tái)代碼的Controller名/method名。
注意:如果當(dāng)前采用的是AOT編譯方式或者是ionic工程,那么useFactory對(duì)應(yīng)的必須是一個(gè)export的自定義方法而非內(nèi)聯(lián)方法。

@NgModule({imports: [BrowserModule,TranslateModule.forRoot({loader: {provide: TranslateLoader,useFactory: (createTranslateLoader),deps: [HttpClient]}})], declarations: [AppComponent],providers: [],bootstrap: [AppComponent] }) export class AppModule { }

如果Angular版本小于4.3,可以使用http-loader@0.1.0,并用@angular/http中的Http代替HttpClient。

為了方便在其他模塊下使用,在sharedModule下面導(dǎo)入TranslateModule:

import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common';import {TranslateModule} from "@ngx-translate/core";const sharedModule = [CommonModule,TranslateModule ];@NgModule({imports: sharedModule,declarations: [],exports: sharedModule }) export class SharedModule { }

這樣在其他模塊下導(dǎo)入sharedModule就可以使用ngx-translate了。

使用ngx-translate
在/assets/i18n/目錄下新建en.json和zh.json兩個(gè)文件,如果用Angular-Cli新建的工程,默認(rèn)會(huì)有這兩個(gè)文件。這個(gè)目錄下的json文件名會(huì)作為ngx-translate中的語(yǔ)言名稱使用,比如translate.use(‘zh’)中的zh就是zh.json的文件名,如果json文件改成zh-CN,相應(yīng)代碼中的也要更改為translate.use(‘zh-CN’)。
不建議用以上刪除線表達(dá)的用法。不利于后期維護(hù)。
建議在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表將每種語(yǔ)言分別作為一列進(jìn)行維護(hù)。如果頁(yè)面元素重復(fù)性很低,并且需要信息量大請(qǐng)結(jié)合項(xiàng)目本身情況在項(xiàng)目初期設(shè)計(jì)每張表的多語(yǔ)言架構(gòu)。

TypeScript:

import { Injectable } from '@angular/core'; import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; import { take } from 'rxjs/operators'; import { ReplaySubject } from 'rxjs';@Injectable({providedIn: 'root' }) export class AppTranslateService {translations: any = {};language$ = new ReplaySubject<LangChangeEvent>(1);constructor(private translateService: TranslateService) { }//設(shè)置初始語(yǔ)言setInitState(){//添加語(yǔ)言const availableLangs = ['en', 'zh-cn'];this.translateService.addLangs(availableLangs);//獲取當(dāng)前語(yǔ)言類型let lang = localStorage.getItem('translate');//如果url上沒有語(yǔ)言類型,則默認(rèn)中文if (lang === null || lang.length === 0) {// const browserLang = (this.translateService.getBrowserLang().includes('zh')) ? 'zh-cn' : 'en';const browserLang = 'zh-cn';lang = browserLang;localStorage.setItem('translate', lang);} //如果url上的語(yǔ)言類型不在列表中,則默認(rèn)英文else {if (availableLangs.indexOf(lang) < 0) {lang = 'en';localStorage.setItem('translate', lang);}}this.setLang(lang);}//當(dāng)語(yǔ)言改變時(shí)使用新語(yǔ)言setLang(lang: string) {//注冊(cè)Lang的監(jiān)聽事件(只要注冊(cè)過,一旦發(fā)生change事件,即會(huì)調(diào)用)this.translateService.onLangChange.pipe(take(1)).subscribe(result => {this.language$.next(result);this.translations = result.translations;console.log(this.translations);});//使用這個(gè)Langthis.translateService.use(lang);}//根據(jù)key獲取對(duì)應(yīng)的值,用于導(dǎo)航欄部分第一次獲取不到值,異步獲取值async translate(key: string): Promise<string> {return await this.translateService.get(key).toPromise();}//根據(jù)key獲取對(duì)應(yīng)的值translateText(key: string): string{const text: string = this.translateService.instant(key);return text;}

HTML:

<p>{{'Edit'' | translate}}</p>

TranslateService僅需在要使用該服務(wù)的地方注入,在不需要的組件中,可以不注入,直接使用管道在HTMl翻譯對(duì)應(yīng)的內(nèi)容。

在HTML中還可以使用屬性指令來翻譯:

<div [translate]="'Edit'"></div>

如果在ts文件中獲取對(duì)應(yīng)語(yǔ)言可以用

Edit = this.translate.translations['Edit '] === undefined? '編輯':this.translate.translations['Edit ']; 或者 Edit = ''; ngOnInit() { this.Edit = this.translate.translations.Edit ; }

翻譯TypeScript中的內(nèi)容
可以使用TranslateService中的instant()方法配合訂閱onLangChange來實(shí)現(xiàn)。onLangChange是一個(gè)監(jiān)聽語(yǔ)言變化的EventEmitter,可以實(shí)現(xiàn)跨模塊通訊,比如A模塊中切換成英文,onLangChange會(huì)通知所有模塊下語(yǔ)言都切換成英文,此時(shí)去B模塊下,界面也是英文狀態(tài)的。

后端采用C#寫法
Controller

[HttpGet("[action]")]public async Task<IActionResult> GetValues(string valueType){var translateValues = await translateManager.GetTranslateValues(valueType);return Ok(translateValues);}

Service

//獲取Json文件 public async Task<JObject> GetTranslateValues(string languageCode){string sqlBase = "SELECT [TextKey], [{0}] [TextValue] FROM [App].[TextValue] WHERE [IsDisabled] = 0 and [IsDeleted] = 0 ";string textValue = string.Empty;switch (languageCode){case "en":textValue = "TextValueEN";break;case "zh-cn":textValue = "TextValueCN";break;default:textValue = "TextValueEN";break;}string sql = string.Format(sqlBase, textValue);var result = await dbContext.Database.GetDbConnection().QueryAsync(sql);JObject json = new JObject();foreach (var row in result){json.Add(row.TextKey, row.TextValue);}return json;}

表結(jié)構(gòu)

對(duì)于以上內(nèi)容如有爭(zhēng)議,歡迎大家留言給我,也為方便國(guó)內(nèi)Angular使用者,謝謝大家。

引用

鏈接:
[1]: https://tc9011.com/2017/12/16/angular%E4%B8%ADngx-translate%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B/
[2]:https://www.jb51.net/article/121841.htm

總結(jié)

以上是生活随笔為你收集整理的Angular国际化中ngx-translate使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。