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);
28 $VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); };
32 C4::Languages - Perl Module containing language list functions for Koha
46 &getFrameworkLanguages
47 &getTranslatedLanguages
53 =head2 getFrameworkLanguages
55 Returns a reference to an array of hashes:
57 my $languages = getFrameworkLanguages();
58 for my $language(@$languages) {
59 print "$language->{language_code}\n"; # language code in iso 639-2
60 print "$language->{language_name}\n"; # language name in native script
61 print "$language->{language_locale_name}\n"; # language name in current locale
66 sub getFrameworkLanguages {
67 # get a hash with all language codes, names, and locale names
68 my $all_languages = getAllLanguages();
71 # find the available directory names
72 my $dir=C4::Context->config('intranetdir')."/installer/data/";
74 my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
77 # pull out all data for the dir names that exist
78 for my $dirname (@listdir) {
79 for my $language_set (@$all_languages) {
80 my $language_name = $language_set->{language_name};
81 my $language_locale_name = $language_set->{language_locale_name};
83 if ($dirname eq $language_set->{language_code}) {
84 push @languages, {'language_code'=>$dirname, 'language_name'=>$language_name, 'language_locale_name'=>$language_locale_name}
91 =head2 getTranslatedLanguages
93 Returns a reference to an array of hashes:
95 my $languages = getTranslatedLanguages();
96 print "Available translated langauges:\n";
97 for my $language(@$trlanguages) {
98 print "$language->{language_code}\n"; # language code in iso 639-2
99 print "$language->{language_name}\n"; # language name in native script
100 print "$language->{language_locale_name}\n"; # language name in current locale
105 sub getTranslatedLanguages {
106 my ($interface, $theme) = @_;
108 my $all_languages = getAllLanguages();
112 if ( $interface eq 'opac' ) {
113 $htdocs = C4::Context->config('opachtdocs');
114 if ( $theme and -d "$htdocs/$theme" ) {
115 (@languages) = _get_language_dirs($htdocs,$theme);
116 return _get_final_languages($all_languages,@languages);
119 for my $theme ( _get_themes('opac') ) {
120 push @languages, _get_language_dirs($htdocs,$theme);
122 return _get_final_languages($all_languages,@languages);
125 elsif ( $interface eq 'intranet' ) {
126 $htdocs = C4::Context->config('intrahtdocs');
127 if ( $theme and -d "$htdocs/$theme" ) {
128 @languages = _get_language_dirs($htdocs,$theme);
129 return _get_final_languages($all_languages,@languages);
132 foreach my $theme ( _get_themes('opac') ) {
133 push @languages, _get_language_dirs($htdocs,$theme);
135 return _get_final_languages($all_languages,@languages);
139 my $htdocs = C4::Context->config('intrahtdocs');
140 foreach my $theme ( _get_themes('intranet') ) {
141 push @languages, _get_language_dirs($htdocs,$theme);
143 $htdocs = C4::Context->config('opachtdocs');
144 foreach my $theme ( _get_themes('opac') ) {
145 push @languages, _get_language_dirs($htdocs,$theme);
147 return _get_final_languages($all_languages,@languages);
151 =head2 getAllLanguages
153 Returns a reference to an array of hashes:
155 my $alllanguages = getAllLanguages();
156 print "Available translated langauges:\n";
157 for my $language(@$alllanguages) {
158 print "$language->{language_code}\n";
159 print "$language->{language_name}\n";
160 print "$language->{language_locale_name}\n";
165 sub getAllLanguages {
166 my $languages_loop = [
169 language_name => "No Limit",
170 language_locale_name => "",
171 selected => "selected",
174 language_code => "ara",
176 "العربية",
177 language_locale_name => "Arabic",
181 language_code => "bul",
183 "Български",
184 language_locale_name => "Bulgarian",
188 language_code => "chi",
189 language_name => "中文",
190 language_locale_name => "Chinese",
194 language_code => "scr",
195 language_name => "Hrvatski",
196 language_locale_name => "Croatian",
200 language_code => "cze",
201 language_name => "čeština",
202 language_locale_name => "Czech",
206 language_code => "dan",
207 language_name => "Dænsk",
208 language_locale_name => "Danish",
212 language_code => "dut",
213 language_name => "nedərlɑns",
214 language_locale_name => "Dutch",
218 language_code => "en",
219 language_name => "English",
220 language_locale_name => "English",
224 language_code => "fr",
225 language_name => "Français",
226 language_locale_name => "French",
230 language_code => "ger",
231 language_name => "Deutsch",
232 language_locale_name => "German",
236 language_code => "gre",
238 "ελληνικά",
239 language_locale_name => "Greek, Modern [1453- ]",
243 language_code => "heb",
244 language_name => "עברית",
245 language_locale_name => "Hebrew",
249 language_code => "hin",
250 language_name => "हिन्दी",
251 language_locale_name => "Hindi",
255 language_code => "hun",
256 language_name => "Magyar",
257 language_locale_name => "Hungarian",
261 language_code => "ind",
263 language_locale_name => "Indonesian",
267 language_code => "ita",
268 language_name => "Italiano",
269 language_locale_name => "Italian",
273 language_code => "jpn",
274 language_name => "日本語",
275 language_locale_name => "Japanese",
279 language_code => "kor",
280 language_name => "한국어",
281 language_locale_name => "Korean",
285 language_code => "lat",
286 language_name => "Latina",
287 language_locale_name => "Latin",
291 language_code => "nor",
292 language_name => "Norsk",
293 language_locale_name => "Norwegian",
297 language_code => "per",
298 language_name => "فارسى",
299 language_locale_name => "Persian",
303 language_code => "pol",
304 language_name => "Polski",
305 language_locale_name => "Polish",
309 language_code => "por",
310 language_name => "Português",
311 language_locale_name => "Portuguese",
315 language_code => "rum",
316 language_name => "Română",
317 language_locale_name => "Romanian",
321 language_code => "rus",
323 "Русский",
324 language_locale_name => "Russian",
328 language_code => "spa",
329 language_name => "Español",
330 language_locale_name => "Spanish",
334 language_code => "swe",
335 language_name => "Svenska",
336 language_locale_name => "Swedish",
340 language_code => "tha",
342 "ภาษาไทย",
343 language_locale_name => "Thai",
347 language_code => "tur",
348 language_name => "Türkçe",
349 language_locale_name => "Turkish",
353 language_code => "ukr",
355 "Українська",
356 language_locale_name => "Ukrainian",
361 return $languages_loop;
366 Internal function, returns an array of all available themes.
368 (@themes) = &_get_themes('opac');
369 (@themes) = &_get_themes('intranet');
374 my $interface = shift;
377 if ( $interface eq 'intranet' ) {
378 $htdocs = C4::Context->config('intrahtdocs');
381 $htdocs = C4::Context->config('opachtdocs');
383 opendir D, "$htdocs";
384 my @dirlist = readdir D;
385 foreach my $directory (@dirlist) {
386 # if there's an en dir, it's a valid theme
387 -d "$htdocs/$directory/en" and push @themes, $directory;
392 =head2 _get_language_dirs
394 Internal function, returns an array of directory names, excluding non-language directories
398 sub _get_language_dirs {
399 my ($htdocs,$theme) = @_;
401 opendir D, "$htdocs/$theme";
402 for my $language ( readdir D ) {
403 next if $language =~/^\./;
404 next if $language eq 'all';
405 next if $language =~/png$/;
406 next if $language =~/css$/;
407 next if $language =~/CVS$/;
408 next if $language =~/itemtypeimg$/;
409 next if $language =~/\.txt$/i; #Don't read the readme.txt !
410 next if $language eq 'images';
411 push @languages, $language;
416 =head2 _get_final_languages
418 Internal function for building the ref to array of hashes
420 FIXME: this could be rewritten and simplified using map
424 sub _get_final_languages {
425 my ($all_languages,@languages) = @_;
428 for my $language (@languages) {
429 unless ($seen_languages{$language}) {
430 for my $language_code (@$all_languages) {
431 if ($language eq $language_code->{'language_code'}) {
432 push @final_languages, $language_code;
435 $seen_languages{$language}++;
438 return \@final_languages;