angular2 学习笔记 ( translate, i18n 翻译 )
更新 : 2017-06-17
<h1 i18n="site header|An introduction header for this sample">Hello {{ name }} world</h1>
<source>Hello <x id="INTERPOLATION"/> world</source>
<target>哈喽 <x id="INTERPOLATION"/> 世界</target>
angular 支持 interpolation {{ }}
你要在 target 去掉 interpolation 也是 ok 的.
说说真实项目中的场景. 除了这种能写在模板上的翻译,我们通常还有一些动态的翻译比如 sql 资料.
比如 :
class Member
{
name_en : string;
name_cn : string;
}
我的做法是为每一个 member 对象添加一个 name 属性, getter(){ if( this.locale == 'zh-CN'...) { return this.... } }
import { LOCALE_ID, Inject } from '@angular/core';
constructor( @Inject(LOCALE_ID) private locale: string) { }
locale 如果没有使用 i18n 的话,会拿 user-agent 的哦
日期 : 2017-04-24
refer :
https://v2.angular.io/docs/ts/latest/cookbook/i18n.html#!#aot
https://github.com/angular/angular-cli/issues/2201
http://blog.danieleghidoli.it/2017/01/15/i18n-angular-cli-aot/
针对翻译, ng 提供了一个解决方案.
流程大概是这样的.
在写模板的时候我们通过一些记号, 标识出要翻译的部分
<h1 i18n="User welcome|An introduction header for this sample">Hello i18n!</h1>
类似上面这样, i18n 是个标识, 内容是一些描述
所有模板都写好了以后
windows cmd 运行 "./node_modules/.bin/ng-xi18n" --i18nFormat=xlf
这时 ng 会从我们的模板中提取这些标识的内容创建出一个 messages.xlf 的 file.
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="ng2.template">
<body>
<trans-unit id="af2ccf4b5dba59616e92cf1531505af02da8f6d2" datatype="html">
<source>Hello i18n!</source>
<target>我爱你妈</target>
<note priority="1" from="description">An introduction header for this sample</note>
<note priority="1" from="meaning">User welcome</note>
</trans-unit>
</body>
</file>
</xliff>
大致上长这样, <target> 一开始是空着的, 我们把翻译写进去.
如果你支持很多语言,那么就 copy paste 这个 file 给每个 file 一个特别的名字比如 : messages.cn.xlf, messages.en.xlf
翻译完成了以后
cmd : ng build --prod --i18nFile=./src/locale/messages.zh-cn.xlf --locale=zh-CN --i18nFormat=xlf --bh=/cn/ --output-path=cn
ng serve --aot --i18nFile=./src/locale/messages.zh-cn.xlf --locale=zh-CN --i18nFormat=xlf (只有 aot 可以跑 ng serve 哦)
bh 是 base href, output-path 默认是 dist, 因为我们有很多版本语言, 所以我们需要重复 build 很多个版本出来.
最后就是 publish to server 咯.
整个流程看完. 我们可以了解到, ng 的做法是让每个语言独立一个 index.html 版本.
好处是快咯,隔离的好咯
坏处是, 如果要改视乎 rebuild 的工作量不少. 当然我觉得这个应该是最后的环节了. 不太可能一直改.
网页中除了一般的静态资料需要翻译,动态资料也是需要翻译的,比如 sql 的 data, alert error message. 这些不在 ng 包含的范围内, 我们得自己处理哦。
外传 :
refer : https://github.com/googlei18n/libphonenumber
介绍一下 google i18n/ libphonenumber
做国际站, 电话号码也是需要处理好的.
npm install google-libphonenumber --save
npm install @types/google-libphonenumber --save-dev ( 版本可能不够新哦, 比如目前是 7.4 但是 lib 已经 8.4 了, getSupportRegions 方法就没找着 /.\ )
import { PhoneNumberUtil, PhoneNumberFormat } from 'google-libphonenumber'; let sg = '+65 9026 9356';
let phoneUtil = PhoneNumberUtil.getInstance();
let number = phoneUtil.parse(sg, '');
let code = phoneUtil.getRegionCodeForNumber(number); //SG
let ok = phoneUtil.isValidNumber(number);
let formatA = phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL); //+65 9026 9356
let formatB = phoneUtil.format(number, PhoneNumberFormat.NATIONAL); // 9026 9356
需要注意的是,任何操作都是使用 phone number 对象, 所以记得要 parse.
主要用途是验证是不是 phone number, 还有转换格式.
除了 js 还有其它版本的哦,比如 c#.
public ActionResult Index()
{
var sg = "+65 9026 9356";
var phoneUtil = PhoneNumberUtil.GetInstance();
var number = phoneUtil.Parse(sg, "");
var code = phoneUtil.GetRegionCodeForNumber(number); //SG
var ok = phoneUtil.IsValidNumber(number);
var formatA = phoneUtil.Format(number, PhoneNumberFormat.INTERNATIONAL); //+65 9026 9356
var formatB = phoneUtil.Format(number, PhoneNumberFormat.NATIONAL); // 9026 9356
List<string> x = phoneUtil.GetSupportedRegions().ToList();
int codex = phoneUtil.GetCountryCodeForRegion(x[]);
return View();
}
angular2 学习笔记 ( translate, i18n 翻译 )的更多相关文章
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- Angular2学习笔记(1)——Hello World
1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之前主要使用的是jQuery,由于 ...
- angular2 学习笔记 ( rxjs 流 )
RxJS 博大精深,看了好几篇文章都没有明白. 范围牵扯到了函数响应式开发去了... 我对函数式一知半解, 响应式更是第一次听到... 唉...不过日子还是得过...混着过先呗 我目前所理解的很浅, ...
- angular2 学习笔记 ( ngModule 模块 )
2016-08-25, 当前版本是 RC 5. 参考 : https://angular.cn/docs/ts/latest/guide/ngmodule.html 提醒 : 这系列笔记的 " ...
- Angular2学习笔记——路由器模型(Router)
Angular2以组件化的视角来看待web应用,使用Angular2开发的web应用,就是一棵组件树.组件大致分为两类:一类是如list.table这种通放之四海而皆准的通用组件,一类是专为业务开发的 ...
- Angular2学习笔记——Observable
Reactive Extensions for Javascript 诞生于几年前,随着angular2正式版的发布,它将会被更多开发者所认知.RxJs提供的核心是Observable对象,它是一个使 ...
- Angular2学习笔记——在子组件中拿到路由参数
工作中碰到的问题,特此记录一下. Angular2中允许我们以`path\:id\childPath`的形式来定义路由,比如: export const appRoutes: RouterConfig ...
- Angular2学习笔记——NgModule
在Angular2中一个Module指的是使用@NgModule修饰的class.@NgModule利用一个元数据对象来告诉Angular如何去编译和运行代码.一个模块内部可以包含组件.指令.管道,并 ...
- angular2 学习笔记 (Pipes)
Pipe 就是 ng1 的 filter <pre>{{ jsonValue | json }}</pre> 用法看这里就很清楚了 : https://angular.cn/d ...
随机推荐
- Cassandra配置多节点集群以及使用雅虎YCSB压测Cassandra 3.11
这几天在搭Cassandra集群以及对Cassandra的性能测试,步骤还挺多,记录一下. 关于Caaandra在服务器上配置多节点集群,可以参考一下文章: http://blog.csdn.net/ ...
- asp.net core 四 IOC&DI Autofac
其实关于IOC,DI已经有了很多的文章,但是自己在使用中还是有很多困惑,而且相信自己使用下,印象还是会比较深刻的 关于这段时间一直在学习.net core,但是这篇文章是比较重要的,也是我自己觉得学习 ...
- RedissonLock分布式锁源码分析
最近碰到的一个问题,Java代码中写了一个定时器,分布式部署的时候,多台同时执行的话就会出现重复的数据,为了避免这种情况,之前是通过在配置文件里写上可以执行这段代码的IP,代码中判断如果跟这个IP相等 ...
- git使用.gitignore设置不生效或不起作用的问题
偶然遇到的问题,记录如下: 通常我们在push项目时,会有些配置文件或本地文件不想上传到服务器上 这时候我们会通过设置.gitignore 文件 一般设置成这样: # 20170418 by 51a ...
- java函数回调
Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 class B有一个参数为callback的方法f(CallBack c ...
- Maven-09: 在线插件信息
仅仅理解如何配置使用插件是不够的.当遇到一个构建任务的时候,用户还需要知道去哪里寻找合适的插件,以帮助完成任务.找到正确的插件之后,还要详细了解该插件的配置点.由于Maven的插件非常多,而且这其中的 ...
- oracle10g 基于linux6安装问题收集
1.[oracle@rsyslogserver database]$ dbca -silent -responseFile /home/oracle/database/dbca.rsp No comm ...
- 【Python】 linux中python命令的命令行参数
Python命令行参数 原文地址:http://blog.163.com/weak_time/blog/static/25852809120169333247925/ Python的命令行参数,提供了 ...
- SQL Quick Reference From W3Schools
SQL Statement Syntax AND / OR SELECT column_name(s)FROM table_nameWHERE conditionAND|OR condition AL ...
- Android开发之eclipse 快捷键
转自:<Android开发之eclipse 快捷键>http://www.cnblogs.com/aimeng/archive/2012/08/07/2626909.html Ctrl+1 ...