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
23 use strict; use warnings; #FIXME: turn off warnings before release
26 use vars qw($VERSION @ISA @EXPORT);
30 C4::Languages - Perl Module containing language list functions for Koha
44 &getFrameworkLanguages
45 &getTranslatedLanguages
51 =head2 getFrameworkLanguages
53 Returns a reference to an array of hashes:
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
64 sub getFrameworkLanguages {
65 # get a hash with all language codes, names, and locale names
66 my $all_languages = getAllLanguages();
69 # find the available directory names
70 my $dir=C4::Context->config('intranetdir')."/installer/data/";
72 my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
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};
81 if ($dirname eq $language_set->{language_code}) {
82 push @languages, {'language_code'=>$dirname, 'language_name'=>$language_name, 'language_locale_name'=>$language_locale_name}
89 =head2 getTranslatedLanguages
91 Returns a reference to an array of hashes:
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
103 sub getTranslatedLanguages {
104 my ($interface, $theme) = @_;
106 my $all_languages = getAllLanguages();
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);
117 for my $theme ( _get_themes('opac') ) {
118 push @languages, _get_language_dirs($htdocs,$theme);
120 return _get_final_languages($all_languages,@languages);
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);
130 foreach my $theme ( _get_themes('opac') ) {
131 push @languages, _get_language_dirs($htdocs,$theme);
133 return _get_final_languages($all_languages,@languages);
137 my $htdocs = C4::Context->config('intrahtdocs');
138 foreach my $theme ( _get_themes('intranet') ) {
139 push @languages, _get_language_dirs($htdocs,$theme);
141 $htdocs = C4::Context->config('opachtdocs');
142 foreach my $theme ( _get_themes('opac') ) {
143 push @languages, _get_language_dirs($htdocs,$theme);
145 return _get_final_languages($all_languages,@languages);
149 =head2 getAllLanguages
151 Returns a reference to an array of hashes:
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";
163 sub getAllLanguages {
164 my $languages_loop = [
167 language_name => "No Limit",
168 language_locale_name => "",
169 selected => "selected",
172 language_code => "ara",
174 "العربية",
175 language_locale_name => "Arabic",
179 language_code => "bul",
181 "Български",
182 language_locale_name => "Bulgarian",
186 language_code => "chi",
187 language_name => "中文",
188 language_locale_name => "Chinese",
192 language_code => "scr",
193 language_name => "Hrvatski",
194 language_locale_name => "Croatian",
198 language_code => "cze",
199 language_name => "čeština",
200 language_locale_name => "Czech",
204 language_code => "dan",
205 language_name => "Dænsk",
206 language_locale_name => "Danish",
210 language_code => "dut",
211 language_name => "nedərlɑns",
212 language_locale_name => "Dutch",
216 language_code => "en",
217 language_name => "English",
218 language_locale_name => "English",
222 language_code => "fr",
223 language_name => "Français",
224 language_locale_name => "French",
228 language_code => "ger",
229 language_name => "Deutsch",
230 language_locale_name => "German",
234 language_code => "gre",
236 "ελληνικά",
237 language_locale_name => "Greek, Modern [1453- ]",
241 language_code => "heb",
242 language_name => "עברית",
243 language_locale_name => "Hebrew",
247 language_code => "hin",
248 language_name => "हिन्दी",
249 language_locale_name => "Hindi",
253 language_code => "hun",
254 language_name => "Magyar",
255 language_locale_name => "Hungarian",
259 language_code => "ind",
261 language_locale_name => "Indonesian",
265 language_code => "ita",
266 language_name => "Italiano",
267 language_locale_name => "Italian",
271 language_code => "jpn",
272 language_name => "日本語",
273 language_locale_name => "Japanese",
277 language_code => "kor",
278 language_name => "한국어",
279 language_locale_name => "Korean",
283 language_code => "lat",
284 language_name => "Latina",
285 language_locale_name => "Latin",
289 language_code => "nor",
290 language_name => "Norsk",
291 language_locale_name => "Norwegian",
295 language_code => "per",
296 language_name => "فارسى",
297 language_locale_name => "Persian",
301 language_code => "pol",
302 language_name => "Polski",
303 language_locale_name => "Polish",
307 language_code => "por",
308 language_name => "Português",
309 language_locale_name => "Portuguese",
313 language_code => "rum",
314 language_name => "Română",
315 language_locale_name => "Romanian",
319 language_code => "rus",
321 "Русский",
322 language_locale_name => "Russian",
326 language_code => "spa",
327 language_name => "Español",
328 language_locale_name => "Spanish",
332 language_code => "swe",
333 language_name => "Svenska",
334 language_locale_name => "Swedish",
338 language_code => "tha",
340 "ภาษาไทย",
341 language_locale_name => "Thai",
345 language_code => "tur",
346 language_name => "Türkçe",
347 language_locale_name => "Turkish",
351 language_code => "ukr",
353 "Українська",
354 language_locale_name => "Ukrainian",
359 return $languages_loop;
364 Internal function, returns an array of all available themes.
366 (@themes) = &_get_themes('opac');
367 (@themes) = &_get_themes('intranet');
372 my $interface = shift;
375 if ( $interface eq 'intranet' ) {
376 $htdocs = C4::Context->config('intrahtdocs');
379 $htdocs = C4::Context->config('opachtdocs');
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;
390 =head2 _get_language_dirs
392 Internal function, returns an array of directory names, excluding non-language directories
396 sub _get_language_dirs {
397 my ($htdocs,$theme) = @_;
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;
414 =head2 _get_final_languages
416 Internal function for building the ref to array of hashes
418 FIXME: this could be rewritten and simplified using map
422 sub _get_final_languages {
423 my ($all_languages,@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;
433 $seen_languages{$language}++;
436 return \@final_languages;