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...
@EXPORT_OK = qw( gettext geterror );
FS::UID->install_callback( sub {
- eval { use FS::Conf; };
+ 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
$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;
}
}
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)";
=head1 SEE ALSO
-L<FS::msgcat>, L<FS::Record>, schema.html from the base documentation.
+L<FS::Locales>, L<FS::msgcat>
=cut