handling multiple languages gracefully in sysprefs, allow the user to enable specific...
authorJoshua Ferraro <jmf@liblime.com>
Mon, 4 Feb 2008 04:18:48 +0000 (23:18 -0500)
committerJoshua Ferraro <jmf@liblime.com>
Fri, 8 Feb 2008 12:20:12 +0000 (06:20 -0600)
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
C4/Languages.pm
admin/systempreferences.pl
koha-tmpl/intranet-tmpl/prog/en/includes/intranet-bottom.inc
koha-tmpl/intranet-tmpl/prog/en/modules/admin/systempreferences.tmpl
koha-tmpl/opac-tmpl/prog/en/includes/opac-bottom.inc

index 8eb6693..bc578f0 100644 (file)
@@ -104,39 +104,43 @@ Returns a reference to an array of hashes:
 =cut
 
 sub getTranslatedLanguages {
-    my ($interface, $theme, $current_language) = @_;
+    my ($interface, $theme, $current_language, $which) = @_;
     my $htdocs;
     my $all_languages = getAllLanguages();
     my @languages;
     my $lang;
-    
+    my @enabled_languages;
     if ($interface && $interface eq 'opac' ) {
+        @enabled_languages = split ",", C4::Context->preference('opaclanguages');
         $htdocs = C4::Context->config('opachtdocs');
         if ( $theme and -d "$htdocs/$theme" ) {
             (@languages) = _get_language_dirs($htdocs,$theme);
-            return _build_languages_arrayref($all_languages,\@languages,$current_language);
+            return _build_languages_arrayref($all_languages,\@languages,$current_language,\@enabled_languages);
         }
         else {
             for my $theme ( _get_themes('opac') ) {
                 push @languages, _get_language_dirs($htdocs,$theme);
             }
-            return _build_languages_arrayref($all_languages,\@languages,$current_language);
+            return _build_languages_arrayref($all_languages,\@languages,$current_language,\@enabled_languages);
         }
     }
     elsif ($interface && $interface eq 'intranet' ) {
+        @enabled_languages = split ",", C4::Context->preference('language');
         $htdocs = C4::Context->config('intrahtdocs');
         if ( $theme and -d "$htdocs/$theme" ) {
             @languages = _get_language_dirs($htdocs,$theme);
-            return _build_languages_arrayref($all_languages,\@languages,$current_language);
+            return _build_languages_arrayref($all_languages,\@languages,$current_language,\@enabled_languages);
         }
         else {
             foreach my $theme ( _get_themes('intranet') ) {
                 push @languages, _get_language_dirs($htdocs,$theme);
             }
-            return _build_languages_arrayref($all_languages,\@languages,$current_language);
+            return _build_languages_arrayref($all_languages,\@languages,$current_language,\@enabled_languages);
         }
     }
     else {
+        @enabled_languages = split ",", C4::Context->preference('opaclanguages');
         my $htdocs = C4::Context->config('intrahtdocs');
         foreach my $theme ( _get_themes('intranet') ) {
             push @languages, _get_language_dirs($htdocs,$theme);
@@ -145,7 +149,7 @@ sub getTranslatedLanguages {
         foreach my $theme ( _get_themes('opac') ) {
             push @languages, _get_language_dirs($htdocs,$theme);
         }
-        return _build_languages_arrayref($all_languages,\@languages,$current_language);
+        return _build_languages_arrayref($all_languages,\@languages,$current_language,\@enabled_languages);
     }
 }
 
@@ -177,8 +181,8 @@ sub getAllLanguages {
 
         # add the correct description info
         while (my $language_descriptions = $sth2->fetchrow_hashref) {
-           # fill in the ISO6329 code
-           $language_subtag_registry->{iso639_2_code} = $language_descriptions->{iso639_2_code};
+        # fill in the ISO6329 code
+        $language_subtag_registry->{iso639_2_code} = $language_descriptions->{iso639_2_code};
             $language_subtag_registry->{language_description} = $language_descriptions->{description};
         }
         push @languages_loop, $language_subtag_registry;
@@ -246,9 +250,10 @@ FIXME: this could be rewritten and simplified using map
 =cut
 
 sub _build_languages_arrayref {
-        my ($all_languages,$translated_languages,$current_language) = @_;
+        my ($all_languages,$translated_languages,$current_language,$enabled_languages) = @_;
         my @translated_languages = @$translated_languages;
         my @languages_loop; # the final reference to an array of hashrefs
+        my @enabled_languages = @$enabled_languages;
         my %seen_languages; # the language tags we've seen
         my %found_languages;
         my $language_groups;
@@ -256,9 +261,14 @@ sub _build_languages_arrayref {
         my $current_language_regex = regex_lang_subtags($current_language);
         # Loop through the translated languages
         for my $translated_language (@translated_languages) {
-
             # separate the language string into its subtag types
             my $language_subtags_hashref = regex_lang_subtags($translated_language);
+
+            # is this language string 'enabled'?
+            for my $enabled_language (@enabled_languages) {
+                #warn "Checking out if $translated_language eq $enabled_language";
+                $language_subtags_hashref->{'enabled'} = 1 if $translated_language eq $enabled_language;
+            }
             
             # group this language, key by langtag
             $language_subtags_hashref->{'sublanguage_current'} = 1 if $translated_language eq $current_language;
@@ -272,6 +282,13 @@ sub _build_languages_arrayref {
         }
         # $key is a language subtag like 'en'
         while( my ($key, $value) = each %$language_groups) {
+
+            # is this language group enabled? are any of the languages within it enabled?
+            my $enabled;
+            for my $enabled_language (@enabled_languages) {
+                my $regex_enabled_language = regex_lang_subtags($enabled_language);
+                $enabled = 1 if $key eq $regex_enabled_language->{language};
+            }
             push @languages_loop,  {
                             # this is only use if there is one
                             rfc4646_subtag => @$value[0]->{rfc4646_subtag},
@@ -280,6 +297,7 @@ sub _build_languages_arrayref {
                             sublanguages_loop => $value,
                             plural => $track_language_groups->{$key} >1 ? 1 : 0,
                             current => $current_language_regex->{language} eq $key ? 1 : 0,
+                            group_enabled => $enabled,
                            };
         }
         return \@languages_loop;
index 0f1cc69..1804a53 100755 (executable)
@@ -473,25 +473,28 @@ if ($op eq 'add_form') {
             $counter++; 
         }
     } elsif ($data->{'type'} eq 'Languages') {
-        $template->param('type-choice' => 1);
-        my $type='';
-        @options=();
-        my $currently_selected_languages;
-        my $counter=0;
+       my $currently_selected_languages;
         foreach my $language (split /\s+/, $data->{'value'}) {
-            next if $language eq 'images';
-            push @options, { option => $language, counter => $counter };
             $currently_selected_languages->{$language}=1;
-            $counter++;
-        }
-        my $langavail = getTranslatedLanguages();
-        foreach my $language (@$langavail) {
-            my $selected='0';
-            next if $currently_selected_languages->{$language->{'language_code'}};
-            #FIXME: could add language_name and language_locale_name for better display
-            push @options, { option => $language->{'language_code'}, counter => $counter };
-            $counter++;
         }
+       # current language
+        my $lang = $template->param('lang');
+        my $theme;
+       my $interface;
+       if ($data->{'variable'} =~ /opac/) {
+               # this is the OPAC
+               $interface = 'opac';
+               $theme = C4::Context->preference('opacthemes');
+       }
+       else {
+               # this is the staff client      
+               $interface = 'intranet';
+               $theme = C4::Context->preference('template');
+       }
+       my $languages_loop = getTranslatedLanguages($interface,$theme,$lang,$currently_selected_languages);
+
+       $template->param('languages_loop' => $languages_loop);
+        $template->param('type-langselector' => 1);
     } else {
         $template->param('type-free' => 1);
         $template->param('fieldlength' => $data->{'options'}>0?$data->{'options'}:60);
@@ -510,16 +513,25 @@ if ($op eq 'add_form') {
     my $dbh = C4::Context->dbh;
     my $sth=$dbh->prepare("select * from systempreferences where variable=?");
     $sth->execute($input->param('variable'));
+    # to handle multiple values
+    my $value;
+    # handle multiple value strings (separated by ',')
+    my $params = $input->Vars;
+    my @values = split("\0",$params->{'value'}) if $params->{'value'};
+    for my $vl (@values) {
+       $value .= "$vl,";
+    }
+    $value =~ s/,$//;
     if ($sth->rows) {
         unless (C4::Context->config('demo') eq 1) {
             my $sth=$dbh->prepare("update systempreferences set value=?,explanation=?,type=?,options=? where variable=?");
-            $sth->execute($input->param('value'), $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'), $input->param('variable'));
+            $sth->execute($value, $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'), $input->param('variable'));
             $sth->finish;
         }
     } else {
         unless (C4::Context->config('demo') eq 1) {
             my $sth=$dbh->prepare("insert into systempreferences (variable,value,explanation,type,options) values (?,?,?,?,?)");
-            $sth->execute($input->param('variable'), $input->param('value'), $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'));
+            $sth->execute($input->param('variable'), $value, $input->param('explanation'), $input->param('preftype'), $input->param('prefoptions'));
             $sth->finish;
         }
     }
index f7402fb..8f48a71 100644 (file)
@@ -4,29 +4,32 @@
         <div id="changelanguage" class="ft">
         <ul id="i18nMenu" class="footermenu">
         <!-- TMPL_LOOP NAME="languages_loop" -->
-
+            <!-- TMPL_IF NAME="group_enabled" -->
             <!-- TMPL_IF NAME="plural" -->
             <li class="more"><a id="showlang" href="#"><!-- TMPL_VAR NAME="native_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</a><div id="sublangs">
             <div class="bd"><ul>
             <!-- TMPL_LOOP NAME="sublanguages_loop" -->
-
+               <!-- TMPL_IF NAME="enabled" -->
                 <!-- TMPL_IF NAME="sublanguage_current" -->
                     <li> <a href="#"><!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</a></li>
                 <!-- TMPL_ELSE -->
                 <li><a href="/cgi-bin/koha/changelanguage.pl?language=<!-- TMPL_VAR NAME="rfc4646_subtag" -->"> <!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</a></li>
+               <!-- /TMPL_IF -->
                 <!-- /TMPL_IF -->
 
             <!-- /TMPL_LOOP -->
             </ul></div></div></li>
 
             <!-- TMPL_ELSE -->
+               <!-- TMPL_IF NAME="group_enabled" -->
                 <!-- TMPL_IF NAME="current" -->
                     <li><!-- TMPL_VAR NAME="native_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</li>
                 <!-- TMPL_ELSE -->
                     <li><a href="/cgi-bin/koha/changelanguage.pl?language=<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</a></li>
                 <!-- /TMPL_IF -->
+               <!-- /TMPL_IF -->
+            <!-- /TMPL_IF -->
             <!-- /TMPL_IF -->
-
         <!-- /TMPL_LOOP -->
         </ul>
         </div>
index 6b09213..df3d72e 100644 (file)
                         <!-- /TMPL_LOOP -->
                     </select>
                 <!-- /TMPL_IF -->
+        <!-- TMPL_IF NAME="type-langselector" -->
+        <!-- TMPL_IF NAME="languages_loop" -->
+       <table>
+        <!-- TMPL_LOOP NAME="languages_loop" -->
+           <tr><td>
+            <!-- TMPL_IF NAME="plural" -->
+            <!-- TMPL_IF NAME="native_description" --><!-- TMPL_VAR NAME="native_description" --><!-- TMPL_ELSE --><!-- TMPL_VAR NAME="rfc4646_subtag" --><!-- /TMPL_IF -->
+            <!-- TMPL_LOOP NAME="sublanguages_loop" --><table><tr><td>
+                <!-- TMPL_IF NAME="sublanguage_current" -->
+                    <label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
+                    <input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
+
+                <!-- TMPL_ELSE -->
+                    <label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
+                    <input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
+                <!-- /TMPL_IF --></td></tr></table>
+            <!-- /TMPL_LOOP -->
+
+            <!-- TMPL_ELSE -->
+                <!-- TMPL_IF NAME="current" -->
+            <label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
+                    <input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="group_enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
+                <!-- TMPL_ELSE -->
+            <label for="<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)
+                    <input value="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" name="value" id="<!-- TMPL_VAR NAME="rfc4646_subtag" -->" type="checkbox" <!-- TMPL_IF NAME="group_enabled" -->checked="checked"<!-- /TMPL_IF --> /> </label>
+                <!-- /TMPL_IF -->
+            <!-- /TMPL_IF -->
+           </td></tr>
+        <!-- /TMPL_LOOP -->
+       </table>
+        <!-- /TMPL_IF -->
+
+        <!-- /TMPL_IF -->
+
                 <!-- TMPL_IF NAME="type-yesno" -->
                     <!-- TMPL_IF NAME="value-yes" -->
                     <input type="radio" name="value" id="value" value="1" checked="checked" /><!-- TMPL_ELSE --><input type="radio" name="value" id="value" value="1" /><!-- /TMPL_IF --> <label for="value" class="yesno">ON</label>
index 87166d8..74ca6fc 100644 (file)
@@ -8,29 +8,31 @@
         <div id="changelanguage" class="ft">
         <ul id="i18nMenu" class="footermenu">
         <!-- TMPL_LOOP NAME="languages_loop" -->
-
+            <!-- TMPL_IF NAME="group_enabled" -->
             <!-- TMPL_IF NAME="plural" -->
-            <li class="more"><a id="showlang" href="#"><!-- TMPL_VAR NAME="native_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</a><div id="sublangs">
+            <li class="more"><a id="showlang" href="#"><!-- TMPL_IF NAME="native_description" --><!-- TMPL_VAR NAME="native_description" --><!-- TMPL_ELSE --><!-- TMPL_VAR NAME="rfc4646_subtag" --><!-- /TMPL_IF --></a><div id="sublangs">
             <div class="bd"><ul>
             <!-- TMPL_LOOP NAME="sublanguages_loop" -->
-
+               <!-- TMPL_IF NAME="enabled" -->
                 <!-- TMPL_IF NAME="sublanguage_current" -->
                     <li> <!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</li>
                 <!-- TMPL_ELSE -->
                 <li><a href="/cgi-bin/koha/opac-changelanguage.pl?language=<!-- TMPL_VAR NAME="rfc4646_subtag" -->"> <!-- TMPL_VAR NAME="native_description" --> <!-- TMPL_VAR NAME="script_description" --> <!-- TMPL_VAR NAME="region_description" --> <!-- TMPL_VAR NAME="variant_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</a></li>
                 <!-- /TMPL_IF -->
-
+               <!-- /TMPL_IF -->
             <!-- /TMPL_LOOP -->
             </ul></div></div></li>
 
             <!-- TMPL_ELSE -->
+               <!-- TMPL_IF NAME="group_enabled" -->
                 <!-- TMPL_IF NAME="current" -->
-                    <li><!-- TMPL_VAR NAME="native_description" -->(<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</li>
+                    <li><!-- TMPL_IF NAME="native_description" --><!-- TMPL_VAR NAME="native_description" --><!-- TMPL_ELSE --><!-- TMPL_VAR NAME="rfc4646_subtag" --><!-- /TMPL_IF --></li>
                 <!-- TMPL_ELSE -->
-                    <li><a href="/cgi-bin/koha/opac-changelanguage.pl?language=<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_VAR NAME="native_description" --> (<!-- TMPL_VAR NAME="rfc4646_subtag" -->)</a></li>
+                    <li><a href="/cgi-bin/koha/opac-changelanguage.pl?language=<!-- TMPL_VAR NAME="rfc4646_subtag" -->"><!-- TMPL_IF NAME="native_description" --><!-- TMPL_VAR NAME="native_description" --><!-- TMPL_ELSE --><!-- TMPL_VAR NAME="rfc4646_subtag" --><!-- /TMPL_IF --></a></li>
                 <!-- /TMPL_IF -->
+               <!-- /TMPL_IF -->
+            <!-- /TMPL_IF -->
             <!-- /TMPL_IF -->
-
         <!-- /TMPL_LOOP -->
         </ul>
         </div>