2

日付形式を少し変更する以外に、Zend_Locale に特定のロケールを使用するように指示することはできますか? Zend_Date::toString() を特定のフォーマットで使用したくありません。すべてのロケールでこのフォーマットが使用されるためです。

問題のケース: ユーザーのロケール設定に従ってフォーマットされた日付があります。私の仲間のオランダ語 (nl_NL) ユーザーは、Zend_Locale が私たちの短い日付形式であると強く主張している dd-mm-yy ではなく、dd-mm-yyyy 形式の日付を要求しています。カスタム形式を明示的に使用するように日付が出力されるコードを変更すると、それはチーズヘッドだけでなくすべての顧客に適用されます。ユーザーのロケールを確認することはできますが、さらに例外を作成する必要がある場合は、日付がエコーされるたびに、これらのチェックと例外を追加する必要があり、その可能性にうんざりします。

ZF ライブラリはさまざまなサイトで使用されているため、Zend_Locale XML データを直接変更することはできません (変更したくありません)。

これは、「本当に単純な」問題の1つであると確信しています...方法がわかれば。何か案は?

4

3 に答える 3

1

[このアプローチは以前の回答とは実質的に異なるため、新しい回答を試みます。]

ビューで呼び出していると思いますZend_Date::toString()

したがって、フォーマットのオーバーライドのリストを構成ファイルに保存できます。の実行中Bootstrapに、ロードされたロケールでオーバーライドが必要かどうかを確認し、フォーマットをビューに保存します。次に、日付を出力するときはいつでも、その形式を使用します。

このようなもの:

application/configs/application.ini

dateFormat.nl_NL = "d-m-Y"

application/Bootstrap.php

protected function _initDateFormat()
{
    // Bootstrap and grab the view
    $this->bootstrap('view');
    $view = $this->getResource('view');

    // grab the date format overrides from options or null for locale-default
    $options = $this->getOptions();
    $this->bootstrap('locale');
    $locale = $this->getResource('locale');
    $dateFormat = isset($options['dateFormat'][$locale]) 
        ? $options['dateFormat'][$locale] 
        : null;

    // stash the dateFormat into the view
    $view->dateFormat = $dateFormat;
}

最後にビュースクリプトで、$dateZend_Dateオブジェクトです:

<p>The date is <?= $date->toString($this->dateFormat) ?>.</p>

null の場合$view->dateFormat、現在のロケールの形式が使用されます。それ以外の場合は、オーバーライドが適用されます。

于 2012-06-07T11:55:48.823 に答える
1

次の方法が必要です。

  1. 拡張するZend_Locale
  2. 動作をカスタマイズする既存のロケールに対応する新しいロケールを作成します。
  3. カスタマイズを含む新しいロケール用の新しい XML ファイルを作成します。

次に、 でBootstrap新しいロケール オブジェクトを作成します。現在のロケールがカスタマイズするロケールと一致する場合は、手動で新しいロケールに切り替えます。

鍵となるのはおそらく、新しい XML ファイルをどこに配置するか、およびマッピングをどのように定義するかです。もちろん、Zend フォルダーに新しいものを置きたくない場合は、どうすればZend_Locale新しい場所を使用するように友人に伝えることができるでしょうか。Zend_Locale_XXXそのマッピング情報は、さまざまなクラスで「ハードコーディング」されていますか?

とにかく、いくつかのアイデアを話すだけです。それがあなたに何らかの方向性を与えるか、私よりも知識のある他の誰かに刺激を与えることを願っています-実際、かなり低いバーです! - より決定的で権威のあるものを考え出すこと。

乾杯!

于 2010-12-29T03:41:20.607 に答える
0

私はまた、David Weinraub の 2 番目の解決策を検討し始めていました。

これは、任意のロケールで 4 桁の年に切り替えるための私の好みです。

Bootstrapクラス内 (ファイルapplication/Bootstrap.php)

protected function _initDate() {
    /** Test and correct Zend_Date::DATE_SHORT format **/
    $localeDataDateFormats = Zend_Locale_Data::getList(Zend_Locale::findLocale(), 'date'); // Date formats for auto Locale (@see Zend_Locale::findLocale())
    define(
        'DATE_SHORT_LONGYEAR',  // Define our new format, should now use it instead of Zend_Date::DATE_SHORT
        preg_replace('@((' . Zend_Date::YEAR . ')+|(' . Zend_Date::YEAR_8601 . ')+)@', '$2$3', $localeDataDateFormats['short']) // Makes years displayed with every digits available
    );
    /** /Test and correct Zend_Date::DATE_SHORT format **/
}

それを使用します(の代わりに新しい定数を使用しますZend_Date::DATE_SHORT):

$date = new Zend_Date();
echo $date->toString(DATE_SHORT_LONGYEAR);
于 2012-06-07T18:30:38.650 に答える