假设我使用composer安装了模块Foo
。模块结构如下:
- Foo
|- models
|- controllers
|- views
|- messages
|- config
Messages
的{{1}}文件夹包含模块的翻译文件。现在我想覆盖Foo
的一些翻译字符串。从Yii2 i18n Documentation我尝试在配置翻译组件时使用fileMap属性将Foo
类别映射到bar
(而不是从bar.php
读取),但它没有任何效果在翻译上。我的i18n组件配置是:
app\modules\Foo\messages
我如何实现目标?
答案 0 :(得分: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);
}
}
在您的情况下,您似乎不需要提供文件映射。您可以将此格式用于您的文件
[[basePath]]/LanguageID/CategoryName.php
不幸的是,我似乎无法找到可用类别的列表。
如果您想要覆盖某些模块转换,则需要指定要使用的类别,如配置文件中所示。它专门覆盖modules / foo / bar类别。
'i18n' => [
'translations' => [
'modules/foo*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages',
],
],
],
您的翻译文件需要遵循翻译说明中的文件夹结构,因此在上面的示例中,它将是
app/messages/ [language code] /modules/foo/bar.php
其他,您可以使用fileMap
映射到不同的位置,例如您的bar.php文件位于app / messages / [语言代码]
'fileMap' => [
'modules/foo/bar' => 'bar.php'
]