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