覆盖yii2上模块的转换路径

mey*_*sam 8 php yii yii2

假设我Foo使用composer 将模块安装在一个存储库中.模块结构如下:

- Foo
 |- models
 |- controllers
 |- views
 |- messages
 |- config
Run Code Online (Sandbox Code Playgroud)

MessagesFoo包含模块翻译文件的文件夹.现在我想覆盖一些翻译字符串Foo.从Yii2 i18n文档我尝试在配置翻译组件时使用fileMap属性将bar类别映射到bar.php(而不是从中读取app\modules\Foo\messages),但它对翻译没有任何影响.我的i18n组件配置是:

'i18n' => [
    'translations' => [
        '*' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'fileMap' => [
                'bar' => 'bar.php'
            ],
        ],
    ],
],
Run Code Online (Sandbox Code Playgroud)

我如何实现目标?

Joe*_*ler 3

如果您希望模块中包含的每个模块都有翻译,那么您需要注册该模块的翻译。它不能简单地通过配置文件来完成。您的模块文件中可能已经有这个,我只是为了完整性而将其包含在内。代码是从文档中复制的,并且需要位于您的模块文件中,因此在app/modules/Foo.php

<?php

namespace app\modules\foo;

use Yii;

class Module extends \yii\base\Module
{
    public $controllerNamespace = 'app\modules\foo\controllers';

    public function init()
    {
        parent::init();
    /** Register custom translations for this module **/
        $this->registerTranslations();
    }

    public function registerTranslations()
    {

    /**This registers translations for the Foo module **/
        Yii::$app->i18n->translations['modules/foo/*'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en-US',
            'basePath' => '@app/modules/foo/messages',

    /**Tells yii where to find the translations for validation and form categories **/
            'fileMap' => [
                'modules/foo/validation' => 'validation.php',
                'modules/foo/form' => 'form.php',
                ...
            ],
        ];
    }

    public static function t($category, $message, $params = [], $language = null)
    {
        return Yii::t('modules/users/' . $category, $message, $params, $language);
    }

}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您似乎不需要提供文件映射。您可以简单地为您的文件使用这种格式

[[basePath]]/LanguageID/CategoryName.php
Run Code Online (Sandbox Code Playgroud)

不幸的是,我似乎无法找到可用类别的列表。

如果您想覆盖某些模块翻译,您将需要指定要使用的类别,就像在配置文件中一样。它专门覆盖了 module/foo/bar 类别。

'i18n' => [
    'translations' => [
        'modules/foo*' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'basePath' => '@app/messages',
        ],
    ],
],
Run Code Online (Sandbox Code Playgroud)

您的翻译文件需要遵循翻译描述中的文件夹结构,因此在上面的示例中它将是

app/messages/ [language code] /modules/foo/bar.php
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用fileMap映射到不同的位置,例如您的 bar.php 文件位于 app/messages/[语言代码] 中

'fileMap' => [
'modules/foo/bar' => 'bar.php'
]
Run Code Online (Sandbox Code Playgroud)