2

是否可以指示 Zend_Locale 它应该使用特定的语言环境,除了对日期格式的小改动?我不想使用具有特定格式的 Zend_Date::toString(),因为那样会在所有语言环境中使用这种格式。

有问题的案例:我根据用户的区域设置格式化了日期。我的荷兰同胞 (nl_NL) 用户要求使用 dd-mm-yyyy 格式的日期,而不是 Zend_Locale 强烈声称是我们的短日期格式的 dd-mm-yy。如果我将输出日期的代码更改为明确使用自定义格式,这将适用于所有客户,而不仅仅是普通客户。我可以检查用户的语言环境,但如果需要创建更多异常,每次回显日期时,我都需要添加这些检查和异常,这让我感到畏缩。

我不能直接(也不想)改变 Zend_Locale XML 数据,因为 ZF 库被各种站点使用。

我确信这是那些“非常简单”的问题之一......一旦你知道如何。有任何想法吗?

4

3 回答 3

1

必须有某种方法:

  1. 延长Zend_Locale
  2. 创建与要自定义其行为的现有语言环境相对应的新语言环境。
  3. 为包含定制的新语言环境创建一个新的 XML 文件。

然后,在 中Bootstrap,创建新的语言环境对象。如果当前语言环境与您希望自定义的语言环境匹配,则手动切换到新语言环境。

关键可能是在哪里放置新的 XML 文件以及如何定义映射。当然,您可能不想在 Zend 文件夹中放置任何新内容,那么我们如何告诉Zend_Locale他和他的朋友使用新位置呢?该映射信息是否在各个Zend_Locale_XXX类中“硬编码”?

反正就是说说一些想法。希望它能给你一些方向或激励比我更有知识的人——确实是一个相当低的标准!- 想出一些更确定和权威的东西。

干杯!

于 2010-12-29T03:41:20.607 回答
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;
}

最后在视图脚本中,$date对象在哪里Zend_Date

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

如果$view->dateFormat为 null,则将使用当前语言环境的格式。否则,您的覆盖将适用。

于 2012-06-07T11:55:48.823 回答
0

我也开始考虑 David Weinraub 的第二个解决方案。

这是我为任何语言环境切换到 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 回答