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
):
但是,当我将其更改为 English(en
;通过在 运行 期间设置 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_US
、en_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'...)
我在我的 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
):
但是,当我将其更改为 English(en
;通过在 运行 期间设置 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_US
、en_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'...)