迷失在yii2模块i18n翻译中

迷失在yii2模块i18n翻译中,yii2,internationalization,yii2-advanced-app,yii2-module,Yii2,Internationalization,Yii2 Advanced App,Yii2 Module,我试图将多语言功能添加到我在俄语中找到的模块中,但当我尝试实现它时遇到了问题,可能是配置问题,不确定 我像平常一样在应用程序中进行文本替换: “部门”=>Yii::t(“应用程序”、“部门”) 然后我用message命令生成了翻译文件,到目前为止一切正常,我得到了正确的结构: vendor/rico/yii2-ticket/messages/en/app.php vendor/rico/yii2-ticket/messages/es/app.php 然后我在yii2票证模块文件的init中添加

我试图将多语言功能添加到我在俄语中找到的模块中,但当我尝试实现它时遇到了问题,可能是配置问题,不确定

我像平常一样在应用程序中进行文本替换:

“部门”=>Yii::t(“应用程序”、“部门”)

然后我用message命令生成了翻译文件,到目前为止一切正常,我得到了正确的结构:

vendor/rico/yii2-ticket/messages/en/app.php
vendor/rico/yii2-ticket/messages/es/app.php
然后我在yii2票证模块文件的init中添加了一个函数:

public function init() {
    User::$user = ($this->userModel !== false) ? $this->userModel : Yii::$app->user->identityClass;
    parent::init();
    $this->registerTranslations();
}
/**
 * Registration of translation class.
 */
protected function registerTranslations()
{
    Yii::$app->i18n->translations['ricco/ticket'] = [
        'class' => 'yii\i18n\PhpMessageSource',
        'sourceLanguage' => 'en',
        'basePath' => '@ricco/ticket/messages',
        'fileMap' => [
            'ricco/ticket' => 'app.php',
        ],
    ];
}
我正在基于到高级应用程序的yii2应用程序中使用此模块,在配置文件中,我有以下内容:

$config = [
'name' => 'London Literary Scouts',
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'extensions' => require(__DIR__ . '/../../vendor/yiisoft/extensions.php'),
'sourceLanguage' => 'en',
'language' => 'en',
'bootstrap' => ['log'],
'modules' => [
    'treemanager' => [
        'class' => '\kartik\tree\Module',
    // other module settings, refer detailed documentation
    ],
    'newsletter' => [
        'class' => 'tikaraj21\newsletter\Newsletter',
    ],
    'comment' => [
        'class' => 'yii2mod\comments\Module',
    ],
    'ticket' => [
        'class' => 'ricco\ticket\Module'
    ],
],

在开发模式下运行应用程序时,日志中没有任何错误

但是,如果我将en/app.php文件复制到我的应用程序的common/messages/en文件夹中,它就会工作

但是我想让翻译从模块中运行,这样其他人就可以在通用配置中使用它

编辑 在对csminb的答案进行分析和理解之后,我从我的主应用程序中删除了所有的i18n配置

1-我对模块中的所有翻译进行了如下编码:

<?= Yii::t('ticket', 'Go back') ?>
])

4-运行消息命令

./yii message/config @app/config/i18n-ricco.php
message命令生成了包含ticket.php文件的所有语言文件夹

5-在模块的init函数中添加了配置:

    /**
 * @inheritdoc
 */
public function init() {
    User::$user = ($this->userModel !== false) ? $this->userModel : Yii::$app->user->identityClass;
    parent::init();
    $this->registerTranslations();
}
/**
 * Registration of translation class.
 */
protected function registerTranslations()
{
    Yii::$app->i18n->translations['ticket'] = [
        'class' => 'yii\i18n\PhpMessageSource',
        'sourceLanguage' => 'en',
        'basePath' => '@ricco/ticket/messages',
        'fileMap' => [
          'ticket' => 'ticket.php',
        ],
    ];
}

在这里加上我上一条评论


如果您想进行单独的模块转换,我会对该模块中的任何内容使用不同于应用程序的作用域,并在模块初始化时将该作用域添加到应用程序中

您没有收到错误的原因很可能是配置中的
*

```

```

在模块中设置翻译文件后
/common/modules/Ticket/messages/en/Ticket.php
确保在初始化模块时添加此消息源

/common/modules/Ticket/Module.php

... 

public function init()
{
    parent::init();
    if (!isset(Yii::$app->i18n->translations['ticket'])) {
        Yii::$app->i18n->translations['ticket'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en',
            'basePath' => '@vendor/rico/ticket/messages'
        ];
    }
}
通过这种方式,只需包含模块,它将添加模块特定的翻译,而不会干扰您的应用程序配置

编辑: 更新到
@vendor/rico
,(
@rico
如果设置了别名,也可以使用)
同时,另一件可能引起混淆的事情是示例中的
fileMap

```


除非翻译文件太大而无法管理,或者它们的名称太冗长(),否则我看不出有任何理由使用它,标准名称映射要简单得多

如果您想进行单独的模块翻译,我将使用与
app
不同的范围来处理该模块中的任何内容,并在模块初始化时将该范围添加到应用程序中。我用ticket.php更改了app.php,并在主应用程序中添加了ticket配置,指向供应商文件夹,但仍然没有获得翻译文件,或者在fromHi工作时出现错误,感谢您的回答,我不能完全使用这段代码,因为正如我在问题的文件夹结构中所显示的,我在供应商中有模块,而不是在我的应用程序模块中。我尝试调整路径,但仍然没有得到文件,如果我删除了i18n配置中的*,我不会得到任何错误
    /**
 * @inheritdoc
 */
public function init() {
    User::$user = ($this->userModel !== false) ? $this->userModel : Yii::$app->user->identityClass;
    parent::init();
    $this->registerTranslations();
}
/**
 * Registration of translation class.
 */
protected function registerTranslations()
{
    Yii::$app->i18n->translations['ticket'] = [
        'class' => 'yii\i18n\PhpMessageSource',
        'sourceLanguage' => 'en',
        'basePath' => '@ricco/ticket/messages',
        'fileMap' => [
          'ticket' => 'ticket.php',
        ],
    ];
}
'i18n' => [
    'translations' => [
        'app' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'basePath' => '@common/messages',
        ],
        // you could remove this (at least in your local dev to make sure errors will be thrown if files are not setup)
        '*' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'basePath' => '@common/messages',
            'fileMap' => [
                'common' => 'common.php',
                'backend' => 'backend.php',
                'frontend' => 'frontend.php',
            ],
            'on missingTranslation' => ['\backend\modules\i18n\Module', 'missingTranslation']
     ]
]
... 

public function init()
{
    parent::init();
    if (!isset(Yii::$app->i18n->translations['ticket'])) {
        Yii::$app->i18n->translations['ticket'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en',
            'basePath' => '@vendor/rico/ticket/messages'
        ];
    }
}
// this is hard to make sense of, :
// it's a category named `rico/ticket` will point to @vendor/rico/ticket/messages/en/app.php 
// are you usinging it like this? Yii:t('rico/ticket', 'sample') 
'fileMap' => [
    'ricco/ticket' => 'app.php',
],