ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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)中有更多适用于此组件的适配器