[Catalyst] getting TT to translate automatically

Daniel McBrearty danielmcbrearty at gmail.com
Sun Apr 9 21:31:45 CEST 2006


I'm thinking it could be simpler still ... if we define a coderef on the
stash, using an actual catalyst plugin ...

L10N => sub {
  my $key = shift;
  # lookup the key from wherever and return it
}

this is going to be very readable in templates

L10N('Bad email address')

I have something similar (but not catalyst) which has the lexicon in the db
- translators like it on the translation site because they can translate an
item from the lexicon, click a link, and see it in a real live web page, no
offline processing required. For production server, the text is cached to
avoid hitting the hell out of the db.

Some work to do to make substitutions using the stash work nicely, but it
should work. I hope ...


On 4/9/06, Peter Edwards <peterdragon at users.sourceforge.net> wrote:
>
>  Hi Daniel, I think you'd be better off using a macro like
>
> <body>
> <H1>[% INCLUDE label.tt2 "key" => "HELLO" %]</H1>
> </body>
>
>  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
>
>
>
> myModule.pm:
>
>
>
>             my $template = Template->new({
>
>                         INCLUDE_PATH => "...",
>
>                         PLUGINS => { D => 'Myapp::Dictionary' },
>
>             )};
>
>             $template->process('sometemplate.tt2', { username => 'Pierre'
> } ) || confess '…'
>
>
>
> sometemplate.tt2:
>
>
>
>     blah
>
>     blah
>
>     [% INCLUDE label.tt2 key = 'hello', someextraflag => 'foo' %] [%
> username %]
>
>     blah
>
>     blah
>
>
>
> label.tt2:
>
> [%
>
>    DEFAULT key = '';
>
>    DEFAULT someextraflag = '';
>
>
>
>    IF key == ''; THROW "key undefined"; END;
>
>
>
>    USE D;
>
>    D.label ( 'key' => key, 'somextraflag' => someextraflag );
>
> %]
>
>
>
> Myapp/Dictionary.pm:
>
>             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);
>
>    $this->load;
>
> }
>
>
>
> 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
>
>    $this->load;
> }
>
>
>
> 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:
>
> Hi
>
> 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 :
>
> <body>
> <H1>[%HELLO%]</H1>
> </body>
>
> 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 ...
>
> regards
>
> Daniel
>
>
> --
> 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
> http://lists.rawmode.org/mailman/listinfo/catalyst
>
>
>
> _______________________________________________
> Catalyst mailing list
> Catalyst at lists.rawmode.org
> http://lists.rawmode.org/mailman/listinfo/catalyst
>
>
>


--
Daniel McBrearty
email : danielmcbrearty at gmail.com
www.engoi.com : the multi - language vocab trainer
BTW : 0873928131
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.rawmode.org/pipermail/catalyst/attachments/20060409/0292f35d/attachment.htm 


More information about the Catalyst mailing list