Yii2国际化,使用代码而不是整句话
我目前正在为一个使用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
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,它就行了。谢谢你的帮助。强制翻译也是必须的。我试着删除它,但没有成功。