Yii2国际化,使用代码而不是整句话

Yii2国际化,使用代码而不是整句话,yii2,internationalization,Yii2,Internationalization,我目前正在为一个使用Yii2的网站进行国际化工作 通常,我是这样使用它的: Yii::t('frontend', 'Do you have something to eat?') Yii::t('frontend', 'My.Random.Sentence'); 然后,我有两个名为en en和id-id的common\messages文件夹。每个文件夹中都有frontend.php en/frontend.php return [ ]; return [ 'Do you

我目前正在为一个使用Yii2的网站进行国际化工作

通常,我是这样使用它的:

Yii::t('frontend', 'Do you have something to eat?')
Yii::t('frontend', 'My.Random.Sentence');
然后,我有两个名为en en和id-id的common\messages文件夹。每个文件夹中都有frontend.php

en/frontend.php

return [
    
];
return [
    'Do you have something to eat?' => 'Ada yang bisa dimakan?'
];
return [
    'My.Random.Sentence' => 'Do you have something to eat?',
];
return [
    'My.Random.Sentence' => 'Ada yang bisa dimakan?'
];
return [
    'sourcePath' => __DIR__. '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    'languages' => ['en-EN','id-ID'],
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (!isset($_SESSION['lang']))
    $_SESSION['lang'] = 'en-US';

return [
    // other options

    'language' => $_SESSION['lang'],
    'sourceLanguage' => 'en-EN',
    'components' => [
        'i18n' => [
            'translations' => [
                'frontend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
                'backend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
            ],
        ],
    ],

    //other options
];
id/frontend.php

return [
    
];
return [
    'Do you have something to eat?' => 'Ada yang bisa dimakan?'
];
return [
    'My.Random.Sentence' => 'Do you have something to eat?',
];
return [
    'My.Random.Sentence' => 'Ada yang bisa dimakan?'
];
return [
    'sourcePath' => __DIR__. '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    'languages' => ['en-EN','id-ID'],
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (!isset($_SESSION['lang']))
    $_SESSION['lang'] = 'en-US';

return [
    // other options

    'language' => $_SESSION['lang'],
    'sourceLanguage' => 'en-EN',
    'components' => [
        'i18n' => [
            'translations' => [
                'frontend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
                'backend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
            ],
        ],
    ],

    //other options
];
它很好用,但我认为它不实用,因为句子太长,一个字符的缺失是不起作用的

所以我试着用这样的方法:

Yii::t('frontend', 'Do you have something to eat?')
Yii::t('frontend', 'My.Random.Sentence');
en/frontend.php

return [
    
];
return [
    'Do you have something to eat?' => 'Ada yang bisa dimakan?'
];
return [
    'My.Random.Sentence' => 'Do you have something to eat?',
];
return [
    'My.Random.Sentence' => 'Ada yang bisa dimakan?'
];
return [
    'sourcePath' => __DIR__. '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    'languages' => ['en-EN','id-ID'],
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (!isset($_SESSION['lang']))
    $_SESSION['lang'] = 'en-US';

return [
    // other options

    'language' => $_SESSION['lang'],
    'sourceLanguage' => 'en-EN',
    'components' => [
        'i18n' => [
            'translations' => [
                'frontend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
                'backend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
            ],
        ],
    ],

    //other options
];
id/frontend.php

return [
    
];
return [
    'Do you have something to eat?' => 'Ada yang bisa dimakan?'
];
return [
    'My.Random.Sentence' => 'Do you have something to eat?',
];
return [
    'My.Random.Sentence' => 'Ada yang bisa dimakan?'
];
return [
    'sourcePath' => __DIR__. '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    'languages' => ['en-EN','id-ID'],
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (!isset($_SESSION['lang']))
    $_SESSION['lang'] = 'en-US';

return [
    // other options

    'language' => $_SESSION['lang'],
    'sourceLanguage' => 'en-EN',
    'components' => [
        'i18n' => [
            'translations' => [
                'frontend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
                'backend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
            ],
        ],
    ],

    //other options
];
它只适用于id,但当我换回英语时,它仍然显示我的.Random.句子,而不是“你有东西吃吗?”

这是我在i18n.php中的配置

return [
    
];
return [
    'Do you have something to eat?' => 'Ada yang bisa dimakan?'
];
return [
    'My.Random.Sentence' => 'Do you have something to eat?',
];
return [
    'My.Random.Sentence' => 'Ada yang bisa dimakan?'
];
return [
    'sourcePath' => __DIR__. '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    'languages' => ['en-EN','id-ID'],
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (!isset($_SESSION['lang']))
    $_SESSION['lang'] = 'en-US';

return [
    // other options

    'language' => $_SESSION['lang'],
    'sourceLanguage' => 'en-EN',
    'components' => [
        'i18n' => [
            'translations' => [
                'frontend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
                'backend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
            ],
        ],
    ],

    //other options
];
这在frontend/config/main.php中

return [
    
];
return [
    'Do you have something to eat?' => 'Ada yang bisa dimakan?'
];
return [
    'My.Random.Sentence' => 'Do you have something to eat?',
];
return [
    'My.Random.Sentence' => 'Ada yang bisa dimakan?'
];
return [
    'sourcePath' => __DIR__. '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    'languages' => ['en-EN','id-ID'],
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (!isset($_SESSION['lang']))
    $_SESSION['lang'] = 'en-US';

return [
    // other options

    'language' => $_SESSION['lang'],
    'sourceLanguage' => 'en-EN',
    'components' => [
        'i18n' => [
            'translations' => [
                'frontend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
                'backend*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages',
                ],
            ],
        ],
    ],

    //other options
];

这不可能吗?解决我的问题的正确方法是什么?

默认情况下,
i18n
组件在
$sourceLanguage
$language
相同时不转换字符串。而是返回源字符串

但幸运的是,即使
$sourceLanguage
$language
属性相同,您也可以强制它转换字符串。为此,需要将
MessageSource
$forceTranslation
属性设置为true。您可以在frontend/config/main.php中这样做:

Yii::t('frontend', 'Do you have something to eat?')
Yii::t('frontend', 'My.Random.Sentence');
返回[
//其他选择
“组件”=>[
‘i18n’=>[
“翻译”=>[
“前端*”=>[
'class'=>'yii\i18n\PhpMessageSource',
“基本路径”=>“@common/messages”,
“forceTranslation”=>正确,
],
// ...
],
],
],
//其他选择
];

感谢您的快速回复。我试过了,但没有working@HenryGunawan我刚刚注意到,您在i18n.php配置(和文件夹名称)中使用了
en-en
,但在未设置会话时,您将
$\u会话['lang']
设置为
en-US
。这可能就是它不适合你的原因。啊!是的,你说得对。这是因为恩恩和恩我们。我把它们都改成了en-en,它就行了。谢谢你的帮助。强制翻译也是必须的。我试着删除它,但没有成功。