国際化された Yii アプリケーションを作成しようとしています。
ユーザーが選択したロケールの日付形式との間で日付を変換する動作があるため、すべて正常に処理されます。
ロケール設定から CJuiDatepicker の言語と日付形式を設定しようとすると、中国の月名 (選択したロケール形式に関係なく) と米国形式の日付になってしまいます。
CJuiDatePicker が必要とする日付と言語の形式が、Yii が提供するものと一致しません。ピッカーを機能させるにはどうすればよいですか?
国際化された Yii アプリケーションを作成しようとしています。
ユーザーが選択したロケールの日付形式との間で日付を変換する動作があるため、すべて正常に処理されます。
ロケール設定から CJuiDatepicker の言語と日付形式を設定しようとすると、中国の月名 (選択したロケール形式に関係なく) と米国形式の日付になってしまいます。
CJuiDatePicker が必要とする日付と言語の形式が、Yii が提供するものと一致しません。ピッカーを機能させるにはどうすればよいですか?
jQuery と Yii の問題は、両方が同じロケール名を使用していないことです。たとえば、Yii にはen
andなどのロケール名がありますen_gb
が、jQuery にはen
ロケールがまったくなく、"English (United Kingdom)" ロケールen-GB
(アンダースコアの代わりにダッシュ) を呼び出します。
Yii と jQuery の日付フォーマット指定子が異なるという問題もあります。
2 つの世界を橋渡しするには、手動でコードを作成する必要があります。これは、過去のプロジェクトで使用した自分のコードからの抜粋です。
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]));