_Your new understanding has made you powerful. Please use your new powers for good._
##1.25.1 固定的中文写法
一直以来,我们都是硬编码方式返回中文的文案或者提示,如:
```javascript
$rs['msg'] = '用户不存在';
```
这种写法在项目根本不需要考虑国际化翻译时,是完全没问题的。
##1.25.2 通用的翻译写法
当我们需要进行翻译时,可以这样进行调整:
```javascript
$rs['msg'] = T('user not exists');
```
然后在对应的翻译文件中(如中文对应文件是:./Language/zh_cn/common.php)添加对应的翻译即可:
```javascript
// $vim ./Language/zh_cn/common.php
return array(
'user not exists' => '用户不存在',
);
```
###(1)当存在动态变量时?
有时,我们需要动态返回一些值,这里可以用 **大括号** 将需要动态替换的值包住并提供替换的参数即可,一如:
```javascript
echo T('hello {name}', array('name' => 'dogstar'));
```
如果对应的中文翻译是:
```javascript
'hello {name}' => '您好,{name}',
```
将会看到输出:
```javascript
您好,dogstar
```
###(2)当多个动态变量时,还可以这样省略变量名
如果要简化动态变量的传递,可以这样:
```javascript
echo T('{0} I love you because {1}', array('PhalApi', 'no reasons'));
```
如果对应的中文翻译是:
```javascript
'{0} I love you because {1}' => '{0} 我爱你因为{1}',
```
将会看到输出:
```javascript
PhalApi 我爱你因为no reasons
```
###(3)当翻译不存在时?
翻译不存在,有两种场景:一是指定的语言包不存在;二是语言包存在但翻译不存在。无论何种情况,找不到翻译时,都会用代码硬编码的内容返回。
##1.25.3 语言的设定
当我们拥有了多种语言时,则可以在入口/初始化文件中,选择设定需要的语言。
```javascript
SL('zh_cn'); //SL()函数等效于PhalApi_Translator::setLanguage()
```
参数即为语言包的路径名,如下面的en, zh_cn:
```javascript
.
|-- en
| `-- common.php
`-- zh_cn
`-- common.php
```
此处,也可以通过客户端传递参数来自行选择语言。简单地:
```javascript
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吗?我们也可以笑着回答:有 ^_^ ;
- 欢迎使用PhalApi!
- 接口,从简单开始!
- [1.1]-下载与安装
- [1.2]-创建一个自己的项目
- [1.3]-在线体验
- [1.4]-文档、帮助和官网
- [1.10]-对PhalApi框架的抉择
- [1.11]-快速入门(backup)
- [1.12]-参数规则:接口参数规则配置
- [1.13]-统一的接口请求方式:_sevice=XXX.XXX
- [1.14]-统一的返回格式和结构:ret-data-msg
- [1.15]-数据库操作:基于NotORM的使用及优化
- [1.16]-配置读取:内外网环境配置的完美切换
- [1.17]-日记纪录:简化版的日记接口
- [1.18]-快速函数:人性化的关怀
- [1.19]-DI服务速查:各资源服务一览表
- [1.20]-DB操作:数据库基本操作速查
- [1.21]-类的自动加载:遵循PEAR包的命名规范
- [1.22]-签名验证:自定义签名规则
- [1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回
- [1.24]-缓存策略:更灵活地可配置化的多级缓存
- [1.25]-国际化翻译:为走向国际化提前做好翻译准备
- [1.26]-数据安全:数据对称加密方案
- [1.27]-精益开发:更富表现力的Model层和重量级数据获取的应对方案
- [1.28]-COOKIE:对COOKIE原生态的支持及记忆加密升级版
- [1.29]-开放与封闭:多入口和统一初始化
- [1.30]-保持的力量:接口开发最佳实践
- [1.31]-新型计划任务:以接口形式实现的计划任务
- [2.11]-核心思想:DI依赖注入-让资源更可控
- [2.12]-海量数据:可配置的分库分表
- [2.13]-接口调试:在线SQL语句查看与性能优化
- [2.14]-测试驱动开发:意图导向编程下的接口开发
- [2.15]-演进:新型计划任务续篇
- [2.16]-领域驱动设计:应对复杂领域业务的Domain层
- [2.17]-微服务:Api接口服务层
- [2.18]-定制化:资源服务的再实现
- [2.19]-扩展库:可重用的扩展类库
- [2.20]-约定编程:架构明显的编程风格
- [2.21]-服务器统一部署方案简明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益项目和团队建设
- [3.1]-扩展类库:微信开发
- [3.2]-扩展类库:代理模式下phprpc协议的轻松支持
- [3.3]-扩展类库:基于PHPMailer的邮件发送
- [3.4]-扩展类库:优酷开放平台接口调用
- [3.5]-扩展类库:七牛云存储接口调用
- [3.6]-扩展类库:新型计划任务
- [3.8]-扩展类库:用户、会话和第三方登录集成
- [3.9]-扩展类库:swoole支持下的长链接和异步任务实现
- [3.11]-扩展类库:基于FastRoute的快速路由
- [4.2]-开发实战2:模拟优酷开放平台接口项目开发
- [4.3]-开发实战3:一个简单的小型项目开发(奔跑吧兄弟投票活动)
- [5.1]-架构与思想:PhalApi核心设计和思想解读
- [5.2]-杂谈:扯一些PhalApi的前世和今生
- [5.3]-框架总结:术语表和PHP开发建议
- [5.4]-许可
- [5.5]-联系和加入我们
- [5.6]-更新日记
- [5.8]-致框架贡献者:加入PhalApi开源指南
- [6.1]-基于接口查询语言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi视频教程
- 附录1:接口文档参考模板