]> git.sesse.net Git - wloh/blob - include/common.pm
Ignore languages that are not WLoH languages; this is marked by non-standard-length...
[wloh] / include / common.pm
1 use strict;
2 use warnings;
3 use POSIX;
4 use XML::Template;
5
6 package wloh_common;
7
8 sub get_max_season {
9         my ($dbh, $locale) = @_;
10         my $ref = $dbh->selectrow_hashref('SELECT MAX(sesong) AS max_sesong FROM fotballserier se JOIN fotballspraak sp ON se.spraak=sp.id WHERE kultur=?',
11                 undef, $locale);
12         return $ref->{'max_sesong'};
13 }
14
15 sub get_last_sync {
16         my $dbh = shift;
17         my $ref = $dbh->selectrow_hashref('SELECT EXTRACT(EPOCH FROM last_sync) AS last_sync FROM last_sync');
18         if (!defined($ref)) {
19                 return "(ukjent)";
20         } else {
21                 return POSIX::strftime("%Y-%m-%d %H:%M %Z", localtime($ref->{'last_sync'}));
22         }
23 }
24
25 sub output_last_sync {
26         my $dbh = shift;
27         my $ts = get_last_sync($dbh);
28         print "    <p class=\"lastsync\">Databasen ble sist synkronisert $ts.</p>\n";
29 }
30
31 sub get_locale {
32         my $cgi = shift;
33         my $url = $cgi->url(-absolute => 1);
34         $url =~ m#^/([a-z][a-z]-[A-Z][A-Z])/# or die "Invalid locale!";
35         return $1;
36 }
37
38 sub set_locale {
39         my $locale = shift;
40         $locale =~ s/-/_/;
41         POSIX::setlocale(&POSIX::LC_ALL, $locale . '.UTF-8');
42 }
43
44 sub get_auxillary_parameters {
45         my ($dbh, $locale) = @_;
46
47         my $q = $dbh->prepare('SELECT * FROM aux_params WHERE kultur=?');
48         $q->execute($locale);
49
50         my $aux_parms = {};
51         while (my $ref = $q->fetchrow_hashref) {
52                 $aux_parms->{$ref->{'id'}} = $ref->{'value'};
53         }
54         return $aux_parms;
55 }
56
57 sub get_navbar {
58         my ($cgi, $dbh, $locale) = @_;
59         my $url = $cgi->url(-relative => 1);
60
61         print "<p style=\"font-size: smaller;\">";
62
63         my $q = $dbh->prepare('SELECT spraak, kultur FROM fotballspraak WHERE nyestesesong <> -1 ORDER BY id');
64         $q->execute;
65
66         my @languages = ();
67
68         my $first = 1;
69         while (my $ref = $q->fetchrow_hashref) {
70                 my %lang = ();
71                 if ($first) {
72                         $lang{'separator'} = '';
73                 }
74                 $first = 0;
75
76                 if ($ref->{'kultur'} eq $locale) {
77                         $lang{'lang-with-link'} = '';
78                         $lang{'lang-no-link'} = Encode::decode_utf8($ref->{'spraak'});
79                 } else {
80                         $lang{'a'} = Encode::decode_utf8($ref->{'spraak'});
81                         $lang{'a/href'} = sprintf "/%s/%s", $ref->{'kultur'}, $url;
82                         $lang{'lang-no-link'} = '';
83                 }
84                 push @languages, \%lang;
85         }
86
87         return \@languages;
88 }
89
90 sub print_navbar {
91         my ($cgi, $dbh, $locale) = @_;
92         my $url = $cgi->url(-relative => 1);
93
94         print "<p style=\"font-size: smaller;\">";
95
96         my $q = $dbh->prepare('SELECT spraak, kultur FROM fotballspraak WHERE nyestesesong <> -1 AND length(kultur)=5 ORDER BY id');
97         $q->execute;
98
99         my $first = 1;
100         while (my $ref = $q->fetchrow_hashref) {
101                 if (!$first) {
102                         print " :: ";
103                 }
104                 $first = 0;
105
106                 if ($ref->{'kultur'} eq $locale) {
107                         printf "%s ", $ref->{'spraak'};
108                 } else {
109                         printf "<a href=\"/%s/%s\">%s</a> ", $ref->{'kultur'}, $url, $ref->{'spraak'};
110                 }
111         }
112         print "</p>\n";
113 }
114
115 # mapping from locale to translation to use (if not found, "en" is used)
116 my %translation_mapping = (
117         'nb-NO' => 'no',
118         'nn-NO' => 'no',
119         'da-DK' => 'no',
120         'sv-SE' => 'no',
121         'nl-NL' => 'en',
122 );
123
124 sub process_template {
125         my ($filename, $locale, $parms) = @_;
126
127         my $translation = $translation_mapping{$locale} // 'en';
128         my $doc;
129         if (-r "../templates/$filename.$translation.xml") {
130                 $parms->{'html/xml:lang'} = $translation;
131                 $doc = XML::Template::process_file("../templates/$filename.$translation.xml", $parms);
132         } else {
133                 $doc = XML::Template::process_file("../templates/$filename.xml", $parms);
134         }
135         print $doc->toString;
136 }
137
138 sub get_ordinal {
139         my ($num, $locale) = @_;
140         my $translation = $translation_mapping{$locale} // 'en';
141
142         if ($translation eq 'no') {
143                 return $num . ".";
144         } elsif ($translation eq 'en') {
145                 # http://en.wikipedia.org/wiki/English_numerals#Ordinal_numbers
146                 my $units = $num % 10;
147                 my $tens = (($num - $units) / 10) % 10;
148                 if ($tens == 1) {
149                         return $num . "th";
150                 } elsif ($units == 1) {
151                         return $num . "st";
152                 } elsif ($units == 2) {
153                         return $num . "nd";
154                 } elsif ($units == 3) {
155                         return $num . "rd";
156                 } else {
157                         return $num . "th";
158                 }
159         } else {
160                 die "Missing ordinal strategy for locale $locale";
161         }       
162 }
163
164 sub find_all_locales {
165         my $dbh = shift;
166         my $q = $dbh->prepare('SELECT kultur FROM fotballspraak WHERE nyestesesong <> -1 AND length(kultur)=5');
167         $q->execute;
168
169         my @locales = ();
170         while (my $ref = $q->fetchrow_hashref) {
171                 push @locales, $ref->{'kultur'};
172         }
173
174         return @locales;
175 }
176
177 1;