public
Description: Book for liftweb: http://www.apress.com/book/view/1430224215
Homepage: http://groups.google.com/group/the-lift-book
Clone URL: git://github.com/tjweir/liftbook.git
liftbook / apdx-i18n.lyx
100644 517 lines (379 sloc) 10.231 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
#LyX 1.6.1 created this file. For more info see http://www.lyx.org/
\lyxformat 345
\begin_document
\begin_header
\textclass book
\use_default_options false
\language english
\inputencoding auto
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
 
\graphics default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_amsmath 1
\use_esint 1
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\author ""
\author ""
\end_header
 
\begin_body
 
\begin_layout Chapter
Internationalization
\begin_inset CommandInset label
LatexCommand label
name "cha:Internationalization"
 
\end_inset
 
 
\end_layout
 
\begin_layout Standard
The ability to display pages to users of multiple languages is a common
 feature of many web frameworks.
 Lift builds on the underlying Java I18N foundations
\begin_inset Foot
status open
 
\begin_layout Plain Layout
Primarily java.util.Locale and java.util.ResourceBundle
\end_layout
 
\end_inset
 
 to provide a simple yet flexible means for using Locales and translated
 strings in your app.
 Locales are used to control not only what language the text is in that's
 presented to the user, but also number and date formatting, among others.
 If you want more details on the underlying foundation of Java I18N we suggest
 you visit the Internationalization Homepage at
\begin_inset CommandInset href
LatexCommand href
target "http://java.sun.com/javase/technologies/core/basic/intl/"
 
\end_inset
 
.
\end_layout
 
\begin_layout Section
Resource Bundles
\begin_inset CommandInset label
LatexCommand label
name "sec:Resource-Bundles"
 
\end_inset
 
 
\end_layout
 
\begin_layout Standard
Resource bundles are sets of property files
\begin_inset Foot
status open
 
\begin_layout Plain Layout
Technically, they can have other formats, but Lift generally only deals
 with PropertyResourceBundles
\end_layout
 
\end_inset
 
 that contain keyed strings for your application to use in messages.
 In addition to the key/value pair contents of the files, the filename itself
 is significant.
 When a ResourceBundle is specified by name, the base name is used as the
 default, and additional files with names of the form
\begin_inset Quotes eld
\end_inset
 
<base name>_<ISO language code>
\begin_inset Quotes erd
\end_inset
 
 can be used to specify translations of the default strings in a given language.
 As an example, consider listing
\begin_inset CommandInset ref
LatexCommand ref
reference "lst:Default-door-bundle"
 
\end_inset
 
, which specifies a default resource bundle for an application that reports
 the status of a door (open or closed).
 
\end_layout
 
\begin_layout Standard
\begin_inset listings
inline false
status open
 
\begin_layout Plain Layout
 
\begin_inset Caption
 
\begin_layout Plain Layout
Default door bundle
\begin_inset CommandInset label
LatexCommand label
name "lst:Default-door-bundle"
 
\end_inset
 
 
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Plain Layout
 
openStatus=The door is open
\end_layout
 
\begin_layout Plain Layout
 
closedStatus=The door is closed
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Standard
Suppose this file is called
\begin_inset Quotes eld
\end_inset
 
DoorMessages.properties
\begin_inset Quotes erd
\end_inset
 
; we can provide an additional translation for Spanish by creating a file
 called
\begin_inset Quotes eld
\end_inset
 
DoorMessages_es.properties
\begin_inset Quotes erd
\end_inset
 
, shown in listing
\begin_inset CommandInset ref
LatexCommand ref
reference "lst:Spanish-door-bundle"
 
\end_inset
 
.
\end_layout
 
\begin_layout Standard
\begin_inset listings
inline false
status open
 
\begin_layout Plain Layout
 
\begin_inset Caption
 
\begin_layout Plain Layout
Spanish door bundle
\begin_inset CommandInset label
LatexCommand label
name "lst:Spanish-door-bundle"
 
\end_inset
 
 
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Plain Layout
 
openStatus=La puerta está abierta
\end_layout
 
\begin_layout Plain Layout
 
closedStatus=La puerta está cerrada
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Standard
When you want to retrieve a message (covered in the next two sections) Lift
 will check the current Locale and see if there's a specialized ResourceBundle
 available for it.
 If so, it uses the messages in that file; otherwise, it uses the default
 bundle.
\end_layout
 
\begin_layout Standard
Lift supports using multiple resource bundle files so that you can break
 your messages up into functional groups.
 You specify this by setting the
\family typewriter
LiftRules.resourceNames
\family default
 property to a list of the base names (without a language or
\begin_inset Quotes eld
\end_inset
 
.properties
\begin_inset Quotes erd
\end_inset
 
 extension):
\end_layout
 
\begin_layout LyX-Code
LiftRules.resourceNames = "DoorMessages" ::
\end_layout
 
\begin_layout LyX-Code
                          "DoorknobMessages" :: Nil
\end_layout
 
\begin_layout Standard
The order that you define the resource bundle names is the order that they'll
 be searched for keys.
 The message properties files should be located in your
\family typewriter
WEB-INF/classes
\family default
 folder so that they are accessible from Lift's classloader
\begin_inset Foot
status open
 
\begin_layout Plain Layout
The properties files are retrieved with ClassLoader.getResourceAsStream
\end_layout
 
\end_inset
 
; if you're using Maven this will happen if you put your files in the
\family typewriter
src/main/resources
\family default
 directory.
\end_layout
 
\begin_layout Section
Localized Strings in Scala Code
\end_layout
 
\begin_layout Standard
Retrieving localized strings in your Scala code is primarily performed using
 the
\family typewriter
S.?
\family default
 method.
 When invoked with one argument the resource bundles are searched for a
 key matching the given argument.
 If a matching value is found it's returned.
 If it can't be found then Lift calls
\family typewriter
LiftRules.localizationLookupFailureNotice
\family default
 on the (key, current Locale) pair and then simply returns the key.
 If you call
\family typewriter
S.?
\family default
 with more than one argument, the first argument is still the key to look
 up, but any remaining arguments are used as format parameters for String.format
 executed on the retrieved value.
 For example, listing
\begin_inset CommandInset ref
LatexCommand ref
reference "lst:Formatted-bundles"
 
\end_inset
 
 shows a sample bundle file and the associated Scala code for using message
 formatting.
\end_layout
 
\begin_layout Standard
\begin_inset listings
inline false
status open
 
\begin_layout Plain Layout
 
\begin_inset Caption
 
\begin_layout Plain Layout
Formatted bundles
\begin_inset CommandInset label
LatexCommand label
name "lst:Formatted-bundles"
 
\end_inset
 
 
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Plain Layout
 
// bundle
\end_layout
 
\begin_layout Plain Layout
 
tempMsg=The current temperature is %0.1 degrees
\end_layout
 
\begin_layout Plain Layout
 
// code
\end_layout
 
\begin_layout Plain Layout
 
var currentTmp : Double = getTemp()
\end_layout
 
\begin_layout Plain Layout
 
Text(S.?("tempMsg", currentTemp))
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Standard
Lift also provides the
\family typewriter
S.??
\family default
 method, which is similar to
\family typewriter
S.?
\family default
 but uses the ResourceBundle for internal Lift strings.
 Lift's resource-bundles are located in the i18n folder with the name lift-core.p
roperties The resource-bundle name is given by LiftRules.liftCoreResourceName
 variable.
 Generally you won't use this method.
\end_layout
 
\begin_layout Section
Localized Strings in Templates
\end_layout
 
\begin_layout Standard
You can add localized strings directly in your templates through the <lift:loc
 /> tag.
 You can either provide a locid attribute on the tag which is used as the
 lookup key, or if you don't provide one, the contents of the tag will be
 used as the key.
 In either case, if the key can't be found in any resource bundles, the
 contents of the tag will be used.
 Listing
\begin_inset CommandInset ref
LatexCommand ref
reference "lst:Using-the-loc-tag"
 
\end_inset
 
 shows some examples of how you could use lift:loc.
 In both examples, assume that we're using the resource bundle shown in
 listing
\begin_inset CommandInset ref
LatexCommand ref
reference "lst:Spanish-door-bundle"
 
\end_inset
 
.
 The fallthrough behavior lets us put a default text (English) directly
 in the template, although for consistency you should usually provide an
 explicit bundle for all languages.
\end_layout
 
\begin_layout Standard
\begin_inset listings
lstparams "language=XML"
inline false
status open
 
\begin_layout Plain Layout
 
\begin_inset Caption
 
\begin_layout Plain Layout
Using the loc tag
\begin_inset CommandInset label
LatexCommand label
name "lst:Using-the-loc-tag"
 
\end_inset
 
 
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Plain Layout
 
<!-- using explicit key -->
\end_layout
 
\begin_layout Plain Layout
 
<lift:loc locid="openStatus">The door is open</lift:loc>
\end_layout
 
\begin_layout Plain Layout
 
\end_layout
 
\begin_layout Plain Layout
 
<!-- should be the same result -->
\end_layout
 
\begin_layout Plain Layout
 
<lift:loc>openStatus</lift:loc>
\end_layout
 
\end_inset
 
 
\end_layout
 
\begin_layout Section
Calculating Locale
\end_layout
 
\begin_layout Standard
The Locale for a given request is calculated by the function set in
\family typewriter
 LiftRules.localeCalculator
\family default
, a
\begin_inset Formula $(Box[HttpServletRequest])\Rightarrow Locale$
\end_inset
 
.
 The default behavior is to call getLocale on the HttpServletRequest, which
 allows the server to set it if your clients send locale preferences.
 If that call returns null, then Locale.getDefault is used.
 You can provide your own function for calculating locales if you desire.
\end_layout
 
\end_body
\end_document