X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fcommon.pm;h=f81f9840d9817e683b520eca863518123b942849;hb=dcc24d444dd3e43c9501e88217b8b8eaaea617fa;hp=6ad6ae403e04d70459994625a98e8db2ab100719;hpb=238f92e411b064cb85c1dee579b7dcaea5e99499;p=wloh diff --git a/include/common.pm b/include/common.pm index 6ad6ae4..f81f984 100644 --- a/include/common.pm +++ b/include/common.pm @@ -35,6 +35,12 @@ sub get_locale { return $1; } +sub set_locale { + my $locale = shift; + $locale =~ s/-/_/; + POSIX::setlocale(&POSIX::LC_ALL, $locale . '.UTF-8'); +} + sub get_auxillary_parameters { my ($dbh, $locale) = @_; @@ -69,9 +75,9 @@ sub get_navbar { if ($ref->{'kultur'} eq $locale) { $lang{'lang-with-link'} = ''; - $lang{'lang-no-link'} = $ref->{'spraak'}; + $lang{'lang-no-link'} = Encode::decode_utf8($ref->{'spraak'}); } else { - $lang{'a'} = $ref->{'spraak'}; + $lang{'a'} = Encode::decode_utf8($ref->{'spraak'}); $lang{'a/href'} = sprintf "/%s/%s", $ref->{'kultur'}, $url; $lang{'lang-no-link'} = ''; } @@ -87,7 +93,7 @@ sub print_navbar { print "

"; - my $q = $dbh->prepare('SELECT spraak, kultur FROM fotballspraak WHERE nyestesesong <> -1 ORDER BY id'); + my $q = $dbh->prepare('SELECT spraak, kultur FROM fotballspraak WHERE nyestesesong <> -1 AND length(kultur)=5 ORDER BY id'); $q->execute; my $first = 1; @@ -106,11 +112,66 @@ sub print_navbar { print "

\n"; } +# mapping from locale to translation to use (if not found, "en" is used) +my %translation_mapping = ( + 'nb-NO' => 'no', + 'nn-NO' => 'no', + 'da-DK' => 'no', + 'sv-SE' => 'no', + 'nl-NL' => 'en', +); + sub process_template { - my ($filename, $parms) = @_; + my ($filename, $locale, $parms) = @_; - my $doc = XML::Template::process_file('../templates/' . $filename, $parms); + my $translation = $translation_mapping{$locale} // 'en'; + my $doc; + if (-r "../templates/$filename.$translation.xml") { + $parms->{'html/xml:lang'} = $translation; + $doc = XML::Template::process_file("../templates/$filename.$translation.xml", $parms); + } else { + $doc = XML::Template::process_file("../templates/$filename.xml", $parms); + } print $doc->toString; } +sub get_ordinal { + my ($num, $locale) = @_; + my $translation = $translation_mapping{$locale} // 'en'; + + if ($translation eq 'no') { + return $num . "."; + } elsif ($translation eq 'en') { + # http://en.wikipedia.org/wiki/English_numerals#Ordinal_numbers + my $units = $num % 10; + my $tens = (($num - $units) / 10) % 10; + if ($tens == 1) { + return $num . "th"; + } elsif ($units == 1) { + return $num . "st"; + } elsif ($units == 2) { + return $num . "nd"; + } elsif ($units == 3) { + return $num . "rd"; + } else { + return $num . "th"; + } + } else { + die "Missing ordinal strategy for locale $locale"; + } +} + +sub find_all_locales { + my $dbh = shift; + my $q = $dbh->prepare('SELECT kultur FROM fotballspraak WHERE nyestesesong <> -1 AND length(kultur)=5'); + $q->execute; + + my @locales = (); + while (my $ref = $q->fetchrow_hashref) { + push @locales, $ref->{'kultur'}; + } + + return @locales; +} + 1;