[LON-CAPA-cvs] cvs: loncom /interface lonhelper.pm

bowersj2 lon-capa-cvs@mail.lon-capa.org
Thu, 02 Oct 2003 21:05:42 -0000


This is a MIME encoded message

--bowersj21065128742
Content-Type: text/plain

bowersj2		Thu Oct  2 17:05:42 2003 EDT

  Modified files:              
    /loncom/interface	lonhelper.pm 
  Log:
  Localizing lonhelper.
  
  Also squashed a new bug in the helper; seems the behavior of the  
  Time::Local::timelocal has changed; instead of coercing Feb. 31 into 
  Mar. 3, it dies. May be related to locale change, may be a change in 
  newer perls. Don't care to investigate, since this new code will catch 
  either dieing or silent coercion and use it as an error. (Dieing was 
  impolite, though, hosed the server for no good reason. I would have left 
  the old behavion and added a 'strict' parameter, I think...)
  
  
--bowersj21065128742
Content-Type: text/plain
Content-Disposition: attachment; filename="bowersj2-20031002170542.txt"

Index: loncom/interface/lonhelper.pm
diff -u loncom/interface/lonhelper.pm:1.49 loncom/interface/lonhelper.pm:1.50
--- loncom/interface/lonhelper.pm:1.49	Tue Sep 30 13:25:48 2003
+++ loncom/interface/lonhelper.pm	Thu Oct  2 17:05:42 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # .helper XML handler to implement the LON-CAPA helper
 #
-# $Id: lonhelper.pm,v 1.49 2003/09/30 17:25:48 bowersj2 Exp $
+# $Id: lonhelper.pm,v 1.50 2003/10/02 21:05:42 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -172,12 +172,20 @@
 when you are done. See lonprintout.pm for examples of this usage in the
 printHelper subroutine.
 
+=head2 Localization
+
+The helper framework tries to handle as much localization as
+possible. The text is always run through
+Apache::lonlocal::normalize_string, so be sure to run the keys through
+that function for maximum usefulness and robustness.
+
 =cut
 
 package Apache::lonhelper;
 use Apache::Constants qw(:common);
 use Apache::File;
 use Apache::lonxml;
+use Apache::lonlocal;
 
 # Register all the tags with the helper, so the helper can 
 # push and pop them
@@ -257,9 +265,9 @@
     # Send header, don't cache this page
     if ($r->header_only) {
         if ($ENV{'browser.mathml'}) {
-            $r->content_type('text/xml');
+            $r->content_type('text/xml; charset=UTF-8');
         } else {
-            $r->content_type('text/html');
+            $r->content_type('text/html; charset=UTF-8');
         }
         $r->send_http_header;
         return OK;
@@ -359,9 +367,10 @@
 package Apache::lonhelper::helper;
 
 use Digest::MD5 qw(md5_hex);
-use HTML::Entities;
+use HTML::Entities();
 use Apache::loncommon;
 use Apache::File;
+use Apache::lonlocal;
 
 sub new {
     my $proto = shift;
@@ -523,7 +532,7 @@
     # Phase 1: Post processing for state of previous screen (which is actually
     # the "current state" in terms of the helper variables), if it wasn't the 
     # beginning state.
-    if ($self->{STATE} ne "START" || $ENV{"form.SUBMIT"} eq "Next ->") {
+    if ($self->{STATE} ne "START" || $ENV{"form.SUBMIT"} eq &mt("Next ->")) {
 	my $prevState = $self->{STATES}{$self->{STATE}};
         $prevState->postprocess();
     }
@@ -574,13 +583,19 @@
     }
 
     # Phase 4: Display.
-    my $stateTitle = $state->title();
-    my $bodytag = &Apache::loncommon::bodytag("$self->{TITLE}",'','');
+    my $stateTitle = &mt($state->title());
+    my $helperTitle = &mt($self->{TITLE});
+    my $bodytag = &Apache::loncommon::bodytag($helperTitle,'','');
+    my $previous = HTML::Entities::encode(&mt("<- Previous"), '<>&"');
+    my $next = HTML::Entities::encode(&mt("Next ->"), '<>&"');
+    # FIXME: This should be parameterized, not concatenated - Jeremy
+    my $loncapaHelper = &mt("LON-CAPA Helper:");
 
     $result .= <<HEADER;
 <html>
     <head>
-        <title>LON-CAPA Helper: $self->{TITLE}</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <title>$loncapaHelper: $helperTitle</title>
     </head>
     $bodytag
 HEADER
@@ -607,12 +622,12 @@
         }
         if ($self->{DONE}) {
             my $returnPage = $self->{RETURN_PAGE};
-            $result .= "<a href=\"$returnPage\">End Helper</a>";
+            $result .= "<a href=\"$returnPage\">" . &mt("End Helper") . "</a>";
         }
         else {
             $result .= '<nobr><input name="back" type="button" ';
-            $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';
-            $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';
+            $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
+            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
         }
     }
 
@@ -626,12 +641,12 @@
         }
         if ($self->{DONE}) {
             my $returnPage = $self->{RETURN_PAGE};
-            $result .= "<a href=\"$returnPage\">End Helper</a>";
+            $result .= "<a href=\"$returnPage\">" . &mt('End Helper') . "</a>";
         }
         else {
             $result .= '<nobr><input name="back" type="button" ';
-            $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';
-            $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';
+            $result .= 'value="' . $previous . '" onclick="history.go(-1)" /> ';
+            $result .= '<input name="SUBMIT" type="submit" value="' . $next . '" /></nobr>';
         }
     }
 
@@ -883,6 +898,7 @@
 
 sub end_defaultvalue { return ''; }
 
+# Validators may need to take language specifications
 sub start_validator {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
 
@@ -952,11 +968,17 @@
 This is also a good template for creating your own new states, as it has
 very little code beyond the state template.
 
+=head3 Localization
+
+The contents of the message tag will be run through the
+normalize_string function and that will be used as a call to &mt.
+
 =cut
 
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::message',
@@ -998,7 +1020,7 @@
 sub render {
     my $self = shift;
 
-    return $self->{MESSAGE_TEXT};
+    return &mtn($self->{MESSAGE_TEXT});
 }
 # If a NEXTSTATE was given, switch to it
 sub postprocess {
@@ -1100,6 +1122,7 @@
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::choices',
@@ -1253,7 +1276,7 @@
             $choiceLabel = eval($choiceLabel);
             $choiceLabel = &$choiceLabel($helper, $self);
         }
-        $result .= "/></td><td> " . $choiceLabel . "</td></tr>\n";
+        $result .= "/></td><td> " . &mtn($choiceLabel) . "</td></tr>\n";
     }
     $result .= "</table>\n\n\n";
     $result .= $buttons;
@@ -1312,9 +1335,13 @@
 
 =cut
 
+# This really ought to be a sibling class to "choice" which is itself
+# a child of some abstract class.... *shrug*
+
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal;
 
 BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::dropdown',
@@ -1404,7 +1431,7 @@
             $choiceLabel = eval($choiceLabel);
             $choiceLabel = &$choiceLabel($helper, $self);
         }
-        $result .= ">" . $choiceLabel . "\n";
+        $result .= ">" . &mtn($choiceLabel) . "\n";
     }
     $result .= "</select>\n";
 
@@ -1473,6 +1500,7 @@
 no strict;
 @ISA = ("Apache::lonhelper::element");
 use strict;
+use Apache::lonlocal; # A localization nightmare
 
 use Time::localtime;
 
@@ -1537,7 +1565,7 @@
         } else {
             $result .= "<option value='$i'>";
         }
-        $result .= $months[$i] . "</option>\n";
+        $result .= &mt($months[$i]) . "</option>\n";
     }
     $result .= "</select>\n";
 
@@ -1624,17 +1652,26 @@
         $hour = $ENV{'form.' . $var . 'hour'};
     }
 
-    my $chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);
+    my $chosenDate;
+    eval {$chosenDate = Time::Local::timelocal(0, $min, $hour, $day, $month, $year);};
+    my $error = $@;
+
     # Check to make sure that the date was not automatically co-erced into a 
     # valid date, as we want to flag that as an error
     # This happens for "Feb. 31", for instance, which is coerced to March 2 or
-    # 3, depending on if it's a leapyear
+    # 3, depending on if it's a leap year
     my $checkDate = localtime($chosenDate);
 
-    if ($checkDate->mon != $month || $checkDate->mday != $day ||
+    if ($error || $checkDate->mon != $month || $checkDate->mday != $day ||
         $checkDate->year + 1900 != $year) {
+	unless (Apache::lonlocal::current_language()== ~/^en/) {
+	    $self->{ERROR_MSG} = &mt("Invalid date entry");
+	    return 0;
+	}
+	# LOCALIZATION FIXME: Needs to be parameterized
         $self->{ERROR_MSG} = "Can't use " . $months[$month] . " $day, $year as a "
             . "date because it doesn't exist. Please enter a valid date.";
+
         return 0;
     }
 

--bowersj21065128742--