做就是语言国际化,怎样改变第三方(MJmj下拉刷新上拉加载的文字)

主题 : 国际化与本地化(i18n)支持函数库(多语言)
级别: 新手上路
可可豆: 38 CB
威望: 29 点
在线时间: 34(时)
发自: Web Page
国际化与本地化(i18n)支持函数库(多语言)&&&
关键字:I18N,本地化,国际化,多语言代码类库:数据持久化(DataPersistence)GitHub链接:-Gettext-Supported
最近在研究项目多语言功能,发现了一套比较成熟的解决方案,就是GUN GETTEX。而且还有完善的编辑器 Poedit,于是就剩下在项目中解析使用翻译文件了。搜索发现 Boost 类库貌似有提供支持,可是又不想为此而使用这么庞大的一个类库。所以自己四处搜索了一些资料,写了这么一个配合 Poedit 软件,解析使用 gettext 翻译文件(*.mo),的解决方案功能类库。使用方法很简单:第一步:在代码中用关键字包装需要翻译的字符串。我做了一些扩展,支持的翻译种类功能有: 普通文本:        就是普通的一句字符串,一句话或者一个单词。例如: __(&Hello world!&)上下文文本:        有些时候一个词语存一词多意的情况,比如一个按钮上显示着 post,另一个标签上也显示着 post。他们的上下文环境不同意思也不一样。但是如果你直接把2个post单词丢给翻译直接去翻译,他一定也会拿不定的,而且直接用post在用在程序翻译哈希表key的话也会被覆盖掉一个的。所以这时候如果有个额外的上下文参数区分,那么就会很方便了。例如: _x(&post&, &A post.&); // 当翻译看到 A post,那么自然就知道这个地方的 post 需要翻译成 “文章”,而翻译并不需要关系这是我们程序中用在标签位置的 post。_x(&post&, &To post.&); // 看到 To post,翻译就很确切的知道这里的 post 需要翻译成 “发布”。单复数文本:        大家都知道很多语言是存在单复数格式的,比如说英语。那么数量不同,自然就需要用不同的格式进行显示。这个格式就会根据第三个变量参数的数量判断是需要使用单数格式还是复数格式显示了。 _n(&There is a comment.&, &There are comments.&, 1);_n(&There is a comment.&, &There are comments.&, 3);单复数 + 上下文:        顾名思义就是既有单复数的情况也存在需要区分上下文环境的情况。不举例了,示例代码中都有。除此之外,我写了一个额外的字符串格式化方法,类似于 printf 方法,只不过假如了为格式标记附带参数索引的功能。例如:i18nFormat(&c:%c1 d:%d2 f:%.2f3 s:%s4 %:%&, '@', 30, 3.1415, &str&);//c:@ d:30 f:3.14 s:str %:%)这个format格式后面增加了参数的索引标记,参数是从1开始依次计算的。这个功能有什么用的?比如,参数需要反复使用的情况:i18nFormat(&%s1.a = %s1.b = %s1.c = %s1.d = %d2&, &foo&, 7);//foo.a = foo.b = foo.c = foo.d = 18)参数需要无序使用的情况:i18nFormat(&[enable] %d1 & %d2; %d2 & %d3; %d3 & %d1&, 1, 3, 2);//1 & 3; 3 & 2; 2 & 1为什么要提提供这个功能呢?因为英文存在一个叫“倒装句”的语法。比如:英文原文:printf(&There are birds singing in the tree.&)翻译中文:printf(&小鸟在树上唱歌。&)如果唱歌和树是变量的话,那么这句话的翻译格式应该为:英文原文:printf(&There are birds %s in the %s.&, &singing&, &tree&)翻译中文:printf(&小鸟在%s上%s。&, &唱歌&, &树&)如果只是单纯的变量按照顺序替换的话,中文翻译过来就会变成:小鸟在[唱歌]上[树]。这时候就是发挥参数匹配foramat的优势了:英文原文:i18nFormatStr(&There are birds %s1 in the %s2.&, &singing&, &tree&)翻译中文:i18nFormatStr(&小鸟在%s2上%s2。&, &唱歌&, &树&)第二步:使用 Poedit 软件捕捉代码使用各种关键字包住的字符串,然后生成翻译清单。
Poedit是一款多平台的软件,有mac、win、liux版。可视化的编辑操作,管理维护起来十分很方便,而且很智能。比如注释的代码就不会去捕捉,而且代码中的翻译文字如果想要修改,只需要点击一下更新按钮就可以自动识别出变动,完全不需要人工调整原字符哪里做了改动,翻译字典那边也要记得同样修改。po文件是Poedit的编辑文件,而保存后将会编译生成二进制文件mo,即减少文件体积又可以达到一点加密的效果。第三步:用类库加载指定的 mo 文件即可。类库会自动解析文件并且生成一个翻译原文与翻译文对应的字符串哈希表提供给外部使用。使用者不需要关心实现细节,只需要写一句话即可实现:I18nUtils::getInstance()-&addMO(&res/zh_Hans.mo&, [](int){return 0;}, 1);
一开始我在做cocos2d-x项目的时候编写的,后来把代码独立抽离出来,所以现在类库不依赖cocos2d-x,可以适用于任何C++的游戏或者软件项目。当然cocos2d-x也是提供了支持接口的。所以该类库是 iOS、Android、MAC、Windows 和 Linux 多平台支持的C++解决方案。最后,我在 github 链接中分别提供了 xcode 以及 vs2012 的用例,以及如何使用 Poedit 的说明。方便大家围观测用。
    
(98 K) 下载次数:216
级别: 新手上路
可可豆: 38 CB
威望: 29 点
在线时间: 34(时)
发自: Web Page
忘记附上 Poedit 的下载地址了
关注本帖(如果有新回复会站内信通知您)
3*3+1 正确答案:10
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版人民日报报系
| |||||| |
直播|回放|回放|回放|
明星|&&&&&&&&&&&&&&
     &&&&           
舆情|&   报刊|&    数据|&  
用户体验反馈QQ群:
国内分站&|
全球分站&|
友情链接&|
镜像:&&&&&&&&&&&&呼叫热线&&&&服务邮箱&&&&&&违法和不良信息举报电话:010-
| 京公网安备号
人 民 网 版 权 所 有 ,未 经 书 面 授 权 禁 止 使 用Copyright &
by .cn. all rights reserved国际化(i18n)的原理
国际化(Internaltionalization)经常被用i18n简称,这是因为从国际化这个词从i到n之间有18个字母,为了避免打过多字就被简化为了i18n。国际化使得任何网站文本不是hard code在代码之中,因此在日后国际化的过程中不需要对原先的代码进行修改而只需要添加对应的文本翻译即可。
国际化的实现一种常用的方法是根据用户的语言设置偏好,将网页模版中的占位字符串替换成对应的语言翻译。比如可以在项目的根目录下设置/locales这样一个文件夹,里面放入以键值对形式存储的json string。如果用户的语言偏好设置是:zh_CN (中文),那么遇到模版的welcome占位符的时候,就替换为“欢迎”,此外还可以有其他不同语言的翻译。
一个通常的locale json文件格式如下:
//zh_CN.json:
"welcome": "欢迎!!"
基于用户登录状态、系统偏好设置的4层备选(Fallback)结构
刚才提到了用户的语言偏好设置为中文,那么偏好设置如何获取呢?假定一个具有用户账户系统的网站,一般来说有以下4个来源,依次作为上一个层次失效时的备选方案(Fallback):
登录用户账户的设置
用户cookie中存储的locale信息
用户的默认语言
网站的默认语言
在用户登录的情况下提取用户的语言偏好。如果检查到用户没有登录,但是cookie中保存了用户上次访问时设置的语言偏好,那么使用cookie中的语言偏好。如果用户的cookie中并没有关于locale的信息(一般来说是用户第一次访问或者清除了cookie数据),那么退一步使用用户的语言偏好,这一信息可以从请求头的Accept-language中提取。最后作为不得已在用户未发送任何信息的情况下,使用网站默认语言作为用户的偏好设置。
其中,使用1、3、4的情况下,端应在最后一步尝试设置浏览器的Cookie数据,以保证用户在下一次访问、或者切换登录状态时仍然能够按照之前的偏好设置获取网站服务。
使用i18n-node和handlebars的实现
nodejs的i18n-node提供了非常简单的i18n中间件,并且支持多种的模版实现。如果大家搜索可能还会看到i18n-node2这个package。它是对于早期i18n-node的一个扩展,由Jquery的John Resig实现,目前的i18n-node已经基本包含了这些内容。
下面的代码展示了如何使用i18n-node module结合handlebars的helper函数来实现基本的i18n。
这里的一个基本假设是,处理i18n是在获取了用户登录信息之后。关于如何使用express-session保存用户登录状态以提供连续的服务,可以参考这篇。
//server.js
var express = require('express'),
session = require('express-session'),
handlebars = require('express-handlebars'),
i18n = require('i18n'),
app = express();
//配置i18n
i18n.configure({
locales:['en', 'zh-CN'],
//声明包含的语言
directory: __dirname + '/locales',
//翻译json文件的路径
defaultLocale: 'en'
//默认的语言,即为上述标准4
// 设置app的模版引擎
app.engine('hbs', handlebars.create({
layoutsDir: 'templates/layouts',
partialsDir: 'templates/partials',
defaultLayout: 'default',
helpers: new require('helpers')(),
extname: '.hbs'
}).engine);
// 添加session处理的中间件
app.use(session({
secret: 'express is powerful'
// 添加setLocale中间件,注意必须在session之后
app.use(setLocale);
// 定义setLocale中间件
function setLocale(req, res, next){
// 当req进入i18n中间件的时候,已经通过sessionId信息获取了用户数据
// 获取用户数据中的locale数据
if(req.user){
locale = req.user.
// 获取cookie中的locale数据
else if(req.signedCookies['locale']){
locale = req.signedCookies['locale'];
// 获取浏览器第一个偏好语言,这个函数是express提供的
else if(req.acceptsLanguages()){
locale = req.acceptsLanguages();
// 没有语言偏好的时候网站使用的语言为中文
locale = 'zh_CN';
// 如果cookie中保存的语言偏好与此处使用的语言偏好不同,更新cookie中的语言偏好设置
if(req.signedCookies['locale'] !== locale){
res.cookie('locale', locale, { signed: true, httpOnly: true });
// 设置i18n对这个请求所使用的语言
req.setLocale(locale);
// 启动http server...省略部分代码
//helpers.js
var i18n = require('i18n');
module.exports = function() {
var _helpers = {};
// 声明handlebar中的i18n helper函数
// __函数不考虑单复数
_helpers.__ = function () {
return i18n.__.apply(this, arguments);
// __n函数考虑单复数
_helpers.__n = function () {
return i18n.__n.apply(this, arguments);
// templates/index.hbs
&h1&{{{__ "welcome"}}}&/h1&
这样就可以渲染出有“欢迎”两个字的页面了。这只是i18n-node最简单的用法,大家可以去i18n-node的看更多API信息
另外给大家推荐偶尔发现的一个网站Transifex,它使用众包的方式帮助你的网站做国际化,比起自己找朋友翻译,这个网站提供的方式是收集世界各地有兴趣来翻译的爱好群体帮你翻译,可以获得的语种和可靠性都还不错的样子。国际汉语教学的语言文字标准问题_李泉_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
国际汉语教学的语言文字标准问题_李泉
上传于||暂无简介
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
你可能喜欢

我要回帖

更多关于 mj刷新 的文章

 

随机推荐