in reply to Multilingual design

My own webserver uses TT. Text in the templates is defined in English, but with a translate callback, something like this:

<h1>[% tr.tr("Hello World") %]</h1> <p>[% tr.tr("Your new username is") %][% tr.quote(username) %]</p>

Basically, i'm registering a plugin into TT that provides a few functions. That includes making variables websafe as well to reduce the possibility of code injection. I haven't touched that particular code in a long, long time, but basically, you start by creating a TT plugin module

package PageCamel::Web::TT::Translate; ... use base qw(Template::Plugin); use Template::Plugin; use Template::Exception; sub load($class, $context) { my $self = bless { }, $class; return $self; } sub new($self, $context) { return $self; } sub tr($self, $data) { return $data if($data eq ''); my $lang = $self->getLang; my $trans = tr_translate($lang, $data); return $trans; <} ...

And then you provide that plugin when instatiating the Template Toolkit:

use Template; ... my $tt = Template->new({ PLUGINS => { tr => 'PageCamel::Web::TT::Translate', }, });

And since you provide the original, untranslated text in the Template, you can return that as default when no translation is found. Plus, automatically add it to the "still to be translated" list.

Original codebase of mine is open source.

PerlMonks XP is useless? Not anymore: XPD - Do more with your PerlMonks XP

Replies are listed 'Best First'.
Re^2: Multilingual design
by Bod (Parson) on Dec 18, 2022 at 21:59 UTC
    registering a plugin into TT that provides a few functions

    What an elegant solution - thanks for sharing

    I hardly use callbacks in Template so forget that thy exist! This alone is reason to take another little look at using them...

Re^2: Multilingual design
by ysth (Canon) on Oct 11, 2024 at 14:31 UTC
    I prefer an approach where what appears in the template is an identifier (e.g. your_new_username_is). This allows making minor changes to the English (or fixing typos) without losing all the translations, but does require that you have good test coverage to ensure all translations exist in at least English (or whatever your fallback language is).

    --
    A math joke: r = | |csc(θ)|+|sec(θ)| |-| |csc(θ)|-|sec(θ)| |