--- loncom/localize/lonlocal.pm 2003/09/22 22:53:21 1.11
+++ loncom/localize/lonlocal.pm 2003/10/11 14:06:01 1.24
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Localization routines
#
-# $Id: lonlocal.pm,v 1.11 2003/09/22 22:53:21 www Exp $
+# $Id: lonlocal.pm,v 1.24 2003/10/11 14:06:01 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -144,11 +144,6 @@ like this:
'No purchase necessary. Illegal where not allowed.'
=> 'Es ist erlaubt, einfach zu verlieren, und das ist Ihre Schuld.'
-The German translation lexicon is in pretty okay shape, but not
-complete yet. Portuguese currently only covers the login screen.
-Russian is purely experimental. Looks like UTF-8 is the way to encode
-this, at least for latin/greek-based languages, but we still have to
-learn a lot.
Comments may be added with the # symbol, which outside of a string
(the things with the apostrophe surrounding them, which are the
@@ -168,11 +163,13 @@ package Apache::lonlocal;
use strict;
use Apache::localize;
use Apache::File;
+use locale;
+use POSIX qw(locale_h);
require Exporter;
our @ISA = qw (Exporter);
-our @EXPORT = qw(mt);
+our @EXPORT = qw(mt mtn ns);
my $reroute;
@@ -183,37 +180,81 @@ use vars qw($lh);
# ===================================================== The "MakeText" function
sub mt (@) {
+# my $fh=Apache::File->new('>>/home/www/loncapa/loncom/localize/localize/newphrases.txt');
+# print $fh join('',@_)."\n";
+# $fh->close();
unless ($ENV{'environment.translator'}) {
- return $lh->maketext(@_);
+ if ($lh) {
+ return $lh->maketext(@_);
+ } else {
+ return @_;
+ }
} else {
- my $trans=$lh->maketext(@_);
- my $link='[['.$trans.']]';
- if ($ENV{'transreroute'}) {
- $reroute.=$link;
- return $trans;
+ if ($lh) {
+ my $trans=$lh->maketext(@_);
+ my $link='[['.$trans.']]';
+ if ($ENV{'transreroute'}) {
+ $reroute.=$link;
+ return $trans;
+ } else {
+ return $link;
+ }
} else {
- return $link;
+ return @_;
}
}
}
+# ================================================================ The tag
+
+BEGIN {
+}
+
+sub start_mt {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+ return &mt(&Apache::lonxml::get_all_text("/mt",$parser));
+}
+
+sub end_mt {
+ return '';
+}
+
# ============================================================== What language?
sub current_language {
- my $lang=$lh->maketext('language_code');
- return ($lang eq 'language_code'?'en':$lang);
+ if ($lh) {
+ my $lang=$lh->maketext('language_code');
+ return ($lang eq 'language_code'?'en':$lang);
+ }
+ return 'en';
}
# ============================================================== What encoding?
sub current_encoding {
- my $enc=$lh->maketext('char_encoding');
- return ($enc eq 'char_encoding'?'':$enc);
+ if ($lh) {
+ my $enc=$lh->maketext('char_encoding');
+ return ($enc eq 'char_encoding'?'':$enc);
+ } else {
+ return undef;
+ }
+}
+
+# =============================================================== Which locale?
+# Refer to locale -a
+#
+sub current_locale {
+ if ($lh) {
+ my $enc=$lh->maketext('lang_locale');
+ return ($enc eq 'lang_locale'?'':$enc);
+ } else {
+ return undef;
+ }
}
# ============================================================== Translate hash
@@ -253,10 +294,85 @@ sub endreroutetrans {
sub get_language_handle {
my $r=shift;
$lh=Apache::localize->get_handle(&Apache::loncommon::preferred_languages);
- $r->content_languages(["¤t_language()"]);
- my $enc=¤t_encoding();
- if ($enc) {
+ if (&Apache::lonnet::mod_perl_version == 1) {
+ $r->content_languages([¤t_language()]);
+ }
+ &Apache::lonxml::register('Apache::lonlocal',('mt'));
+### setlocale(LC_ALL,¤t_locale);
+}
+
+# ========================================================== Localize localtime
+
+sub locallocaltime {
+ my $thistime=shift;
+ if ((¤t_language=~/^en/) || (!$lh)) {
+ return ''.localtime($thistime);
+ } else {
+ my $format=$lh->maketext('date_locale');
+ if ($format eq 'date_locale') {
+ return ''.localtime($thistime);
+ }
+ my ($seconds,$minutes,$twentyfour,$day,$mon,$year,$wday,$yday,$isdst)=
+ localtime($thistime);
+ my $month=(split(/\,/,$lh->maketext('date_months')))[$mon];
+ my $weekday=(split(/\,/,$lh->maketext('date_days')))[$wday];
+ if ($seconds<10) {
+ $seconds='0'.$seconds;
+ }
+ if ($minutes<10) {
+ $minutes='0'.$minutes;
+ }
+ $year+=1900;
+ my $twelve=$twentyfour;
+ my $ampm;
+ if ($twelve>12) {
+ $twelve-=12;
+ $ampm=$lh->maketext('date_pm');
+ } else {
+ $ampm=$lh->maketext('date_am');
+ }
+ foreach
+ ('seconds','minutes','twentyfour','twelve','day','year',
+ 'month','weekday','ampm') {
+ $format=~s/\$$_/eval('$'.$_)/gse;
+ }
+ return $format;
+ }
+}
+# ==================== Normalize string (reduce fragility in the lexicon files)
+
+# This normalizes a string to reduce fragility in the lexicon files of
+# huge messages (such as are used by the helper), and allow useful
+# formatting: reduce all consecutive whitespace to a single space,
+# and remove all HTML
+sub normalize_string {
+ my $s = shift;
+ $s =~ s/\s+/ /g;
+ $s =~ s/<[^>]+>//g;
+ # Pop off beginning or ending spaces, which aren't good
+ $s =~ s/^\s+//;
+ $s =~ s/\s+$//;
+ return $s;
+}
+
+# alias for normalize_string; recommend using it only in the lexicon
+sub ns {
+ return normalize_string(@_);
+}
+
+# mtn: call the mt function and the normalization function easily.
+# Returns original non-normalized string if there was no translation
+sub mtn (@) {
+ my @args = @_; # don't want to modify caller's string; if we
+ # didn't care about that we could set $_[0]
+ # directly
+ $args[0] = normalize_string($args[0]);
+ my $translation = &mt(@args);
+ if ($translation ne $args[0]) {
+ return $translation;
+ } else {
+ return $_[0];
}
}