HTML::Template => HTML::Template::Pro
[koha.git] / C4 / Languages.pm
1 package C4::Languages;
2
3 # Copyright 2006 (C) LibLime
4 # Joshua Ferraro <jmf@liblime.com>
5 #
6 # This file is part of Koha.
7 #
8 # Koha is free software; you can redistribute it and/or modify it under the
9 # terms of the GNU General Public License as published by the Free Software
10 # Foundation; either version 2 of the License, or (at your option) any later
11 # version.
12 #
13 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
14 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License along with
18 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
19 # Suite 330, Boston, MA  02111-1307 USA
20
21
22 use strict; use warnings; #FIXME: turn off warnings before release
23 require Exporter;
24 use C4::Context;
25 use vars qw($VERSION @ISA @EXPORT);
26
27 =head1 NAME
28
29 C4::Languages - Perl Module containing language list functions for Koha 
30
31 =head1 SYNOPSIS
32
33 use C4::Languages;
34
35 =head1 DESCRIPTION
36
37 =head1 FUNCTIONS
38
39 =cut
40
41 @ISA    = qw(Exporter);
42 @EXPORT = qw(
43   &getFrameworkLanguages
44   &getTranslatedLanguages
45   &getAllLanguages
46   );
47
48 my $DEBUG = 0;
49
50 =head2 getFrameworkLanguages
51
52 Returns a reference to an array of hashes:
53
54  my $languages = getFrameworkLanguages();
55  for my $language(@$languages) {
56     print "$language->{language_code}\n"; # language code in iso 639-2
57     print "$language->{language_name}\n"; # language name in native script
58     print "$language->{language_locale_name}\n"; # language name in current locale
59  }
60
61 =cut
62
63 sub getFrameworkLanguages {
64     # get a hash with all language codes, names, and locale names
65     my $all_languages = getAllLanguages();
66     my @languages;
67     
68     # find the available directory names
69     my $dir=C4::Context->config('intranetdir')."/installer/data/";
70     opendir (MYDIR,$dir);
71     my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);    
72     closedir MYDIR;
73
74     # pull out all data for the dir names that exist
75     for my $dirname (@listdir) {
76         for my $language_set (@$all_languages) {
77             my $language_name = $language_set->{language_name};
78             my $language_locale_name = $language_set->{language_locale_name};
79
80             if ($dirname eq $language_set->{language_code}) {
81                 push @languages, {'language_code'=>$dirname, 'language_name'=>$language_name, 'language_locale_name'=>$language_locale_name}
82             }
83         }
84     }
85     return \@languages;
86 }
87
88 =head2 getTranslatedLanguages
89
90 Returns a reference to an array of hashes:
91
92  my $languages = getTranslatedLanguages();
93  print "Available translated langauges:\n";
94  for my $language(@$trlanguages) {
95     print "$language->{language_code}\n"; # language code in iso 639-2
96     print "$language->{language_name}\n"; # language name in native script
97     print "$language->{language_locale_name}\n"; # language name in current locale
98  }
99
100 =cut
101
102 sub getTranslatedLanguages {
103     my ($interface, $theme) = @_;
104     my $htdocs;
105     my $all_languages = getAllLanguages();
106     my @languages;
107     my $lang;
108     
109     if ($interface && $interface eq 'opac' ) {
110         $htdocs = C4::Context->config('opachtdocs');
111         if ( $theme and -d "$htdocs/$theme" ) {
112             (@languages) = _get_language_dirs($htdocs,$theme);
113             return _get_final_languages($all_languages,@languages);
114         }
115         else {
116             for my $theme ( _get_themes('opac') ) {
117                 push @languages, _get_language_dirs($htdocs,$theme);
118             }
119             return _get_final_languages($all_languages,@languages);
120         }
121     }
122     elsif ($interface && $interface eq 'intranet' ) {
123         $htdocs = C4::Context->config('intrahtdocs');
124         if ( $theme and -d "$htdocs/$theme" ) {
125             @languages = _get_language_dirs($htdocs,$theme);
126             return _get_final_languages($all_languages,@languages);
127         }
128         else {
129             foreach my $theme ( _get_themes('opac') ) {
130                 push @languages, _get_language_dirs($htdocs,$theme);
131             }
132             return _get_final_languages($all_languages,@languages);
133         }
134     }
135     else {
136         my $htdocs = C4::Context->config('intrahtdocs');
137         foreach my $theme ( _get_themes('intranet') ) {
138             push @languages, _get_language_dirs($htdocs,$theme);
139         }
140         $htdocs = C4::Context->config('opachtdocs');
141         foreach my $theme ( _get_themes('opac') ) {
142             push @languages, _get_language_dirs($htdocs,$theme);
143         }
144         return _get_final_languages($all_languages,@languages);
145     }
146 }
147
148 =head2 getAllLanguages
149
150 Returns a reference to an array of hashes:
151
152  my $alllanguages = getAllLanguages();
153  print "Available translated langauges:\n";
154  for my $language(@$alllanguages) {
155     print "$language->{language_code}\n";
156     print "$language->{language_name}\n";
157     print "$language->{language_locale_name}\n";
158  }
159
160 =cut
161
162 sub getAllLanguages {
163     my $languages_loop = [
164         {
165             language_code          => "ara",
166             language_name =>
167               "&#1575;&#1604;&#1593;&#1585;&#1576;&#1610;&#1577;",
168             language_locale_name => "Arabic",
169             ,
170         },
171         {
172             language_code          => "bul",
173             language_name =>
174               "&#1041;&#1098;&#1083;&#1075;&#1072;&#1088;&#1089;&#1082;&#1080;",
175             language_locale_name => "Bulgarian",
176             ,
177         },
178         {
179             language_code          => "chi",
180             language_name => "&#20013;&#25991;",
181             language_locale_name   => "Chinese",
182             ,
183         },
184         {
185             language_code          => "scr",
186             language_name => "Hrvatski",
187             language_locale_name   => "Croatian",
188             ,
189         },
190         {
191             language_code          => "cze",
192             language_name => "&#x010D;e&#353;tina",
193             language_locale_name   => "Czech",
194             ,
195         },
196         {
197             language_code          => "dan",
198             language_name => "D&aelig;nsk",
199             language_locale_name   => "Danish",
200             ,
201         },
202         {
203             language_code          => "dut",
204             language_name => "ned&#601;rl&#593;ns",
205             language_locale_name   => "Dutch",
206             ,
207         },
208         {
209             language_code          => "en",
210             language_name => "English",
211             language_locale_name   => "English",
212             ,
213         },
214         {
215             language_code          => "fr",
216             language_name => "Fran&ccedil;ais",
217             language_locale_name   => "French",
218             ,
219         },
220         {
221             language_code          => "ger",
222             language_name => "Deutsch",
223             language_locale_name   => "German",
224             ,
225         },
226         {
227             language_code          => "gre",
228             language_name =>
229               "&#949;&#955;&#955;&#951;&#957;&#953;&#954;&#940;",
230             language_locale_name => "Greek, Modern [1453- ]",
231             ,
232         },
233         {
234             language_code          => "heb",
235             language_name => "&#1506;&#1489;&#1512;&#1497;&#1514;",
236             language_locale_name   => "Hebrew",
237             ,
238         },
239         {
240             language_code          => "hin",
241             language_name => "&#2361;&#2367;&#2344;&#2381;&#2342;&#2368;",
242             language_locale_name   => "Hindi",
243             ,
244         },
245         {
246             language_code          => "hun",
247             language_name => "Magyar",
248             language_locale_name   => "Hungarian",
249             ,
250         },
251         {
252             language_code          => "ind",
253             language_name => "",
254             language_locale_name   => "Indonesian",
255             ,
256         },
257         {
258             language_code          => "ita",
259             language_name => "Italiano",
260             language_locale_name   => "Italian",
261             ,
262         },
263         {
264             language_code          => "jpn",
265             language_name => "&#26085;&#26412;&#35486;",
266             language_locale_name   => "Japanese",
267             ,
268         },
269         {
270             language_code          => "kor",
271             language_name => "&#54620;&#44397;&#50612;",
272             language_locale_name   => "Korean",
273             ,
274         },
275         {
276             language_code          => "lat",
277             language_name => "Latina",
278             language_locale_name   => "Latin",
279             ,
280         },
281         {
282             language_code          => "nor",
283             language_name => "Norsk",
284             language_locale_name   => "Norwegian",
285             ,
286         },
287         {
288             language_code          => "per",
289             language_name => "&#1601;&#1575;&#1585;&#1587;&#1609;",
290             language_locale_name   => "Persian",
291             ,
292         },
293         {
294             language_code          => "pol",
295             language_name => "Polski",
296             language_locale_name   => "Polish",
297             ,
298         },
299         {
300             language_code          => "por",
301             language_name => "Portugu&ecirc;s",
302             language_locale_name   => "Portuguese",
303             ,
304         },
305         {
306             language_code          => "rum",
307             language_name => "Rom&acirc;n&#259;",
308             language_locale_name   => "Romanian",
309             ,
310         },
311         {
312             language_code          => "rus",
313             language_name =>
314               "&#1056;&#1091;&#1089;&#1089;&#1082;&#1080;&#1081;",
315             language_locale_name => "Russian",
316             ,
317         },
318         {
319             language_code          => "spa",
320             language_name => "Espa&ntilde;ol",
321             language_locale_name   => "Spanish",
322             ,
323         },
324         {
325             language_code          => "swe",
326             language_name => "Svenska",
327             language_locale_name   => "Swedish",
328             ,
329         },
330         {
331             language_code          => "tha",
332             language_name =>
333               "&#3616;&#3634;&#3625;&#3634;&#3652;&#3607;&#3618;",
334             language_locale_name => "Thai",
335             ,
336         },
337         {
338             language_code          => "tur",
339             language_name => "T&uuml;rk&ccedil;e",
340             language_locale_name   => "Turkish",
341             ,
342         },
343         {
344             language_code          => "ukr",
345             language_name =>
346 "&#1059;&#1082;&#1088;&#1072;&#1111;&#1085;&#1089;&#1100;&#1082;&#1072;",
347             language_locale_name => "Ukrainian",
348             ,
349         },
350
351     ];
352     return $languages_loop;
353 }
354
355 =head2 _get_themes
356
357 Internal function, returns an array of all available themes.
358
359   (@themes) = &_get_themes('opac');
360   (@themes) = &_get_themes('intranet');
361
362 =cut
363
364 sub _get_themes {
365     my $interface = shift;
366     my $htdocs;
367     my @themes;
368     if ( $interface eq 'intranet' ) {
369         $htdocs = C4::Context->config('intrahtdocs');
370     }
371     else {
372         $htdocs = C4::Context->config('opachtdocs');
373     }
374     opendir D, "$htdocs";
375     my @dirlist = readdir D;
376     foreach my $directory (@dirlist) {
377         # if there's an en dir, it's a valid theme
378         -d "$htdocs/$directory/en" and push @themes, $directory;
379     }
380     return @themes;
381 }
382
383 =head2 _get_language_dirs
384
385 Internal function, returns an array of directory names, excluding non-language directories
386
387 =cut
388
389 sub _get_language_dirs {
390     my ($htdocs,$theme) = @_;
391     my @languages;
392     opendir D, "$htdocs/$theme";
393     for my $language ( readdir D ) {
394         next if $language =~/^\./;
395         next if $language eq 'all';
396         next if $language =~/png$/;
397         next if $language =~/css$/;
398         next if $language =~/CVS$/;
399         next if $language =~/itemtypeimg$/;
400         next if $language =~/\.txt$/i;     #Don't read the readme.txt !
401         next if $language eq 'images';
402         push @languages, $language;
403     }
404         return (@languages);
405 }
406
407 =head2 _get_final_languages 
408
409 Internal function for building the ref to array of hashes
410
411 FIXME: this could be rewritten and simplified using map
412
413 =cut
414
415 sub _get_final_languages {
416         my ($all_languages,@languages) = @_;
417         my @final_languages;
418         my %seen_languages;
419         for my $language (@languages) {
420             unless ($seen_languages{$language}) {
421                 for my $language_code (@$all_languages) {
422                     if ($language eq $language_code->{'language_code'}) {
423                         push @final_languages, $language_code;
424                     }
425                 }
426                 $seen_languages{$language}++;
427             }
428         }
429         return \@final_languages;
430 }
431
432 1;
433
434 __END__
435
436 =head1 AUTHOR
437
438 Joshua Ferraro
439
440 =cut