我正在使用Yii框架开发一个多语言网站。现在我有英文版和法文版。我创建了一个fr
文件夹,并放置了与法语版本相关的视图和控制器,但两个版本都使用相同的模型。
我的数据库表结构(文章表)是:
id, title_en, title_fr, title_ru, detail_en, detail_fr, detail_ru and
so on.
我面临的问题是,我需要用相应的语言向用户显示错误消息,比如法语版本的错误消息应该是法语。如何在所有语言中使用相同的模型。
我需要把法语留言放在哪里?
我不知道,我是否能纠正你的错误,但如果我理解你的问题,你的问题已经通过核心Yii 1.x引擎解决了,没有太多工作要做。
详细地说,你必须:
-
在
/protected/messages/fr/
文件夹中创建任何文件(例如app.php
)。 -
将
'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'
)中预先设置它,您应该在上面的视图中看到en savoir plus
(或您放入翻译文件的任何内容)代替read more
。
如果您的应用程序的语言设置为英语,或者找不到给定的翻译字符串,您将看到用Yii::t
编写的文本。这就是为什么在这种方法中(以及在翻译文件中)使用完全限定的英语字符串并避免"模式"(如'core.app.language'=>'Langue'
等)是如此重要。
注意,您也可以使用参数占位符:
'Error no {code}:'=>'Erreur n {code}:'
将替换为实际参数值:
Yii::t('app', 'Error no {code}:', array('{code}'=>$code));
通过这种方式,您可以为不变的消息文本提供变量值。
在《Yii最终指南》中有一个关于国际化的好话题。你应该通读一遍,了解更多关于这件事的信息,或者,如果你想以更高级的方式使用Yii翻译机制。
您可以使用以下内容覆盖CPhpMessageSource::loadMessages()
:
protected function loadMessages($category,$language)
{
if ($category == 'yii')
return array();
else
return parent::loadMessages($category,$language);
}
此外,您还可以更改语言,适当地设置CApplication::language
。这可以像一样在运行时完成
Yii::app()->language = 'fr';