localize CDR column headings, #27276
authorMark Wells <mark@freeside.biz>
Thu, 30 Jan 2014 21:16:14 +0000 (13:16 -0800)
committerMark Wells <mark@freeside.biz>
Thu, 30 Jan 2014 21:16:14 +0000 (13:16 -0800)
12 files changed:
FS/FS/Locales.pm
FS/FS/detail_format.pm
FS/FS/detail_format/accountcode_default.pm
FS/FS/detail_format/accountcode_simple.pm
FS/FS/detail_format/basic.pm
FS/FS/detail_format/default.pm
FS/FS/detail_format/description_default.pm
FS/FS/detail_format/simple.pm
FS/FS/detail_format/simple2.pm
FS/FS/detail_format/source_default.pm
FS/FS/part_pkg/voip_cdr.pm
FS/FS/part_pkg/voip_inbound.pm

index bf10990..6dd7c5a 100644 (file)
@@ -52,7 +52,13 @@ Returns a hash of information about a locale.
 
 sub locale_info {
   my($class, $locale) = @_;
-  %{ $locales{$locale} };
+  if (!$locale) {
+    return ();
+  } elsif (exists $locales{$locale}) {
+    return %{ $locales{$locale} };
+  } else {
+    die "unsupported locale '$locale'\n";
+  }
 }
 
 =item description LOCALE
index 88cc02f..665afdb 100644 (file)
@@ -5,7 +5,8 @@ use vars qw( $DEBUG );
 use FS::Conf;
 use FS::cdr;
 use FS::cust_bill_pkg_detail;
-use Date::Format qw(time2str);
+use FS::L10N;
+use Date::Language;
 use Text::CSV_XS;
 
 my $me = '[FS::detail_format]';
@@ -44,6 +45,9 @@ OPTIONS may contain:
   rated_price, rated_seconds, rated_minutes, and svcnum.  This can be 
   changed with the C<inbound> method.
 
+- locale: a locale string to use for static text and date formats.  This
+  is optional.
+
 =cut
 
 sub new {
@@ -58,11 +62,21 @@ sub new {
   die "$me error loading $class: $@" if $@;
   my %opt = @_;
 
-  my $self = { conf => FS::Conf->new,
+  my $locale = $opt{'locale'} || '';
+  my $conf = FS::Conf->new(locale => $locale);
+  $locale ||= $conf->config('locale') || 'en_US';
+
+  my %locale_info = FS::Locales->locale_info($locale);
+  my $language_name = $locale_info{'name'};
+
+  my $self = { conf => FS::Conf->new(locale => $locale),
                csv  => Text::CSV_XS->new,
                inbound  => ($opt{'inbound'} ? 1 : 0),
                buffer   => ($opt{'buffer'} || []),
-             }; 
+               _lh      => FS::L10N->get_handle($locale),
+               _dh      => eval { Date::Language->new($language_name) } ||
+                           Date::Language->new()
+             };
   bless $self, $class;
 }
 
@@ -139,7 +153,7 @@ sub header {
   my $self = shift;
 
   FS::cust_bill_pkg_detail->new(
-    { 'format' => 'C', 'detail' => $self->header_detail }
+    { 'format' => 'C', 'detail' => $self->mt($self->header_detail) }
   )
 }
 
@@ -228,6 +242,18 @@ sub money_char {
   $self->{money_char} ||= ($self->conf->config('money_char') || '$');
 }
 
+# localization methods
+
+sub time2str_local {
+  my $self = shift;
+  $self->{_dh}->time2str(@_);
+}
+
+sub mt {
+  my $self = shift;
+  $self->{_lh}->maketext(@_);
+}
+
 #imitate previous behavior for now
 
 sub duration {
index f76c9d5..562a8a9 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::accountcode_default;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Default with accountcode' }
 
@@ -12,8 +11,8 @@ sub columns {
   my $self = shift;
   my $cdr = shift;
   (
-    time2str($self->date_format, $cdr->startdate),
-    time2str('%r', $cdr->startdate),
+    $self->time2str_local($self->date_format, $cdr->startdate),
+    $self->time2str_local('%r', $cdr->startdate),
     $cdr->accountcode,
     ($cdr->rated_pretty_dst || $cdr->dst),
     $cdr->rated_regionname,
index 10a28db..5a19310 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::accountcode_simple;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Simple with source' }
 
@@ -12,8 +11,8 @@ sub columns {
   my $self = shift;
   my $cdr = shift;
   (
-    time2str($self->date_format, $cdr->startdate),
-    time2str('%r', $cdr->startdate),
+    $self->time2str_local($self->date_format, $cdr->startdate),
+    $self->time2str_local('%r', $cdr->startdate),
     $cdr->src,
     $cdr->accountcode,
     $self->duration($cdr),
index 811cf40..c45e926 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::basic;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Basic' }
 
@@ -12,7 +11,7 @@ sub columns {
   my $self = shift;
   my $cdr = shift;
   (
-    time2str('%d %b - %I:%M %p', $cdr->startdate),
+    $self->time2str_local('%d %b - %I:%M %p', $cdr->startdate),
     $cdr->dst,
     $self->duration($cdr),
     $self->price($cdr),
index 6c73d08..44abc83 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::default;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Default' }
 
@@ -12,8 +11,8 @@ sub columns {
   my $self = shift;
   my $cdr = shift;
   (
-    time2str($self->date_format, $cdr->startdate),
-    time2str('%r', $cdr->startdate),
+    $self->time2str_local($self->date_format, $cdr->startdate),
+    $self->time2str_local('%r', $cdr->startdate),
     ($cdr->rated_pretty_dst || $cdr->dst),
     $cdr->rated_regionname,
     $self->duration($cdr),
index 42e1725..7bc3ee2 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::description_default;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Default with description field as destination' }
 
@@ -13,8 +12,8 @@ sub columns {
   my $cdr = shift;
   (
     $cdr->src,
-    time2str($self->date_format, $cdr->startdate),
-    time2str('%r', $cdr->startdate),
+    $self->time2str_local($self->date_format, $cdr->startdate),
+    $self->time2str_local('%r', $cdr->startdate),
     ($cdr->rated_pretty_dst || $cdr->dst),
     $cdr->description,
     $self->duration($cdr),
index ef92706..9622e32 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::simple;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Simple' }
 
@@ -12,8 +11,8 @@ sub columns {
   my $self = shift;
   my $cdr = shift;
   (
-    time2str($self->date_format, $cdr->startdate),
-    time2str('%r', $cdr->startdate),
+    $self->time2str_local($self->date_format, $cdr->startdate),
+    $self->time2str_local('%r', $cdr->startdate),
     $cdr->userfield,
     $cdr->dst,
     $self->duration($cdr),
index 82773d2..d571141 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::simple2;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Simple with source' }
 
@@ -12,8 +11,8 @@ sub columns {
   my $self = shift;
   my $cdr = shift;
   (
-    time2str($self->date_format, $cdr->startdate),
-    time2str('%r', $cdr->startdate),
+    $self->time2str_local($self->date_format, $cdr->startdate),
+    $self->time2str_local('%r', $cdr->startdate),
     $cdr->userfield,
     $cdr->src,
     $cdr->dst,
index 1f46cd2..592fd3c 100644 (file)
@@ -2,7 +2,6 @@ package FS::detail_format::source_default;
 
 use strict;
 use base qw(FS::detail_format);
-use Date::Format qw(time2str);
 
 sub name { 'Default with source' }
 
@@ -13,8 +12,8 @@ sub columns {
   my $cdr = shift;
   (
     $cdr->src,
-    time2str($self->date_format, $cdr->startdate),
-    time2str('%r', $cdr->startdate),
+    $self->time2str_local($self->date_format, $cdr->startdate),
+    $self->time2str_local('%r', $cdr->startdate),
     ($cdr->rated_pretty_dst || $cdr->dst),
     $cdr->rated_regionname,
     $self->duration($cdr),
index a55832d..229d4f6 100644 (file)
@@ -418,7 +418,10 @@ sub calc_usage {
 
   my $usage_showzero    = $self->option('usage_showzero', 1);
 
-  my $formatter = FS::detail_format->new($output_format, buffer => $details);
+  my $formatter = FS::detail_format->new($output_format,
+    buffer => $details,
+    locale => $cust_pkg->cust_main->locale
+  );
 
   my $use_duration = $self->option('use_duration');
 
index 1566c18..052bb7f 100644 (file)
@@ -218,7 +218,11 @@ sub calc_usage {
   my $output_format = $self->option('output_format', 1) || 'default';
 
   my $formatter = 
-    FS::detail_format->new($output_format, buffer => $details, inbound => 1);
+    FS::detail_format->new($output_format,
+      buffer => $details,
+      inbound => 1,
+      locale => $cust_pkg->cust_main->locale
+    );
 
   my $granularity   = length($self->option('sec_granularity'))
                         ? $self->option('sec_granularity')