MVC 教程
国际化
如果你想要创建一个面向国际用户的站点,你可能会需要为站点的通用字符提供本地化的版本, 包括导航,表单标签,按钮标签等等。另外某些站点可能还需要提供本地化的路由。
Laminas 提供了国际化 (i18n) 工具组件 laminas-i18n, 并同时为 laminas-mvc 提供了 laminas-mvc-i18n 组件。
安装
使用 Composer 安装 laminas-mvc-i18n:
$ composer require laminas/laminas-mvc-i18n
假设你使用的是 laminas-component-installer
(默认情况下会随着 skeleton application 一起安装),
他将提示你将组件作为一个模块安装到应用中,
并让你选择本地的 application.config.php
或者 modules.config.php
文件。
一单安装,组件将会注册几个服务,包括:
MvcTranslator
, 实现了 laminas-i18nTranslatorInterface
, 以及提供了课用于应用上下文的特定 laminas-validator。- 一个 "translator aware" 路由。
默认情况下,在你配置翻译之前,安装并不会提现任何效果。 所以接下来我们就需要在应用中创建并使用翻译。
创建翻译
laminas-i18n Translation chapter 一章详细介绍了如果再应用中添加翻译。 你可以使用 PHP 数组,INI 文件或者通用的 gettext 包 (允许你使用行业通用工具例如poedit 来编辑翻译)。
一单你拥有了翻译资源,就需要将其放在应用中的某个位置以便访问,包括:
- 在一个模块的子目录中,例如:
module/Application/language/
。 - 在应用的 data 目录中; e.g.,
data/language/
.
同时确保你在命名文件的时候遵循 laminas-i18n 文档的准则。 另外,你可能需要按照文本域进一步分割子目录。
当你需要配置翻译使用你的文件时。就需要在模块或者应用程序中添加配置,包括:
- 如果没有提供配置情况下的默认语言。
- 翻译文件的格式,包括:
- 翻译资源类型 (e.g.,
gettext
,phparray
,ini
) - 默认存储的路径
- 用于识别需要使用文件的格式
例如:
// in a module's module.config.php:
'translator' => [
'locale' => 'en_US',
'translation_file_patterns' => [
[
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
],
],
],
// or in config/autoload/global.php:
'translator' => [
'locale' => 'en_US',
'translation_file_patterns' => [
[
'type' => 'gettext',
'base_dir' => getcwd() . '/data/language',
'pattern' => '%s.mo',
],
],
],
一旦进行了如上配置,翻译将会在应用中生效,并允许我们使用了。
在模板中翻译字符串
一旦你定义个翻译的字符,并在应用中进行了配置,你就可以在应用中使用他们了。
视图助手
translate()
和 translatePlural()
允许你在视图脚本中使用翻译。
举个例子,你可能会需要在页脚翻译 "All rights reserved"。那么就可以按照如下方式操作:
<p>© 2016 by Examples Ltd. <?= $this->translate('All rights reserved') ?></p>
翻译路由参数
为了在路由中使用翻译,你可能需要做如下两个操作: In order to enable route translation, you need to do two things:
- 告诉路由使用 translation-aware 路由类。
- (可选)告诉它要使用哪个文本域(如果不使用默认文本域的话)。
我们可以更新路由配置已告知路由使用 translation-aware 路由类。
在最上层的 router
key 中,添加 router_class
key:
// In a module.config.php file, or config/autoload/global.php:
'router' => [
'router_class' => Laminas\Mvc\I18n\Router\TranslatorAwareTreeRouteStack::class,
'routes' => [
/* ... */
],
],
如果你需要使用备用额度文本域,你可以在 router
中配置 translator_text_domain
(如果不配置,默认值为default):
// In a module.config.php file, or config/autoload/global.php:
'router' => [
'router_class' => Laminas\Mvc\I18n\Router\TranslatorAwareTreeRouteStack::class,
'translator_text_domain' => 'router',
'routes' => [
/* ... */
],
],
现在路由就可以使用翻译功能了,我们可以在路由中使用翻译字符。
为此,请使用大扩展 ({}
) 扩住需要翻译的字符。例如:
'route' => '/{login}',
单词 "login" 将会被翻译。
发现错误或者想为此文档做贡献? 来 GitHub 编辑!