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 函数声明与函数表达式的区别介绍
Oct 05 Javascript
JavaScript将数据转换成整数的方法
Jan 04 Javascript
二叉树先序遍历的非递归算法具体实现
Jan 09 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
May 29 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
webpack学习教程之publicPath路径问题详解
Jun 17 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
Jan 12 Javascript
mpvue项目中使用第三方UI组件库的方法
Sep 30 Javascript
Vue实现购物车详情页面的方法
Aug 20 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
Oct 26 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
详解基于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生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
Laravel下生成验证码的类
2017/11/15 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
python实现进程间通信简单实例
2014/07/23 Python
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
python的re正则表达式实例代码
2018/01/24 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
python两个list[]相加的实现方法
2020/09/23 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
党员自我评价分享
2013/12/13 职场文书
部队学习十八大感言
2014/01/11 职场文书
美化环境标语
2014/06/20 职场文书
影视后期实训报告
2014/11/05 职场文书
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python