1package DateTime::Locale;
2
3use strict;
4use warnings;
5
6use 5.006;
7
8# Loading this here isn't necessary, but it makes it easier to catch
9# syntax errors when testing.
10use DateTime::Locale::Base;
11use DateTime::Locale::Catalog;
12use Params::Validate qw( validate validate_pos SCALAR );
13
14our $VERSION = '0.45';
15
16my %Class;
17my %DataForID;
18my %NameToID;
19my %NativeNameToID;
20my %AliasToID;
21my %IDToExtra;
22
23my %LoadCache;
24
25sub register {
26    my $class = shift;
27
28    %LoadCache = ();
29
30    if ( ref $_[0] ) {
31        $class->_register(%$_) foreach @_;
32    }
33    else {
34        $class->_register(@_);
35    }
36}
37
38sub _register {
39    my $class = shift;
40
41    my %p = validate(
42        @_, {
43            id => { type => SCALAR },
44
45            en_language  => { type => SCALAR },
46            en_script    => { type => SCALAR, optional => 1 },
47            en_territory => { type => SCALAR, optional => 1 },
48            en_variant   => { type => SCALAR, optional => 1 },
49
50            native_language  => { type => SCALAR, optional => 1 },
51            native_script    => { type => SCALAR, optional => 1 },
52            native_territory => { type => SCALAR, optional => 1 },
53            native_variant   => { type => SCALAR, optional => 1 },
54
55            class   => { type => SCALAR, optional => 1 },
56            replace => { type => SCALAR, default  => 0 },
57        }
58    );
59
60    my $id = $p{id};
61
62    die "'\@' or '=' are not allowed in locale ids"
63        if $id =~ /[\@=]/;
64
65    die
66        "You cannot replace an existing locale ('$id') unless you also specify the 'replace' parameter as true\n"
67        if !delete $p{replace} && exists $DataForID{$id};
68
69    $p{native_language} = $p{en_language}
70        unless exists $p{native_language};
71
72    my @en_pieces;
73    my @native_pieces;
74    foreach my $p (qw( language script territory variant )) {
75        push @en_pieces,     $p{"en_$p"}     if exists $p{"en_$p"};
76        push @native_pieces, $p{"native_$p"} if exists $p{"native_$p"};
77    }
78
79    $p{en_complete_name}     = join ' ', @en_pieces;
80    $p{native_complete_name} = join ' ', @native_pieces;
81
82    $DataForID{$id} = \%p;
83
84    $NameToID{ $p{en_complete_name} }           = $id;
85    $NativeNameToID{ $p{native_complete_name} } = $id;
86
87    $Class{$id} = $p{class} if defined exists $p{class};
88}
89
90sub _registered_id {
91    shift;
92    my ($id) = validate_pos( @_, { type => SCALAR } );
93
94    return 1 if $AliasToID{$id};
95    return 1 if $DataForID{$id};
96
97    return 0;
98}
99
100sub add_aliases {
101    shift;
102
103    %LoadCache = ();
104
105    my $aliases = ref $_[0] ? $_[0] : {@_};
106
107    while ( my ( $alias, $id ) = each %$aliases ) {
108        die
109            "Unregistered locale '$id' cannot be used as an alias target for $alias"
110            unless __PACKAGE__->_registered_id($id);
111
112        die "Can't alias an id to itself"
113            if $alias eq $id;
114
115        # check for overwrite?
116
117        my %seen = ( $alias => 1, $id => 1 );
118        my $copy = $id;
119        while ( $copy = $AliasToID{$copy} ) {
120            die "Creating an alias from $alias to $id would create a loop.\n"
121                if $seen{$copy};
122
123            $seen{$copy} = 1;
124        }
125
126        $AliasToID{$alias} = $id;
127    }
128}
129
130sub remove_alias {
131    shift;
132
133    %LoadCache = ();
134
135    my ($alias) = validate_pos( @_, { type => SCALAR } );
136
137    return delete $AliasToID{$alias};
138}
139
140BEGIN {
141    __PACKAGE__->register( DateTime::Locale::Catalog->Locales() );
142    __PACKAGE__->add_aliases( DateTime::Locale::Catalog->Aliases() );
143}
144
145sub ids   { wantarray ? keys %DataForID : [ keys %DataForID ] }
146sub names { wantarray ? keys %NameToID  : [ keys %NameToID ] }
147
148sub native_names {
149    wantarray ? keys %NativeNameToID : [ keys %NativeNameToID ];
150}
151
152# These are hardcoded for backwards comaptibility with the
153# DateTime::Language code.
154my %OldAliases = (
155    'Afar'      => 'aa',
156    'Amharic'   => 'am_ET',
157    'Austrian'  => 'de_AT',
158    'Brazilian' => 'pt_BR',
159    'Czech'     => 'cs_CZ',
160    'Danish'    => 'da_DK',
161    'Dutch'     => 'nl_NL',
162    'English'   => 'en_US',
163    'French'    => 'fr_FR',
164
165    #      'Gedeo'             => undef, # XXX
166    'German'            => 'de_DE',
167    'Italian'           => 'it_IT',
168    'Norwegian'         => 'no_NO',
169    'Oromo'             => 'om_ET',    # Maybe om_KE or plain om ?
170    'Portugese'         => 'pt_PT',
171    'Sidama'            => 'sid',
172    'Somali'            => 'so_SO',
173    'Spanish'           => 'es_ES',
174    'Swedish'           => 'sv_SE',
175    'Tigre'             => 'tig',
176    'TigrinyaEthiopian' => 'ti_ET',
177    'TigrinyaEritrean'  => 'ti_ER',
178);
179
180sub load {
181    my $class = shift;
182    my ($name) = validate_pos( @_, { type => SCALAR } );
183
184    # Support RFC 3066 language tags, which use '-' instead of '_'.
185    $name =~ tr/-/_/;
186
187    my $key = $name;
188
189    return $LoadCache{$key} if exists $LoadCache{$key};
190
191    # Custom class registered by user
192    if ( $Class{$name} ) {
193        return $LoadCache{$key}
194            = $class->_load_class_from_id( $name, $Class{$name} );
195    }
196
197    # special case for backwards compatibility with DT::Language
198    $name = $OldAliases{$name} if exists $OldAliases{$name};
199
200    if ( exists $DataForID{$name} || exists $AliasToID{$name} ) {
201        return $LoadCache{$key} = $class->_load_class_from_id($name);
202    }
203
204    foreach my $h ( \%NameToID, \%NativeNameToID ) {
205        return $LoadCache{$key} = $class->_load_class_from_id( $h->{$name} )
206            if exists $h->{$name};
207    }
208
209    if ( my $id = $class->_guess_id($name) ) {
210        return $LoadCache{$key} = $class->_load_class_from_id($id);
211    }
212
213    die "Invalid locale name or id: $name\n";
214}
215
216sub _guess_id {
217    my $class = shift;
218    my $name  = shift;
219
220    # Strip off charset for LC_* ids : en_GB.UTF-8 etc
221    $name =~ s/\..*$//;
222
223    my ( $language, $script, $territory, $variant ) = _parse_id($name);
224
225    my @guesses;
226
227    if ( defined $script ) {
228        my $guess = join '_', lc $language, ucfirst lc $script;
229
230        push @guesses, $guess;
231
232        $guess .= '_' . uc $territory if defined $territory;
233
234        # version with script comes first
235        unshift @guesses, $guess;
236    }
237
238    if ( defined $variant ) {
239        push @guesses, join '_', lc $language, uc $territory, uc $variant;
240    }
241
242    if ( defined $territory ) {
243        push @guesses, join '_', lc $language, uc $territory;
244    }
245
246    push @guesses, lc $language;
247
248    foreach my $id (@guesses) {
249        return $id
250            if exists $DataForID{$id} || exists $AliasToID{$id};
251    }
252}
253
254sub _parse_id {
255    $_[0] =~ /([a-z]+)               # id
256              (?: _([A-Z][a-z]+) )?  # script - Title Case - optional
257              (?: _([A-Z]+) )?       # territory - ALL CAPS - optional
258              (?: _([A-Z]+) )?       # variant - ALL CAPS - optional
259             /x;
260
261    return $1, $2, $3, $4;
262}
263
264sub _load_class_from_id {
265    my $class      = shift;
266    my $id         = shift;
267    my $real_class = shift;
268
269    # We want the first alias for which there is data, even if it has
270    # no corresponding .pm file.  There may be multiple levels of
271    # alias to go through.
272    my $data_id = $id;
273    while ( exists $AliasToID{$data_id} && !exists $DataForID{$data_id} ) {
274        $data_id = $AliasToID{$data_id};
275    }
276
277    $real_class ||= "DateTime::Locale::$data_id";
278
279    unless ( $real_class->can('new') ) {
280        eval "require $real_class";
281
282        die $@ if $@;
283    }
284
285    my $locale = $real_class->new(
286        %{ $DataForID{$data_id} },
287        id => $id,
288    );
289
290    return $locale if $DateTime::Locale::InGenerator;
291
292    if ( $locale->can('cldr_version') ) {
293        my $object_version  = $locale->cldr_version();
294        my $catalog_version = DateTime::Locale::Catalog->CLDRVersion();
295
296        if ( $object_version ne $catalog_version ) {
297            warn
298                "Loaded $real_class, which is from an older version ($object_version)"
299                . "of the CLDR database than this installation of"
300                . "DateTime::Locale ($catalog_version).\n";
301        }
302    }
303
304    return $locale;
305}
306
3071;
308
309__END__
310
311=pod
312
313=encoding utf8
314
315=head1 NAME
316
317DateTime::Locale - Localization support for DateTime.pm
318
319=head1 SYNOPSIS
320
321  use DateTime::Locale;
322
323  my $loc = DateTime::Locale->load('en_GB');
324
325  print $loc->native_locale_name(),   "\n",
326	$loc->datetime_format_long(), "\n";
327
328  # but mostly just things like ...
329
330  my $dt = DateTime->now( locale => 'fr' );
331  print "Aujourd'hui le mois est " . $dt->month_name(), "\n";
332
333=head1 DESCRIPTION
334
335DateTime::Locale is primarily a factory for the various locale
336subclasses. It also provides some functions for getting information on
337all the available locales.
338
339If you want to know what methods are available for locale objects,
340then please read the C<DateTime::Locale::Base> documentation.
341
342=head1 USAGE
343
344This module provides the following class methods:
345
346=head2 DateTime::Locale->load( $locale_id | $locale_name | $alias )
347
348Returns the locale object for the specified locale id, name, or alias
349- see the C<DateTime::Locale::Catalog> documentation for a list of
350built in names and ids. The name provided may be either the English
351or native name.
352
353If the requested locale is not found, a fallback search takes place to
354find a suitable replacement.
355
356The fallback search order is:
357
358  {language}_{script}_{territory}
359  {language}_{script}
360  {language}_{territory}_{variant}
361  {language}_{territory}
362  {language}
363
364Eg. For locale C<es_XX_UNKNOWN> the fallback search would be:
365
366  es_XX_UNKNOWN   # Fails - no such locale
367  es_XX           # Fails - no such locale
368  es              # Found - the es locale is returned as the
369                  # closest match to the requested id
370
371Eg. For locale C<es_Latn_XX> the fallback search would be:
372
373  es_Latn_XX      # Fails - no such locale
374  es_Latn         # Fails - no such locale
375  es_XX           # Fails - no such locale
376  es              # Found - the es locale is returned as the
377                  # closest match to the requested id
378
379If no suitable replacement is found, then an exception is thrown.
380
381Please note that if you provide an B<id> to this method, then the
382returned locale object's C<id()> method will B<always> return the
383value you gave, even if that value was an alias to some other id.
384
385This is done for forwards compatibility, in case something that is
386currently an alias becomes a unique locale in the future.
387
388This means that the value of C<< $locale->id() >> and the object's
389class may not match.
390
391The loaded locale is cached, so that B<locale objects may be
392singletons>. Calling C<< DateTime::Locale->register() >>, C<<
393DateTime::Locale->add_aliases() >>, or C<<
394DateTime::Locale->remove_alias() >> clears the cache.
395
396=head2 DateTime::Locale->ids()
397
398  my @ids = DateTime::Locale->ids();
399  my $ids = DateTime::Locale->ids();
400
401Returns an unsorted list of the available locale ids, or an array
402reference if called in a scalar context. This list does not include
403aliases.
404
405=head2 DateTime::Locale->names()
406
407  my @names = DateTime::Locale->names();
408  my $names = DateTime::Locale->names();
409
410Returns an unsorted list of the available locale names in English, or
411an array reference if called in a scalar context.
412
413=head2 DateTime::Locale->native_names()
414
415  my @names = DateTime::Locale->native_names();
416  my $names = DateTime::Locale->native_names();
417
418Returns an unsorted list of the available locale names in their native
419language, or an array reference if called in a scalar context. All
420native names are utf8 encoded.
421
422B<NB>: Some locales are only partially translated, so their native locale
423names may still contain some English.
424
425=head2 DateTime::Locale->add_aliases ( $alias1 => $id1, $alias2 => $id2, ... )
426
427Adds an alias to an existing locale id. This allows a locale to be
428loaded by its alias rather than id or name. Multiple aliases are
429allowed.
430
431If the passed locale id is neither registered nor listed in
432L<DateTime::Local::Catalog>'s list of ids, an exception is thrown.
433
434 DateTime::Locale->add_aliases( LastResort => 'es_ES' );
435
436 # Equivalent to DateTime::Locale->load('es_ES');
437 DateTime::Locale->load('LastResort');
438
439You can also pass a hash reference to this method.
440
441 DateTime::Locale->add_aliases( { Default     => 'en_GB',
442                                  Alternative => 'en_US',
443                                  LastResort  => 'es_ES' } );
444
445=head2 DateTime::Locale->remove_alias( $alias )
446
447Removes a locale id alias, and returns true if the specified alias
448actually existed.
449
450 DateTime::Locale->add_aliases( LastResort => 'es_ES' );
451
452 # Equivalent to DateTime::Locale->load('es_ES');
453 DateTime::Locale->load('LastResort');
454
455 DateTime::Locale->remove_alias('LastResort');
456
457 # Throws an exception, 'LastResort' no longer exists
458 DateTime::Locale->load('LastResort');
459
460=head2 DateTime::Locale->register( { ... }, { ... } )
461
462This method allows you to register custom locales with the module. A
463single locale is specified as a hash, and you may register multiple
464locales at once by passing an array of hash references.
465
466Until registered, custom locales cannot be instantiated via C<load()>
467and will not be returned by querying methods such as C<ids()> or
468C<names()>.
469
470 register( id           => $locale_id,
471           en_language  => ..., # something like 'English' or 'Afar',
472
473           # All other keys are optional. These are:
474           en_script    => ...,
475           en_territory => ...,
476           en_variant   => ...,
477
478           native_language  => ...,
479           native_sript     => ...,
480           native_territory => ...,
481           native_variant   => ...,
482
483           # Optional - defaults to DateTime::Locale::$locale_id
484           class   => $class_name,
485
486           replace => $boolean
487         )
488
489The locale id and English name are required, and the following formats
490should used wherever possible:
491
492 id:   languageId[_script][_territoryId[_variantId]]
493
494 Where:  languageId = Lower case ISO 639 code -
495         Always choose 639-1 over 639-2 where possible.
496
497 script = Title Case ISO 15924 script code
498
499 territoryId = Upper case ISO 3166 code -
500               Always choose 3166-1 over 3166-2 where possible.
501
502 variantId = Upper case variant id -
503             Basically anything you want, since this is typically the
504             component that uniquely identifies a custom locale.
505
506You cannot not use '@' or '=' in locale ids - these are reserved for
507future use. The underscore (_) is the component separator, and should
508not be used for any other purpose.
509
510If the "native_*" components are supplied, they must be utf8 encoded.
511
512If omitted, the native name is assumed to be identical to the English
513name.
514
515If class is supplied, it must be the full module name of your custom
516locale. If omitted, the locale module is assumed to be a
517DateTime::Locale subclass.
518
519Examples:
520
521 DateTime::Locale->register
522     ( id           => 'en_GB_RIDAS',
523       en_language  => 'English',
524       en_territory => 'United Kingdom',
525       en_variant   => 'Ridas Custom Locale',
526     );
527
528 # Returns instance of class DateTime::Locale::en_GB_RIDAS
529 my $l = DateTime::Locale->load('en_GB_RIDAS');
530
531 DateTime::Locale->register
532     ( id               => 'hu_HU',
533       en_language      => 'Hungarian',
534       en_territory     => Hungary',
535       native_language  => 'Magyar',
536       native_territory => 'Magyarország',
537     );
538
539 # Returns instance of class DateTime::Locale::hu_HU
540 my $l = DateTime::Locale->load('hu_HU');
541
542 DateTime::Locale->register
543     ( id    => 'en_GB_RIDAS',
544       name  => 'English United Kingdom Ridas custom locale',
545       class => 'Ridas::Locales::CustomGB',
546     );
547
548 # Returns instance of class Ridas::Locales::CustomGB
549 my $l = DateTime::Locale->load('en_GB_RIDAS');
550
551If you register a locale for an id that is already registered, the
552"replace" parameter must be true or an exception will be thrown.
553
554The complete name for a registered locale is generated by joining
555together the language, territory, and variant components with a single
556space.
557
558This means that in the first example, the complete English and native
559names for the locale would be "English United Kingdom Ridas Custom
560Locale", and in the second example the complete English name is
561"Hungarian Hungary", while the complete native name is "Magyar
562Magyarország". The locale will be loadable by these complete names
563(English and native), via the C<load()> method.
564
565=head1 ADDING CUSTOM LOCALES
566
567These are added in one of two ways:
568
569=over 4
570
571=item 1.
572
573Subclass an existing locale implementing only the changes you require.
574
575=item 2.
576
577Create a completely new locale as a new class.
578
579=back
580
581In either case the locale MUST be registered before use.
582
583=head2 Subclassing an existing locale
584
585The following example sublasses the United Kingdom English locale to change
586some the full date and time formats.
587
588  package Ridas::Locale::en_GB_RIDAS1;
589
590  use strict;
591  use DateTime::Locale::en_GB;
592
593  use base 'DateTime::Locale::en_GB';
594
595  sub date_format_full   { 'EEEE d MMMM y' }
596
597  sub time_format_full   { 'HH mm zzzz' }
598
599  1;
600
601Now register it:
602
603 DateTime::Locale->register
604     ( id    => 'en_GB_RIDAS1',
605
606       # name, territory, and variant as described in register() documentation
607
608       class => 'Ridas::Locale::en_GB_RIDAS1',
609     );
610
611=head2 Creating a completely new locale
612
613You are, of course, free to subclass L<DateTime::Locale::Base> if you
614want to, though this is not required.
615
616Remember to register your custom locale!
617
618Of course, you can always do the registration in the module itself,
619and simply load it before using it.
620
621A completely new custom locale, one which does not subclass
622L<DateTime::Locale::Base>, must implement a number of methods.
623
624The following methods can be used to get information about the
625locale's id and name.
626
627=over 4
628
629=item * $locale->id()
630
631The complete locale id, something like "en_US".
632
633=item * $locale->language_id()
634
635The language portion of the id, like "en".
636
637=item * $locale->script_id()
638
639The script portion of the id, like "Hant".
640
641=item * $locale->territory_id()
642
643The territory portion of the id, like "US".
644
645=item * $locale->variant_id()
646
647The variant portion of the id, like "PREEURO".
648
649=item * $locale->name()
650
651The locale's complete name, which always includes at least a language
652component, plus optional territory and variant components. Something
653like "English United States". The value returned will always be in
654English.
655
656=item * $locale->language()
657
658=item * $locale->script()
659
660=item * $locale->territory()
661
662=item * $locale->variant()
663
664The relevant component from the locale's complete name, like "English"
665or "United States".
666
667=item * $locale->native_name()
668
669The locale's complete name in localized form as a UTF-8 string.
670
671=item * $locale->native_language()
672
673=item * $locale->native_script()
674
675=item * $locale->native_territory()
676
677=item * $locale->native_variant()
678
679The relevant component from the locale's complete native name as a
680UTF-8 string.
681
682=back
683
684The following methods all return an array reference containing the
685specified data.
686
687The methods with "format" in the name should return strings that can be used a
688part of a string, like "the month of July". The stand alone values are for
689use in things like calendars, and the narrow form may not be unique (for
690example, in day column heading for a calendar it's okay to have "T" for both
691Tuesday and Thursday).
692
693The wide name should always be the full name of thing in question. The narrow
694name should be just one or two characters.
695
696=over 4
697
698=item * $locale->month_format_wide()
699
700=item * $locale->month_format_abbreviated()
701
702=item * $locale->month_format_narrow()
703
704=item * $locale->month_stand_alone_wide()
705
706=item * $locale->month_stand_alone_abbreviated()
707
708=item * $locale->month_stand_alone_narrow()
709
710=item * $locale->day_format_wide()
711
712=item * $locale->day_format_abbreviated()
713
714=item * $locale->day_format_narrow()
715
716=item * $locale->day_stand_alone_wide()
717
718=item * $locale->day_stand_alone_abbreviated()
719
720=item * $locale->day_stand_alone_narrow()
721
722=item * $locale->quarter_format_wide()
723
724=item * $locale->quarter_format_abbreviated()
725
726=item * $locale->quarter_format_narrow()
727
728=item * $locale->quarter_stand_alone_wide()
729
730=item * $locale->quarter_stand_alone_abbreviated()
731
732=item * $locale->quarter_stand_alone_narrow()
733
734=item * $locale->am_pm_abbreviated()
735
736=item * $locale->era_wide()
737
738=item * $locale->era_abbreviated()
739
740=item * $locale->era_narrow()
741
742=back
743
744The following methods return strings appropriate for the
745C<< DateTime->format_cldr() >> method:
746
747=over 4
748
749=item * $locale->date_format_full()
750
751=item * $locale->date_format_long()
752
753=item * $locale->date_format_medium()
754
755=item * $locale->date_format_short()
756
757=item * $locale->date_format_default()
758
759=item * $locale->time_format_full()
760
761=item * $locale->time_format_long()
762
763=item * $locale->time_format_medium()
764
765=item * $locale->time_format_short()
766
767=item * $locale->time_format_default()
768
769=item * $locale->datetime_format_full()
770
771=item * $locale->datetime_format_long()
772
773=item * $locale->datetime_format_medium()
774
775=item * $locale->datetime_format_short()
776
777=item * $locale->datetime_format_default()
778
779=back
780
781A locale may also offer one or more formats for displaying part of a
782datetime, such as the year and month, or hour and minute.
783
784=over 4
785
786=item * $locale->format_for($name)
787
788These are accessed by passing a name to C<< $locale->format_for(...)  >>,
789where the name is a CLDR-style format specifier.
790
791The return value is a string suitable for passing to C<< $dt->format_cldr()
792>>, so you can do something like this:
793
794  print $dt->format_cldr( $dt->locale()->format_for('MMMdd') )
795
796which for the "en" locale would print out something like "08 Jul".
797
798Note that the localization may also include additional text specific to the
799locale. For example, the "MMMMd" format for the "zh" locale includes the
800Chinese characters for "day" (日) and month (月), so you get something like
801"8月23日".
802
803=item * $locale->available_formats()
804
805This should return a list of all the format names that could be passed
806to C<< $locale->format_for() >>.
807
808=back
809
810The following methods deal with the default format lengths:
811
812=over 4
813
814=item * $locale->default_date_format_length()
815
816=item * $locale->default_time_format_length()
817
818These methods return one of "full", "long", "medium", or "short",
819indicating the current default format length.
820
821The default when an object is created is determined by the CLDR locale
822data.
823
824=item * $locale->set_default_date_format_length($length)
825
826=item * $locale->set_default_time_format_length($length)
827
828These methods accept one of "full", "long", "medium", or "short",
829indicating the new default format length.
830
831=back
832
833There are also some miscellaneous methods locales should support:
834
835=over 4
836
837=item * $locale->prefers_24_hour_time()
838
839Returns a boolean indicating whether or not the locale prefers 24-hour time.
840
841=item * $locale->first_day_of_week()
842
843Returns a number from 1 to 7 indicating the I<local> first day of the
844week, with Monday being 1 and Sunday being 7.
845
846=back
847
848=head1 SUPPORT
849
850Please be aware that all locale data has been generated from the CLDR (Common
851Locale Data Repository) project locales data). The data is incomplete, and
852will contain errors in some locales.
853
854When reporting errors in data, please check the primary data sources
855first, then where necessary report errors directly to the primary
856source via the CLDR bug report system. See
857http://unicode.org/cldr/filing_bug_reports.html for details.
858
859Once these errors have been confirmed, please forward the error report
860and corrections to the DateTime mailing list, datetime@perl.org.
861
862Support for this module is provided via the datetime@perl.org email
863list. See http://lists.perl.org/ for more details.
864
865=head1 DONATIONS
866
867If you'd like to thank me for the work I've done on this module,
868please consider making a "donation" to me via PayPal. I spend a lot of
869free time creating free software, and would appreciate any support
870you'd care to offer.
871
872Please note that B<I am not suggesting that you must do this> in order
873for me to continue working on this particular software. I will
874continue to do so, inasmuch as I have in the past, for as long as it
875interests me.
876
877Similarly, a donation made in this way will probably not make me work
878on this software much more, unless I get so many donations that I can
879consider working on free software full time, which seems unlikely at
880best.
881
882To donate, log into PayPal and send money to autarch@urth.org or use
883the button on this page:
884L<http://www.urth.org/~autarch/fs-donation.html>
885
886=head1 AUTHORS
887
888Richard Evans <rich@ridas.com>
889
890Dave Rolsky <autarch@urth.org>
891
892These modules are loosely based on the DateTime::Language modules,
893which were in turn based on the Date::Language modules from Graham
894Barr's TimeDate distribution.
895
896=head1 COPYRIGHT
897
898Copyright (c) 2003 Richard Evans. Copyright (c) 2004-2009 David
899Rolsky. All rights reserved. This program is free software; you can
900redistribute it and/or modify it under the same terms as Perl itself.
901
902This program is free software; you can redistribute it and/or modify
903it under the same terms as Perl itself.
904
905The full text of the license can be found in the F<LICENSE> file included
906with this module.
907
908The locale modules in directory F<DateTime/Locale/> have been
909generated from data provided by the CLDR project, see
910F<DateTime/Locale/LICENSE.cldr> for details on the CLDR data's
911license.
912
913=head1 SEE ALSO
914
915L<DateTime::Locale::Base>
916
917datetime@perl.org mailing list
918
919http://datetime.perl.org/
920
921=cut
922