in reply to Writing multilingual perl applications?

One thing that I stumbled onto recently was, how the Gimp handles internationalization - through an interesting hack :

They (or rather, Marc Lehmann) introduce a special sub _ (underscore), and that sub does the lookup on whole phrases. This keeps the source code relatively clean, as your code is not cluttered with translate_message() calls, but every (translatable) string is prefixed by _ "foo".

There are some complications to this matter, as the automagic source code scanning only works for _ "..." and not for qq{} constructs, also, it dosen't allow for any context-sensitive stuff like 1 file found vs. 2 files found. It allows for sprintf placeholders, something I urge you to allow too, as the construction of sentences varies enough to make hardcoded string construction ugly/awkward for the user.

This sentence based approach has the drawback that you have to scan the source code and then translate all those sentences, but it has the advantage that you keep readable (english) error messages in your code, and these can be used as the defaults, if no translation is found.

perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web

Replies are listed 'Best First'.
Re: Re: Writing multilingual perl applications?
by diotalevi (Canon) on Mar 20, 2003 at 08:37 UTC

    This sounds like what UseMod does. Anyhow, its free software so I'll quote from it for a moment.

    # This could have alternate languages if extended. %Translate = ( 'Edit text of this page' => 'Edit this page', 'Index' => 'All Pages' ); # ... T('showing current revision instead') .... sub T { my ($text) = @_; if (1) { # Later make translation optional? if (defined($Translate{$text}) && ($Translate{$text} ne '')) { return $Translate{$text}; } } return $text; } # &ReportError(Ts('Could not create %s', $DataDir) . ": $!"); sub Ts { my ($text, $string) = @_; $text = T($text); $text =~ s/\%s/$string/; return $text; } # Improved Ts sub Ts { my ($text, $string) = @_; return sprintf $text, $string; }