
jesse at bestpractical
Jan 12, 2009, 5:34 AM
Post #4 of 5
(930 views)
Permalink
|
|
Re: $DateDayBeforeMonth in DefaultFormat and enhance of date/time display
[In reply to]
|
|
That seems fairly reasonable. If it had tests, it would be incredibly reasonable ;) On Mon, Jan 12, 2009 at 10:28:40AM +0100, Emmanuel Lacour wrote: > On Fri, Jan 09, 2009 at 12:23:15PM -0500, Jesse Vincent wrote: > > > > Hm. This makes me a little twitchy. I'd really rather keep it > > parsing-only. I like your suggestion below :) > > > > I agree, I just modified a bit the description in RT_Config.pm.in to > say that it's only for parsing. > > > > > > > > > But maybe we would better make use of DateTime::Locale for displaying > > > date/times to be sure to cover most languages. > > > > I like this plan better :) > > > > > Here is an example of DateTime::Locale usage (as I understand this > > > module): > > > > > > > Cool. Can we make it depend on DateTime::Locale only if it's installed? > > > > See attached patch. > > > Also, I'd probably only offer the datetime formats, since only-date and > > only-time formats don't make a whole lot of sense in RT ;) > > > > Thought, I prefer to stay consistent with current output formaters which > supports this ;) > > diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in > index 0ac4a30..9bc0c2e 100755 > --- a/etc/RT_Config.pm.in > +++ b/etc/RT_Config.pm.in > @@ -1284,6 +1284,7 @@ section in perldoc F<lib/RT/Date.pm> for more options. This option can > be overridden by users in their preferences. > Some examples: > > +C<Set($DateTimeFormat, 'LocalizedDateTime');> > C<Set($DateTimeFormat, { Format => 'ISO', Seconds => 0 });> > C<Set($DateTimeFormat, 'RFC2822');> > C<Set($DateTimeFormat, { Format => 'RFC2822', Seconds => 0, DayOfWeek => 0 });> > diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm > index 0027656..710a2c9 100644 > --- a/lib/RT/Config.pm > +++ b/lib/RT/Config.pm > @@ -275,7 +275,11 @@ our %META = ( > Callback => sub { my $ret = { Values => [], ValuesLabel => {}}; > my $date = new RT::Date($HTML::Mason::Commands::session{'CurrentUser'}); > $date->Set; > - foreach my $value (qw(DefaultFormat RFC2822 ISO W3CDTF)) { #loc_qw > + my @formats = qw(DefaultFormat RFC2822 ISO W3CDTF); #loc_qw > + if ( eval 'use DateTime qw(); 1;' && eval 'use DateTime::Locale qw(); 1;' ) { > + push @formats, 'LocalizedDateTime'; #loc > + } > + foreach my $value (@formats) { > push @{$ret->{Values}}, $value; > $ret->{ValuesLabel}{$value} = $date->$value(); > } > diff --git a/lib/RT/Date.pm b/lib/RT/Date.pm > index c1354b7..b03f8a1 100755 > --- a/lib/RT/Date.pm > +++ b/lib/RT/Date.pm > @@ -586,6 +586,72 @@ sub DefaultFormat > } > } > > +=head3 LocalizedDateTime > + > +Returns date and time as string, with user localization. > + > +Supports arguments: C<DateFormat> and C<TimeFormat> which may contains date and > +time format as specified in DateTime::Locale (default to full_date_format and > +medium_time_format), C<AbbrDay> and C<AbbrMonth> which may be set to 0 if > +you want full Day/Month names instead of abbreviated ones. > + > +Require optionnal DateTime::Locale module. > + > +=cut > + > +sub LocalizedDateTime > +{ > + my $self = shift; > + my %args = ( Date => 1, > + Time => 1, > + Timezone => '', > + DateFormat => 'full_date_format', > + TimeFormat => 'medium_time_format', > + AbbrDay => 1, > + AbbrMonth => 1, > + @_, > + ); > + > + return $self->loc("DateTime module missing") unless ( eval 'use DateTime qw(); 1;' ); > + return $self->loc("DateTime::Locale module missing") unless ( eval 'use DateTime::Locale qw(); 1;' ); > + my $date_format = $args{'DateFormat'}; > + my $time_format = $args{'TimeFormat'}; > + > + my $lang = $self->CurrentUser->UserObj->Lang || 'en'; > + > + my $formatter = DateTime::Locale->load($lang); > + $date_format = $formatter->$date_format; > + $time_format = $formatter->$time_format; > + $date_format =~ s/\%A/\%a/g if ( $args{'AbbrDay'} ); > + $date_format =~ s/\%B/\%b/g if ( $args{'AbbrMonth'} ); > + > + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$ydaym,$isdst,$offset) = > + $self->Localtime($args{'Timezone'}); > + $mon++; > + my $tz = $self->Timezone($args{'Timezone'}); > + > + # FIXME : another way to call this module without conflict with local > + # DateTime method? > + my $dt = new DateTime::( locale => $lang, > + time_zone => $tz, > + year => $year, > + month => $mon, > + day => $mday, > + hour => $hour, > + minute => $min, > + second => $sec, > + nanosecond => 0, > + ); > + > + if ( $args{'Date'} && !$args{'Time'} ) { > + return $dt->strftime($date_format); > + } elsif ( !$args{'Date'} && $args{'Time'} ) { > + return $dt->strftime($time_format); > + } else { > + return $dt->strftime($date_format) . " " . $dt->strftime($time_format); > + } > +} > + > =head3 ISO > > Returns the object's date in ISO format C<YYYY-MM-DD mm:hh:ss>. > _______________________________________________ > List info: http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel -- _______________________________________________ List info: http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel
|