我正在尝试制作国际化的Yii应用程序。
我有一种行为可以将日期转换为用户选择的区域设置日期格式,以便处理完所有。
当我尝试从区域设置设置CJuiDatepicker的语言和日期格式时,我最终得到中文月份名称(无论我选择哪种语言环境格式)和美国格式化日期。
CJuiDatePicker希望其日期和语言的格式与Yii提供的格式不匹配 - 如何使选择器工作?
答案 0 :(得分:3)
jQuery和Yii的问题是它们都不使用相同的区域设置名称。例如,Yii具有区域设置名称,例如en
和en_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]));