多语言支持

最后更新于: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 ';