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 = [
165 language_code => "ara",
167 "العربية",
168 language_locale_name => "Arabic",
172 language_code => "bul",
174 "Български",
175 language_locale_name => "Bulgarian",
179 language_code => "chi",
180 language_name => "中文",
181 language_locale_name => "Chinese",
185 language_code => "scr",
186 language_name => "Hrvatski",
187 language_locale_name => "Croatian",
191 language_code => "cze",
192 language_name => "čeština",
193 language_locale_name => "Czech",
197 language_code => "dan",
198 language_name => "Dænsk",
199 language_locale_name => "Danish",
203 language_code => "dut",
204 language_name => "nedərlɑns",
205 language_locale_name => "Dutch",
209 language_code => "en",
210 language_name => "English",
211 language_locale_name => "English",
215 language_code => "fr",
216 language_name => "Français",
217 language_locale_name => "French",
221 language_code => "ger",
222 language_name => "Deutsch",
223 language_locale_name => "German",
227 language_code => "gre",
229 "ελληνικά",
230 language_locale_name => "Greek, Modern [1453- ]",
234 language_code => "heb",
235 language_name => "עברית",
236 language_locale_name => "Hebrew",
240 language_code => "hin",
241 language_name => "हिन्दी",
242 language_locale_name => "Hindi",
246 language_code => "hun",
247 language_name => "Magyar",
248 language_locale_name => "Hungarian",
252 language_code => "ind",
254 language_locale_name => "Indonesian",
258 language_code => "ita",
259 language_name => "Italiano",
260 language_locale_name => "Italian",
264 language_code => "jpn",
265 language_name => "日本語",
266 language_locale_name => "Japanese",
270 language_code => "kor",
271 language_name => "한국어",
272 language_locale_name => "Korean",
276 language_code => "lat",
277 language_name => "Latina",
278 language_locale_name => "Latin",
282 language_code => "nor",
283 language_name => "Norsk",
284 language_locale_name => "Norwegian",
288 language_code => "per",
289 language_name => "فارسى",
290 language_locale_name => "Persian",
294 language_code => "pol",
295 language_name => "Polski",
296 language_locale_name => "Polish",
300 language_code => "por",
301 language_name => "Português",
302 language_locale_name => "Portuguese",
306 language_code => "rum",
307 language_name => "Română",
308 language_locale_name => "Romanian",
312 language_code => "rus",
314 "Русский",
315 language_locale_name => "Russian",
319 language_code => "spa",
320 language_name => "Español",
321 language_locale_name => "Spanish",
325 language_code => "swe",
326 language_name => "Svenska",
327 language_locale_name => "Swedish",
331 language_code => "tha",
333 "ภาษาไทย",
334 language_locale_name => "Thai",
338 language_code => "tur",
339 language_name => "Türkçe",
340 language_locale_name => "Turkish",
344 language_code => "ukr",
346 "Українська",
347 language_locale_name => "Ukrainian",
352 return $languages_loop;
357 Internal function, returns an array of all available themes.
359 (@themes) = &_get_themes('opac');
360 (@themes) = &_get_themes('intranet');
365 my $interface = shift;
368 if ( $interface eq 'intranet' ) {
369 $htdocs = C4::Context->config('intrahtdocs');
372 $htdocs = C4::Context->config('opachtdocs');
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;
383 =head2 _get_language_dirs
385 Internal function, returns an array of directory names, excluding non-language directories
389 sub _get_language_dirs {
390 my ($htdocs,$theme) = @_;
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;
407 =head2 _get_final_languages
409 Internal function for building the ref to array of hashes
411 FIXME: this could be rewritten and simplified using map
415 sub _get_final_languages {
416 my ($all_languages,@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;
426 $seen_languages{$language}++;
429 return \@final_languages;