#! /bin/false # vim: tabstop=4 package SimpleCal; use strict; # The text domain (identifier) of our package is 'com.cantanea.simplecal', # following the advice in the pod of Locale::TextDomain. use Locale::TextDomain qw (com.cantanea.simplecal); use base qw (Exporter); use vars qw (@EXPORT); @EXPORT = qw (month_name abbr_week_day is_leap_year); sub month_name ($) { my $month = shift; $month = 0 unless $month; $month %= 12; # This is of course stupid but explains things best. See the # function abbr_week_day() for a smarter approach. if ($month == 0) { return __"January"; } elsif ($month == 1) { return __"February"; } elsif ($month == 2) { return __"March"; } elsif ($month == 3) { return __"April"; } elsif ($month == 4) { return __"May"; } elsif ($month == 5) { return __"June"; } elsif ($month == 6) { return __"July"; } elsif ($month == 7) { return __"August"; } elsif ($month == 8) { return __"September"; } elsif ($month == 9) { return __"October"; } elsif ($month == 10) { return __"November"; } else { return __"December"; } } # This is smarter. We initialize an array with the English names first. # The function N__() is exported by Locale::TextDomain and returns # its argument unmodified. Its sole purpose is to mark the string as # being translatable, so that it will make it into the pot file for # our package. # # It is dangerous to use __() here! Why? Then the array will be translated # only once, at compile time. It is very likely that the locale settings # have not yet been initialized to the user preferences at this point # of time, and since the array is already created, the translation # will not produce the correct results. # # This should become clearer if you imagine that our library would be # part of a daemon that is running for days or even years. The array # would be initialized with the language that was set at program startup # and would then never change again, because you actually cache the # translations. my @abbr_week_days = ( N__"Sun", N__"Mon", N__"Tue", N__"Wed", N__"Thu", N__"Fri", N__"Sat", ); sub abbr_week_day ($) { my $wday = shift; $wday = 0 unless $wday; $wday %= 7; # The argument to __() is simply a string, not necessarily a string # constant. The following line will look up the English name in the # array, and then translates that string on the fly into the current # user language. return __($abbr_week_days[$wday]); # This can still be suboptimal because it translates the string again # and again. In situations where you are absolutely sure that the # user language will not change again, you may prefer to cache the # translations despite of the above hints, especially if you # call the function very many times. In a library you can usually # not be sure whether the user language can change or not and you # should avoid that. The message lookup is quite fast. # Instead of the above return directive we could also have written: # # return $__{$abbr_week_days[$wday]}; # # resp. # # return $__->{$abbr_week_days[$wday]}; # # It is basically a matter of taste whether you prefer the tied # hash lookup or the function call. } # Check whether the argument is a leap year. sub is_leap_year { my $year = shift; $year = 0 unless $year; return 1 if $year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0); return; } 1; __END__ Local Variables: mode: perl perl-indent-level: 4 perl-continued-statement-offset: 4 perl-continued-brace-offset: 0 perl-brace-offset: -4 perl-brace-imaginary-offset: 0 perl-label-offset: -4 cperl-indent-level: 4 cperl-continued-statement-offset: 2 tab-width: 4 End: