我在Yii2应用程序中使用基于关键字的翻译(我知道,这不是最佳选择,但我没有其他选项)。我已使用关键字准备了@app/messages/pl/app.php
和@app/messages/en/app.php
个带翻译字符串的文件,而不是使用功能齐全的句子或单词:
<?php
return [
'name_english'=>'Name in English',
'keywords_english'=>'Keywords in English'
];
?>
我已将我的应用程序设置为默认使用 Polish 语言:
'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
文件的开头,我可以清楚地看到,当语言设置为英语时,第二个文件Yii2没有包含(应用程序运行如下),而当语言波兰语时,包含第一个文件,应用程序流中断die()
。
我错过了什么?如果语言设置为英语(@app/messages/en/app.php
),为什么Yii2不使用en
文件的翻译?
编辑:默认情况下,我没有在我的应用程序配置中更改默认的i18n
组件配置,因为我发现没有必要。翻译文件存储在默认位置(@app/messages/<language>/
),并使用默认类(yii\i18n\PhpMessageSource
)。这适用于除sourceLanguage
之外的所有语言。在某些时候,我试图改变配置:
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en',
'basePath' => '@app/messages'
],
],
],
但是,它没有带来任何变化(为什么它应该 - 它仍然使用默认设置)。
答案 0 :(得分:7)
根据samdark at Yii Forum,这是设计的。如果language
= sourceLangage
,则不会执行翻译。
要解决此问题并在此情况下强制翻译,必须将forceTranslation
设置为true
。
因此,必须以与此类似的方式在应用程序配置的i18n
部分中添加/修改components
组件:
'i18n' => [
'translations' => [
'app' => [
'class' => 'yii\i18n\PhpMessageSource',
'forceTranslation' => true
],
],
],
答案 1 :(得分:1)
解决方案:
'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'...)