Zend_Date / Zend_Locale: изменить формат даты для определенной локали? - PullRequest
2 голосов
/ 28 декабря 2010

Можно ли указать Zend_Locale, что он должен использовать определенную локаль, за исключением незначительного изменения формата даты? Я не хочу использовать Zend_Date :: toString () с определенным форматированием, потому что это будет использовать этот формат во всех локалях.

Случай, о котором идет речь: даты отформатированы в соответствии с настройками локали пользователя. Мои коллеги из Нидерландов (nl_NL) запрашивают даты в формате dd-mm-yyyy вместо dd-mm-yy, который Zend_Locale категорически утверждает, что это наш короткий формат дат. Если я изменю код, в котором дата выводится, чтобы явно использовать пользовательский формат, он применяется ко всем клиентам, а не только к головным уборам. Я мог бы проверить локаль пользователя, но если нужно создавать больше исключений, каждый раз, когда отображается эхо, мне нужно было бы добавлять эти проверки и исключения, перспектива которых заставляет меня съеживаться.

Я не могу напрямую (и не хочу) изменять XML-данные Zend_Locale, поскольку библиотека ZF используется различными сайтами.

Я уверен, что это одна из тех "действительно простых" проблем ... когда вы знаете, как. Есть идеи?

Ответы [ 3 ]

1 голос
/ 07 июня 2012

[Попытка нового ответа, поскольку этот подход существенно отличается от предыдущего ответа.]

Я предполагаю, что вы будете звонить Zend_Date::toString() в представлении.

Итак, возможно, вы могли бы сохранить список переопределений формата в файле конфигурации. Во время Bootstrap проверьте, требует ли загруженный языковой стандарт переопределения, и сохраните формат в представлении. Затем всякий раз, когда вы выводите дату, используйте этот формат.

Примерно так:

In 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;
}

Наконец, в скрипте вида, где $date это Zend_Date объект:

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

Если $view->dateFormat равно нулю, будет использоваться формат для текущей локали. В противном случае ваше переопределение будет применяться.

1 голос
/ 29 декабря 2010

Должен быть какой-то способ:

  1. Расширить Zend_Locale
  2. Создайте новую локаль, соответствующую существующей локали, поведение которой вы хотите настроить.
  3. Создайте новый XML-файл для новой локали, содержащий настройки.

Затем в Bootstrap создайте новый объект локали. Если текущая локаль соответствует локали, которую вы хотите настроить, вручную переключитесь на новую локаль.

Ключ, вероятно, в том, где разместить новые XML-файлы и как определить отображение. Конечно, вы, вероятно, не хотите помещать что-то новое в папки Zend, так как же мы скажем Zend_Locale и его друзьям использовать новое местоположение? Является ли эта информация отображения жестко закодированной в различных классах Zend_Locale_XXX?

В любом случае, просто высказываю некоторые идеи. Надеюсь, что это даст вам какое-то направление или вдохновит кого-то более знающего, чем я, - довольно низкая планка! - придумать что-то более определенное и авторитетное.

Ура!

0 голосов
/ 07 июня 2012

Я также начал рассматривать второе решение Дэвида Вайнрауба.

Вот мой вкус к переходу на четырехзначные годы для любой локали:

В 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);
...