【问题标题】:Translations in sourceLanguage does not work in Yii2 applicationsourceLanguage 中的翻译在 Yii2 应用程序中不起作用
【发布时间】: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-&gt;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/&lt;language&gt;/) 并使用默认类 (yii\i18n\PhpMessageSource)。这适用于除sourceLanguage 之外的所有语言。在某些时候,我尝试更改配置:

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

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

【问题讨论】:

  • 从配置中显示i18n
  • 查看更新的问题。我没有以任何方式配置i18n。我为什么要?我想使用默认设置,这应该适用于en,如果它适用于pl,对吧?
  • 试试看:'translations' =&gt; [ 'app*' =&gt; [ 'class' =&gt; 'yii\i18n\PhpMessageSource', 'basePath' =&gt; '@app/messages', 'sourceLanguage' =&gt; 'en_US', 'fileMap' =&gt; [ 'app' =&gt; 'app.php', ], ],
  • 这很好用!即使没有fileMap 部分。 'sourceLanguage' =&gt; 'en_US' 是关键。让它成为一个答案,所以我可以接受它。然而,这带来了更多的问题:为什么我必须设置'sourceLanguage' =&gt; 'en_US',当我不使用两部分语言代码并且我的应用程序的源语言是en,而不是en_US(使用en 你的解决方案不工作)?为什么这适用于app 或app*,但不适用于*(翻译所有类别)?等等。在 Yii2 中实现这个对于初学者来说真的很奇怪。

标签: translation yii2


【解决方案1】:

根据samdark at Yii Forum,这是设计使然。如果language = sourceLangage,则不执行翻译。

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

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

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

【讨论】:

    【解决方案2】:

    解决办法:

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

    您的评论的答案:

    1) 'sourceLanguage' =&gt; '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'...)中设置的类别

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多