[TOC]
# 多语言支持
`Phalcon\Translate` 组件有助于创建多语言应用程序。使用此组件的应用程序,根据应用程序支持的用户所选语言显示不同语言的内容。
## 适配器
该组件使用适配器以统一的方式读取来自不同源的翻译消息。
| 适配器 | 描述 |
| ------------------------------------------ | --------------------------------------------------------------------------------------- |
| `Phalcon\Translate\Adapter\NativeArray` | 使用PHP数组来存储消息。这是性能方面的最佳选择。|
### 工厂
使用适配器选项加载Translate Adapter类
```php
<?php
use Phalcon\Translate\Factory;
$options = [
'locale' => 'de_DE.UTF-8',
'defaultDomain' => 'translations',
'directory' => '/path/to/application/locales',
'category' => LC_MESSAGES,
'adapter' => 'gettext',
];
$translate = Factory::load($options);
```
## 使用组件
翻译字符串存储在文件中。这些文件的结构可能因使用的适配器而异。Phalcon让您可以自由地组织翻译字符串。一个简单的结构可能是:
```bash
app/messages/en.php
app/messages/es.php
app/messages/fr.php
app/messages/zh.php
```
每个文件都以键/值的方式包含一系列翻译。对于每个翻译文件,密钥都是唯一的。在不同的文件中使用相同的数组,其中键保持不变,值包含取决于每种语言的翻译字符串。
```php
<?php
// app/messages/en.php
$messages = [
'hi' => 'Hello',
'bye' => 'Good Bye',
'hi-name' => 'Hello %name%',
'song' => 'This song is %song%',
];
```
```php
<?php
// app/messages/fr.php
$messages = [
'hi' => 'Bonjour',
'bye' => 'Au revoir',
'hi-name' => 'Bonjour %name%',
'song' => 'La chanson est %song%',
];
```
在您的应用程序中实现转换机制是微不足道的,但取决于您希望如何实现它。您可以使用用户浏览器中的语言自动检测,也可以提供用户可以选择语言的设置页面。
检测用户语言的一种简单方法是解析 `$_SERVER['HTTP_ACCEPT_LANGUAGE']` 内容,或者如果您愿意,可以通过从动作/控制器调用 `$this->request->getBestLanguage()` 来直接访问它:
```php
<?php
use Phalcon\Mvc\Controller;
use Phalcon\Translate\Adapter\NativeArray;
class UserController extends Controller
{
protected function getTranslation()
{
// 询问浏览器什么是最好的语言
$language = $this->request->getBestLanguage();
$messages = [];
$translationFile = 'app/messages/' . $language . '.php';
// 检查我们是否有该lang的翻译文件
if (file_exists($translationFile)) {
require $translationFile;
} else {
// 回退到某些默认值
require 'app/messages/en.php';
}
// 返回翻译对象$messages来自上面的require语句
return new NativeArray(
[
'content' => $messages,
]
);
}
public function indexAction()
{
$this->view->name = 'Mike';
$this->view->t = $this->getTranslation();
}
}
```
`_getTranslation()` 方法适用于需要翻译的所有操作。`$t` 变量传递给视图,有了它,我们可以翻译该层中的字符串:
```php
<!-- welcome -->
<!-- String: hi => 'Hello' -->
<p><?php echo $t->_('hi'), ' ', $name; ?></p>
```
`_()` 方法根据传递的索引返回已翻译的字符串。某些字符串需要包含计算数据的占位符,即`Hello %name%`。可以使用`_()`方法中的传递参数替换这些占位符。传递的参数采用 key/value 数组的形式,其中键与占位符名称匹配,值是要替换的实际数据:
```php
<!-- welcome -->
<!-- String: hi-name => 'Hello %name%' -->
<p><?php echo $t->_('hi-name', ['name' => $name]); ?></p>
```
一些应用程序在URL上实现多语言,例如 `http://www.mozilla.org/**es-ES**/firefox/`。Phalcon可以使用路由器实现这一点。
上面的实现很有帮助,但它需要一个基本控制器来实现 `_getTranslation()` 并返回 `Phalcon\Translate\Adapter\NativeArray` 组件。另外,需要在视图中设置组件,如上面 `$t` 变量中所示。
您始终可以将此功能包装在自己的类中,并在DI容器中注册该类:
```php
<?php
use Phalcon\Mvc\User\Component;
use Phalcon\Translate\Adapter\NativeArray;
class Locale extends Component
{
public function getTranslator()
{
// 询问浏览器什么是最好的语言
$language = $this->request->getBestLanguage();
/**
* 我们使用基于JSON的文件来存储翻译。
* 您需要检查文件是否存在!
*/
$translations = json_decode(
file_get_contents('app/messages/' . $language . '.json'),
true
);
// 返回翻译对象$messages来自上面的require语句
return new NativeArray(
[
'content' => $translations,
]
);
}
}
```
这样您就可以在控制器中使用该组件:
```php
<?php
use Phalcon\Mvc\Controller;
class MyController extends Controller
{
public function indexAction()
{
$name = 'Mike';
$text = $this->locale->_('hi-name', ['name' => $name]);
$this->view->text = $text;
}
}
```
或直接查看
```php
<?php echo $locale->_('hi-name', ['name' => 'Mike']);
```
<a name='custom'></a>
## 实现自己的适配器
必须实现 `Phalcon\Translate\AdapterInterface` 接口才能创建自己的转换适配器或扩展现有转换适配器:
```php
<?php
use Phalcon\Translate\AdapterInterface;
class MyTranslateAdapter implements AdapterInterface
{
/**
* Adapter constructor
*
* @param array $options
*/
public function __construct(array $options);
/**
* @param string $translateKey
* @param array|null $placeholders
* @return string
*/
public function t($translateKey, $placeholders = null);
/**
* 返回给定的key翻译字符串
*
* @param string $translateKey
* @param array $placeholders
* @return string
*/
public function _(string $translateKey, $placeholders = null): string;
/**
* 返回与给定的key相关的转换
*
* @param string $index
* @param array $placeholders
* @return string
*/
public function query(string $index, $placeholders = null): string;
/**
* 检查是否在内部数组中定义了转换key
*
* @param string $index
* @return bool
*/
public function exists(string $index): bool;
}
```
[Phalcon Incubator](https://github.com/phalcon/incubator/tree/master/Library/Phalcon/Translate/Adapter)中有更多适用于此组件的适配器
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持