更新 : 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
  let list = phoneUtil['getSupportedRegions'](); //typesciprt 每这个方法, 因为版本不够新, 但依然是可以用的啦. 

需要注意的是,任何操作都是使用 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 翻译 )的更多相关文章

  1. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  2. Angular2学习笔记(1)——Hello World

    1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之前主要使用的是jQuery,由于 ...

  3. angular2 学习笔记 ( rxjs 流 )

    RxJS 博大精深,看了好几篇文章都没有明白. 范围牵扯到了函数响应式开发去了... 我对函数式一知半解, 响应式更是第一次听到... 唉...不过日子还是得过...混着过先呗 我目前所理解的很浅,  ...

  4. angular2 学习笔记 ( ngModule 模块 )

    2016-08-25, 当前版本是 RC 5. 参考 : https://angular.cn/docs/ts/latest/guide/ngmodule.html 提醒 : 这系列笔记的 " ...

  5. Angular2学习笔记——路由器模型(Router)

    Angular2以组件化的视角来看待web应用,使用Angular2开发的web应用,就是一棵组件树.组件大致分为两类:一类是如list.table这种通放之四海而皆准的通用组件,一类是专为业务开发的 ...

  6. Angular2学习笔记——Observable

    Reactive Extensions for Javascript 诞生于几年前,随着angular2正式版的发布,它将会被更多开发者所认知.RxJs提供的核心是Observable对象,它是一个使 ...

  7. Angular2学习笔记——在子组件中拿到路由参数

    工作中碰到的问题,特此记录一下. Angular2中允许我们以`path\:id\childPath`的形式来定义路由,比如: export const appRoutes: RouterConfig ...

  8. Angular2学习笔记——NgModule

    在Angular2中一个Module指的是使用@NgModule修饰的class.@NgModule利用一个元数据对象来告诉Angular如何去编译和运行代码.一个模块内部可以包含组件.指令.管道,并 ...

  9. angular2 学习笔记 (Pipes)

    Pipe 就是 ng1 的 filter <pre>{{ jsonValue | json }}</pre> 用法看这里就很清楚了 : https://angular.cn/d ...

随机推荐

  1. 序列化、反序列化(Serializable特性)

    //需要被实例化的类 using System.Collections; using UnityEngine; [Serializable] public class SerializableClas ...

  2. Maven 手动添加selenium JAR 包到本地仓库

    安装Maven后我们会在用户目录下发现.m2 文件夹.默认情况下,该文件夹下放置了Maven本地仓库.m2/repository. 在intellij中创建maven项目时,添加 selenium 依 ...

  3. js---BOW---页面打开方式,跳转方式 2017-03-24

    BOM  ( browse object model) 一.js页面的三种打开方式 1. window.open 格式: window.open("第一部分", "第二部 ...

  4. threejs - uv 映射 简要

    啥也不说先上way+code+demo; https://github.com/Thinkia/threejs_/blob/master/test/test2-%20uv/readme.md 如何理解 ...

  5. Flask入门HelloWorld

    Flask入门HelloWorld Flask官网:http://flask.pocoo.org/ Flask中文翻译:http://dormousehole.readthedocs.io/en/la ...

  6. 笔记:Maven 私服 Nexus 权限控制

    Nexus 用户 Nexus 预定义了三个用户,这三个用户对应了三个权限级别: admin:该用户拥有对Nexus服务的完全控制,默认密码为 admin123,以下为admin用户的角色树 deplo ...

  7. Docker + webpack 打包前端项目

    码云代码地址: https://gitee.com/caonimashi/docker_deployment_front_end    构建基础镜像: 1.下载一个 Apline Linux 操作系统 ...

  8. 使用gevent提高IO繁忙型wsgi服务的并发量(转)

    add by zhj: 在Benchmark of Python WSGI Servers一文中,作者进行详细分析,得出的结论是gevent在所有WSGI Server(包括Tornado.Uwsgi ...

  9. [luogu1168]中位数_优先队列

    中位数 题目大意:输出读入的前2*k+1个数的中位数.一共有n个数,按照读入顺序. 注释:$1\le n \le 10^9$. 想法:这是优先队列的一个应用qwq.我们弄两个堆.小根堆和大根堆,保证: ...

  10. vue Echarts 柱状图点击事件

    drawBar(){ let that = this; let chart = this.$echarts.init(document.getElementById('bar-graph')); le ...