显示多语言错误消息


Display multilingual error messages

我正在使用Yii框架开发一个多语言网站。现在我有英文版和法文版。我创建了一个fr文件夹,并放置了与法语版本相关的视图和控制器,但两个版本都使用相同的模型。

我的数据库表结构(文章表)是:

 id, title_en, title_fr, title_ru, detail_en, detail_fr, detail_ru and     
 so on.

我面临的问题是,我需要用相应的语言向用户显示错误消息,比如法语版本的错误消息应该是法语。如何在所有语言中使用相同的模型。

我需要把法语留言放在哪里?

我不知道,我是否能纠正你的错误,但如果我理解你的问题,你的问题已经通过核心Yii 1.x引擎解决了,没有太多工作要做。

详细地说,你必须:

  1. /protected/messages/fr/文件夹中创建任何文件(例如app.php)。

  2. 'coreMessages'=>array('basePath'=>'../protected/messages'),放入应用程序的配置数组中——将Yii翻译系统路由到包含自定义翻译的文件夹中。

  3. 'sourceLanguage'=>'en'放入配置数组中——确保应用程序的核心语言设置为英语。

  4. 用您的翻译字符串填充app.php文件(见下文)。

  5. 使用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';