angular多语言配置详解


Posted in Javascript onMay 16, 2019

angular的国际化方案,采用ngx-translate来实现。

安装模块:

npm install @ngx-translate/core --save

在根模块中导入:

// other module
import {TranslateModule} from '@ngx-translate/core';
@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    // other module
    TranslateModule.forRoot(),

  ],
  providers: [
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}

我们希望可以在一个固定的文件里面配置对应的翻译文件,然后在每个用到的组件里面使用它,随意我们需要借助TranslateHttpLoader来加载翻译文件。首先安装TranslateHttpLoader:

npm install @ngx-translate/http-loader --save

翻译文件可以放在/assets/i18n/[lang].json中,[lang]代表使用的语言文件名称。然后我们可以在跟组件中添加配置对应的加载项:

// other module
import {TranslateModule} from '@ngx-translate/core';
// 自定义加载方法
export function HttpLoaderFactory(http: HttpClient) {
  return new TranslateHttpLoader(http, './assets/i18n/', '.json?');
}
@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    // other module
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: HttpLoaderFactory,
        deps: [HttpClient],
      }
    }),
  ],
  providers: [
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}

然后我们在翻译文件中配置一个简单的示例:

// /asserts/il8n/en.json
{
 "Hello": "hello, {{value}}",
 "Introduce": {
  "Name": "my name is {{name}}.",
  "Today": "today is {{date}}, and now time is {{time}}"
 }
}

应用的时候我们可以使用点语法,例如:Introduce.Name。

好了,定义好之后再来看如何使用。我们可以使用服务或管道或指令的方式来达到显示语言的效果。在使用之前,我们需要在应用中初始化TranslateService:

import { Component } from '@angular/core';
import {TranslateService} from '@ngx-translate/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.less']
})
export class AppComponent {
 constructor(
   public translate: TranslateService,
 ) {
   this.translate.setDefaultLang('en');
   this.translate.use('en');
 }
}

我倾向于在跟组件的construct里面初始化TranslateService,因为一个系统的翻译是统一的,在开始应用的时候就需要设置好默认语言。这里使用translate.setDefaultLang('en')来设置默认语言为英文。然后使用translate.user('en')手动选择使用英文。在切换语言的时候,我们使用translate.user([lang])来设置启用哪个语言。

最后来使用翻译,有多种使用的方式。来看看。

使用方式

使用Service的方式

在运行的时候,会先发起个请求通过Http获取翻译文件,通过Observable的方式应用参数上去,然后获得翻译的内容。

// app.compent.ts
this.translate.get(
  'Introduce.Name',
  {name: 'Jarvis'}
).subscribe((res: string) => {
  console.log('res', res); // res my name is Jarvis.
});
this.translate.get(
  'Introduce.Today',
  {
    date: new Date().getDate(),
    time: new Date().getTime()
  },
).subscribe((res: string) => {
  console.log('res', res); // res today is 22, and now time is 1534937370461
});

使用pipe的方式

<div>{{'Hello' | translate: param</div>

在js里定义参数param:

const param = {
  value: 'world',
};

使用指令

管道的方式虽然方便,但参数还是需要在先定义好,这样子变量多的话也比较繁琐。使用指令的方式可以在程序中直接传参:

<span [translate]="'Introduce.Name'" [translateParams]="{name: 'Jarvis'}"></span>

或者直接将元素的内容作为key:

<span translate [translateParams]="{date: '10.11', time: '20:33'}">Introduce.Today</span>

应用html标签

可以在翻译文件中中定义简单的行级html标签

{
 "Hello": "hello, {{value}}",
}

要渲染它们,在任何元素上只需要将innerHTML属性和管道一同使用即可。

<p [innerHTML]="'Introduce.Name'| translate: param"></p>

常用方法

instant() 即时翻译

有些情况下,我们要在js里面动态的获取值和赋值,这时候没法使用模板语法,使用subscribe的方式又不利于代码的组织,这时候我们需要即时翻译来搞定了。方法定义:

instant(key: string|Array<string>), insterpolateParams?: Object):string|Object

调用的时候传入key和对应的参数,即可返回当前key的翻译:

this.translate.instant('HELLO', {value: 'Jarvis'});

但是需要注意的是,这个方法是同步的,默认加载器是异步的。使用这个方法需要确保翻译文件已经加载完成了,如果不确定,就应该用get的方式。

参考:

https://www.npmjs.com/package/@ngx-translate/core

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 不能释放内存.
Sep 07 Javascript
广告切换效果(缓动切换)
May 27 Javascript
Jquery 基础学习笔记之文档处理
May 29 Javascript
js获取元素在浏览器中的绝对位置
Jul 24 Javascript
js Date概念详细介绍
Nov 22 Javascript
js判断横竖屏及禁止浏览器滑动条示例
Apr 29 Javascript
了不起的node.js读书笔记之例程分析
Dec 22 Javascript
js中跨域方法原理详解
Jul 19 Javascript
jQuery实现大图轮播
Feb 13 Javascript
jquery获取transform里的值实现方法
Dec 12 jQuery
详解如何实现一个简单的 vuex
Feb 10 Javascript
p5.js入门教程之鼠标交互的示例
Mar 16 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
May 16 #Javascript
Django模板继承 extend标签实例代码详解
May 16 #Javascript
vue视图不更新情况详解
May 16 #Javascript
详解如何写出一个利于扩展的vue路由配置
May 16 #Javascript
Vue中props的详解
May 16 #Javascript
使用Vue实现移动端左滑删除效果附源码
May 16 #Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 #Javascript
You might like
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
用Python制作简单的钢琴程序的教程
2015/04/01 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
阿迪达斯印度官方商城:adidas India
2017/03/26 全球购物
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
食堂员工工作职责
2013/12/18 职场文书
英文导游词
2015/02/13 职场文书
房地产项目合作意向书
2015/05/08 职场文书
污水处理保证书
2015/05/09 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
教学副校长工作总结
2015/08/13 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android