我正在使用Yii框架开发一个多语言网站。现在我有英文版和法文版。我创建了一个fr
文件夹,并放置了与法语版相关的视图和控制器,但两个版本都使用相同的模型。
我的数据库表结构(文章表)是:
id, title_en, title_fr, title_ru, detail_en, detail_fr, detail_ru and
so on.
我面临的问题是我需要以相应的语言向用户显示错误消息,例如法语版本的错误消息应该是法语。如何为所有语言使用相同的模型。
我需要在哪里发布法语消息?
答案 0 :(得分:0)
您可以使用以下内容覆盖CPhpMessageSource::loadMessages()
:
protected function loadMessages($category,$language)
{
if ($category == 'yii')
return array();
else
return parent::loadMessages($category,$language);
}
您也可以更改语言,适当设置CApplication::language
。这可以在运行时完成,如
Yii::app()->language = 'fr';
答案 1 :(得分:0)
我不知道,如果我告诉你的话,但是如果我理解你的问题,你的问题已经由核心Yii 1.x引擎解决了,还有很多工作要做。
详细说明,你必须:
在app.php
文件夹中创建任何文件(例如/protected/messages/fr/
)。
将'coreMessages'=>array('basePath'=>'../protected/messages'),
放入应用程序的配置阵列 - 将Yii翻译系统路由到带有自定义翻译的文件夹。
将'sourceLanguage'=>'en'
放入配置数组 - 确保应用程序的核心语言设置为英语。
使用您的翻译字符串填写app.php
文件(见下文)。
使用Yii::t('app', 'string');
翻译部分应用程序(见下文)。
您的翻译文件格式应为:
return array
(
//Translations from Google Translate! :> I don't speak French at all! :>
'This page is not yet translated into your language.'=>'Cette page n'a pas encore été traduit dans votre langue.',
'Language'=>'Langue',
'read more'=>'en savoir plus'
);
因此,例如,但在您的博客列表中查看字符串,如:
<?php Yii::t('app', 'read more'); ?>
当您将应用程序语言设置为fr
时,无论是通过强制代码(Yii::app()->language = 'fr';
)还是将其预设在应用程序的配置数组('language'=>'fr'
)中,您都应该看到{{1} (或者您在翻译文件中添加的任何内容)代替上面视图中的en savoir plus
。
如果您的应用程序的语言设置为英语,或者如果找不到给定的翻译字符串,您将看到用read more
写的文字。这就是为什么在这种方法(和翻译文件)中使用完全限定的英语字符串以及避免“模式”,如Yii::t
等等,这一点非常重要。
注意,您也可以使用参数占位符:
'core.app.language'=>'Langue'
将替换为实际参数值:
'Error no {code}:'=>'Erreur n {code}:'
这样,您可以为其他常量消息文本提供变量值。
“Yii的权威指南”中有一个很棒的topic about internationalization。您应该阅读有关此事项的更多信息,或者如果您想以更高级的方式使用Yii翻译机制。