i18next的jquery插件jquery-i18next的使用方法

前提条件

使用jquery-i18next插件前,需要jquery和i18next的支持。

安装

jquery-i18next支持npm和bower安装

1
2
3
4
5
# npm package
$ npm install jquery-i18next

# bower
$ bower install jquery-i18next

使用入门

在html代码中插入data-i18n的属性

1
2
3
4
5
<ul class="nav">
<li><a href="#" data-i18n="nav.home"></a></li>
<li><a href="#" data-i18n="nav.page1"></a></li>
<li><a href="#" data-i18n="nav.page2"></a></li>
</ul>

定义翻译文件

可在源码路径下创建locales/en/translation.json文件

1
2
3
4
5
6
7
{
"nav": {
"home": "Home",
"page1": "Page One",
"page2": "Page Two"
}
}

通过Javascript代码进行初始化和翻译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 其中i18nextInstance是i18next的实例,最后一个参数是配置项

jqueryI18next.init(i18nextInstance, $, {
tName: 't', // --> appends $.t = i18next.t
i18nName: 'i18n', // --> appends $.i18n = i18next
handleName: 'localize', // --> appends $(selector).localize(opts);
selectorAttr: 'data-i18n', // selector for translating elements
targetAttr: 'i18n-target', // data-() attribute to grab target element to translate (if diffrent then itself)
optionsAttr: 'i18n-options', // data-() attribute that contains options, will load/set if useOptionsAttr = true
useOptionsAttr: false, // see optionsAttr
parseDefaultValueFromContent: true // parses default values from content ele.val or ele.text
});

$(".nav").localize();

最终展现在网页中的结果

1
2
3
4
5
// <ul class="nav">
// <li><a href="#" data-i18n="nav.home">Home</a></li>
// <li><a href="#" data-i18n="nav.page1">Page One</a></li>
// <li><a href="#" data-i18n="nav.page2">Page Two</a></li>
// </ul>

使用进阶

通过jQuery的选择器来实现不同的翻译

翻译一个元素

1
2
<a id="btn1" href="#" data-i18n="myKey"></a>
$("#btn1").localize(options);

翻译一个元素的子元素

1
2
3
4
5
6
<ul class="nav">
<li><a href="#" data-i18n="nav.home"></a></li>
<li><a href="#" data-i18n="nav.page1"></a></li>
<li><a href="#" data-i18n="nav.page2"></a></li>
</ul>
$(".nav").localize();

翻译一些内部元素

1
2
3
4
<div class="outer" data-i18n="ns:key" data-i18n-target=".inner">
<input class="inner" type="text"></input>
</div>
$(".outer").localize();

设置不同属性的翻译

比如,想要设置某个元素的title属性的多语言,可使用这种方式;或者其他提示信息等。

1
2
<a id="btn1" href="#" data-i18n="[title]key.for.title"></a>
$("#btn1").localize();

设置多个属性

和设置单个属性类似,不过通过分号进行分隔,添加多个属性。

1
2
<a id="btn1" href="#" data-i18n="[title]key.for.title;myNamespace:key.for.text"></a>
$("#btn1").localize();

设置内部html的属性

1
2
<a id="btn1" href="#" data-i18n="[html]key.for.title"></a>
$("#btn1").localize();

添加前置内容

给一个元素原有内容前插入一些翻译文字

1
2
<a id="btn1" href="#" data-i18n="[prepend]key.for.title">insert before me, please!</a>
$("#btn1").localize();

添加后置内容

给一个元素原有内容后追加一些翻译文字

1
2
<a id="btn1" href="#" data-i18n="[append]key.for.title">append after me, please!</a>
$("#btn1").localize();

设置数据

1
2
<a id="btn1" href="#" data-i18n="[data-someDataAttribute]key.for.content"></a>
$("#btn1").localize();

参考

JavaScript国际化方案i18next的入门使用

JavaScript中实现国际化的方案有不少,从github上star数较多的选择角度,选择了i18Next库,生态比较全。

i18next的官方教程文档不够明了,记录一下入门使用,主要是加载自定义的多语言json文件。

拷贝官方的实例

1
https://github.com/i18next/jquery-i18next/blob/master/example/sample.html

将官方的实例放入Web服务器上,通过浏览器可直接访问。

此时的文字内容是通过js代码直接定义的,若是要添加其他的语言,直接在resources中添加即可。

增加对多语言json文件的支持

引入插件xhr backend

增加xhr配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
// path where resources get loaded from, or a function
// returning a path:
// function(lngs, namespaces) { return customPath; }
// the returned path will interpolate lng, ns if provided like giving a static path
loadPath: '/locales/{{lng}}/{{ns}}.json',

// path to post missing resources
addPath: 'locales/add/{{lng}}/{{ns}}',

// your backend server supports multiloading
// /locales/resources.json?lng=de+en&ns=ns1+ns2
allowMultiLoading: false,

// parse data after it has been fetched
// in example use https://www.npmjs.com/package/json5
// here it removes the letter a from the json (bad idea)
parse: function(data) { return data.replace(/a/g, ''); },

// allow cross domain requests
crossDomain: false,

// allow credentials on cross domain requests
withCredentials: false,

// define a custom xhr function
// can be used to support XDomainRequest in IE 8 and 9
ajax: function (url, options, callback, data) {}

// adds parameters to resource URL. 'example.com' -> 'example.com?v=1.3.5'
queryStringParams: { v: '1.3.5' }
}

使用xhr:

1
2
3
4
5
6
import i18next from 'i18next';
import XHR from 'i18next-xhr-backend';

i18next
.use(XHR)
.init(i18nextOptions);

增加json文件

增加json翻译文件:

1
2
3
locales/en/translation.json
locales/zh/translation.json
locales/dev/translation.json

切换语言

切换多语言,切换之后需要再调用localize函数。

1
2
3
4
5
6
var lan = i18next.language;
i18next.changeLanguage(lan == 'zh' ? "en" : "zh", (err, t) => {
// resources have been loaded
console.log("changeLanguage success: " + i18next.language);
$('.translation').localize();
});

缓存的问题

v1.4.1版本增加查询参数,可以控制浏览器的缓存。

使用方法:在配置项中增加以下的版本配置。

1
queryStringParams: { v: '1.3.5' }

【全文完】

–update 2017.5.14
增加v1.4.1版本的查询参数配置说明