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

Translations in sourceLanguage does not work in Yii2 application

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

<?php
    return [
        'name_english'=>'Name in English',
        'keywords_english'=>'Keywords in English'
    ];
?>

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

'language' => 'pl',
'sourceLanguage' => 'en',

我正在调用翻译:

Yii::t('app', 'keywords_english');

一切正常,当语言实际设置为基本语言时,波兰语 (pl):

但是,当我将其更改为 Englishen;通过在 运行 期间设置 Yii::$app->language 或通过更改应用程序配置),未执行翻译,我得到 keywords_english:

我已经把 die() 放在 @app/messages/pl/app.php@app/messages/en/app.php 文件的开头,我可以清楚地看到,当语言设置为 English,Yii2 不包含第二个文件(后面是应用程序 运行),而当语言为 波兰语 时,第一个文件被包含并且应用程序流程中断 die().

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

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

'i18n' => [
    'translations' => [
        '*' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en',
            'basePath' => '@app/messages'
        ],
    ],
],

但是,它没有带来任何变化(为什么要这样——它仍然使用默认设置)。

根据 samdark at Yii Forum,这是设计使然。如果 language = sourceLangage.

,则不执行翻译

要解决此问题并在这种情况下强制进行翻译,必须将 forceTranslation 设置为 true

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

'i18n' => [
    'translations' => [
        'app' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'forceTranslation' => true
        ],
    ],
],

解决方案:

'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
                'sourceLanguage' => 'en_US',
                'fileMap' => [
                    'app' => 'app.php',
                ],
            ],

您评论的答案:

1) 'sourceLanguage' => 'en_US' - 您必须使用完整的语言环境。因为英文语言环境可能是 en_USen_UK 和 e.t.c。 The format for the language/locale is ll-CC where ll is a two- or three-letter lowercase code for a language according to ISO-639 and CC is the country code according to ISO-3166. 来自 [doc][1]

2) 在关键使用类别中。类别设置在Yii::t('category'...)