[LON-CAPA-dev] Fwd: Internationalization
Gerd Kortemeyer
lon-capa-dev@mail.lon-capa.org
Thu, 18 Sep 2003 08:32:56 -0400
Begin forwarded message:
> From: Gerd Kortemeyer <korte@lite.msu.edu>
> Date: Thu Sep 18, 2003 8:28:34 AM US/Eastern
> To: lon-capa-dev@mail.lon-capa.org, Leonardo Mendes
> <lmendes@decom.fee.unicamp.br>, Ricardo Luis Kulzer
> <ricardol@decom.fee.unicamp.br>, Horst Bögel
> <boegel@chemie.uni-halle.de>, Shoji Kajita
> <kajita@itc.nagoya-u.ac.jp>, "Timothy Takemoto"
> <tim@yamaguchi-u.ac.jp>, Michael Thoennessen > <thoennessen@nscl.msu.edu>
> Cc: Gerd Kortemeyer <korte@lite.msu.edu>, Ed Kashy
> <kashy@nscl.msu.edu>, cspeier@msu.edu, Deborah Kashy
> <kashyd@pilot.msu.edu>, Wolfgang Bauer <bauer@pa.msu.edu>, Helen Keefe
> <helen@lon-capa.org>
> Subject: Internationalization
>
> Hi,
>
> As you might have seen from a number of CVS commits in the last two
> days, we have started to internationalize LON-CAPA, so that it can run
> in different languages. We have also started localizing for German and
> Portuguese. Internalizing is the bulk of the work right now,
> localizing can be done anytime, and involves no programming.
>
> The internationalization process involves putting a wrapper around
> on-screen user messages and menus and turning them into keys, which
> the Maketext library translates into the desired language output using
> a look-up table ("lexicon").
>
> As keys we are currently using the plain English messages, and
> Maketext is configured to replace the message by its own key if no
> translation is found. This makes it easy to phase in the
> internationalization without disturbing the screen output.
>
> Internationalization is tedious, and the more we can distribute the
> work, the better.
>
> *** New software should be written in internationalized format from
> now on.
>
> *** If you feel like doing something brainless but productive, grab a
> module and internationalize it.
>
> *** As you come across some code during normal programming, just
> insert the wrappers.
>
> *** HERE'S WHAT TO DO:
>
> Into the "use" section of a module, we need to insert
>
> use Apache::lonlocal;
>
> - note that there are NO BRACKETS, we *want* to pollute our namespace.
>
> Inside might be something like this
>
> sub message {
> my $status=shift;
> my $message='Status unknown';
> if ($status eq 'WON') {
> $message='You have won.';
> } elsif ($status eq 'LOST') {
> $message='You are a total looser.';
> }
> return $message;
> }
> ...
> $r->print('<h3>Gamble your Homework Points</h3>');
> ...
> $r->print(<<ENDMSG);
> <font size="1">Rules:</font>
> <font size="0">No purchase necessary. Illegal where not allowed.</font>
> ENDMSG
>
> We have to now wrap the subroutine &mt() ("maketext") around our
> messages, but not around markup, etc. We also want minimal
> disturbance. The first two examples are easy:
>
> sub message {
> my $status=shift;
> my $message='Status unknown';
> if ($status eq 'WON') {
> $message='You have won.';
> } elsif ($status eq 'LOST') {
> $message='You are a total looser.';
> }
> return &mt($message);
> }
> ...
> $r->print('<h3>'.&mt('Gamble your Homework Points').'</h3>');
>
> The last one is a bummer, since you cannot call subroutines inside of
> (<<MARKER). I have written a little subroutine to generate a
> translated hash for that purpose:
>
> my %lt=&Apache::lonlocal::texthash('header' => 'Rules', 'disclaimer'
> => 'No purchase necessary. Illegal where not allowed.');
> $r->print(<<ENDMSG);
> <font size="1">$lt{'header'}:</font>
> <font size="0">$lt{'disclaimer'}</font>
> ENDMSG
>
> As a programmer, your job is done here. If everything worked, you
> should see no changes on the screen.
>
> As a translator, you need to provide the lexicon for the keys, which
> in this case is the plain text message. The lexicons sit in
> loncom/localize/localize, with the language code as filename, for
> example de.pm for the German translation. The file then simply looks
> like this:
>
> 'You have won.'
> => 'Sie haben gewonnen.',
>
> 'You are a total looser.'
> => 'Sie sind der totale Verlierer.',
>
> 'Rules'
> => 'Regeln',
>
> 'No purchase necessary. Illegal where not allowed.'
> => 'Es ist erlaubt, einfach zu verlieren, und das ist Ihre Schuld.'
>
> The German translation lexicon is in pretty okay shape, but not
> complete yet. Portuguese currently only covers the login screen.
> Russian is purely experimental. Looks like UTF-8 is the way to encode
> this, at least for latin/greek-based languages, but we still have to
> learn a lot.
>
> This is a relatively easy programming task, and any help is
> appreciated.
>
> Maketext can do a whole lot more, see
>
> http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext.pod
>
> but for most purposes, we do not have to mess with that.
>
> - Gerd.
>
>