显示多语言错误消息

时间:2013-11-27 05:58:13

标签: php yii

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

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

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

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

我需要在哪里发布法语消息?

2 个答案:

答案 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引擎解决了,还有很多工作要做。

详细说明,你必须:

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

  2. 'coreMessages'=>array('basePath'=>'../protected/messages'),放入应用程序的配置阵列 - 将Yii翻译系统路由到带有自定义翻译的文件夹。

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

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

  5. 使用Yii::t('app', 'string');翻译部分应用程序(见下文)。

  6. 您的翻译文件格式应为:

    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翻译机制。