codecamp

国际化翻译:为走向国际化提前做好翻译准备

Your new understanding has made you powerful. Please use your new powers for good.

1.25.1 固定的中文写法

一直以来,我们都是硬编码方式返回中文的文案或者提示,如:

$rs['msg'] = '用户不存在';

这种写法在项目根本不需要考虑国际化翻译时,是完全没问题的。

1.25.2 通用的翻译写法

当我们需要进行翻译时,可以这样进行调整:

$rs['msg'] = T('user not exists');

然后在对应的翻译文件中(如中文对应文件是:./Language/zh_cn/common.php)添加对应的翻译即可:

// $vim ./Language/zh_cn/common.php
return array(
    'user not exists' => '用户不存在',
);

(1)当存在动态变量时?

有时,我们需要动态返回一些值,这里可以用 大括号 将需要动态替换的值包住并提供替换的参数即可,一如:

echo T('hello {name}', array('name' => 'dogstar'));  

如果对应的中文翻译是:

'hello {name}' => '您好,{name}',

将会看到输出:

您好,dogstar

(2)当多个动态变量时,还可以这样省略变量名

如果要简化动态变量的传递,可以这样:

echo T('{0} I love you because {1}', array('PhalApi', 'no reasons'));

如果对应的中文翻译是:

'{0} I love you because {1}' => '{0} 我爱你因为{1}',

将会看到输出:

PhalApi 我爱你因为no reasons

(3)当翻译不存在时?

翻译不存在,有两种场景:一是指定的语言包不存在;二是语言包存在但翻译不存在。无论何种情况,找不到翻译时,都会用代码硬编码的内容返回。

1.25.3 语言的设定

当我们拥有了多种语言时,则可以在入口/初始化文件中,选择设定需要的语言。

SL('zh_cn');    //SL()函数等效于PhalApi_Translator::setLanguage()

参数即为语言包的路径名,如下面的en, zh_cn:

.
|-- en
|   `-- common.php
`-- zh_cn
    `-- common.php

此处,也可以通过客户端传递参数来自行选择语言。简单地:

SL($_GET['lan']);

1.25.4 添加语言翻译包

有时需要手动添加语言翻译包,因为对应的翻译不一定在项目的./Language下,如扩展类库。

当需要添加额外的语言翻译包时,可以这样添加:

        PhalApi_Translator::addMessage(API_ROOT . '/Library/User');

在User这个目录下的翻译包类似地,为:

./Language/
└── zh_cn
    └── common.php

1 directory, 1 file

相当于追加一个额外的项目路径,其他的加载过程和原来的一样。

1.25.5 建议

所以,你可以轻松看到,所谓的翻译也只是通过数组下标找一下对应的内容而已,没有太多的技术性,也没有过多的性能问题。

但正是有这样提前周到的国际化准备,我们可以对外(如像产品、BOSS和外界)传送这样一个隐喻: 我们的项目可以快速支持国际翻译
这听起来多么高大尚啊!因为那些不懂技术的人,根本不在乎是用PHP的数组来存放还是什么技术,而在于能不能走向国际化。

SO?既然翻译”无伤大雅“(指对性能的影响和对代码编写的阻碍),统一使用翻译的写法是值得推荐的。

即使项目没有机会用到真正的翻译,但至少有两点我认为也是有用的:

  • 1、便于产品维护接口返回的提示文案;
  • 2、被同行问到时,你们有支持i18n吗?我们也可以笑着回答:有 ^_^ ;

缓存策略:更灵活地可配置化的多级缓存
数据安全:数据对称加密方案
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

八、视频教程

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }