多语言支持
最后更新于:2022-04-02 05:15:49
[TOC]
# 多语言支持
`Phalcon\Translate` 组件有助于创建多语言应用程序。使用此组件的应用程序,根据应用程序支持的用户所选语言显示不同语言的内容。
## 适配器
该组件使用适配器以统一的方式读取来自不同源的翻译消息。
| 适配器 | 描述 |
| ------------------------------------------ | --------------------------------------------------------------------------------------- |
| `Phalcon\Translate\Adapter\NativeArray` | 使用PHP数组来存储消息。这是性能方面的最佳选择。|
### 工厂
使用适配器选项加载Translate Adapter类
```php
'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
'Hello',
'bye' => 'Good Bye',
'hi-name' => 'Hello %name%',
'song' => 'This song is %song%',
];
```
```php
'Bonjour',
'bye' => 'Au revoir',
'hi-name' => 'Bonjour %name%',
'song' => 'La chanson est %song%',
];
```
在您的应用程序中实现转换机制是微不足道的,但取决于您希望如何实现它。您可以使用用户浏览器中的语言自动检测,也可以提供用户可以选择语言的设置页面。
检测用户语言的一种简单方法是解析 `$_SERVER['HTTP_ACCEPT_LANGUAGE']` 内容,或者如果您愿意,可以通过从动作/控制器调用 `$this->request->getBestLanguage()` 来直接访问它:
```php
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
_('hi'), ' ', $name; ?>
``` `_()` 方法根据传递的索引返回已翻译的字符串。某些字符串需要包含计算数据的占位符,即`Hello %name%`。可以使用`_()`方法中的传递参数替换这些占位符。传递的参数采用 key/value 数组的形式,其中键与占位符名称匹配,值是要替换的实际数据: ```php_('hi-name', ['name' => $name]); ?>
``` 一些应用程序在URL上实现多语言,例如 `http://www.mozilla.org/**es-ES**/firefox/`。Phalcon可以使用路由器实现这一点。 上面的实现很有帮助,但它需要一个基本控制器来实现 `_getTranslation()` 并返回 `Phalcon\Translate\Adapter\NativeArray` 组件。另外,需要在视图中设置组件,如上面 `$t` 变量中所示。 您始终可以将此功能包装在自己的类中,并在DI容器中注册该类: ```php request->getBestLanguage(); /** * 我们使用基于JSON的文件来存储翻译。 * 您需要检查文件是否存在! */ $translations = json_decode( file_get_contents('app/messages/' . $language . '.json'), true ); // 返回翻译对象$messages来自上面的require语句 return new NativeArray( [ 'content' => $translations, ] ); } } ``` 这样您就可以在控制器中使用该组件: ```php locale->_('hi-name', ['name' => $name]); $this->view->text = $text; } } ``` 或直接查看 ```php _('hi-name', ['name' => 'Mike']); ``` ## 实现自己的适配器 必须实现 `Phalcon\Translate\AdapterInterface` 接口才能创建自己的转换适配器或扩展现有转换适配器: ```php ';