version 1.14, 2003/09/28 02:06:37
|
version 1.46, 2008/07/02 21:10:41
|
Line 162 package Apache::lonlocal;
|
Line 162 package Apache::lonlocal;
|
|
|
use strict; |
use strict; |
use Apache::localize; |
use Apache::localize; |
use Apache::File; |
|
use locale; |
use locale; |
use POSIX qw(locale_h); |
use POSIX qw(locale_h strftime); |
|
use DateTime(); |
|
use DateTime::TimeZone; |
|
|
require Exporter; |
require Exporter; |
|
|
our @ISA = qw (Exporter); |
our @ISA = qw (Exporter); |
our @EXPORT = qw(mt); |
our @EXPORT = qw(mt mtn ns); |
|
|
my $reroute; |
|
|
|
# ========================================================= The language handle |
# ========================================================= The language handle |
|
|
Line 180 use vars qw($lh);
|
Line 179 use vars qw($lh);
|
# ===================================================== The "MakeText" function |
# ===================================================== The "MakeText" function |
|
|
sub mt (@) { |
sub mt (@) { |
unless ($ENV{'environment.translator'}) { |
# open(LOG,'>>/home/www/loncapa/loncom/localize/localize/newphrases.txt'); |
if ($lh) { |
# print LOG (@_[0]."\n"); |
return $lh->maketext(@_); |
# close(LOG); |
} else { |
if ($lh) { |
return @_; |
if ($_[0] eq '') { |
} |
if (wantarray) { |
|
return @_; |
|
} else { |
|
return $_[0]; |
|
} |
|
} else { |
|
return $lh->maketext(@_); |
|
} |
} else { |
} else { |
if ($lh) { |
if (wantarray) { |
my $trans=$lh->maketext(@_); |
|
my $link='<a target="trans" href="/cgi-bin/translator.pl?arg1='. |
|
&Apache::lonnet::escape($_[0]).'&arg2='. |
|
&Apache::lonnet::escape($_[1]).'&arg3='. |
|
&Apache::lonnet::escape($_[2]).'&lang='. |
|
$ENV{'environment.translator'}. |
|
'">[['.$trans.']]</a>'; |
|
if ($ENV{'transreroute'}) { |
|
$reroute.=$link; |
|
return $trans; |
|
} else { |
|
return $link; |
|
} |
|
} else { |
|
return @_; |
return @_; |
|
} else { |
|
return $_[0]; |
} |
} |
} |
} |
} |
} |
Line 210 sub mt (@) {
|
Line 204 sub mt (@) {
|
# ============================================================== What language? |
# ============================================================== What language? |
|
|
sub current_language { |
sub current_language { |
my $lang=$lh->maketext('language_code'); |
if ($lh) { |
return ($lang eq 'language_code'?'en':$lang); |
my $lang=$lh->maketext('language_code'); |
|
return ($lang eq 'language_code'?'en':$lang); |
|
} |
|
return 'en'; |
} |
} |
|
|
# ============================================================== What encoding? |
# ============================================================== What encoding? |
|
|
sub current_encoding { |
sub current_encoding { |
|
my $default='UTF-8'; |
|
if ($Apache::lonnet::env{'browser.os'} eq 'win' && |
|
$Apache::lonnet::env{'browser.type'} eq 'explorer') { |
|
$default='ISO-8859-1'; |
|
} |
if ($lh) { |
if ($lh) { |
my $enc=$lh->maketext('char_encoding'); |
my $enc=$lh->maketext('char_encoding'); |
return ($enc eq 'char_encoding'?'':$enc); |
return ($enc eq 'char_encoding'?$default:$enc); |
|
} else { |
|
return $default; |
|
} |
|
} |
|
|
|
# =============================================================== Which locale? |
|
# Refer to locale -a |
|
# |
|
sub current_locale { |
|
if ($lh) { |
|
my $enc=$lh->maketext('lang_locale'); |
|
return ($enc eq 'lang_locale'?'':$enc); |
} else { |
} else { |
return undef; |
return undef; |
} |
} |
Line 234 sub texthash {
|
Line 248 sub texthash {
|
} |
} |
return %hash; |
return %hash; |
} |
} |
# ======================================================== Re-route translation |
|
|
|
sub clearreroutetrans { |
# ========= Get a handle (do not invoke in vain, leave this to access handlers) |
&reroutetrans(); |
|
$reroute=''; |
|
} |
|
|
|
# ======================================================== Re-route translation |
sub get_language_handle { |
|
my $r=shift; |
|
if ($r) { |
|
my $headers=$r->headers_in; |
|
$ENV{'HTTP_ACCEPT_LANGUAGE'}=$headers->{'Accept-language'}; |
|
} |
|
my @languages=&Apache::loncommon::preferred_languages; |
|
$ENV{'HTTP_ACCEPT_LANGUAGE'}=''; |
|
$lh=Apache::localize->get_handle(@languages); |
|
if ($r) { |
|
$r->content_languages([¤t_language()]); |
|
} |
|
### setlocale(LC_ALL,¤t_locale); |
|
} |
|
|
sub reroutetrans { |
# ========================================================== Localize localtime |
$ENV{'transreroute'}=1; |
sub gettimezone { |
|
my $timezone; |
|
if ($Apache::lonnet::env{'course.'.$Apache::lonnet::env{'request.course.id'}.'.timezone'}) { |
|
$timezone = $Apache::lonnet::env{'course.'.$Apache::lonnet::env{'request.course.id'}.'.timezone'}; |
|
} elsif ($Apache::lonnet::env{'request.course.id'} ne '') { |
|
my $cdom = $Apache::lonnet::env{'course.'.$Apache::lonnet::env{'request.course.id'}.'.domain'}; |
|
if ($cdom ne '') { |
|
my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); |
|
if ($domdefaults{'timezone_def'} ne '') { |
|
$timezone = $domdefaults{'timezone_def'}; |
|
} |
|
} |
|
} |
|
if ($timezone ne '') { |
|
if (DateTime::TimeZone->is_valid_name($timezone)) { |
|
return $timezone; |
|
} |
|
} |
|
return 'local'; |
} |
} |
|
|
# ==================================================== End re-route translation |
sub locallocaltime { |
sub endreroutetrans { |
my $thistime=shift; |
$ENV{'transreroute'}=0; |
if (!defined($thistime) || $thistime eq '') { |
if ($ENV{'environment.translator'}) { |
return &mt('Never'); |
return $reroute; |
} |
|
|
|
my $dt = DateTime->from_epoch(epoch => $thistime) |
|
->set_time_zone(&gettimezone()); |
|
if ((¤t_language=~/^en/) || (!$lh)) { |
|
|
|
return $dt->strftime("%a %b %e %I:%M:%S %P %Y (%Z)"); |
} else { |
} else { |
return ''; |
my $format=$lh->maketext('date_locale'); |
|
if ($format eq 'date_locale') { |
|
return $dt->strftime("%a %b %e %I:%M:%S %P %Y (%Z)"); |
|
} |
|
my $time_zone = $dt->time_zone_short_name(); |
|
my $seconds = $dt->second(); |
|
my $minutes = $dt->minute(); |
|
my $twentyfour = $dt->hour(); |
|
my $day = $dt->day_of_month(); |
|
my $mon = $dt->month()-1; |
|
my $year = $dt->year(); |
|
my $wday = $dt->wday(); |
|
if ($wday==7) { $wday=0; } |
|
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; |
|
} |
|
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." ($time_zone)"; |
} |
} |
} |
} |
|
|
# ========= Get a handle (do not invoke in vain, leave this to access handlers) |
# ==================== Normalize string (reduce fragility in the lexicon files) |
|
|
sub get_language_handle { |
# This normalizes a string to reduce fragility in the lexicon files of |
my $r=shift; |
# huge messages (such as are used by the helper), and allow useful |
$lh=Apache::localize->get_handle(&Apache::loncommon::preferred_languages); |
# formatting: reduce all consecutive whitespace to a single space, |
if (&Apache::lonnet::mod_perl_version == 1) { |
# and remove all HTML |
$r->content_languages([¤t_language()]); |
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]; |
} |
} |
setlocale(LC_ALL,¤t_language.'.'.¤t_encoding); |
} |
|
|
|
# ---------------------------------------------------- Replace MT{...} in files |
|
|
|
sub transstatic { |
|
my $strptr=shift; |
|
$$strptr=~s/MT\{([^\}]*)\}/&mt($1)/gse; |
|
} |
|
|
|
=pod |
|
|
|
=item * mt_escape |
|
|
|
mt_escape takes a string reference and escape the [] in there so mt |
|
will leave them as is and not try to expand them |
|
|
|
=cut |
|
|
|
sub mt_escape { |
|
my ($str_ref) = @_; |
|
$$str_ref =~s/~/~~/g; |
|
$$str_ref =~s/([\[\]])/~$1/g; |
} |
} |
|
|
1; |
1; |