迷失在yii2模块i18n翻译中
我试图将多语言功能添加到我在俄语中找到的模块中,但当我尝试实现它时遇到了问题,可能是配置问题,不确定 我像平常一样在应用程序中进行文本替换: “部门”=>Yii::t(“应用程序”、“部门”) 然后我用message命令生成了翻译文件,到目前为止一切正常,我得到了正确的结构:迷失在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中添加
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',
],