source: trunk/doc/src/i18n.qdoc@ 321

Last change on this file since 321 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 21.5 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the documentation of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \group i18n
44 \title Internationalization with Qt
45 \ingroup topics
46
47 \brief Information about Qt's support for internationalization and multiple languages.
48
49 \keyword internationalization
50 \keyword i18n
51
52 The internationalization of an application is the process of making
53 the application usable by people in countries other than one's own.
54
55 \tableofcontents
56
57 In some cases internationalization is simple, for example, making a US
58 application accessible to Australian or British users may require
59 little more than a few spelling corrections. But to make a US
60 application usable by Japanese users, or a Korean application usable
61 by German users, will require that the software operate not only in
62 different languages, but use different input techniques, character
63 encodings and presentation conventions.
64
65 Qt tries to make internationalization as painless as possible for
66 developers. All input widgets and text drawing methods in Qt offer
67 built-in support for all supported languages. The built-in font engine
68 is capable of correctly and attractively rendering text that contains
69 characters from a variety of different writing systems at the same
70 time.
71
72 Qt supports most languages in use today, in particular:
73 \list
74 \o All East Asian languages (Chinese, Japanese and Korean)
75 \o All Western languages (using Latin script)
76 \o Arabic
77 \o Cyrillic languages (Russian, Ukrainian, etc.)
78 \o Greek
79 \o Hebrew
80 \o Thai and Lao
81 \o All scripts in Unicode 4.0 that do not require special processing
82 \endlist
83
84 On Windows, Unix/X11 with FontConfig (client side font support)
85 and Qt for Embedded Linux the following languages are also supported:
86 \list
87 \o Bengali
88 \o Devanagari
89 \o Dhivehi (Thaana)
90 \o Gujarati
91 \o Gurmukhi
92 \o Kannada
93 \o Khmer
94 \o Malayalam
95 \o Myanmar
96 \o Syriac
97 \o Tamil
98 \o Telugu
99 \o Tibetan
100 \endlist
101
102 Many of these writing systems exhibit special features:
103
104 \list
105
106 \o \bold{Special line breaking behavior.} Some of the Asian languages are
107 written without spaces between words. Line breaking can occur either
108 after every character (with exceptions) as in Chinese, Japanese and
109 Korean, or after logical word boundaries as in Thai.
110
111 \o \bold{Bidirectional writing.} Arabic and Hebrew are written from right to
112 left, except for numbers and embedded English text which is written
113 left to right. The exact behavior is defined in the
114 \l{http://www.unicode.org/unicode/reports/tr9/}{Unicode Technical Annex #9}.
115
116 \o \bold{Non-spacing or diacritical marks (accents or umlauts in European
117 languages).} Some languages such as Vietnamese make extensive use of
118 these marks and some characters can have more than one mark at the
119 same time to clarify pronunciation.
120
121 \o \bold{Ligatures.} In special contexts, some pairs of characters get
122 replaced by a combined glyph forming a ligature. Common examples are
123 the fl and fi ligatures used in typesetting US and European books.
124
125 \endlist
126
127 Qt tries to take care of all the special features listed above. You
128 usually don't have to worry about these features so long as you use
129 Qt's input widgets (e.g. QLineEdit, QTextEdit, and derived classes)
130 and Qt's display widgets (e.g. QLabel).
131
132 Support for these writing systems is transparent to the
133 programmer and completely encapsulated in \l{rich text
134 processing}{Qt's text engine}. This means that you don't need to
135 have any knowledge about the writing system used in a particular
136 language, except for the following small points:
137
138 \list
139
140 \o QPainter::drawText(int x, int y, const QString &str) will always
141 draw the string with its left edge at the position specified with
142 the x, y parameters. This will usually give you left aligned strings.
143 Arabic and Hebrew application strings are usually right
144 aligned, so for these languages use the version of drawText() that
145 takes a QRect since this will align in accordance with the language.
146
147 \o When you write your own text input controls, use \l
148 QFontMetrics::charWidth() to determine the width of a character in a
149 string. In some languages (e.g. Arabic or languages from the Indian
150 subcontinent), the width and shape of a glyph changes depending on the
151 surrounding characters. Writing input controls usually requires a
152 certain knowledge of the scripts it is going to be used in. Usually
153 the easiest way is to subclass QLineEdit or QTextEdit.
154
155 \endlist
156
157 The following sections give some information on the status of the
158 internationalization (i18n) support in Qt. See also the \l{Qt
159 Linguist manual}.
160
161 \section1 Step by Step
162
163 Writing cross-platform international software with Qt is a gentle,
164 incremental process. Your software can become internationalized in
165 the following stages:
166
167 \section2 Use QString for All User-Visible Text
168
169 Since QString uses the Unicode 4.0 encoding internally, every
170 language in the world can be processed transparently using
171 familiar text processing operations. Also, since all Qt functions
172 that present text to the user take a QString as a parameter,
173 there is no \c{char *} to QString conversion overhead.
174
175 Strings that are in "programmer space" (such as QObject names
176 and file format texts) need not use QString; the traditional
177 \c{char *} or the QByteArray class will suffice.
178
179 You're unlikely to notice that you are using Unicode;
180 QString, and QChar are just like easier versions of the crude
181 \c{const char *} and char from traditional C.
182
183 \section2 Use tr() for All Literal Text
184
185 Wherever your program uses "quoted text" for text that will
186 be presented to the user, ensure that it is processed by the \l
187 QCoreApplication::translate() function. Essentially all that is necessary
188 to achieve this is to use QObject::tr(). For example, assuming the
189 \c LoginWidget is a subclass of QWidget:
190
191 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 0
192
193 This accounts for 99% of the user-visible strings you're likely to
194 write.
195
196 If the quoted text is not in a member function of a
197 QObject subclass, use either the tr() function of an
198 appropriate class, or the QCoreApplication::translate() function
199 directly:
200
201 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 1
202
203 If you need to have translatable text completely
204 outside a function, there are two macros to help: QT_TR_NOOP()
205 and QT_TRANSLATE_NOOP(). They merely mark the text for
206 extraction by the \c lupdate utility described below.
207 The macros expand to just the text (without the context).
208
209 Example of QT_TR_NOOP():
210
211 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 2
212
213 Example of QT_TRANSLATE_NOOP():
214
215 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 3
216
217 If you disable the \c{const char *} to QString automatic
218 conversion by compiling your software with the macro \c
219 QT_NO_CAST_FROM_ASCII defined, you'll be very likely to catch any
220 strings you are missing. See QString::fromLatin1() for more
221 information. Disabling the conversion can make programming a bit
222 cumbersome.
223
224 If your source language uses characters outside Latin1, you
225 might find QObject::trUtf8() more convenient than
226 QObject::tr(), as tr() depends on the
227 QTextCodec::codecForTr(), which makes it more fragile than
228 QObject::trUtf8().
229
230 \section2 Use QKeySequence() for Accelerator Values
231
232 Accelerator values such as Ctrl+Q or Alt+F need to be translated
233 too. If you hardcode Qt::CTRL + Qt::Key_Q for "quit" in your
234 application, translators won't be able to override it. The
235 correct idiom is
236
237 \snippet examples/mainwindows/application/mainwindow.cpp 20
238
239 \section2 Use QString::arg() for Dynamic Text
240
241 The QString::arg() functions offer a simple means for substituting
242 arguments:
243 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 4
244
245 In some languages the order of arguments may need to change, and this
246 can easily be achieved by changing the order of the % arguments. For
247 example:
248
249 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 5
250
251 produces the correct output in English and Norwegian:
252 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 6
253
254 \section2 Produce Translations
255
256 Once you are using tr() throughout an application, you can start
257 producing translations of the user-visible text in your program.
258
259 The \l{Qt Linguist manual} provides further information about
260 Qt's translation tools, \e{Qt Linguist}, \c lupdate and \c
261 lrelease.
262
263 Translation of a Qt application is a three-step process:
264
265 \list 1
266
267 \o Run \c lupdate to extract translatable text from the C++
268 source code of the Qt application, resulting in a message file
269 for translators (a \c .ts file). The utility recognizes the tr()
270 construct and the \c{QT_TR*_NOOP()} macros described above and
271 produces \c .ts files (usually one per language).
272
273 \o Provide translations for the source texts in the \c .ts file, using
274 \e{Qt Linguist}. Since \c .ts files are in XML format, you can also
275 edit them by hand.
276
277 \o Run \c lrelease to obtain a light-weight message file (a \c .qm
278 file) from the \c .ts file, suitable only for end use. Think of the \c
279 .ts files as "source files", and \c .qm files as "object files". The
280 translator edits the \c .ts files, but the users of your application
281 only need the \c .qm files. Both kinds of files are platform and
282 locale independent.
283
284 \endlist
285
286 Typically, you will repeat these steps for every release of your
287 application. The \c lupdate utility does its best to reuse the
288 translations from previous releases.
289
290 Before you run \c lupdate, you should prepare a project file. Here's
291 an example project file (\c .pro file):
292
293 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 7
294
295 When you run \c lupdate or \c lrelease, you must give the name of the
296 project file as a command-line argument.
297
298 In this example, four exotic languages are supported: Danish,
299 Finnish, Norwegian and Swedish. If you use \l{qmake}, you usually
300 don't need an extra project file for \c lupdate; your \c qmake
301 project file will work fine once you add the \c TRANSLATIONS
302 entry.
303
304 In your application, you must \l QTranslator::load() the translation
305 files appropriate for the user's language, and install them using \l
306 QCoreApplication::installTranslator().
307
308 \c linguist, \c lupdate and \c lrelease are installed in the \c bin
309 subdirectory of the base directory Qt is installed into. Click Help|Manual
310 in \e{Qt Linguist} to access the user's manual; it contains a tutorial
311 to get you started.
312
313 \target qt-itself
314 Qt itself contains over 400 strings that will also need to be
315 translated into the languages that you are targeting. You will find
316 translation files for French, German and Simplified Chinese in
317 \c{$QTDIR/translations}, as well as a template for translating to
318 other languages. (This directory also contains some additional
319 unsupported translations which may be useful.)
320
321 Typically, your application's \c main() function will look like
322 this:
323
324 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 8
325
326 Note the use of QLibraryInfo::location() to locate the Qt translations.
327 Developers should request the path to the translations at run-time by
328 passing QLibraryInfo::TranslationsPath to this function instead of
329 using the \c QTDIR environment variable in their applications.
330
331 \section2 Support for Encodings
332
333 The QTextCodec class and the facilities in QTextStream make it easy to
334 support many input and output encodings for your users' data. When an
335 application starts, the locale of the machine will determine the 8-bit
336 encoding used when dealing with 8-bit data: such as for font
337 selection, text display, 8-bit text I/O, and character input.
338
339 The application may occasionally require encodings other than the
340 default local 8-bit encoding. For example, an application in a
341 Cyrillic KOI8-R locale (the de-facto standard locale in Russia) might
342 need to output Cyrillic in the ISO 8859-5 encoding. Code for this
343 would be:
344
345 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 9
346
347 For converting Unicode to local 8-bit encodings, a shortcut is
348 available: the QString::toLocal8Bit() function returns such 8-bit
349 data. Another useful shortcut is QString::toUtf8(), which returns
350 text in the 8-bit UTF-8 encoding: this perfectly preserves
351 Unicode information while looking like plain ASCII if the text is
352 wholly ASCII.
353
354 For converting the other way, there are the QString::fromUtf8() and
355 QString::fromLocal8Bit() convenience functions, or the general code,
356 demonstrated by this conversion from ISO 8859-5 Cyrillic to Unicode
357 conversion:
358
359 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 10
360
361 Ideally Unicode I/O should be used as this maximizes the portability
362 of documents between users around the world, but in reality it is
363 useful to support all the appropriate encodings that your users will
364 need to process existing documents. In general, Unicode (UTF-16 or
365 UTF-8) is best for information transferred between arbitrary people,
366 while within a language or national group, a local standard is often
367 more appropriate. The most important encoding to support is the one
368 returned by QTextCodec::codecForLocale(), as this is the one the user
369 is most likely to need for communicating with other people and
370 applications (this is the codec used by local8Bit()).
371
372 Qt supports most of the more frequently used encodings natively. For a
373 complete list of supported encodings see the \l QTextCodec
374 documentation.
375
376 In some cases and for less frequently used encodings it may be
377 necessary to write your own QTextCodec subclass. Depending on the
378 urgency, it may be useful to contact Qt's technical support team or
379 ask on the \c qt-interest mailing list to see if someone else is
380 already working on supporting the encoding.
381
382 \keyword localization
383
384 \section2 Localize
385
386 Localization is the process of adapting to local conventions, for
387 example presenting dates and times using the locally preferred
388 formats. Such localizations can be accomplished using appropriate tr()
389 strings.
390
391 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 11
392
393 In the example, for the US we would leave the translation of
394 "AMPM" as it is and thereby use the 12-hour clock branch; but in
395 Europe we would translate it as something else and this will make
396 the code use the 24-hour clock branch.
397
398 For localized numbers use the QLocale class.
399
400 Localizing images is not recommended. Choose clear icons that are
401 appropriate for all localities, rather than relying on local puns or
402 stretched metaphors. The exception is for images of left and right
403 pointing arrows which may need to be reversed for Arabic and Hebrew
404 locales.
405
406 \section1 Dynamic Translation
407
408 Some applications, such as Qt Linguist, must be able to support changes
409 to the user's language settings while they are still running. To make
410 widgets aware of changes to the installed QTranslators, reimplement the
411 widget's \l{QWidget::changeEvent()}{changeEvent()} function to check whether
412 the event is a \l{QEvent::LanguageChange}{LanguageChange} event, and update
413 the text displayed by widgets using the \l{QObject::tr()}{tr()} function
414 in the usual way. For example:
415
416 \snippet doc/src/snippets/code/doc_src_i18n.qdoc 12
417
418 All other change events should be passed on by calling the default
419 implementation of the function.
420
421 The list of installed translators might change in reaction to a
422 \l{QEvent::LocaleChange}{LocaleChange} event, or the application might
423 provide a user interface that allows the user to change the current
424 application language.
425
426 The default event handler for QWidget subclasses responds to the
427 QEvent::LanguageChange event, and will call this function when necessary;
428 other application components can also force widgets to update themselves
429 by posting the \l{QEvent::LanguageChange}{LanguageChange} event to them.
430
431 \section1 Translating Non-Qt Classes
432
433 It is sometimes necessary to provide internationalization support for
434 strings used in classes that do not inherit QObject or use the Q_OBJECT
435 macro to enable translation features. Since Qt translates strings at
436 run-time based on the class they are associated with and \c lupdate
437 looks for translatable strings in the source code, non-Qt classes must
438 use mechanisms that also provide this information.
439
440 One way to do this is to add translation support to a non-Qt class
441 using the Q_DECLARE_TR_FUNCTIONS() macro; for example:
442
443 \snippet doc/src/snippets/i18n-non-qt-class/myclass.h 0
444 \dots
445 \snippet doc/src/snippets/i18n-non-qt-class/myclass.h 1
446
447 This provides the class with \l{QObject::}{tr()} functions that can
448 be used to translate strings associated with the class, and makes it
449 possible for \c lupdate to find translatable strings in the source
450 code.
451
452 Alternatively, the QCoreApplication::translate() function can be called
453 with a specific context, and this will be recognized by \c lupdate and
454 Qt Linguist.
455
456 \section1 System Support
457
458 Some of the operating systems and windowing systems that Qt runs on
459 only have limited support for Unicode. The level of support available
460 in the underlying system has some influence on the support that Qt can
461 provide on those platforms, although in general Qt applications need
462 not be too concerned with platform-specific limitations.
463
464 \section2 Unix/X11
465
466 \list
467 \o Locale-oriented fonts and input methods. Qt hides these and
468 provides Unicode input and output.
469 \o Filesystem conventions such as
470 \l{http://www.ietf.org/rfc/rfc2279.txt}{UTF-8}
471 are under development in some Unix variants. All Qt file
472 functions allow Unicode, but convert filenames to the local
473 8-bit encoding, as this is the Unix convention (see
474 QFile::setEncodingFunction() to explore alternative
475 encodings).
476 \o File I/O defaults to the local 8-bit encoding,
477 with Unicode options in QTextStream.
478 \o Many Unix distributions contain only partial support for some locales.
479 For example, if you have a \c /usr/share/locale/ja_JP.EUC directory,
480 this does not necessarily mean you can display Japanese text; you also
481 need JIS encoded fonts (or Unicode fonts), and the
482 \c /usr/share/locale/ja_JP.EUC directory needs to be complete. For
483 best results, use complete locales from your system vendor.
484 \endlist
485
486 \section2 Windows
487
488 \list
489 \o Qt provides full Unicode support, including input methods, fonts,
490 clipboard, drag-and-drop and file names.
491 \o File I/O defaults to Latin1, with Unicode options in QTextStream.
492 Note that some Windows programs do not understand big-endian
493 Unicode text files even though that is the order prescribed by
494 the Unicode Standard in the absence of higher-level protocols.
495 \o Unlike programs written with MFC or plain winlib, Qt programs
496 are portable between Windows 98 and Windows NT.
497 \e {You do not need different binaries to support Unicode.}
498 \endlist
499
500 \section2 Mac OS X
501
502 For details on Mac-specific translation, refer to the Qt/Mac Specific Issues
503 document \l{Qt for Mac OS X - Specific Issues#Translating the Application Menu and Native Dialogs}{here}.
504
505 \section1 Relevant Qt Classes
506
507 These classes are relevant to internationalizing Qt applications.
508*/
Note: See TracBrowser for help on using the repository browser.