Dave,

Thanks for your excellent response.

It looks like the MMMMd entry is the one i'm interested in. I was able to change the generate_from_cldr tool to extract this information and incorporate it into the locale modules. Out of the 134 modules derived from DateTime::Locale::root.pm, 71 of them had MMMMd information. The other locales will just inherit root which seems acceptable to me. As the cldr database gets more complete, these may fill out.

I really don't know what to name the format string so i stuck with the current convention which is to derive the names from the xml entities. That would make the format string MMMMd_datetime_format. It seems like an awkward name, but is easy enough to change.

The patch is pretty straight forward and included below.

If this is something that you are interested in incorporating into Date::Time::Locale, I would obviously love that. If not, you have still provided me with a pretty easy way to do what I want without a lot of manual work. If there is anything I can do to help (like update the documentation), please let me know.

Best Regards,

Brian Hirt

--- DateTime-Locale-0.35/tools/generate_from_cldr 2007-09-09 13:13:56.000000000 -0600 +++ DateTime-Locale-patch/tools/generate_from_cldr 2008-05-12 17:14:12.000000000 -0600
@@ -69,6 +69,7 @@
     );

 my @FormatLengths = qw( full long medium short  );
+my @dateTimeFormatIds = qw( MMMMd );

 my %opts;

@@ -373,6 +374,29 @@
 {
     my ( $hash, $cal ) = @_;

+ if ( my $dateTimes = $cal->{dateTimeFormats}{availableFormats} {dateFormatItem} )
+    {
+ # if there is only one availableFormats, a hash will be returned instead of an
+       # array, create array so it get's processed below
+       if ( ref $dateTimes eq 'HASH' )
+       {
+           $dateTimes = [ $dateTimes ];
+       }
+
+       foreach my $dateFormatItem (@$dateTimes)
+       {
+           foreach my $formatId (@dateTimeFormatIds)
+           {
+               next unless $dateFormatItem->{id} eq $formatId;
+
+ $hash->{datetime_formats}{$formatId} = simple2strf($dateFormatItem- >{content});
+
+ print " datetime_formats{$formatId}: $hash->{datetime_formats} {$formatId}\n"
+                   if $opts{verbose};
+           }
+       }
+    }
+
     if ( my $dates = $cal->{dateFormats} )
     {
         my %original;
@@ -690,6 +714,21 @@
         $subs .= sprintf "sub %-30s { [EMAIL PROTECTED] }\n", $var, $var;
     }

+    foreach my $var ( qw( datetime_formats) )
+    {
+        next unless $hash->{$var};
+
+        for my $formatId (@dateTimeFormatIds)
+        {
+            next unless $hash->{$var}{$formatId};
+
+            my $sub_name = join '_', $formatId, $var;
+            $sub_name =~ s/s$//;
+
+            $subs .=
+ sprintf "sub %-30s { %s }\n", $sub_name, qq|"\Q$hash- >{$var}{$formatId}\E"|;
+        }
+    }
     foreach my $var ( qw( date_formats
                           time_formats
                         ) )

On May 12, 2008, at 3:40 PM, Dave Rolsky wrote:

On Mon, 12 May 2008, Brian Hirt wrote:

it includes the year (which i do not want). Does anyone have any advice on how to do this other than manually defining and maintaining 200 different format strings outside of DateTime? If it is not possible to print a "day month" string, is this something that might be added to the locale objects? It seems like this would be a common thing that's wanted.

This is definitely something that should be part of the DT::Locale api (if it exists).

It looks like this data does exist in the CLDR XML data, which is key, because the DT::Locale modules are just generated from this data.

If you look at the CLDR data, there's a bit of XML like this:

 <dateTimeFormats>
         <dateTimeFormatLength>
                 <dateTimeFormat>
                         <pattern>{1} {0}</pattern>
                 </dateTimeFormat>
         </dateTimeFormatLength>
         <availableFormats>
                 <dateFormatItem id="HHmm">HH:mm</dateFormatItem>
                 <dateFormatItem id="HHmmss">HH:mm:ss</dateFormatItem>
                 <dateFormatItem id="MMMMd">MMMM d</dateFormatItem>
<dateFormatItem id="MMMMdd" draft="unconfirmed">dd MMMM</dateFormatItem> <dateFormatItem id="MMMd" draft="unconfirmed">d- MMM</dateFormatItem> <dateFormatItem id="MMMdd" draft="unconfirmed">dd MMM</dateFormatItem> <dateFormatItem id="MMd" draft="unconfirmed">d/MM</ dateFormatItem>
                 <dateFormatItem id="Md">M/d</dateFormatItem>
<dateFormatItem id="hhmm" draft="unconfirmed">hh:mm a</dateFormatItem> <dateFormatItem id="hhmmss" draft="unconfirmed">hh:mm:ss a</dateFormatItem>
                 <dateFormatItem id="mmss">mm:ss</dateFormatItem>
                 <dateFormatItem id="yyMM">MM/yy</dateFormatItem>
                 <dateFormatItem id="yyQ">Q yy</dateFormatItem>
                 <dateFormatItem id="yyQQQQ">QQQQ yy</dateFormatItem>
<dateFormatItem id="yyyyM" draft="unconfirmed">M/ yyyy</dateFormatItem> <dateFormatItem id="yyyyMMM">MMM yyyy</ dateFormatItem>
         </availableFormats>
 </dateTimeFormats>

I'm pretty sure this is the type of thing you're looking for.

This is definitely a case of patches welcome.

It probably wouldn't be _too_ hard to add support for this.

The starting point is the tools/generate_from_cldr script, which is what generates the various locatel .pm files. It's not the most beautiful code though ;)

If you make the generator include this info I would certainly be willing to add an appropriate API for retrieving it, probably something like:

 $locale->format_for('MMMMd')

since there's so many formats making a mtehod for each seems like a mess.


-dave

/*==========================
VegGuide.Org
Your guide to all that's veg
==========================*/


Reply via email to