angular2 学习笔记 ( translate, i18n 翻译 )

时间:2023-02-27 16:09:08

更新 : 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学习笔记&lpar;1&rpar;——Hello World

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

  3. angular2 学习笔记 &lpar; rxjs 流 &rpar;

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

  4. angular2 学习笔记 &lpar; ngModule 模块 &rpar;

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

  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 学习笔记 &lpar;Pipes&rpar;

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

随机推荐

  1. ubuntu 默认防火墙安装、启用、查看状态

    ubuntu 9.10默认的是UFW防火墙,已经支持界面操作了.在命令行运行ufw命令就可以看到提示的一系列可进行的操作. 最简单的一个操作:sudo ufw status可检查防火墙的状态,我的返回 ...

  2. alexkn android第一行代码-7&period;广播

    0.Android 中的广播主要可以分为两种类型,标准广播和有序广播.标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的 广播接收器几乎都会在同一时刻接收到 ...

  3. jQuery设置元素attribute之特殊属性

    一般我们使用.attr()对某个dom元素设置attribute属性.今天在使用过程中发现在给input设置disabled属性为true时,最终元素disabled属性值解析成了disabled,并 ...

  4. DOM&lowbar;01之树及遍历

    1.DOM:ECMAScript+DOM+BOM,Document Object Model,核心DOM+HTML DOM+XML DOM: 2.辨析:①HTML:专门编写网页内容的语言:②XHTML ...

  5. java web开发问题集合

    前台和后台的交流到底是借助什么?servlet?xml? 我们能感觉到用servlet,但是我们是如何使用servlet的?不是现在web.xml部署后,才能触发吗?所以其实我们是本质是借助XML文件 ...

  6. 解决方案:将已存在的项目 添加到 tfs解决方案中的时候 出现:新项目不能成功加入源码控制

    遇到此问题 可能是因为你的 解决方案文件 没有正确与 tfs服务器绑定导致的 解决方式是: 在打开任意一个源码文件的时候,打开 vs2013的 文件>> Go to File->So ...

  7. js library

    jquery.js prototype.js requirejs.js backbone.js modernizr.js knockout.js http://share.renren.com/sha ...

  8. mysql应用技巧

    1. 查看mysql死锁 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; 2.查看正在锁的事务 SELECT * FROM INFORMATION_SCHEM ...

  9. 谈谈CommonsChunkPlugin抽取公共模块

    引言 webpack插件CommonsChunkPlugin的主要作用是抽取webpack项目入口chunk的公共部分,具体的用法就不做过多介绍,不太了解可以参考webpack官网介绍: 该插件是we ...

  10. openblas下载安装编译

    编译好的库: https://github.com/JuliaLinearAlgebra/OpenBLASBuilder/releases 源码编译 下载:https://github.com/xia ...