sourceLanguage中的翻译在Yii2应用程序中不起作用

tre*_*der 6 translation yii2

我在我的Yii2应用程序中使用基于关键字的翻译(我知道,这不是最佳选择,但我没有其他选项).我准备@app/messages/pl/app.php@app/messages/en/app.php使用关键字翻译字符串的文件,而不是全功能的句子或单词:

<?php
    return [
        'name_english'=>'Name in English',
        'keywords_english'=>'Keywords in English'
    ];
?>
Run Code Online (Sandbox Code Playgroud)

我已将我的应用程序设置为默认使用波兰语:

'language' => 'pl',
'sourceLanguage' => 'en',
Run Code Online (Sandbox Code Playgroud)

我正在调用翻译:

Yii::t('app', 'keywords_english');
Run Code Online (Sandbox Code Playgroud)

一切正常,当语言实际设置为base,Polish(pl)时:

在此输入图像描述

但是,当我将其更改为英语时(en;通过Yii::$app->language在运行时或通过更改应用程序配置进行设置),不执行翻译,我得到keywords_english:

在此输入图像描述

我已经把文件die()开头了@app/messages/pl/app.php,@app/messages/en/app.php我可以清楚地看到,当语言设置为英语时,Yii2不包含第二个文件(应用程序运行如下),而当语言为波兰语时,包含第一个文件并且应用程序流动打破了die().

我错过了什么?@app/messages/en/app.php如果语言设置为英语(en),为什么Yii2不使用文件中的翻译?

编辑:默认情况下,我没有改变i18n我的应用程序配置中的默认组件配置,因为我发现没有必要.翻译文件存储在默认位置(@app/messages/<language>/)并使用默认的class(yii\i18n\PhpMessageSource).这适用于所有语言,除了sourceLanguage.在某些时候,我试图改变配置:

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

但是,它没有带来任何变化(为什么它应该 - 它仍然使用默认设置).

tre*_*der 7

根据Yii论坛的samdark,这是设计的.如果language= ,则不执行翻译sourceLangage.

要解决此问题,并在这种情况下强制翻译,必须设置forceTranslationtrue.

因此,必须以类似于下面的方式添加/修改应用程序配置部分中的i18n组件components:

'i18n' => [
    'translations' => [
        'app' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'forceTranslation' => true
        ],
    ],
],
Run Code Online (Sandbox Code Playgroud)