Angular 6 多语言支持的 CLI 本地化和国际化
Angular 6 CLI localisation & Internationalization for multilingual support
我们在我们的应用程序中使用 Angular 6。在该应用程序中,我们希望提供多语言支持。
我们如何在 angular6 中实现本地化和国际化?它是 angular 6 版本。
参考:https://dgwebidea.blogspot.com/2020/01/angular-internationalization-and.html
翻译 Angular 6 个应用 ngx-translate
我们将做什么:
创建最少 Angular6 个项目
安装并加载 ngx-translate
初始化翻译服务
创建 .json 翻译文件
翻译简单的标题和介绍
集成语言切换器
翻译带变量的句子
使用嵌套 .json objects
创建最少 Angular6 个项目
我们使用@angular/cli在终端中创建一个名为“traduction”的新项目:
ng new traduction --prefix tr
cd traduction
ng serve -o
安装并加载ngx-translate
在项目文件夹“traduction”中的终端中使用 npm:
npm install @ngx-translate/core --save
npm install @ngx-translate/http-loader
Note:
Use following versions forbelow angular 6
"@ngx-translate/core": "^9.1.1"
"@ngx-translate/http-loader": "^3.0.1"
and for angular 5 use latest version 10 and above
将必要的模块导入app.module.ts :
import { HttpClientModule, HttpClient } from '@angular/common/http';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
添加一个函数,returns 一个“TranslateHttpLoader”并将其导出(AoT 需要)。在这种情况下,我们创建的 HttpLoaderFactory 函数 returns 可以使用 Http 和 .json 加载翻译的 Object,但您可以编写自己的 Class,例如使用全局 JavaScript 变量而不是加载文件,或者使用 Google 翻译:
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
或
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
}
然后我们需要将我们的模块导入到@NgModule 中,这是告诉 Angular 将此模块加载到您的 AppModule 中的导入:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
providers: [],
bootstrap: [AppComponent]
})
注入 TranslateService
在“app.component.ts”中我们现在初始化“TranslateService”,我们导入TranslateService:
import { TranslateService } from '@ngx-translate/core';
然后在 AppComponent Class 中我们注入服务并定义我们的默认语言。为了为下一步做好准备,我们添加了一个功能来切换语言。
constructor(private translate: TranslateService) {
translate.setDefaultLang('en');
}
switchLanguage(language: string) {
this.translate.use(language);
}
创建 .json 个翻译文件
我们现在在 assets/i18n 文件夹中创建我们的翻译文件:
src/assets/i18n/en.json
{
"Title": "Translation example",
"Intro": "Hello I am Arthur, I am 42 years old."
}
src/assets/i18n/fr.json
{
"Title": "Exemple de traduction",
"Intro": "Bonjour je m'appelle Arthur, j'ai 42 ans."
}
这些是简单的 .json 文件,将由我们在“app.module.ts”中创建的“TranslateHttpLoader”加载。
翻译简单的标题和简介
在app.component.html中我们添加了一个header,在“h1”标签内带有翻译“指令”。该指令将获取标签内的文本并将其替换为匹配的翻译。如果您使用该指令,则必须确保标签内除了文本之外没有其他内容。
作为第二个示例,我们使用“TranslationPipe”将带有定义的标签翻译为内联字符串。由于我们有时在要替换的翻译中有价值,我们可以将数据 object 传递到“翻译”管道中。
<h1 translate>Title</h1>
<div>
{{ 'Intro' | translate:user }}
</div>
集成语言切换器
我们现在可以将上面 app.component.ts 中看到的语言切换器功能附加到按钮上。在这种情况下,我们为每种语言创建一个按钮,并使用匹配的语言键调用 switchLanguage() 函数。
<button (click)="switchLanguage('en')">en</button>
<button (click)="switchLanguage('fr')">fr</button>
翻译带变量的句子
如前所述,您有时会有包含变量的句子。在这个小例子中,我们有一个用户 object,年龄和名字在“app.component.ts”中,我们想要翻译一个包含这些值的句子:
...
export class AppComponent {
user = {
name: 'Arthur',
age: 42
};
...
}
因为我们将这个 object 传递给“翻译”管道,我们现在可以在我们的翻译中使用它的属性,使用 {{ placeholder }} 符号。
src/assets/i18n/en.json
{
"Title": "Translation example",
"Intro": "Hello I am {{name}}, I am {{age}} years old."
}
src/assets/i18n/fr.json
{
"Title": "Exemple de traduction",
"Intro": "Bonjour je m'appelle {{name}}, j'ai {{age}} ans."
}
使用嵌套 .json objects
如果您希望能够更好地控制您的翻译,例如翻译页面块(从 end-user 的角度)或组件(从开发人员的角度),一种解决方案可能是以下;使用嵌套的 .json objects,如 git 存储库中所述。 -json 文件中的示例可能如下所示:
{
"Title": "Translation example",
"Intro": "Hello I am {{name}}, I am {{age}} years old.",
"Startpage": {
"TranslationSections": "Hello World"
},
"Aboutpage": {
"TranslationSections": "We are letsboot"
}
}
{
"Title": "Exemple de traduction",
"Intro": "Bonjour je m'appelle {{name}}, j'ai {{age}} ans.",
"Startpage": {
"TranslationSections": "Bonjour Monde"
},
"Aboutpage": {
"TranslationSections": "Nous sommes letsboot"
}
}
并在对应模板中:
<h1 translate>Title</h1>
<div>
{{ 'Intro' | translate:user }}
</div>
<div>
{{ 'Startpage.TranslationSections' | translate }}
</div>
<div>
{{ 'Aboutpage.TranslationSections' | translate }}
</div>
<br/>
<button (click)="switchLanguage('en')">en</button>
<button (click)="switchLanguage('fr')">fr</button>
component.module.ts
export function translateHttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: translateHttpLoaderFactory,
deps: [HttpClient]
}
})
class LanguagService.ts
import { Injectable } from '@angular/core';
import { TranslateService, LangChangeEvent } from '@ngx-translate/core';
import { ReplaySubject } from 'rxjs';
import { take } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class LanguageService {
language$ = new ReplaySubject<LangChangeEvent>(1);
translate = this.translateService;
// 國旗對照;
constructor(private translateService: TranslateService) {}
setInitState() {
this.translateService.addLangs(['en', 'cn','vi']);
console.log( 'Browser Lang', this.translate.getBrowserLang());
const browserLang = (this.translate.getBrowserLang().includes('vi')) ? 'vi' : 'cn' ;
console.log("anhtt "," anguage = " +browserLang);
this.setLang(browserLang);
}
setLang(lang: string) {
this.translateService.onLangChange.pipe(take(1)).subscribe(result => {
this.language$.next(result);
});
this.translateService.use(lang);
}
}
app.component.html
<h1>How to multi language in angular 7</h1>
<p >{{'content' |translate}}</p>
<h4 translate>
{{'message' |translate}}
</h4>
<button (click)="selectLanguageEN()">English</button>
<button (click)="selectLanguageCN()">中國</button>
<button (click)="selectLanguageVI()">Viet Nam</button>
代码演示:
https://tienanhvn.blogspot.com/2019/06/angular-7-how-to-multi-language.html
我们在我们的应用程序中使用 Angular 6。在该应用程序中,我们希望提供多语言支持。
我们如何在 angular6 中实现本地化和国际化?它是 angular 6 版本。
参考:https://dgwebidea.blogspot.com/2020/01/angular-internationalization-and.html
翻译 Angular 6 个应用 ngx-translate 我们将做什么:
创建最少 Angular6 个项目 安装并加载 ngx-translate 初始化翻译服务 创建 .json 翻译文件 翻译简单的标题和介绍 集成语言切换器 翻译带变量的句子
使用嵌套 .json objects
创建最少 Angular6 个项目
我们使用@angular/cli在终端中创建一个名为“traduction”的新项目:
ng new traduction --prefix tr
cd traduction
ng serve -o
安装并加载ngx-translate
在项目文件夹“traduction”中的终端中使用 npm:
npm install @ngx-translate/core --save
npm install @ngx-translate/http-loader
Note: Use following versions forbelow angular 6
"@ngx-translate/core": "^9.1.1"
"@ngx-translate/http-loader": "^3.0.1"
and for angular 5 use latest version 10 and above
将必要的模块导入app.module.ts :
import { HttpClientModule, HttpClient } from '@angular/common/http';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
添加一个函数,returns 一个“TranslateHttpLoader”并将其导出(AoT 需要)。在这种情况下,我们创建的 HttpLoaderFactory 函数 returns 可以使用 Http 和 .json 加载翻译的 Object,但您可以编写自己的 Class,例如使用全局 JavaScript 变量而不是加载文件,或者使用 Google 翻译:
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
或
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
}
然后我们需要将我们的模块导入到@NgModule 中,这是告诉 Angular 将此模块加载到您的 AppModule 中的导入:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
providers: [],
bootstrap: [AppComponent]
})
注入 TranslateService
在“app.component.ts”中我们现在初始化“TranslateService”,我们导入TranslateService:
import { TranslateService } from '@ngx-translate/core';
然后在 AppComponent Class 中我们注入服务并定义我们的默认语言。为了为下一步做好准备,我们添加了一个功能来切换语言。
constructor(private translate: TranslateService) {
translate.setDefaultLang('en');
}
switchLanguage(language: string) {
this.translate.use(language);
}
创建 .json 个翻译文件
我们现在在 assets/i18n 文件夹中创建我们的翻译文件:
src/assets/i18n/en.json
{
"Title": "Translation example",
"Intro": "Hello I am Arthur, I am 42 years old."
}
src/assets/i18n/fr.json
{
"Title": "Exemple de traduction",
"Intro": "Bonjour je m'appelle Arthur, j'ai 42 ans."
}
这些是简单的 .json 文件,将由我们在“app.module.ts”中创建的“TranslateHttpLoader”加载。
翻译简单的标题和简介
在app.component.html中我们添加了一个header,在“h1”标签内带有翻译“指令”。该指令将获取标签内的文本并将其替换为匹配的翻译。如果您使用该指令,则必须确保标签内除了文本之外没有其他内容。
作为第二个示例,我们使用“TranslationPipe”将带有定义的标签翻译为内联字符串。由于我们有时在要替换的翻译中有价值,我们可以将数据 object 传递到“翻译”管道中。
<h1 translate>Title</h1>
<div>
{{ 'Intro' | translate:user }}
</div>
集成语言切换器
我们现在可以将上面 app.component.ts 中看到的语言切换器功能附加到按钮上。在这种情况下,我们为每种语言创建一个按钮,并使用匹配的语言键调用 switchLanguage() 函数。
<button (click)="switchLanguage('en')">en</button>
<button (click)="switchLanguage('fr')">fr</button>
翻译带变量的句子
如前所述,您有时会有包含变量的句子。在这个小例子中,我们有一个用户 object,年龄和名字在“app.component.ts”中,我们想要翻译一个包含这些值的句子:
...
export class AppComponent {
user = {
name: 'Arthur',
age: 42
};
...
}
因为我们将这个 object 传递给“翻译”管道,我们现在可以在我们的翻译中使用它的属性,使用 {{ placeholder }} 符号。
src/assets/i18n/en.json
{
"Title": "Translation example",
"Intro": "Hello I am {{name}}, I am {{age}} years old."
}
src/assets/i18n/fr.json
{
"Title": "Exemple de traduction",
"Intro": "Bonjour je m'appelle {{name}}, j'ai {{age}} ans."
}
使用嵌套 .json objects
如果您希望能够更好地控制您的翻译,例如翻译页面块(从 end-user 的角度)或组件(从开发人员的角度),一种解决方案可能是以下;使用嵌套的 .json objects,如 git 存储库中所述。 -json 文件中的示例可能如下所示:
{
"Title": "Translation example",
"Intro": "Hello I am {{name}}, I am {{age}} years old.",
"Startpage": {
"TranslationSections": "Hello World"
},
"Aboutpage": {
"TranslationSections": "We are letsboot"
}
}
{
"Title": "Exemple de traduction",
"Intro": "Bonjour je m'appelle {{name}}, j'ai {{age}} ans.",
"Startpage": {
"TranslationSections": "Bonjour Monde"
},
"Aboutpage": {
"TranslationSections": "Nous sommes letsboot"
}
}
并在对应模板中:
<h1 translate>Title</h1>
<div>
{{ 'Intro' | translate:user }}
</div>
<div>
{{ 'Startpage.TranslationSections' | translate }}
</div>
<div>
{{ 'Aboutpage.TranslationSections' | translate }}
</div>
<br/>
<button (click)="switchLanguage('en')">en</button>
<button (click)="switchLanguage('fr')">fr</button>
component.module.ts
export function translateHttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
}
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: translateHttpLoaderFactory,
deps: [HttpClient]
}
})
class LanguagService.ts
import { Injectable } from '@angular/core';
import { TranslateService, LangChangeEvent } from '@ngx-translate/core';
import { ReplaySubject } from 'rxjs';
import { take } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
export class LanguageService {
language$ = new ReplaySubject<LangChangeEvent>(1);
translate = this.translateService;
// 國旗對照;
constructor(private translateService: TranslateService) {}
setInitState() {
this.translateService.addLangs(['en', 'cn','vi']);
console.log( 'Browser Lang', this.translate.getBrowserLang());
const browserLang = (this.translate.getBrowserLang().includes('vi')) ? 'vi' : 'cn' ;
console.log("anhtt "," anguage = " +browserLang);
this.setLang(browserLang);
}
setLang(lang: string) {
this.translateService.onLangChange.pipe(take(1)).subscribe(result => {
this.language$.next(result);
});
this.translateService.use(lang);
}
}
app.component.html
<h1>How to multi language in angular 7</h1>
<p >{{'content' |translate}}</p>
<h4 translate>
{{'message' |translate}}
</h4>
<button (click)="selectLanguageEN()">English</button>
<button (click)="selectLanguageCN()">中國</button>
<button (click)="selectLanguageVI()">Viet Nam</button>
代码演示:
https://tienanhvn.blogspot.com/2019/06/angular-7-how-to-multi-language.html