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-i18n TranslatorInterface, 以及提供了课用于应用上下文的特定 laminas-validator。
  • 一个 "translator aware" 路由。

默认情况下,在你配置翻译之前,安装并不会提现任何效果。 所以接下来我们就需要在应用中创建并使用翻译。

创建翻译

laminas-i18n Translation chapter 一章详细介绍了如果再应用中添加翻译。 你可以使用 PHP 数组,INI 文件或者通用的 gettext 包 (允许你使用行业通用工具例如poedit 来编辑翻译)。

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>&copy; 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 编辑!