[Catalyst] getting TT to translate automatically

Peter Edwards peterdragon at users.sourceforge.net
Sun Apr 9 21:04:02 CEST 2006

Hi Daniel, I think you'd be better off using a macro like

<H1>[% INCLUDE label.tt2 "key" => "HELLO" %]</H1>

and do your internationalisation in label.tt2 rather than using magic.


A couple of approaches are 

1) Generate static lookup .tt2 files from your database and at run time load
up the correct one based on the 'lang' value passed in the stash. The static
file can map key => internationalised label.

2) Call back to perl to look up the label using a Template Toolkit plugin.



We use a Template Toolkit perl plugin and call out to that to handle field
label mappings (in fact, to generate the HTML for the whole field, its label
and surrounds based on a data dictionary, so for example we can show a
DATETIME sql field as either a text input or as a date picker DHTML rich
element). It looks up dictionary settings from DBM format database files
generated overnight by reading from SQL. It's a lot quicker to look up from
DBM than SQL.


E.g. you could do something like this




            my $template = Template->new({

                        INCLUDE_PATH => "...",

                        PLUGINS => { D => 'Myapp::Dictionary' },


            $template->process('sometemplate.tt2', { username => 'Pierre' }
) || confess '.'






    [% INCLUDE label.tt2 key = 'hello', someextraflag => 'foo' %] [%
username %]






   DEFAULT key = '';

   DEFAULT someextraflag = '';


   IF key == ''; THROW "key undefined"; END;


   USE D;

   D.label ( 'key' => key, 'somextraflag' => someextraflag );




            package Myapp::Dictionary;

            use base qw ( Template::Plugin );



            sub new


   my $class = shift;

   my $context = shift;

   my $this = {

            _CONTEXT => $context,


            _lang => 'fr',


   bless($this, $class);




sub load


    Some code to read your dictionary from a filename based on
$this->{_lang} and eval it to a perl structure


sub setlang


   my $this = shift;

   $this->{_lang} = shift;

   Some validation of _lang value



sub label

   my $this = shift;

   my $p = shift || {};


   Look up and return internationalised label from key in $p->{key}



Regards, Peter



On 4/9/06, Daniel McBrearty <danielmcbrearty at gmail.com> wrote:


I am looking at using TT with cat to rewrite my multilanguage website.

The way my current implementation works is that all text for the site is in
a database, each row has a text mnemonic as primary key. You get back text
in a given language by doing something like::

$text = Sitetext::get( $lang, $key);

You can also do substitution of variables like this :

$text = Sitetext::get( $lang, $key, {NAME => "Pierre"});

What I'd like to do is get TT to do this automatically for all items on the
page that it doesn't find in the stash. So, for a template called "hello.tt"
like this :


and passed a stash like this :

{ substrings = {NAME => "Pierre"},
  lang => "fr",
  template => "hello.tt"}

TT would then do Sitetext::get( 'fr', 'HELLO', {NAME => 'Pierre'} ),
returning "Bonjour Pierre", and substitute it (because the HELLO var was not
explicitly defined on the stash).

Can anyone tell me if this is doable in TT? I have looked but don't see an
easy way. Discussion of other neat methods used to make a multilingual
catalyst app are also welcome ...



Daniel McBrearty
email : danielmcbrearty at gmail.com
www.engoi.com : the multi - language vocab trainer
BTW : 0873928131 

Catalyst mailing list
Catalyst at lists.rawmode.org 


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.rawmode.org/pipermail/catalyst/attachments/20060409/b12a311a/attachment.htm 

More information about the Catalyst mailing list