On Tue, 9 Jan 2007, Kovacs Baldvin wrote:
> I am wondering if a different approach would be possible: why don't we
> hack the mason compiler to compile not just .obj files from the
> templates, but .en.obj, .fr.obj, .de.obj, ... When a component is to be
> run, then the appropriate .obj file is taken, and would run the same
> speed as there were no internationalization would be in place.
The way I do it is to override Mason's Resolver class. The language is
part of the URL, and my Resolver actually reads the html file from a
common directory. This way there is only one copy of the untranslated
mason source, but the mason cache has one copy for each language.
We use <trans key=xyzzy> tags to delimit the translatable text. Mason's
"<% %>" tags are replaced by "{1}" in the translation database, so they
can be reordered. (In my experience, even that much flexibility confuses
many contractual translators.)
I cannot share my company's translation code, but here is the get_info
function from our Resolver subclass. It just a modified version
of the code from HTML::Mason::Resolver::File. Modifying this use to
Maketext is left as an exercise for the reader.
sub get_info {
my ($self, $path) = @_;
# get the language handle
my $tr = TNI::Translation->new(
comp_root => $self->comp_root,
path => $path,
);
# language is determined from the URL
my $language = $tr->language;
# when the translation database was last modified
my $modified = $tr->domain_modified( unix=>1 ) || 0;
# find the untranslated file
my $english = $path;
$english =~ s{//+}{/}g;
$english =~ s{^/([^/]*?)/\Q$language\E/}{/default/english/} if
$language;
foreach my $pair ($self->comp_root_array) {
my $fname = File::Spec->canonpath( File::Spec->catfile(
$pair->[1], $path ) );
my $srcfile = File::Spec->canonpath( File::Spec->catfile(
$pair->[1], $english ) );
next unless -f $srcfile;
my $filemodified = (stat _)[9];
$modified = $filemodified if $filemodified > $modified;
my $key = $pair->[0];
my $base = $key eq 'MAIN' ? '' : "/$key";
$key = undef if $key eq 'MAIN';
return
HTML::Mason::ComponentSource->new
( friendly_name => $fname,
comp_id => "$base$path",
last_modified => $modified,
comp_path => $path,
comp_class =>
'HTML::Mason::Component::FileBased',
extra => { comp_root => $key },
#source_callback => sub {
read_file_ref($srcfile) },
source_callback => sub {
# read the source file and translate
TNI::Translation::Parse::HTML->new( tr=>$tr
)->translate_page_ref(read_file_ref($srcfile));
},
);
}
# see if path corresponds to real filesystem path, a common new user
mistake
my $fs_path = File::Spec->catfile( split /\//, $path );
if ( defined $fs_path && -e $fs_path )
{
warn "Your component path ($path) matches a real file on disk
($fs_path). Have you read about the component root in the Administrator's
Manual (HTML::Mason::Admin)?";
}
return;
}
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Mason-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mason-users