0

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

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

'部门' => Yii::t('app', '部门'),

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

vendor/rico/yii2-ticket/messages/en/app.php
vendor/rico/yii2-ticket/messages/es/app.php

然后我在 yii2-ticket 模块文件的 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'
    ],
],

...

    'i18n' => [
        'translations' => [
            'app' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@common/messages',
            ],
            '*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@common/messages',
                'fileMap' => [
                    'common' => 'common.php',
                    'backend' => 'backend.php',
                    'frontend' => 'frontend.php',
                ],
                'on missingTranslation' => ['\backend\modules\i18n\Module', 'missingTranslation']
            ],

在开发模式下运行应用程序我在日志中没有收到任何错误。

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

但我希望从模块中运行翻译,以便其他人可以基于一般配置使用它。

已编辑

在玩弄并从 csminb 答案中理解之后,我从我的主应用程序中删除了所有 i18n 配置。

1-我在模块硬编码文本中进行了所有翻译,如下所示:

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

2- 在我的控制台/配置文件夹中创建配置文件 ./yii message/config @app/config/i18n-ricco.php

3-编辑添加语言和正确的路径

return [
'color' => null,
'interactive' => true,
'help' => null,
'sourcePath' => '@vendor/ricco/yii2-ticket',
'messagePath' => '@vendor/ricco/yii2-ticket/messages',
'languages' => ['en','ru','es'],
'translator' => 'Yii::t',
'sort' => false,
'overwrite' => true,
'removeUnused' => false,
'markUnused' => true,
'except' => [
    '.svn',
    '.git',
    '.gitignore',
    '.gitkeep',
    '.hgignore',
    '.hgkeep',
    '/messages',
    '/BaseYii.php',
],
'only' => [
    '*.php',
],
'format' => 'php',
'db' => 'db',
'sourceMessageTable' => '{{%source_message}}',
'messageTable' => '{{%message}}',
'catalog' => 'messages',
'ignoreCategories' => [],

];

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',
        ],
    ];
}
4

1 回答 1

0

在这里添加我的上一条评论

如果您想要单独的模块翻译,我会为该模块中的任何内容使用与 app 不同的范围,并在模块初始化时将该范围添加到应用程序中。

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

```

'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']
     ]
]

```

在模块中设置翻译文件后,请 /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在您的示例中。

```

// 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',
],

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

于 2017-06-23T14:32:55.523 回答