3 # Copyright 2006 (C) LibLime
4 # Joshua Ferraro <jmf@liblime.com>
6 # This file is part of Koha.
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
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.
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
22 use strict; use warnings; #FIXME: turn off warnings before release
25 use vars qw($VERSION @ISA @EXPORT);
29 C4::Languages - Perl Module containing language list functions for Koha
43 &getFrameworkLanguages
44 &getTranslatedLanguages
50 =head2 getFrameworkLanguages
52 Returns a reference to an array of hashes:
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
63 sub getFrameworkLanguages {
64 # get a hash with all language codes, names, and locale names
65 my $all_languages = getAllLanguages();
68 # find the available directory names
69 my $dir=C4::Context->config('intranetdir')."/installer/data/";
71 my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
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};
80 if ($dirname eq $language_set->{language_code}) {
81 push @languages, {'language_code'=>$dirname, 'language_name'=>$language_name, 'language_locale_name'=>$language_locale_name}
88 =head2 getTranslatedLanguages
90 Returns a reference to an array of hashes:
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
102 sub getTranslatedLanguages {
103 my ($interface, $theme) = @_;
105 my $all_languages = getAllLanguages();
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);
116 for my $theme ( _get_themes('opac') ) {
117 push @languages, _get_language_dirs($htdocs,$theme);
119 return _get_final_languages($all_languages,@languages);
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);
129 foreach my $theme ( _get_themes('opac') ) {
130 push @languages, _get_language_dirs($htdocs,$theme);
132 return _get_final_languages($all_languages,@languages);
136 my $htdocs = C4::Context->config('intrahtdocs');
137 foreach my $theme ( _get_themes('intranet') ) {
138 push @languages, _get_language_dirs($htdocs,$theme);
140 $htdocs = C4::Context->config('opachtdocs');
141 foreach my $theme ( _get_themes('opac') ) {
142 push @languages, _get_language_dirs($htdocs,$theme);
144 return _get_final_languages($all_languages,@languages);
148 =head2 getAllLanguages
150 Returns a reference to an array of hashes:
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";
162 sub getAllLanguages {
163 my $languages_loop = [
166 language_name => "No Limit",
167 language_locale_name => "",
168 selected => "selected",
171 language_code => "ara",
173 "العربية",
174 language_locale_name => "Arabic",
178 language_code => "bul",
180 "Български",
181 language_locale_name => "Bulgarian",
185 language_code => "chi",
186 language_name => "中文",
187 language_locale_name => "Chinese",
191 language_code => "scr",
192 language_name => "Hrvatski",
193 language_locale_name => "Croatian",
197 language_code => "cze",
198 language_name => "čeština",
199 language_locale_name => "Czech",
203 language_code => "dan",
204 language_name => "Dænsk",
205 language_locale_name => "Danish",
209 language_code => "dut",
210 language_name => "nedərlɑns",
211 language_locale_name => "Dutch",
215 language_code => "en",
216 language_name => "English",
217 language_locale_name => "English",
221 language_code => "fr",
222 language_name => "Français",
223 language_locale_name => "French",
227 language_code => "ger",
228 language_name => "Deutsch",
229 language_locale_name => "German",
233 language_code => "gre",
235 "ελληνικά",
236 language_locale_name => "Greek, Modern [1453- ]",
240 language_code => "heb",
241 language_name => "עברית",
242 language_locale_name => "Hebrew",
246 language_code => "hin",
247 language_name => "हिन्दी",
248 language_locale_name => "Hindi",
252 language_code => "hun",
253 language_name => "Magyar",
254 language_locale_name => "Hungarian",
258 language_code => "ind",
260 language_locale_name => "Indonesian",
264 language_code => "ita",
265 language_name => "Italiano",
266 language_locale_name => "Italian",
270 language_code => "jpn",
271 language_name => "日本語",
272 language_locale_name => "Japanese",
276 language_code => "kor",
277 language_name => "한국어",
278 language_locale_name => "Korean",
282 language_code => "lat",
283 language_name => "Latina",
284 language_locale_name => "Latin",
288 language_code => "nor",
289 language_name => "Norsk",
290 language_locale_name => "Norwegian",
294 language_code => "per",
295 language_name => "فارسى",
296 language_locale_name => "Persian",
300 language_code => "pol",
301 language_name => "Polski",
302 language_locale_name => "Polish",
306 language_code => "por",
307 language_name => "Português",
308 language_locale_name => "Portuguese",
312 language_code => "rum",
313 language_name => "Română",
314 language_locale_name => "Romanian",
318 language_code => "rus",
320 "Русский",
321 language_locale_name => "Russian",
325 language_code => "spa",
326 language_name => "Español",
327 language_locale_name => "Spanish",
331 language_code => "swe",
332 language_name => "Svenska",
333 language_locale_name => "Swedish",
337 language_code => "tha",
339 "ภาษาไทย",
340 language_locale_name => "Thai",
344 language_code => "tur",
345 language_name => "Türkçe",
346 language_locale_name => "Turkish",
350 language_code => "ukr",
352 "Українська",
353 language_locale_name => "Ukrainian",
358 return $languages_loop;
363 Internal function, returns an array of all available themes.
365 (@themes) = &_get_themes('opac');
366 (@themes) = &_get_themes('intranet');
371 my $interface = shift;
374 if ( $interface eq 'intranet' ) {
375 $htdocs = C4::Context->config('intrahtdocs');
378 $htdocs = C4::Context->config('opachtdocs');
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;
389 =head2 _get_language_dirs
391 Internal function, returns an array of directory names, excluding non-language directories
395 sub _get_language_dirs {
396 my ($htdocs,$theme) = @_;
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;
413 =head2 _get_final_languages
415 Internal function for building the ref to array of hashes
417 FIXME: this could be rewritten and simplified using map
421 sub _get_final_languages {
422 my ($all_languages,@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;
432 $seen_languages{$language}++;
435 return \@final_languages;