version 1.37, 2005/11/15 19:07:58
|
version 1.51, 2008/11/24 16:53:16
|
Line 161 but for most purposes, we do not have to
|
Line 161 but for most purposes, we do not have to
|
package Apache::lonlocal; |
package Apache::lonlocal; |
|
|
use strict; |
use strict; |
use Apache::Constants qw(:common); |
|
use Apache::localize; |
use Apache::localize; |
use locale; |
use locale; |
use POSIX qw(locale_h); |
use POSIX qw(locale_h strftime); |
|
use DateTime(); |
|
use DateTime::TimeZone; |
|
use DateTime::Locale; |
|
|
require Exporter; |
require Exporter; |
|
|
our @ISA = qw (Exporter); |
our @ISA = qw (Exporter); |
our @EXPORT = qw(mt mtn ns); |
our @EXPORT = qw(mt mtn ns mt_user); |
|
|
# ========================================================= The language handle |
# ========================================================= The language handle |
|
|
Line 182 sub mt (@) {
|
Line 184 sub mt (@) {
|
# print LOG (@_[0]."\n"); |
# print LOG (@_[0]."\n"); |
# close(LOG); |
# close(LOG); |
if ($lh) { |
if ($lh) { |
return $lh->maketext(@_); |
if ($_[0] eq '') { |
|
if (wantarray) { |
|
return @_; |
|
} else { |
|
return $_[0]; |
|
} |
|
} else { |
|
return $lh->maketext(@_); |
|
} |
} else { |
} else { |
if (wantarray) { |
if (wantarray) { |
return @_; |
return @_; |
Line 192 sub mt (@) {
|
Line 202 sub mt (@) {
|
} |
} |
} |
} |
|
|
|
sub mt_user { |
|
my ($user_lh,@what) = @_; |
|
if ($user_lh) { |
|
if ($what[0] eq '') { |
|
if (wantarray) { |
|
return @what; |
|
} else { |
|
return $what[0]; |
|
} |
|
} else { |
|
return $user_lh->maketext(@what); |
|
} |
|
} else { |
|
if (wantarray) { |
|
return @what; |
|
} else { |
|
return $what[0]; |
|
} |
|
} |
|
} |
|
|
# ============================================================== What language? |
# ============================================================== What language? |
|
|
sub current_language { |
sub current_language { |
Line 259 sub get_language_handle {
|
Line 290 sub get_language_handle {
|
|
|
# ========================================================== Localize localtime |
# ========================================================== Localize localtime |
sub gettimezone { |
sub gettimezone { |
return ' ('.$Apache::lonnet::env{'server.timezone'}.')'; |
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'}; |
|
} |
|
} |
|
} elsif ($Apache::lonnet::env{'request.role.domain'} ne '') { |
|
my %uroledomdefs = |
|
&Apache::lonnet::get_domain_defaults($Apache::lonnet::env{'request.role.domain'}); |
|
if ($uroledomdefs{'timezone_def'} ne '') { |
|
$timezone = $uroledomdefs{'timezone_def'}; |
|
} |
|
} elsif ($Apache::lonnet::env{'user.domain'} ne '') { |
|
my %udomdefaults = |
|
&Apache::lonnet::get_domain_defaults($Apache::lonnet::env{'user.domain'}); |
|
if ($udomdefaults{'timezone_def'} ne '') { |
|
$timezone = $udomdefaults{'timezone_def'}; |
|
} |
|
} |
|
if ($timezone ne '') { |
|
if (DateTime::TimeZone->is_valid_name($timezone)) { |
|
return $timezone; |
|
} |
|
} |
|
return 'local'; |
} |
} |
|
|
sub locallocaltime { |
sub locallocaltime { |
my $thistime=shift; |
my $thistime=shift; |
|
if (!defined($thistime) || $thistime eq '') { |
|
return &mt('Never'); |
|
} |
|
if (($thistime < 0) || ($thistime eq 'NaN')) { |
|
&Apache::lonnet::logthis("Unexpected time (negative or NaN) '$thistime' passed to lonlocal::locallocaltime"); |
|
return &mt('Never'); |
|
} |
|
if ($thistime !~ /^\d+$/) { |
|
&Apache::lonnet::logthis("Unexpected non-numeric time '$thistime' passed to lonlocal::locallocaltime"); |
|
return &mt('Never'); |
|
} |
|
|
|
my $dt = DateTime->from_epoch(epoch => $thistime) |
|
->set_time_zone(&gettimezone()); |
if ((¤t_language=~/^en/) || (!$lh)) { |
if ((¤t_language=~/^en/) || (!$lh)) { |
return ''.localtime($thistime).&gettimezone(); |
|
|
return $dt->strftime("%a %b %e %I:%M:%S %P %Y (%Z)"); |
} else { |
} else { |
my $format=$lh->maketext('date_locale'); |
my $format=$lh->maketext('date_locale'); |
if ($format eq 'date_locale') { |
if ($format eq 'date_locale') { |
return ''.localtime($thistime); |
return $dt->strftime("%a %b %e %I:%M:%S %P %Y (%Z)"); |
} |
} |
my ($seconds,$minutes,$twentyfour,$day,$mon,$year,$wday,$yday,$isdst)= |
my $time_zone = $dt->time_zone_short_name(); |
localtime($thistime); |
my $seconds = $dt->second(); |
my $month=(split(/\,/,$lh->maketext('date_months')))[$mon]; |
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]; |
my $weekday=(split(/\,/,$lh->maketext('date_days')))[$wday]; |
if ($seconds<10) { |
if ($seconds<10) { |
$seconds='0'.$seconds; |
$seconds='0'.$seconds; |
Line 281 sub locallocaltime {
|
Line 363 sub locallocaltime {
|
if ($minutes<10) { |
if ($minutes<10) { |
$minutes='0'.$minutes; |
$minutes='0'.$minutes; |
} |
} |
$year+=1900; |
|
my $twelve=$twentyfour; |
my $twelve=$twentyfour; |
my $ampm; |
my $ampm; |
if ($twelve>12) { |
if ($twelve>12) { |
Line 290 sub locallocaltime {
|
Line 371 sub locallocaltime {
|
} else { |
} else { |
$ampm=$lh->maketext('date_am'); |
$ampm=$lh->maketext('date_am'); |
} |
} |
foreach |
foreach ('seconds','minutes','twentyfour','twelve','day','year', |
('seconds','minutes','twentyfour','twelve','day','year', |
'month','weekday','ampm') { |
'month','weekday','ampm') { |
|
$format=~s/\$$_/eval('$'.$_)/gse; |
$format=~s/\$$_/eval('$'.$_)/gse; |
} |
} |
return $format.&gettimezone(); |
return $format." ($time_zone)"; |
|
} |
|
} |
|
|
|
sub getdatelocale { |
|
my ($datelocale,$locale_obj); |
|
if ($Apache::lonnet::env{'course.'.$Apache::lonnet::env{'request.course.id'}.'.datelocale'}) { |
|
$datelocale = $Apache::lonnet::env{'course.'.$Apache::lonnet::env{'request.course.id'}.'.datelocale'}; |
|
} 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{'datelocale_def'} ne '') { |
|
$datelocale = $domdefaults{'datelocale_def'}; |
|
} |
|
} |
|
} elsif ($Apache::lonnet::env{'user.domain'} ne '') { |
|
my %udomdefaults = &Apache::lonnet::get_domain_defaults($Apache::lonnet::env{'user.domain'}); |
|
if ($udomdefaults{'datelocale_def'} ne '') { |
|
$datelocale = $udomdefaults{'datelocale_def'}; |
|
} |
} |
} |
|
if ($datelocale ne '') { |
|
eval { |
|
$locale_obj = DateTime::Locale->load($datelocale); |
|
}; |
|
if (!$@) { |
|
if ($locale_obj->id() eq $datelocale) { |
|
return $locale_obj; |
|
} |
|
} |
|
} |
|
return $locale_obj; |
} |
} |
|
|
# ==================== Normalize string (reduce fragility in the lexicon files) |
=pod |
|
|
|
=item * normalize_string |
|
|
|
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 |
|
|
|
=cut |
|
|
# 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 { |
sub normalize_string { |
my $s = shift; |
my $s = shift; |
$s =~ s/\s+/ /g; |
$s =~ s/\s+/ /g; |
Line 315 sub normalize_string {
|
Line 433 sub normalize_string {
|
return $s; |
return $s; |
} |
} |
|
|
# alias for normalize_string; recommend using it only in the lexicon |
=pod |
|
|
|
=item * ns |
|
|
|
alias for normalize_string; recommend using it only in the lexicon |
|
|
|
=cut |
|
|
sub ns { |
sub ns { |
return normalize_string(@_); |
return normalize_string(@_); |
} |
} |
|
|
# mtn: call the mt function and the normalization function easily. |
=pod |
# Returns original non-normalized string if there was no translation |
|
|
=item * mtn |
|
|
|
mtn: call the mt function and the normalization function easily. |
|
Returns original non-normalized string if there was no translation |
|
|
|
=cut |
|
|
sub mtn (@) { |
sub mtn (@) { |
my @args = @_; # don't want to modify caller's string; if we |
my @args = @_; # don't want to modify caller's string; if we |
# didn't care about that we could set $_[0] |
# didn't care about that we could set $_[0] |
Line 342 sub transstatic {
|
Line 474 sub transstatic {
|
$$strptr=~s/MT\{([^\}]*)\}/&mt($1)/gse; |
$$strptr=~s/MT\{([^\}]*)\}/&mt($1)/gse; |
} |
} |
|
|
# ----------------------------------------------- Handler Routine /adm/localize |
=pod |
sub handler { |
|
my $r=shift; |
=item * mt_escape |
&Apache::lonlocal::get_language_handle($r); |
|
&Apache::loncommon::content_type($r,'text/html'); |
mt_escape takes a string reference and escape the [] in there so mt |
$r->send_http_header; |
will leave them as is and not try to expand them |
return OK if $r->header_only; |
|
|
=cut |
my $uri=$r->uri; |
|
$uri=~s/^\/adm\/localize//; |
sub mt_escape { |
my $fn=$Apache::lonnet::perlvar{'lonDocRoot'}.$uri; |
my ($str_ref) = @_; |
|
$$str_ref =~s/~/~~/g; |
my $file=&Apache::lonnet::getfile($fn); |
$$str_ref =~s/([\[\]])/~$1/g; |
&transstatic(\$file); |
|
$r->print($file); |
|
return OK; |
|
} |
} |
|
|
1; |
1; |