Annotation of loncom/localize/lonlocal.pm, revision 1.13
1.1 www 1: # The LearningOnline Network with CAPA
2: # Localization routines
3: #
1.13 ! www 4: # $Id: lonlocal.pm,v 1.12 2003/09/23 02:19:09 albertel Exp $
1.1 www 5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28: ######################################################################
29: ######################################################################
1.10 bowersj2 30:
31: =pod
32:
33: =head1 NAME
34:
35: Apache::lonlocal - provides localization services
36:
37: =head1 SYNOPSIS
38:
39: lonlocal provides localization services for LON-CAPA programmers based
40: on Locale::Maketext. See
41: C<http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext.pod>
42: for more information on Maketext.
43:
44: =head1 OVERVIEWX<internationalization>
45:
46: As of LON-CAPA 1.1, we've started to localize LON-CAPA using the
47: Locale::Maketext module. Internationalization is the bulk of the work
48: right now (pre-1.1); localizing can be done anytime, and involves
49: little or no programming.
50:
51: The internationalization process involves putting a wrapper around
52: on-screen user messages and menus and turning them into keys,
53: which the MaketextX<Maketext> library translates into the desired
54: language output using a look-up table ("lexicon").X<lexicon>
55:
56: As keys we are currently using the plain English messages, and
57: Maketext is configured to replace the message by its own key if no
58: translation is found. This makes it easy to phase in the
59: internationalization without disturbing the screen output.
60:
61: Internationalization is somewhat tedious and effectively impossible
62: for a non-fluent speaker to perform, but is fairly easy to create
63: translations, requiring no programming skill. As a result, this is one
64: area where you can really help LON-CAPA out, even if you aren't a
65: programmer, and we'd really appreciate it.
66:
67: =head1 How To Localize Handlers For Programmers
68:
69: Into the "use" section of a module, we need to insert
70:
71: use Apache::lonlocal;
72:
73: Note that there are B<no parentheses>, we B<want> to pollute our
74: namespace.
75:
76: Inside might be something like this
77:
78: sub message {
79: my $status=shift;
80: my $message='Status unknown';
81: if ($status eq 'WON') {
82: $message='You have won.';
83: } elsif ($status eq 'LOST') {
84: $message='You are a total looser.';
85: }
86: return $message;
87: }
88: ...
89: $r->print('<h3>Gamble your Homework Points</h3>');
90: ...
91: $r->print(<<ENDMSG);
92: <font size="1">Rules:</font>
93: <font size="0">No purchase necessary. Illegal where not allowed.</font>
94: ENDMSG
95:
96: We have to now wrap the subroutine &mt()X<mt> ("maketext") around our
97: messages, but not around markup, etc. We also want minimal disturbance.
98: The first two examples are easy:
99:
100: sub message {
101: my $status=shift;
102: my $message='Status unknown';
103: if ($status eq 'WON') {
104: $message='You have won.';
105: } elsif ($status eq 'LOST') {
106: $message='You are a total looser.';
107: }
108: return &mt($message);
109: }
110: ...
111: $r->print('<h3>'.&mt('Gamble your Homework Points').'</h3>');
112:
113: The last one is a bummer, since you cannot call subroutines inside of
114: (<<MARKER). I have written a little subroutine to generate a translated
115: hash for that purpose:
116:
117: my %lt=&Apache::lonlocal::texthash('header' => 'Rules', 'disclaimer' =>
118: 'No purchase necessary. Illegal where not allowed.');
119: $r->print(<<ENDMSG);
120: <font size="1">$lt{'header'}:</font>
121: <font size="0">$lt{'disclaimer'}</font>
122: ENDMSG
123:
124: As a programmer, your job is done here. If everything worked, you
125: should see no changes on the screen.
126:
127: =head1 How To Localize LON-CAPA for Translators
128:
129: As a translator, you need to provide the lexicon for the keys, which in
130: this case is the plain text message. The lexicons sit in
131: loncom/localize/localize, with the language code as filename, for
132: example de.pm for the German translation. The file then simply looks
133: like this:
134:
135: 'You have won.'
136: => 'Sie haben gewonnen.',
137:
138: 'You are a total looser.'
139: => 'Sie sind der totale Verlierer.',
140:
141: 'Rules'
142: => 'Regeln',
143:
144: 'No purchase necessary. Illegal where not allowed.'
145: => 'Es ist erlaubt, einfach zu verlieren, und das ist Ihre Schuld.'
146:
147: The German translation lexicon is in pretty okay shape, but not
148: complete yet. Portuguese currently only covers the login screen.
149: Russian is purely experimental. Looks like UTF-8 is the way to encode
150: this, at least for latin/greek-based languages, but we still have to
151: learn a lot.
152:
153: Comments may be added with the # symbol, which outside of a string
154: (the things with the apostrophe surrounding them, which are the
155: keys and translations) will cause the translation routines to
156: ignore the rest of the line.
157:
158: This is a relatively easy task, and any help is appreciated.
159:
160: Maketext can do a whole lot more, see
161: C<http://search.cpan.org/dist/Locale-Maketext/lib/Locale/Maketext.pod>
162: but for most purposes, we do not have to mess with that.
163:
164: =cut
1.1 www 165:
166: package Apache::lonlocal;
167:
168: use strict;
169: use Apache::localize;
1.3 www 170: use Apache::File;
1.1 www 171:
172: require Exporter;
173:
174: our @ISA = qw (Exporter);
175: our @EXPORT = qw(mt);
176:
1.4 www 177: my $reroute;
178:
1.1 www 179: # ========================================================= The language handle
180:
181: use vars qw($lh);
182:
183: # ===================================================== The "MakeText" function
184:
185: sub mt (@) {
1.3 www 186: unless ($ENV{'environment.translator'}) {
1.12 albertel 187: if ($lh) {
188: return $lh->maketext(@_);
189: } else {
190: return @_;
191: }
1.3 www 192: } else {
1.12 albertel 193: if ($lh) {
194: my $trans=$lh->maketext(@_);
195: my $link='<a target="trans" href="/cgi-bin/translator.pl?arg1='.
196: &Apache::lonnet::escape($_[0]).'&arg2='.
197: &Apache::lonnet::escape($_[1]).'&arg3='.
198: &Apache::lonnet::escape($_[2]).'&lang='.
199: $ENV{'environment.translator'}.
200: '">[['.$trans.']]</a>';
201: if ($ENV{'transreroute'}) {
202: $reroute.=$link;
203: return $trans;
204: } else {
205: return $link;
206: }
1.4 www 207: } else {
1.12 albertel 208: return @_;
1.4 www 209: }
210: }
211: }
212:
1.6 www 213: # ============================================================== What language?
214:
215: sub current_language {
1.11 www 216: my $lang=$lh->maketext('language_code');
217: return ($lang eq 'language_code'?'en':$lang);
1.6 www 218: }
219:
1.8 www 220: # ============================================================== What encoding?
221:
222: sub current_encoding {
1.12 albertel 223: if ($lh) {
224: my $enc=$lh->maketext('char_encoding');
225: return ($enc eq 'char_encoding'?'':$enc);
226: } else {
227: return undef;
228: }
1.8 www 229: }
230:
1.4 www 231: # ============================================================== Translate hash
232:
233: sub texthash {
234: my %hash=@_;
235: foreach (keys %hash) {
236: $hash{$_}=&mt($hash{$_});
237: }
238: return %hash;
239: }
1.5 www 240: # ======================================================== Re-route translation
241:
242: sub clearreroutetrans {
243: &reroutetrans();
244: $reroute='';
245: }
1.4 www 246:
247: # ======================================================== Re-route translation
248:
249: sub reroutetrans {
250: $ENV{'transreroute'}=1;
251: }
1.5 www 252:
1.4 www 253: # ==================================================== End re-route translation
254: sub endreroutetrans {
255: $ENV{'transreroute'}=0;
256: if ($ENV{'environment.translator'}) {
257: return $reroute;
258: } else {
259: return '';
1.3 www 260: }
1.1 www 261: }
262:
263: # ========= Get a handle (do not invoke in vain, leave this to access handlers)
264:
265: sub get_language_handle {
1.9 www 266: my $r=shift;
1.2 www 267: $lh=Apache::localize->get_handle(&Apache::loncommon::preferred_languages);
1.12 albertel 268: if (&Apache::lonnet::mod_perl_version == 1) {
269: $r->content_languages([¤t_language()]);
1.8 www 270: }
1.1 www 271: }
272:
273: 1;
274:
275: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>