2

国際化された Yii アプリケーションを作成しようとしています。

ユーザーが選択したロケールの日付形式との間で日付を変換する動作があるため、すべて正常に処理されます。

ロケール設定から CJuiDatepicker の言語と日付形式を設定しようとすると、中国の月名 (選択したロケール形式に関係なく) と米国形式の日付になってしまいます。

CJuiDatePicker が必要とする日付と言語の形式が、Yii が提供するものと一致しません。ピッカーを機能させるにはどうすればよいですか?

4

1 に答える 1

3

jQuery と Yii の問題は、両方が同じロケール名を使用していないことです。たとえば、Yii にはenandなどのロケール名があります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]));
于 2012-07-03T09:58:56.193 に答える