Reputation: 4306
Is it possible to instruct Zend_Locale that it should use a certain locale, except for a minor alteration to the date format? I don't want to use the Zend_Date::toString() with the specific formatting, because that would use this format on all locales.
Case in question: I have dates formatted according to a user's locale setting. My fellow Dutch (nl_NL) users are asking for dd-mm-yyyy formatted dates, instead of dd-mm-yy which Zend_Locale vehemently claims to be our short date format. If I change the code where the date is outputted to explicitly use a custom format, that applies to all customers instead of just the cheeseheads. I could check the user's locale, but if more exceptions need to be created, every time a date is echo'd I'd need to add these checks and exceptions, the prospect of which makes me cringe.
I can't alter the Zend_Locale XML data directly (and don't want to), as the ZF library is used by various sites.
I'm sure this is one of those "really simple" issues... once you know how. Any ideas?
Upvotes: 2
Views: 3015
Reputation: 2260
I was also commencing to consider David Weinraub's second solution.
Here is my flavour for switching to 4-digits years for any Locale:
In Bootstrap
class (application/Bootstrap.php
file)
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 **/
}
Use it (use the new constant instead of Zend_Date::DATE_SHORT
):
$date = new Zend_Date();
echo $date->toString(DATE_SHORT_LONGYEAR);
Upvotes: 0
Reputation: 14184
[Trying a new answer since this approach is substantively different than the previous answer.]
I assume that you would be calling Zend_Date::toString()
in a view.
So, maybe you could store a list of format overrides in a config file. During Bootstrap
, check if the loaded locale requires an override and then store the format in the view. Then whenever you output a date, use that format.
Something like this:
In application/configs/application.ini
:
dateFormat.nl_NL = "d-m-Y"
In 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;
}
Finally in a view-script, where $date
is a Zend_Date
object:
<p>The date is <?= $date->toString($this->dateFormat) ?>.</p>
If $view->dateFormat
is null, then the format for the current locale will be used. Otherwise, your override will apply.
Upvotes: 1
Reputation: 14184
There must be some way to:
Zend_Locale
Then, in Bootstrap
, create the new locale object. If the current locale matches the locale you wish to customize, then manually switch to the new locale.
The key is probably where to place the new XML files and how to define the mapping. Of course, you probably don't want to place anything new in the Zend folders, so how do we tell Zend_Locale
and his friends to use the new location? Is that mapping information "hard-coded" in the various Zend_Locale_XXX
classes?
Anyway, just talking out some ideas. Hope it gives you some direction or inspires someone else more knowledgeable than me - a rather low bar, indeed! - to come up with something more definitive and authoritative.
Cheers!
Upvotes: 1