Yii - 在CJuiDatePicker中使用i18n

时间:2012-07-03 09:48:05

标签: internationalization yii

我正在尝试制作国际化的Yii应用程序。

我有一种行为可以将日期转换为用户选择的区域设置日期格式,以便处理完所有。

当我尝试从区域设置设置CJuiDatepicker的语言和日期格式时,我最终得到中文月份名称(无论我选择哪种语言环境格式)和美国格式化日期。

CJuiDatePicker希望其日期和语言的格式与Yii提供的格式不匹配 - 如何使选择器工作?

1 个答案:

答案 0 :(得分:3)

jQuery和Yii的问题是它们都不使用相同的区域设置名称。例如,Yii具有区域设置名称,例如enen_gb,而jQuery根本没有en区域设置,并且调用“英语(英国)”区域设置en-GB(破折号而不是下划线。)

Yii和jQuery的日期格式说明符也存在差异。

为了弥合这两个世界,你必须编写一些手动代码;这是我自己的代码的摘录,我在过去的项目中使用过:

class LocaleExtensions {
    private static $yiiTojQueryFormatConversion = array(
        'yyyy' => 'yy',
        'yy' => 'y',
        'MMMM' => 'MM',
        'MMM' => 'M',
        'MM' => 'mm',
        'M' => 'm',
    );

    private static $yiiTojQueryLanguageConversion = array(
        'en' => 'en-GB',
    );

    public static function getJQueryDateFormat($width='medium') {
        return strtr(Yii::app()->getLocale()->getDateFormat($width),
                     self::$yiiTojQueryFormatConversion);
    }

    public static function getJQueryLanguageFromYii($language = null) {
        if ($language == null) {
            $language = Yii::app()->getLanguage();
        }

        if (isset(self::$yiiTojQueryLanguageConversion[$language])) {
            return self::$yiiTojQueryLanguageConversion[$language];
        }

        return $language;
    }
}

要修复区域设置问题,您可以将Yii的小部件子类化为适当的时间(或者只是手动执行):

$this->language = LocaleExtensions::getJQueryLanguageFromYii($this->language);

您还可以从Yii设置中检索与jQuery兼容的日期格式,并在Javascript代码中使用它,如下所示:

var format = <?php echo json_encode(LocaleExtensions::getJQueryDateFormat('long'));?>
var locale = <?php echo json_encode(LocaleExtensions::getJQueryLanguageFromYii());?>
var now = new Date();
alert($.datepicker.formatDate(format, now, $.datepicker.regional[locale]));