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 @EXPORT_OK %EXPORT_TAGS);
29 C4::Languages - Perl Module containing language list functions for Koha
42 @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages);
45 =head2 getFrameworkLanguages
47 Returns a reference to an array of hashes:
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
58 sub getFrameworkLanguages {
59 # get a hash with all language codes, names, and locale names
60 my $all_languages = getAllLanguages();
63 # find the available directory names
64 my $dir=C4::Context->config('intranetdir')."/installer/data/";
66 my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
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};
75 if ($dirname eq $language_set->{language_code}) {
76 push @languages, {'language_code'=>$dirname, 'language_name'=>$language_name, 'language_locale_name'=>$language_locale_name}
83 =head2 getTranslatedLanguages
85 Returns a reference to an array of hashes:
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
97 sub getTranslatedLanguages {
98 my ($interface, $theme) = @_;
100 my $all_languages = getAllLanguages();
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);
111 for my $theme ( _get_themes('opac') ) {
112 push @languages, _get_language_dirs($htdocs,$theme);
114 return _get_final_languages($all_languages,@languages);
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);
124 foreach my $theme ( _get_themes('opac') ) {
125 push @languages, _get_language_dirs($htdocs,$theme);
127 return _get_final_languages($all_languages,@languages);
131 my $htdocs = C4::Context->config('intrahtdocs');
132 foreach my $theme ( _get_themes('intranet') ) {
133 push @languages, _get_language_dirs($htdocs,$theme);
135 $htdocs = C4::Context->config('opachtdocs');
136 foreach my $theme ( _get_themes('opac') ) {
137 push @languages, _get_language_dirs($htdocs,$theme);
139 return _get_final_languages($all_languages,@languages);
143 =head2 getAllLanguages
145 Returns a reference to an array of hashes:
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";
157 sub getAllLanguages {
158 my $languages_loop = [
160 language_code => "ara",
162 "العربية",
163 language_locale_name => "Arabic",
168 language_code => "bul",
170 "Български",
171 language_locale_name => "Bulgarian",
175 language_code => "chi",
176 language_name => "中文",
177 language_locale_name => "Chinese",
181 language_code => "scr",
182 language_name => "Hrvatski",
183 language_locale_name => "Croatian",
187 language_code => "cze",
188 language_name => "čeština",
189 language_locale_name => "Czech",
193 language_code => "dan",
194 language_name => "Dænsk",
195 language_locale_name => "Danish",
199 language_code => "dut",
200 language_name => "nedərlɑns",
201 language_locale_name => "Dutch",
205 language_code => "en",
206 language_name => "English",
207 language_locale_name => "English",
211 language_code => "fr",
212 language_name => "Français",
213 language_locale_name => "French",
217 language_code => "ger",
218 language_name => "Deutsch",
219 language_locale_name => "German",
223 language_code => "gre",
225 "ελληνικά",
226 language_locale_name => "Greek, Modern [1453- ]",
230 language_code => "heb",
231 language_name => "עברית",
232 language_locale_name => "Hebrew",
237 language_code => "hin",
238 language_name => "हिन्दी",
239 language_locale_name => "Hindi",
243 language_code => "hun",
244 language_name => "Magyar",
245 language_locale_name => "Hungarian",
249 language_code => "ind",
251 language_locale_name => "Indonesian",
255 language_code => "ita",
256 language_name => "Italiano",
257 language_locale_name => "Italian",
261 language_code => "jpn",
262 language_name => "日本語",
263 language_locale_name => "Japanese",
267 language_code => "kor",
268 language_name => "한국어",
269 language_locale_name => "Korean",
273 language_code => "lat",
274 language_name => "Latina",
275 language_locale_name => "Latin",
279 language_code => "nor",
280 language_name => "Norsk",
281 language_locale_name => "Norwegian",
285 language_code => "per",
286 language_name => "فارسى",
287 language_locale_name => "Persian",
291 language_code => "pol",
292 language_name => "Polski",
293 language_locale_name => "Polish",
297 language_code => "por",
298 language_name => "Português",
299 language_locale_name => "Portuguese",
303 language_code => "rum",
304 language_name => "Română",
305 language_locale_name => "Romanian",
309 language_code => "rus",
311 "Русский",
312 language_locale_name => "Russian",
316 language_code => "spa",
317 language_name => "Español",
318 language_locale_name => "Spanish",
322 language_code => "swe",
323 language_name => "Svenska",
324 language_locale_name => "Swedish",
328 language_code => "tha",
330 "ภาษาไทย",
331 language_locale_name => "Thai",
335 language_code => "tur",
336 language_name => "Türkçe",
337 language_locale_name => "Turkish",
341 language_code => "ukr",
343 "Українська",
344 language_locale_name => "Ukrainian",
349 return $languages_loop;
354 Internal function, returns an array of all available themes.
356 (@themes) = &_get_themes('opac');
357 (@themes) = &_get_themes('intranet');
362 my $interface = shift;
365 if ( $interface eq 'intranet' ) {
366 $htdocs = C4::Context->config('intrahtdocs');
369 $htdocs = C4::Context->config('opachtdocs');
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;
380 =head2 _get_language_dirs
382 Internal function, returns an array of directory names, excluding non-language directories
386 sub _get_language_dirs {
387 my ($htdocs,$theme) = @_;
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;
404 =head2 _get_final_languages
406 Internal function for building the ref to array of hashes
408 FIXME: this could be rewritten and simplified using map
412 sub _get_final_languages {
413 my ($all_languages,@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;
423 $seen_languages{$language}++;
426 return \@final_languages;