Patch from Galen Charlton, removing $Id$ $Log$ and $Revision$ from files
[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 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 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          => "",
166             language_name => "No Limit",
167             language_locale_name   => "",
168             selected       => "selected",
169         },
170         {
171             language_code          => "ara",
172             language_name =>
173               "&#1575;&#1604;&#1593;&#1585;&#1576;&#1610;&#1577;",
174             language_locale_name => "Arabic",
175             ,
176         },
177         {
178             language_code          => "bul",
179             language_name =>
180               "&#1041;&#1098;&#1083;&#1075;&#1072;&#1088;&#1089;&#1082;&#1080;",
181             language_locale_name => "Bulgarian",
182             ,
183         },
184         {
185             language_code          => "chi",
186             language_name => "&#20013;&#25991;",
187             language_locale_name   => "Chinese",
188             ,
189         },
190         {
191             language_code          => "scr",
192             language_name => "Hrvatski",
193             language_locale_name   => "Croatian",
194             ,
195         },
196         {
197             language_code          => "cze",
198             language_name => "&#x010D;e&#353;tina",
199             language_locale_name   => "Czech",
200             ,
201         },
202         {
203             language_code          => "dan",
204             language_name => "D&aelig;nsk",
205             language_locale_name   => "Danish",
206             ,
207         },
208         {
209             language_code          => "dut",
210             language_name => "ned&#601;rl&#593;ns",
211             language_locale_name   => "Dutch",
212             ,
213         },
214         {
215             language_code          => "en",
216             language_name => "English",
217             language_locale_name   => "English",
218             ,
219         },
220         {
221             language_code          => "fr",
222             language_name => "Fran&ccedil;ais",
223             language_locale_name   => "French",
224             ,
225         },
226         {
227             language_code          => "ger",
228             language_name => "Deutsch",
229             language_locale_name   => "German",
230             ,
231         },
232         {
233             language_code          => "gre",
234             language_name =>
235               "&#949;&#955;&#955;&#951;&#957;&#953;&#954;&#940;",
236             language_locale_name => "Greek, Modern [1453- ]",
237             ,
238         },
239         {
240             language_code          => "heb",
241             language_name => "&#1506;&#1489;&#1512;&#1497;&#1514;",
242             language_locale_name   => "Hebrew",
243             ,
244         },
245         {
246             language_code          => "hin",
247             language_name => "&#2361;&#2367;&#2344;&#2381;&#2342;&#2368;",
248             language_locale_name   => "Hindi",
249             ,
250         },
251         {
252             language_code          => "hun",
253             language_name => "Magyar",
254             language_locale_name   => "Hungarian",
255             ,
256         },
257         {
258             language_code          => "ind",
259             language_name => "",
260             language_locale_name   => "Indonesian",
261             ,
262         },
263         {
264             language_code          => "ita",
265             language_name => "Italiano",
266             language_locale_name   => "Italian",
267             ,
268         },
269         {
270             language_code          => "jpn",
271             language_name => "&#26085;&#26412;&#35486;",
272             language_locale_name   => "Japanese",
273             ,
274         },
275         {
276             language_code          => "kor",
277             language_name => "&#54620;&#44397;&#50612;",
278             language_locale_name   => "Korean",
279             ,
280         },
281         {
282             language_code          => "lat",
283             language_name => "Latina",
284             language_locale_name   => "Latin",
285             ,
286         },
287         {
288             language_code          => "nor",
289             language_name => "Norsk",
290             language_locale_name   => "Norwegian",
291             ,
292         },
293         {
294             language_code          => "per",
295             language_name => "&#1601;&#1575;&#1585;&#1587;&#1609;",
296             language_locale_name   => "Persian",
297             ,
298         },
299         {
300             language_code          => "pol",
301             language_name => "Polski",
302             language_locale_name   => "Polish",
303             ,
304         },
305         {
306             language_code          => "por",
307             language_name => "Portugu&ecirc;s",
308             language_locale_name   => "Portuguese",
309             ,
310         },
311         {
312             language_code          => "rum",
313             language_name => "Rom&acirc;n&#259;",
314             language_locale_name   => "Romanian",
315             ,
316         },
317         {
318             language_code          => "rus",
319             language_name =>
320               "&#1056;&#1091;&#1089;&#1089;&#1082;&#1080;&#1081;",
321             language_locale_name => "Russian",
322             ,
323         },
324         {
325             language_code          => "spa",
326             language_name => "Espa&ntilde;ol",
327             language_locale_name   => "Spanish",
328             ,
329         },
330         {
331             language_code          => "swe",
332             language_name => "Svenska",
333             language_locale_name   => "Swedish",
334             ,
335         },
336         {
337             language_code          => "tha",
338             language_name =>
339               "&#3616;&#3634;&#3625;&#3634;&#3652;&#3607;&#3618;",
340             language_locale_name => "Thai",
341             ,
342         },
343         {
344             language_code          => "tur",
345             language_name => "T&uuml;rk&ccedil;e",
346             language_locale_name   => "Turkish",
347             ,
348         },
349         {
350             language_code          => "ukr",
351             language_name =>
352 "&#1059;&#1082;&#1088;&#1072;&#1111;&#1085;&#1089;&#1100;&#1082;&#1072;",
353             language_locale_name => "Ukrainian",
354             ,
355         },
356
357     ];
358     return $languages_loop;
359 }
360
361 =head2 _get_themes
362
363 Internal function, returns an array of all available themes.
364
365   (@themes) = &_get_themes('opac');
366   (@themes) = &_get_themes('intranet');
367
368 =cut
369
370 sub _get_themes {
371     my $interface = shift;
372     my $htdocs;
373     my @themes;
374     if ( $interface eq 'intranet' ) {
375         $htdocs = C4::Context->config('intrahtdocs');
376     }
377     else {
378         $htdocs = C4::Context->config('opachtdocs');
379     }
380     opendir D, "$htdocs";
381     my @dirlist = readdir D;
382     foreach my $directory (@dirlist) {
383         # if there's an en dir, it's a valid theme
384         -d "$htdocs/$directory/en" and push @themes, $directory;
385     }
386     return @themes;
387 }
388
389 =head2 _get_language_dirs
390
391 Internal function, returns an array of directory names, excluding non-language directories
392
393 =cut
394
395 sub _get_language_dirs {
396     my ($htdocs,$theme) = @_;
397     my @languages;
398     opendir D, "$htdocs/$theme";
399     for my $language ( readdir D ) {
400         next if $language =~/^\./;
401         next if $language eq 'all';
402         next if $language =~/png$/;
403         next if $language =~/css$/;
404         next if $language =~/CVS$/;
405         next if $language =~/itemtypeimg$/;
406         next if $language =~/\.txt$/i;     #Don't read the readme.txt !
407         next if $language eq 'images';
408         push @languages, $language;
409     }
410         return (@languages);
411 }
412
413 =head2 _get_final_languages 
414
415 Internal function for building the ref to array of hashes
416
417 FIXME: this could be rewritten and simplified using map
418
419 =cut
420
421 sub _get_final_languages {
422         my ($all_languages,@languages) = @_;
423         my @final_languages;
424         my %seen_languages;
425         for my $language (@languages) {
426             unless ($seen_languages{$language}) {
427                 for my $language_code (@$all_languages) {
428                     if ($language eq $language_code->{'language_code'}) {
429                         push @final_languages, $language_code;
430                     }
431                 }
432                 $seen_languages{$language}++;
433             }
434         }
435         return \@final_languages;
436 }
437
438 1;
439
440 __END__
441
442 =head1 AUTHOR
443
444 Joshua Ferraro
445
446 =cut