Php Yii2翻译不适用于西班牙语,但适用于其他语言

Php Yii2翻译不适用于西班牙语,但适用于其他语言,php,yii2,Php,Yii2,我有一个包含四种语言的Yii2应用程序: 英式 西班牙文 法语的 葡萄牙人 我已经实现了语言切换器,并翻译了由以下命令生成的所有消息文件: php yii message/extract @app/config/i18n.php 以下是我用于i18n和语言切换器的配置 config/web.php 'bootstrap' => ['log','languageSwitcher'], 'language'=> 'en', // spanish 'sourceLanguage' =

我有一个包含四种语言的Yii2应用程序:

  • 英式
  • 西班牙文
  • 法语的
  • 葡萄牙人
我已经实现了语言切换器,并翻译了由以下命令生成的所有消息文件:

php yii message/extract @app/config/i18n.php
以下是我用于i18n和语言切换器的配置

config/web.php

'bootstrap' => ['log','languageSwitcher'],
'language'=> 'en', // spanish
'sourceLanguage' => 'en',
'i18n' => [
    'translations' => [
        'app' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'basePath' => '@app/messages',
            'forceTranslation' => true,
        ],
        'kvgrid' => [
             'class' => 'yii\i18n\PhpMessageSource',
             'basePath' => '@app/messages',
             'forceTranslation' => true,
        ],
    ],
],
'languageSwitcher' => [
     'class' => 'app\widgets\languageSwitcher',
],
return [
    'sourcePath' => __DIR__. DIRECTORY_SEPARATOR .'..',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',
    'languages' => ['en','fr','es','po'],
    'translator' => 'Yii::t',
    'sort' => false,
    'overwrite' => true,
    'removeUnused' => false,
    'markUnused' => true,
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/BaseYii.php',
        '/vendor',
    ],
    'only' => [
        '*.php',
    ],
    'format' => 'php',
    'db' => 'db',
    'sourceMessageTable' => '{{%source_message}}',
    'messageTable' => '{{%message}}',
    'catalog' => 'messages',
    'ignoreCategories' => [],
];
<?php
namespace app\widgets;

use Yii;
use yii\base\Component;
use yii\base\Widget;
use yii\bootstrap\ButtonDropdown;
use yii\helpers\Url;
use yii\web\Cookie;
use yii\helpers\Html;

class languageSwitcher extends Widget
{
    public $languages = [
        'en' => 'English',
        'fr' => 'Français',
        'es' => 'Español',
        'po' => 'Português',
    ];
    public function init()
    {
        if(php_sapi_name() === 'cli')
        {
            return true;
        }
        parent::init();
        $languageNew = Yii::$app->request->get('language');
        if($languageNew)
        {
            {
                Yii::$app->language = $languageNew;
                Yii::$app->session->set('language', $languageNew);
            }
        }
        elseif(Yii::$app->session->get('language'))
        {
            Yii::$app->language = Yii::$app->session->get('language');
        }
        else
        {
            Yii::$app->language = 'en';
        }
    }

    public static function getFlag(){
        $current = Yii::$app->language; //$languages[Yii::$app->language];
        return "<img src='/img/flags/".Yii::$app->language.".png' style='height:20px;'>";
    }

    public function run(){
        $languages = $this->languages;
        $current = $languages[Yii::$app->language];
        ?>
            <div>
            <?php foreach ($languages as $code => $language): ?>
                <?php $cl = "btn-".$code;
                $img = "<img src='/img/flags/".$code.".png' style='height:20px;'> ".t($language); ?>
                <div class='<?php echo $cl; ?>'>
                    <?= Html::a($img, Url::current(['language' => $code]));?>
                </div>
            <?php endforeach; ?>
            </div>
        <?php
    }
}
config/i18n.php

'bootstrap' => ['log','languageSwitcher'],
'language'=> 'en', // spanish
'sourceLanguage' => 'en',
'i18n' => [
    'translations' => [
        'app' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'basePath' => '@app/messages',
            'forceTranslation' => true,
        ],
        'kvgrid' => [
             'class' => 'yii\i18n\PhpMessageSource',
             'basePath' => '@app/messages',
             'forceTranslation' => true,
        ],
    ],
],
'languageSwitcher' => [
     'class' => 'app\widgets\languageSwitcher',
],
return [
    'sourcePath' => __DIR__. DIRECTORY_SEPARATOR .'..',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',
    'languages' => ['en','fr','es','po'],
    'translator' => 'Yii::t',
    'sort' => false,
    'overwrite' => true,
    'removeUnused' => false,
    'markUnused' => true,
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/BaseYii.php',
        '/vendor',
    ],
    'only' => [
        '*.php',
    ],
    'format' => 'php',
    'db' => 'db',
    'sourceMessageTable' => '{{%source_message}}',
    'messageTable' => '{{%message}}',
    'catalog' => 'messages',
    'ignoreCategories' => [],
];
<?php
namespace app\widgets;

use Yii;
use yii\base\Component;
use yii\base\Widget;
use yii\bootstrap\ButtonDropdown;
use yii\helpers\Url;
use yii\web\Cookie;
use yii\helpers\Html;

class languageSwitcher extends Widget
{
    public $languages = [
        'en' => 'English',
        'fr' => 'Français',
        'es' => 'Español',
        'po' => 'Português',
    ];
    public function init()
    {
        if(php_sapi_name() === 'cli')
        {
            return true;
        }
        parent::init();
        $languageNew = Yii::$app->request->get('language');
        if($languageNew)
        {
            {
                Yii::$app->language = $languageNew;
                Yii::$app->session->set('language', $languageNew);
            }
        }
        elseif(Yii::$app->session->get('language'))
        {
            Yii::$app->language = Yii::$app->session->get('language');
        }
        else
        {
            Yii::$app->language = 'en';
        }
    }

    public static function getFlag(){
        $current = Yii::$app->language; //$languages[Yii::$app->language];
        return "<img src='/img/flags/".Yii::$app->language.".png' style='height:20px;'>";
    }

    public function run(){
        $languages = $this->languages;
        $current = $languages[Yii::$app->language];
        ?>
            <div>
            <?php foreach ($languages as $code => $language): ?>
                <?php $cl = "btn-".$code;
                $img = "<img src='/img/flags/".$code.".png' style='height:20px;'> ".t($language); ?>
                <div class='<?php echo $cl; ?>'>
                    <?= Html::a($img, Url::current(['language' => $code]));?>
                </div>
            <?php endforeach; ?>
            </div>
        <?php
    }
}
widgets/languageSwitcher.php

'bootstrap' => ['log','languageSwitcher'],
'language'=> 'en', // spanish
'sourceLanguage' => 'en',
'i18n' => [
    'translations' => [
        'app' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'basePath' => '@app/messages',
            'forceTranslation' => true,
        ],
        'kvgrid' => [
             'class' => 'yii\i18n\PhpMessageSource',
             'basePath' => '@app/messages',
             'forceTranslation' => true,
        ],
    ],
],
'languageSwitcher' => [
     'class' => 'app\widgets\languageSwitcher',
],
return [
    'sourcePath' => __DIR__. DIRECTORY_SEPARATOR .'..',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',
    'languages' => ['en','fr','es','po'],
    'translator' => 'Yii::t',
    'sort' => false,
    'overwrite' => true,
    'removeUnused' => false,
    'markUnused' => true,
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/BaseYii.php',
        '/vendor',
    ],
    'only' => [
        '*.php',
    ],
    'format' => 'php',
    'db' => 'db',
    'sourceMessageTable' => '{{%source_message}}',
    'messageTable' => '{{%message}}',
    'catalog' => 'messages',
    'ignoreCategories' => [],
];
<?php
namespace app\widgets;

use Yii;
use yii\base\Component;
use yii\base\Widget;
use yii\bootstrap\ButtonDropdown;
use yii\helpers\Url;
use yii\web\Cookie;
use yii\helpers\Html;

class languageSwitcher extends Widget
{
    public $languages = [
        'en' => 'English',
        'fr' => 'Français',
        'es' => 'Español',
        'po' => 'Português',
    ];
    public function init()
    {
        if(php_sapi_name() === 'cli')
        {
            return true;
        }
        parent::init();
        $languageNew = Yii::$app->request->get('language');
        if($languageNew)
        {
            {
                Yii::$app->language = $languageNew;
                Yii::$app->session->set('language', $languageNew);
            }
        }
        elseif(Yii::$app->session->get('language'))
        {
            Yii::$app->language = Yii::$app->session->get('language');
        }
        else
        {
            Yii::$app->language = 'en';
        }
    }

    public static function getFlag(){
        $current = Yii::$app->language; //$languages[Yii::$app->language];
        return "<img src='/img/flags/".Yii::$app->language.".png' style='height:20px;'>";
    }

    public function run(){
        $languages = $this->languages;
        $current = $languages[Yii::$app->language];
        ?>
            <div>
            <?php foreach ($languages as $code => $language): ?>
                <?php $cl = "btn-".$code;
                $img = "<img src='/img/flags/".$code.".png' style='height:20px;'> ".t($language); ?>
                <div class='<?php echo $cl; ?>'>
                    <?= Html::a($img, Url::current(['language' => $code]));?>
                </div>
            <?php endforeach; ?>
            </div>
        <?php
    }
}
没有翻译。但是,默认的yii2测试是因为GridView中的
(未设置)
被转换为
(无定义)

  • 我尝试将
    es
    更改为
    es
    并重新生成消息,但没有成功

  • 我尝试在西班牙语文件中使用法语翻译,但也没有显示

  • 我尝试在法语翻译文件中使用西班牙语翻译,这显示了我选择法语时的翻译

  • 我已尝试删除
    forceTranslation


为什么翻译不适用于西班牙语而适用于其他语言?

真奇怪。。。你能提供
languageSwitcher
的代码和
@app/messages
文件夹中文件的结构吗?@Bizley我已经添加了代码以及结构的图像。我不知道只有
es
不能在这里工作的原因是什么。很明显,您正在将
languageSwitcher
添加到引导阶段,尽管它没有实现
BootstrapInterface
,但这并不是一个问题,因为其他语言可以工作。。。我建议你阅读Samdark的《语言选择》以获得灵感。@Bizley是的,我确实觉得它只在
es
时才这样做,这是非常奇怪的。我读过Samdark的烹饪书这是我得到的印象是,将
es
更改为
es
可能会有所不同,但出于某种原因,它没有改变。