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