【发布时间】:2015-04-07 09:22:51
【问题描述】:
我在 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() 处中断。
我错过了什么?如果语言设置为 English (en),为什么 Yii2 不使用来自 @app/messages/en/app.php 文件的翻译?
编辑:默认情况下,我没有在我的应用程序配置中更改默认的i18n 组件配置,因为我发现没有必要这样做。翻译文件存储在默认位置 (@app/messages/<language>/) 并使用默认类 (yii\i18n\PhpMessageSource)。这适用于除sourceLanguage 之外的所有语言。在某些时候,我尝试更改配置:
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en',
'basePath' => '@app/messages'
],
],
],
但是,它没有带来任何改变(为什么要这样做——它仍然使用默认设置)。
【问题讨论】:
-
从配置中显示
i18n -
查看更新的问题。我没有以任何方式配置
i18n。我为什么要?我想使用默认设置,这应该适用于en,如果它适用于pl,对吧? -
试试看:
'translations' => [ 'app*' => [ 'class' => 'yii\i18n\PhpMessageSource', 'basePath' => '@app/messages', 'sourceLanguage' => 'en_US', 'fileMap' => [ 'app' => 'app.php', ], ], -
这很好用!即使没有
fileMap部分。'sourceLanguage' => 'en_US'是关键。让它成为一个答案,所以我可以接受它。然而,这带来了更多的问题:为什么我必须设置'sourceLanguage' => 'en_US',当我不使用两部分语言代码并且我的应用程序的源语言是en,而不是en_US(使用en你的解决方案不工作)?为什么这适用于app或app*,但不适用于*(翻译所有类别)?等等。在 Yii2 中实现这个对于初学者来说真的很奇怪。
标签: translation yii2