是否可以指示Zend_Locale应该使用某个区域设置,除了对日期格式进行微小更改?我不想将Zend_Date :: toString()与特定格式一起使用,因为这会在所有语言环境中使用这种格式。
有问题的案例:我根据用户的区域设置格式化了日期。我的荷兰(nl_NL)用户要求使用dd-mm-yyyy格式的日期,而不是dd-mm-yy,Zend_Locale强烈声称这是我们的短日期格式。如果我更改输出日期的代码以明确使用自定义格式,则适用于所有客户而不仅仅是奶酪头。我可以检查用户的语言环境,但是如果需要创建更多的异常,每次回显日期时我都需要添加这些检查和异常,这样做的前景让我感到畏缩。
我无法直接(并且不希望)更改Zend_Locale XML数据,因为各个站点都使用ZF库。
我确信这是“非常简单”的问题之一......一旦你知道如何。有什么想法吗?
答案 0 :(得分:1)
必须有一些方法:
Zend_Locale
然后,在Bootstrap
中,创建新的语言环境对象。如果当前区域设置与您要自定义的区域设置匹配,则手动切换到新区域设置。
关键可能是放置新XML文件的位置以及如何定义映射。当然,您可能不希望在Zend文件夹中放置任何新内容,那么我们如何告诉Zend_Locale
和他的朋友使用新位置?该映射信息是否在各种Zend_Locale_XXX
类中“硬编码”?
无论如何,只是说出一些想法。希望它给你一些方向或激励别人比我更有知识 - 确实是一个相当低的酒吧! - 提出更具权威性和权威性的内容。
干杯!
答案 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;
}
最后在视图脚本中,$date
是Zend_Date
对象:
<p>The date is <?= $date->toString($this->dateFormat) ?>.</p>
如果$view->dateFormat
为null,则将使用当前语言环境的格式。否则,您的覆盖将适用。
答案 2 :(得分: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);