X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2FMsgcat.pm;h=e1bde8b51123f6b14dcb8e414f5ee4956a9cc932;hp=625743dc074e4115da6ea4c27124a2c40c8d2dbe;hb=dc83512c36dc6bea2585abada4f88d714c600e55;hpb=5e05724a635a22776f1b973f5d7e77989da4e048 diff --git a/FS/FS/Msgcat.pm b/FS/FS/Msgcat.pm index 625743dc0..e1bde8b51 100644 --- a/FS/FS/Msgcat.pm +++ b/FS/FS/Msgcat.pm @@ -1,22 +1,25 @@ package FS::Msgcat; use strict; -use vars qw( @ISA @EXPORT_OK $conf $locale $debug ); +use vars qw( @ISA @EXPORT_OK $conf $def_locale $debug @translate_auto_insert ); use Exporter; use FS::UID; #use FS::Record qw( qsearchs ); # wtf? won't import... use FS::Record; -use FS::Conf; +#use FS::Conf; #wtf? causes dependency loops too. use FS::msgcat; @ISA = qw(Exporter); @EXPORT_OK = qw( gettext geterror ); -$FS::UID::callback{'Msgcat'} = sub { +FS::UID->install_callback( sub { + eval "use FS::Conf;"; + die $@ if $@; $conf = new FS::Conf; - $locale = $conf->config('locale') || 'en_US'; - $debug = $conf->exists('show-msgcat-codes') -}; + $def_locale = $conf->config('locale') || 'en_US'; + $debug = $conf->exists('show-msgcat-codes'); + @translate_auto_insert = $conf->config('translate-auto-insert'); +}); =head1 NAME @@ -50,17 +53,42 @@ sub gettext { $debug ? geterror(@_) : _gettext(@_); } +#though i guess we don't really have to cache here since we do it in +# FS::L10N::DBI +our %cache; + sub _gettext { my $msgcode = shift; + return '' unless defined($msgcode) && length($msgcode) > 0; + + my $locale = (@_ && shift) + || $FS::CurrentUser::CurrentUser->locale + || $def_locale; + + return $cache{$locale}->{$msgcode} if exists $cache{$locale}->{$msgcode}; + my $msgcat = FS::Record::qsearchs('msgcat', { 'msgcode' => $msgcode, - 'locale' => $locale + 'locale' => $locale, } ); if ( $msgcat ) { - $msgcat->msg; + $cache{$locale}->{$msgcode} = $msgcat->msg; } else { - warn "WARNING: message for msgcode $msgcode in locale $locale not found"; - $msgcode; + warn "WARNING: message for msgcode $msgcode in locale $locale not found" + unless $locale eq 'en_US'; + $cache{$locale}->{$msgcode} = $msgcode; + + if ( $locale ne 'en_US' && grep { $_ eq $locale } @translate_auto_insert ) { + + # :( + my $newmsgcat = new FS::Record('msgcat', { locale => $locale, + msgcode => $msgcode, + msg => $msgcode, + }); + warn "WARNING: auto-inserting message for msgcode $msgcode in locale $locale"; + $newmsgcat->insert; + } + return $msgcode; } } @@ -76,6 +104,7 @@ sub geterror { my $msgcode = shift; my $msg = _gettext($msgcode); if ( $msg eq $msgcode ) { + my $locale = $FS::CurrentUser::CurrentUser->option('locale') || $def_locale; "Error code $msgcode (message for locale $locale not found)"; } else { "$msg (error code $msgcode)"; @@ -90,7 +119,7 @@ i18n/l10n, eek =head1 SEE ALSO -L, L, schema.html from the base documentation. +L, L =cut