2010-12-28 16 views
2

Zend_Localeに、特定のロケールを使用するよう指示することは可能ですか?ただし、日付形式を少し変更した場合を除きますか? Zend_Date :: toString()を特定の書式で使用したくないのは、すべてのロケールでこの書式を使用するためです。Zend_Date/Zend_Locale:特定のロケールの日付形式を変更しますか?

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

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

これは「本当にシンプルな」問題の1つであると確信しています。何か案は?

答えて

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> 

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

+0

こんにちはデビッド - 私はもうこのプロジェクトに取り組んでいませんが、この問題の一部です。解決策が浮上しているのを見て非常にうれしく思います。ありがとう!答えを受け入れるのに遅れて申し訳ありません:) – kander

+0

私の喜びは、喜んで助けました。乾杯。 ;-) –

1

にはいくつかの方法があるに違いありません:

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

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

キーは、おそらく新しいXMLファイルを配置する場所と、マッピングを定義する方法です。もちろん、Zendフォルダに何か新しいものを置くことは望まないでしょうから、Zend_Localeと彼の友達に新しい場所を使用するにはどうすればいいですか?そのマッピング情報は、さまざまなZend_Locale_XXXクラスに「ハードコードされていますか?

とにかく、いくつかのアイデアを語ってください。それはあなたにある方向性を与えるか、私より知識のある他の誰かにインスピレーションを与えることを望みます - 確かに低いバーです!より決定的で権威のあるものを考え出すこと。

乾杯!

+0

Davidさんのご意見ありがとうございます。私はこれらの行に沿って考えてきましたが、段階的な方法で書かれているのは良いことです。しかし、おそらくこれを行う簡単な方法があると私に感じさせる。 – kander

+0

また、与えられたロケールの日付形式を変更してZend Framework 1を見つけることができません。私はカスタムLDMLファイルを作成し、それを 'Zend_Locale_Data'に渡すことができましたが、メソッドはプライベートです)。 – CDuv

+0

@カンダー:別のアプローチについては私の他の答えを見てください。 –

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); 
関連する問題