/****************************************************************************
**
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.  For licensing terms and
** conditions see http://qt.digia.com/licensing.  For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file.  Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: http://www.gnu.org/copyleft/fdl.html.
** $QT_END_LICENSE$
**
****************************************************************************/

/*!
    \page qtlinguist-index.html
    \title Qt Linguist Manual
    \ingroup qttools
    \ingroup internationalization

    \startpage {index.html}{Qt Reference Documentation}
    \nextpage Qt Linguist Manual: Release Manager

    \keyword Qt Linguist

    Qt provides excellent support for translating Qt C++ and Qt Quick
    applications into local languages. Release managers, translators, and
    developers can use Qt tools to accomplish their tasks.

    \l{linguist-manager.html}{Release managers} bear the overall responsibility
    for the release of the application. Typically, they coordinate the work of
    developers and translators. They can use the \e lupdate tool to synchronize
    source code and translations and the \e lrelease tool to create
    run-time translation files for use by the released application.

    \l{linguist-translators.html}{Translators} can use the \QL tool to
    translate text in applications.
    No computer knowledge beyond the ability to start a program and
    use a text editor or word processor is required.

    \l{linguist-programmers.html}{Developers} must create Qt applications that are
    able to use translated text. They should also help translators identify
    the context in which phrases appear. Developers can use tutorials to learn
    about their tasks.

    \section1 Overview of the Translation Process

    Most of the text that must be translated in an application
    consists of either single words or short phrases. These typically
    appear as window titles, menu items, pop-up help text (balloon help),
    and labels to buttons, check boxes and radio buttons.

    The phrases are entered into the source code by the developer in
    their native language using a simple but special syntax to identify
    that the phrases require translation. The Qt tools provide context
    information for each of the phrases to help the translator, and the
    developer is able to add additional context information to phrases
    when necessary.

    The release manager generates a set of translation
    files that are produced from the source files and passes these to the
    translator. The translator opens the translation files using \QL,
    enters their translations and saves the results back into
    the translation files, which they pass back to the release manager.
    The release manager then generates fast compact versions of these
    translation files ready for use by the application.

    The tools are
    designed to be used in repeated cycles as applications change and
    evolve, preserving existing translations and making it easy to
    identify which new translations are required. \QL also
    provides a phrase book facility to help ensure consistent
    translations across multiple applications and projects.

    Translators and developers must address a number of issues because
    of the subtleties and complexities of human language:

    \list

    \li A single phrase may need to be translated into several
    different forms depending on context, e.g. \e open in English
    might become \e{\ouml}\e{ffnen}, "open file", or \e aufbauen,
    "open internet connection", in German.

    \li Keyboard accelerators may need to be changed but without
    introducing conflicts, e.g. "\&Quit" in English becomes "Avslutt"
    in Norwegian which doesn't contain a "Q". We cannot use a letter
    that is already in use - unless we change several accelerators.

    \li Phrases that contain variables, for example, "The 25 files
    selected will take 63 seconds to process", where the two numbers
    are inserted programmatically at run-time may need to be reworded
    because in a different language the word order and therefore the
    placement of the variables may have to change.

    \endlist

    The Qt translation tools provide clear and simple solutions to these
    issues.

    \QL and lupdate are able to import and export XML Localization
    Interchange File Format (XLIFF) files, making it possible to take
    advantage of tools and translation services that work with this
    format. For more information on working with these files, see
    \l{Qt Linguist Manual: Translators}{Translators}.

    \section1 Table of Contents

    \list
    \li \l{Qt Linguist Manual: Release Manager}{Release Manager}
    \li \l{Qt Linguist Manual: Translators}{Translators}
    \li \l{Qt Linguist Manual: Developers}{Developers}
    \li \l{Qt Linguist Manual: TS File Format}{TS File Format}
    \li \l{Qt Linguist Manual: Text ID Based Translations}{Text ID Based Translations}
    \endlist

*/

/*!
    \page linguist-manager.html
    \title Qt Linguist Manual: Release Manager
    \ingroup internationalization

    \contentspage {Qt Linguist Manual}{Contents}
    \previouspage Qt Linguist Manual
    \nextpage Qt Linguist Manual: Translators

    Two tools are provided for the release manager, lupdate and
    lrelease. These tools can process \l qmake project files, or operate
    directly on the file system.

    \section1 Qt Project Files

    The easiest method to use lupdate and lrelease is by specifying
    a \c .pro Qt project file. There must be an entry in the \c TRANSLATIONS
    section of the project file for each language that is additional to
    the native language. A typical entry looks like this:

    \snippet arrowpad/arrowpad.pro 1

    Using a locale within the translation file name is useful for
    determining which language to load at runtime. This is explained
    in the \l{linguist-programmers.html} {Developers} chapter.

    An example of a complete \c .pro file with four translation source
    files:

    \snippet doc_src_linguist-manual.pro 0
    \snippet doc_src_linguist-manual.pro 1

    QTextCodec::setCodecForTr() makes it possible to choose a 8-bit
    encoding for literal strings that appear within \c tr() calls.
    This is useful for applications whose source language is, for
    example, Chinese or Japanese. If no encoding is set, \c tr() uses
    Latin1.

    If you do use the QTextCodec::codecForTr() mechanism in your
    application, \QL needs you to set the \c CODECFORTR
    entry in the \c .pro file as well. For example:

    \snippet doc_src_linguist-manual.pro 1

    Also, if your compiler uses a different encoding for its runtime
    system as for its source code and you want to use  non-ASCII
    characters in string literals, you will need to set the \c
    CODECFORSRC. For example:

    \snippet doc_src_linguist-manual.pro 2

    Microsoft Visual Studio 2005 .NET appears to be the only compiler
    for which this is necessary. However, if you want to write
    portable code, we recommend that you avoid non-ASCII characters
    in your source files. You can still specify non-ASCII characters
    portably using escape sequences, for example:

    \snippet doc_src_linguist-manual.cpp 3

    \section1 Using lupdate

    Usage: \c {lupdate myproject.pro}

    The lupdate command line tool finds the translatable
    strings in the specified source, header and \e {Qt Designer}
    interface files, and produces or updates \c .ts translation
    files. The files to process and the files to update can be set at
    the command line, or provided in a \c .pro file specified as an
    command line argument. The produced translation files are given to
    the translator who uses \QL to read the files and insert the
    translations.

    Companies that have their own translators in-house may find it
    useful to run lupdate regularly, perhaps monthly, as the
    application develops. This will lead to a fairly low volume of
    translation work spread evenly over the life of the project and
    will allow the translators to support a number of projects
    simultaneously.

    Companies that hire in translators as required may prefer to run
    lupdate only a few times during the application life cycle. The
    first time might be just before the first test phase. This will
    provide the translator with a substantial single block of work and
    any bugs that the translator detects may easily be included with
    those found during the initial test phase. The second and any
    subsequent lupdate runs would probably take place during the
    final beta phase.

    The TS file format is a simple human-readable XML format that
    can be used with version control systems if required. \c lupdate
    can also process Localization Interchange File Format (XLIFF)
    format files; files in this format typically have file names that
    end with the \c .xlf suffix.

    \note The minimum supported version for XLIFF format files is
    1.1. XLIFF 1.0 version files are not supported.

    Pass the \c -help option to \c lupdate to obtain the list of
    supported options:

    \snippet doc_src_linguist-manual.qdoc 4

    \QL is also able to import and export XLIFF files. See the
    \l{Qt Linguist Manual: Translators}{Translators} section for more
    information.

    \section1 Using lrelease

    Usage: \c {lrelease myproject.pro}

    The lrelease command line tool produces QM files out
    of TS files. The QM file format is a compact binary format
    that is used by the localized application. It provides extremely
    fast lookups for translations. The TS files lrelease
    processes can be specified at the command line, or given
    indirectly by a Qt \c .pro project file.

    This tool is run whenever a release of the application is to be
    made, from initial test version through to final release
    version. If the QM files are not created, e.g. because an
    alpha release is required before any translation has been
    undertaken, the application will run perfectly well using the text
    the developers placed in the source files. Once the QM files
    are available the application will detect them and use them
    automatically.

    \note The lrelease tool only incorporates translations that are
    marked as "finished". Otherwise the original text is used
    instead.

    Pass the \c -help option to \c lrelease to obtain the list of
    supported options:

    \snippet doc_src_linguist-manual.qdoc 5

    \section1 Missing Translations

    Both lupdate and lrelease may be used with TS
    translation source files which are incomplete. Missing
    translations will be replaced with the native language phrases at
    runtime.
*/

/*!
    \page linguist-translators.html
    \title Qt Linguist Manual: Translators
    \ingroup internationalization

    \contentspage {Qt Linguist Manual}{Contents}
    \previouspage Qt Linguist Manual: Release Manager
    \nextpage Qt Linguist Manual: Developers

    \QL is a tool for adding translations to Qt applications. Run \QL
    from the taskbar menu, or by double clicking the desktop icon, or
    by entering the command \c {linguist} at the command line. Once
    \QL has started, choose \menu{File|Open} from the \l{menubar}
    {menu bar} and select a translation source (TS file) to
    load. If you do not have a TS file, see \l {Qt Linguist
    Manual: Release Manager}{Release Manager} to learn how to
    generate one.

    The \QL main window is divided into several, dockable subwindows
    arranged around a central \l{The Translation Area} {translation
    area}. The \l{Context Window} {context list} is normally shown
    on the left, and the \l{Sources and Forms Window} {source code},
    \l{Strings Window} {string list}, and either the \l{Phrases and
    Guesses Window} {phrases and guesses}, or the \l{Warnings Window}
    {warnings} are shown above and below the \l{The Translation Area}
    {translations area}.

    With a translation file loaded, select a context from the
    \l{Context Window} {context list} on the left. Selecting a context
    loads the translatable strings found in that context into the
    \l{Strings Window} {string list}. Selecting one of the strings
    copies that string as the \key{Source text} in the \l{The
    Translation Area} {translation area}. Click in the text entry
    widget below the copied string and type your translation for that
    string. To accept the translation, either press the green
    \key{tick mark} button on the toolbar, or click the icon to the
    left of the selected source string in the string list. Repeat this
    process until all strings in the string list are marked with
    \inlineimage linguist-check-on.png
    or
    \inlineimage linguist-check-warning.png
    . Then select the next context and continue.

    Translation options are shown in the \l{Phrases and Guesses
    Window} {phrases and guesses window}. If the phrases and guesses
    window is not visible, click the \key{Phrases and guesses} tab at
    the bottom of the main window. The phrases and guesses window
    shows possible translations for the current string. These
    translation "guesses" have been read from phrase books
    (\menu{Phrases|Open Phrase Book...}).  The current strings
    translation is also shown here. To select a guess, double
    click it in the phrases and guesses window or use the keyboard
    shortcut shown to the right of the guess.

    \QL can automatically check whether your translation strings pass
    a list of \l{Validation Tests} {validation tests}. Validation test
    failures are shown in the \l{Warnings Window} {warnings window}.
    If the warnings window is not visible, click the \key{Warnings}
    tab at the bottom of the main window.

    Finally, if the source code for the contexts is accessible, the
    \l{Sources and Forms Window} {source code window} shows the
    context where the current string is used. If the source code
    window is not visible, click the \key{Sources and Forms} tab at
    the bottom of the main window.

    At the end of the session choose \menu{File|Save} from the menu
    bar and then \menu{File|Exit} to quit.

    \section1 The Qt Linguist Window

    \image linguist-linguist.png "Linguist UI Snapshot"

    This \QL main window is divided into dockable subwindows arranged
    around a central \l{The Translation Area} {translation area}. The
    subwindows are: \l{Context Window} {Context}, \l{Sources and Forms
    Window} {Sources and Forms}, \l{Strings Window} {Strings},
    \l{Phrases and Guesses Window} {Phrases and guesses}, and
    \l{Warnings Window} {Warnings} (hidden in the UI snapshot). The
    translation area is always visible, but the dockable subwindows
    can be activated or deactivated in the \menu{View|Views} menu, and
    dragged around by their title bars and dropped in the translation
    area or even outside the main window.

    \section2 Context Window

    The context window normally appears on the left side of the main
    window. It lists the contexts in which strings to be translated
    appear. The column labeled \e{Context} lists the context names in
    alphabetical order. Each context is the name of a subclass of
    QObject. There can also be a context for QObject itself, which
    contains strings passed to the static function QObject::tr().
    There can also be an \e{<unnamed context>}, which contains strings
    that aren't in a subclass of QObject.

    To the left of the \e{Context} column is a column labeled
    \inlineimage linguist-check-obsolete.png
    . This column uses the following list of icons to summarize the
    current translation state for each context:

    \list

    \li \inlineimage linguist-check-on.png
    All strings in the context have been translated, and all the
    translations passed the \l{Validation Tests} {validation tests}.

    \li \inlineimage linguist-check-warning.png
    All strings in the context have been translated or marked as
    translated, but at least one translation failed the \l{Validation
    Tests} {validation tests}.

    \li \inlineimage linguist-check-off.png
    At least one string in the context has not been translated or is
    not marked as translated.

    \li \inlineimage linguist-check-obsolete.png
    None of the translated strings still appears in the context. This
    usually means the context itself no longer exists in the
    application.

    \endlist

    To the right of the \e{Context} column is the \e{Items} column.
    Each entry in the \e{Items} column is a pair of numbers separated
    by a slash ("/"). The number to the right of the slash is the
    number of translatable strings in the context. The number to the
    left of the slash is the number of those strings that currently
    have translations. i.e., if the numbers are equal, all the
    translatable strings in the context have translations.

    In the UI snapshot above, the \b{MessageEditor} context is
    selected.  Its \e{Items} entry shows \b{18/18}, which means it
    has 18 translatable strings and all 18 strings currently have
    translations. However, the context has been marked with the
    \inlineimage linguist-check-warning.png
    icon, which means that at least one of the current translations
    failed a \l{Validation Tests} {validation test}. In the
    \l{Strings Window} {strings window} to the right, we see that one
    of the strings is indeed marked with the
    \inlineimage linguist-check-warning.png
    icon.

    The context window is a dockable window. It can be dragged to
    another position in the main window, or dragged out of the main
    window to be a separate window. If you move the context window,
    \QL remembers the new position and puts the context window there
    whenever you start the program. If the context window has been
    closed, it can be restored by pressing \key{F6}.

    \section2 Strings Window

    The strings window normally appears on the right in the main
    window, above the \l{The Translation Area} {translation area}. Its
    \e{Source text} column lists all the translatable strings found in
    the current context. Selecting a string makes that string the
    current string in the \l{The Translation Area} {translation area}.

    To the left of the \e{Source text} column is a column labeled
    \inlineimage linguist-check-obsolete.png
    . This column is similar to the one in the \l{Context Window}
    {context window}, but here you can click on the icon to change the
    translation acceptance state for each string in the list. A tick
    mark, green or yellow, means the string has been translated and
    the user has accepted the translation. A question mark means
    either that the user has not accepted the string's translation or
    that the string doesn't have a translation. The table below
    explains the acceptance states and their icons:

    \target String Translation States

    \table
    \header
    \li State
    \li Icon
    \li Description

    \row
    \li Accepted/Correct
    \li \inlineimage linguist-check-on.png
    \li The source string has a translation (possibly empty); the user
    has accepted the translation, and the translation passes all the
    \l{Validation Tests} {validation tests}. If the translation is
    empty, the user has chosen to leave it empty. Click the icon to
    revoke acceptance of the translation and decrement the number of
    accepted translations in the \e{Items} column of the \l{Context
    Window} {context list} by 1. The state is reset to
    \inlineimage linguist-check-off.png
    if the string has a translation, or to
    \inlineimage linguist-check-empty.png
    if the string's translation is empty. If \c{lupdate} changes the
    contents of a string, its acceptance state is automatically reset
    to \inlineimage linguist-check-off.png
    .

    \row
    \li Accepted/Warnings
    \li \inlineimage linguist-check-warning.png
    \li The user has accepted the translation, but the translation does
    not pass all the \l{Validation Tests} {validation tests}. The
    validation test failures are shown in the \l{Warnings Window}
    {warnings window}. Click the icon to revoke acceptance of the
    translation. The state is reset to \inlineimage linguist-danger.png
    , and the number of accepted translations in the \e{Items} column
    of the \l{Context Window} {context list} is decremented by 1.

    \row
    \li Not Accepted
    \li \inlineimage linguist-check-off.png
    \li The string has a non-empty translation that passes all the
    \l{Validation Tests} {validation tests}, but the user has not yet
    accepted the translation. Click the icon or press \key{Ctrl+Enter}
    to accept the translation. The state is reset to
    \inlineimage linguist-check-on.png
    , and the number of accepted translations in the \e{Items} column
    of the \l{Context Window} {context list} is incremented by 1.

    \row
    \li No Translation
    \li \inlineimage linguist-check-empty.png
    \li The string does not have a translation. Click the icon to
    accept the empty translation anyway. The state is reset to
    \inlineimage linguist-check-on.png
    , and the number of accepted translations in the \e{Items} column
    of the \l{Context Window} {context list} is incremented by 1.

    \row
    \li Validation Failures
    \li \inlineimage linguist-danger.png
    \li The string has a translation, but the translation does not
    pass all the \l{Validation Tests} {validation tests}. Validation
    test failures are shown in the \l{Warnings Window} {warnings}
    window. Click on the icon or press \key{Ctrl+Return} to accept
    the translation even with validation failures. The state is
    reset to  \inlineimage linguist-check-warning.png
    . We recommended editing the translation to fix the causes of
    the validation failures. The state will reset automatically to
    \inlineimage linguist-check-off.png
    , when all the failures have been fixed.

    \row
    \li Obsolete
    \li \inlineimage linguist-check-obsolete.png
    \li The string is obsolete. It is no longer used in the context.
    See the \l{Qt Linguist Manual: Release Manager} {Release Manager}
    for instructions on how to remove obsolete messages from the file.

    \endtable

    The string list is a dockable subwindow. If it has been closed,
    restored it by pressing \key{F7}.

    \section2 The Translation Area

    The translation area is in the middle of the main window, to the
    right of the \l{Context Window} {context list}. It doesn't have a
    title bar, so you can't drag it around. Instead, you drag and drop
    the other subwindows to arrange them around the translation area.
    The string currently selected in the \l{Strings Window} {string
    list} appears at the top of the translation area, under the label
    \menu{Source text}. Note that all blanks in the source text have
    been replaced by "." so the translator can see the spacing
    required within the text.

    If the developer provides a \l{QObject::tr()} {disambiguating
    comment}, it will appear below the source text area, under the
    label \menu{Developer comments}.

    Below the source text and optional developer comments are two text
    entry widgets for the translator, one for entering the translation
    of the current string, and one for the translator to enter an
    optional comment to be read by other translators.

    When \l{Translating Multiple Languages Simultaneously} {multiple
    languages} are being translated, this sequence of fields is
    repeated for each language. See also \l {Changing the Target
    Locale}.

    \section2 Phrases and Guesses Window

    If the current string in the \l{Strings Window} {string list}
    appears in one or more of the \l{Phrase Books} {phrase books}
    that have been loaded, the current string and its phrase book
    translation(s) will be listed in this window. If the current
    string is the same as, or similar to, another string that has
    already been translated, that other string and its translation
    will also be listed in this window.

    To use a translation from the Phrases and Guesses Window, you can
    double click the translation, and it will be copied into the
    translation area, or you can use the translation's \e{Guess}
    hotkey on the right. You can also press \key{F10} to move the
    focus to the Phrases and Guesses Window, then use the up and down
    arrow keys to find the desired translation, and then press
    \key{Enter} to copy it to the translation area.  If you decide
    that you don't want to copy a phrase after all, press \key{Esc} to
    return the focus to the translation area.

    The Phrases and Guesses Window is a dockable window. If it has
    been closed, it can be made visible by pressing the \e{Phrases and
    guesses} tab at the bottom of the window, or by pressing
    \key{F10}.

    \section2 Sources and Forms Window

    If the source files containing the translatable strings are
    available to \QL, this window shows the source context of the
    current string in the \l{Strings Window} {string list}. The source
    code line containing the current string should be shown and
    highlighted. If the file containing the source string is not
    found, the expected absolute file path is shown.

    If the source context shows the wrong source line, it probably
    means the translation file is out of sync with the source files.
    To re-sync the translation file with the source files, see
    \l{Using lupdate}.

    The Sources and Forms window is a dockable window. If it has been
    closed, it can be made visible again by pressing the \e{Sources
    and Forms} tab at the bottom of the window, or by pressing
    \key{F9}.

    \section2 Warnings Window

    If the translation you enter for the current string fails any of
    the active \l{Validation Tests} {validation tests}, the failures
    are listed in the warnings window. The first of these failure
    messages is also shown in the status bar at the bottom of the main
    window. Note that only \e{active} validation tests are
    reported. To see which validation tests are currently active, or
    to activate or deactivate tests, use the \menu{Validation} menu
    from the \l{menubar}{menu bar}.

    The Warnings window is a dockable window. If it has been closed,
    it can be made visible by pressing the \e{Warnings} tab at the
    bottom of the window, or by pressing \key{F8}.

    \target multiple languages
    \section2 Translating Multiple Languages Simultaneously

    Qt Linguist can now load and edit multiple translation files
    simultaneously. One use for this is the case where you know two
    languages better than you know English (Polish and Japanese, say),
    and you are given an application's Polish translation file and
    asked to update the application's Japanese translation file. You
    are more comfortable translating Polish to Japanese than you are
    translating English to Japanese.

    Below is the UI snapshot shown earlier, but this time with both
    \e{Polish} and \e{Japanese} translation files loaded.

    \image linguist-linguist_2.png

    The first thing to notice is that the \l{The Translation Area}
    {translation area} has text editing areas for both Polish and
    Japanese, and these are color-coded for easier separation.
    Second, the \l{Context Window} and the \l{Strings Window} both
    have two columns labeled \inlineimage linguist-check-obsolete.png
    instead of one, and although it may be hard to tell, these columns
    are also color-coded with the same colors. The left-most column in
    either case applies to the top-most language area (Polish above)
    in the \l{The Translation Area} {translation area}, and the
    right-most column applies to the bottom language area.

    The \e{Items} column in the \l{Context Window} combines the values
    for both languages. The best way to see this is to look at the
    value for the \b{MessageEditor} context, which is the one
    selected in the snapshot shown above. Recall that in the first UI
    snapshot (Polish only), the numbers for this context were
    \e{18/18}, meaning 18 translatable strings had been found in the
    context, and all 18 strings had accepted translations.  In the UI
    snapshot above, the numbers for the \b{MessageEditor} context
    are now \e{1/18}, meaning that both languages have 18 translatable
    strings for that context, but for Japanese, only 1 of the 18
    strings has an accepted translation. The
    \inlineimage linguist-check-off.png
    icon in the Japanese column means that at least one string in the
    context doesn't have an accepted Japanese translation yet. In fact,
    17 of the 18 strings don't have accepted Japanese translations yet.
    We will see \e{18/18} in the \e{Items} column when all 18 strings
    have accepted translations for all the loaded translation files,
    e.g., both Polish and Japanese in the snapshot.

    \section1 Common Tasks

    \section2 Leaving a Translation for Later

    If you wish to leave a translation press \key{Ctrl+L} (Next
    Unfinished) to move to the next unfinished translation. To move to
    the next translation (whether finished or unfinished) press
    \key{Shift+Ctrl+L}. You can also navigate using the Translation
    menu. If you want to go to a different context entirely, click the
    context you want to work on in the Context list, then click the
    source text in the \l{Strings Window} {string list}.

    \section2 Phrases That Require Multiple Translations Depending on Context

    The same phrase may occur in two or more contexts without conflict. Once
    a phrase has been translated in one context, \QL notes
    that the translation has been made and when the translator reaches a
    later occurrence of the same phrase \QL will provide
    the previous translation as a possible translation candidate in the
    \l{Phrases and Guesses Window}.

    If a phrase occurs more than once in a particular context it will
    only be shown once in \QL's \l{Context Window} {context list} and
    the translation will be applied to every occurrence within the
    context.  If the same phrase needs to be translated differently
    within the same context the developer must provide a
    distinguishing comment for each of the phrases concerned. If such
    comments are used the duplicate phrases will appear in the
    \l{Context Window} {context list}. The developer's comments will
    appear in the \l{The Translation Area} {translation area} on a
    light blue background.

    \section2 Changing Keyboard Accelerators

    A keyboard accelerator is a key combination that, when pressed,
    causes an application to perform an action. There are two kinds of
    keyboard accelerators: Alt key and Ctrl key accelerators.

    \section3 Alt Key Accelerators

    Alt key accelerators are used in menu selection and on buttons.
    The underlined character in a menu item or button label signifies
    that pressing the Alt key with the underlined character will
    perform the same action as clicking the menu item or pressing the
    button.  For example, most applications have a \e{File} menu with
    the "F" in the word "File" underlined. In these applications the
    \e{File} menu can be invoked either by clicking the word "File" on
    the menu bar or by pressing \e{Alt+F}. To identify an accelerator
    key in the translation text ("File") precede it with an ampersand,
    e.g. \e{\&File}. If a string to be translated has an ampersand in
    it, then the translation for that string should also have an
    ampersand in it, preferably in front of the same character.

    The meaning of an Alt key accelerator can be determined from the
    phrase in which the ampersand is embedded. The translator can
    change the character part of the Alt key accelerator, if the
    translated phrase does not contain the same character or if that
    character has already been used in the translation of some other
    Alt key accelerator. Conflicts with other Alt key accelerators
    must be avoided within a context.  Note that some Alt key
    accelerators, usually those on the menu bar, may apply in other
    contexts.

    \section3 Ctrl Key Accelerators

    Ctrl key accelerators can exist independently of any visual
    control. They are often used to invoke actions in menus that would
    otherwise require multiple keystrokes or mouse clicks. They may
    also be used to perform actions that do not appear in any menu or
    on any button. For example, most applications that have a \e{File}
    menu have a \e{New} submenu item in the \e{File} menu. The \e{New}
    item might appear as "\underline{N}ew Ctrl+N" in the \e{File}
    menu, meaning the \e{New} menu can be invoked by simply pressing
    \key{Ctrl+N}, instead of either clicking \e{File} with the mouse
    and then clicking \e{New} with the mouse, or by entering \e{Alt+F}
    and \e{N}.

    Each Ctrl key accelerator is shown in the \l{Strings Window}
    {string list} as a separate string, e.g. \key{Ctrl+Enter}. Since
    the string doesn't have a context to give it meaning, e.g. like
    the context of the phrase in which an Alt key accelerator appears,
    the translator must rely on the UI developer to include a
    \l{QObject::tr()} {disambiguation comment} to explain the action
    the Ctrl key accelerator is meant to perform. This disambiguating
    comment (if provided by the developer) will appear under
    \e{Developer comments} in the \l{The Translation Area}
    {translation area} under the \e{Source text} area.

    Ideally Ctrl key accelerators are translated simply by copying
    them directly using \e {Copy from source text} in the
    \menu{Translation} menu. However, in some cases the character will
    not make sense in the target language, and it must be
    changed. Whichever character (alpha or digit) is chosen, the
    translation must be in the form "Ctrl+" followed by the upper case
    character.  \e{Qt} will automatically display the correct name at
    run-time. As with Alt key accelerators, if the translator changes
    the character, the new character must not conflict with any other
    Ctrl key accelerator.

    \warning Do not translate the "Alt", "Ctrl" or "Shift" parts of
    the accelerators. \e{Qt} relies on these strings being there. For
    supported languages, \e {Qt} automatically translates these
    strings.

    \section2 Handling Numbered Arguments and Plurals

    Some phrases contain numbered arguments. A numbered argument is a
    placeholder that will be replaced with text at run-time. A numbered
    argument appears in a source string as a percent sign followed by
    a digit. Consider an example: \c{After processing file %1, file %2
    is next in line}. In this string to be translated, \c{%1} and
    \c{%2} are numbered arguments. At run-time, \c{%1} and \c{%2} will
    be replaced with the first and next file names respectively. The
    same numbered arguments must appear in the translation, but not
    necessarily in the same order. A German translation of the string
    might reverse the phrases, e.g. \c{Datei %2 wird bearbeitet, wenn
    Datei %1 fertig ist}. Both numbered arguments appear in the
    translation, but in the reverse order. \c{%i} will always be
    replaced by the same text in the translation strings, regardless
    of where argument \e{i} appears in the argument sequence in the
    source string.

    The use of numbered arguments is often accompanied by the use of
    plurals in the source text. In many languages, the form of the
    text will depend on the value shown, and more than one translation
    is required. If the developers have marked up the source text in
    correct way, fields for each of the possible plural forms will be
    available in the translation area. (The
    \l{Writing Source Code for Translation#Handling Plurals}{Writing Source Code for Translation}
    document contains details about this feature for developers.)

    \section2 Reusing Translations

    If the translated text is similar to the source text, choose the
    \e {Copy from source text} entry in the \menu Translation menu (press
    \key{Ctrl+B}) which will copy the source text into the
    \l{The Translation Area} {translation area}.

    \QL automatically lists possible translations from any open
    \l{Phrase Books} {phrase books} in the \l{Phrases and Guesses
    Window}, as well as similar or identical phrases that have already
    been translated.

    \section2 Changing the Target Locale

    \QL displays the target language in the \l{The Translation Area}
    {translation area}, and adapts the number of input fields for
    plural forms accordingly. If not explicitly set, \QL guesses the
    target language and country by evaluating the translation source
    file name. For example, \c app_de.ts sets the target language to German,
    and \c app_de_ch.ts sets the target language to German and the
    target country to Switzerland (this also helps loading
    translations for the current locale automatically; see
    \l{linguist-programmers.html}{Developers} for details).
    If your files do not follow this convention, you can also set the
    locale information explicitly using \e {Translation File Settings}
    in the \menu Edit menu.

    \image linguist-translationfilesettings.png

    \section1 Phrase Books

    A \QL phrase book is a set of source phrases, target
    (translated) phrases, and optional definitions. Typically one phrase book
    will be created per language and family of applications. Phrase books
    are used to provide a common set of translations to help ensure consistency.
    They can also be used to avoid duplication of effort since the translations
    for a family of applications can be produced once in the phrase book.
    If the translator reaches an non-translated phrase that is the same as a
    source phrase in a phrase book, \QL will show the
    phrase book entry in the \l {Phrases and Guesses Window}.

    \section2 Creating and Editing Phrase Books

    \image linguist-phrasebookdialog.png

    Before a phrase book can be edited it must be created or, if it already
    exists, opened. Create a new phrase book by selecting
    \menu{Phrase|New Phrase Book} from the menu bar. You must enter a
    filename and may change the location of the file if you wish. A newly
    created phrase book is automatically opened. Open an existing phrase
    book by choosing \menu{Phrase|Open Phrase Book} from the menu bar.

    The phrase book contents can be displayed and changed by selecting
    \menu{Phrase|Edit Phrase Book}, and then activating the phrase book you
    want to work on. This will pop up the Phrase Book Dialog as shown
    in the image above. To add a new phrase click the \gui{New Phrase}
    button (or press Alt+N) and type in a new source phrase. Press Tab and
    type in the translation. Optionally press Tab and enter a definition \mdash
    this is useful to distinguish different translations of the same source
    phrase. This process may be repeated as often as necessary. You can delete
    a phrase by selecting it in the phrases list and clicking
    Remove Phrase. Click the \gui Close button (press Esc) once you've finished
    adding (and removing) phrases.

    \section2 Shortcuts for Editing Phrase Books

    You can also create a new phrase book entry directly out of the translation you
    are working on: Clicking \menu{Phrases|Add to Phrase Book} or pressing
    \key{Ctrl+T} will add the source text and the content of the first translation
    field to the current phrase book. If multiple phrase books are loaded,
    you have to specify the phrase book to add the entry to in a dialogue.
    If you detect an error in a phrase book entry that is shown in the
    \l{Phrases and Guesses Window}, you can also edit it in place by right
    clicking on the entry, and selecting \menu{Edit}. After fixing the error
    press \key{Return} to leave the editing mode.

    \section2 Batch Translation

    \image linguist-batchtranslation.png

    Use the batch translation feature of \QL to automatically
    translate source texts that are also in a phrase book. Selecting
    \menu{Tools|Batch Translation} will show you the batch translation dialog,
    which let you configure which phrase books to use in what order during the
    batch translation process. Furthermore you can set whether only entries
    with no present translation should be considered, and whether batch translated
    entries should be set to finished (see also \l {String Translation States}).

    \section1 Validation Tests

    \QL provides four kinds of validation tests for translations.

    \list 1
    \li \e {Accelerator validation} detects translated phrases
    that do not have an ampersand when the source phrase does and vice
    versa.
    \li \e {Punctuation validation} detects differences in the
    terminating punctuation between source and translated phrases when this
    may be significant, e.g. warns if the source phrase ends with an
    ellipsis, exclamation mark or question mark, and the translated phrase
    doesn't and vice versa.
    \li \e {Phrases validation} detects source phrases that are
    also in the phrase book but whose translation differs from that given in
    the phrase book.
    \li \e {Place marker validation} detects whether the same variables
    (like \c %1, \c %2) are used both in the source text and in the translation.
    \endlist

    Validation may be switched on or off from the menu bar's
    Validation item or using the toolbar buttons. Unfinished phrases
    that fail validation are marked with an exclamation mark in the
    source text pane. Finished phrases will get a yellow tick
    instead. If you switch validation off and then switch it on later,
    \QL will recheck all phrases and mark any that fail
    validation. See also \l{String Translation States}.

    \section1 Form Preview

    \image linguist-previewtool.png

    Forms created by \e{Qt Designer} are stored in special UI files.
    \QL can make use of these UI files to show the translations
    done so far on the form itself. This of course requires access to the UI
    files during the translation process. Activate
    \menu{Tools|Open/Refresh Form Preview} to open the window shown above.
    The list of UI files \QL has detected are displayed in the Forms
    List on the left hand. If the path to the files has changed, you can load
    the files manually via \menu{File|Open Form...}. Double-click on an entry
    in the Forms List to display the Form File. Select \e{<No Translation>} from
    the toolbar to display the non-translated form.

    \section1 Qt Linguist Reference


    \section2 File Types

    \QL makes use of four kinds of files:

    \list
    \li TS \e {translation source files} \BR are human-readable XML
    files containing source phrases and their translations. These files are
    usually created and updated by lupdate
    and are specific to an application.
    \li \c .xlf \e {XLIFF files} \BR are human-readable XML files that adhere
    to the international XML Localization Interchange File Format. \QL
    can be used to edit XLIFF files generated by other programs. However, for
    standard Qt projects, only the TS file format is used.  \note The minimum
    supported version for XLIFF format files is 1.1. XLIFF 1.0 version files
    are not supported.
    \li QM \e {Qt message files} \BR are binary files that contain
    translations used by an application at run-time. These files are
    generated by lrelease, but can also
    be generated by \QL.
    \li \c .qph \e {Qt phrase book files} \BR are human-readable XML
    files containing standard phrases and their translations. These files
    are created and updated by \QL and may be used by any
    number of projects and applications.
    \endlist

    \target menubar
    \section2 The Menu Bar

    \image linguist-menubar.png

    \list
    \li \gui {File}
        \list
        \li \gui {Open... Ctrl+O} \BR pops up an open file dialog from which a
        translation source \c .ts or \c .xlf file can be chosen.
        \li \gui {Recently opened files} \BR shows the TS files that
        have been opened recently, click one to open it.
        \li \gui {Save Ctrl+S} \BR saves the current translation source file.
        \li \gui {Save As...} \BR pops up a save as file dialog so that the
        current translation source file may be saved with a different
        name, format and/or put in a different location.
        \li \gui {Release} \BR create a Qt message QM file with the same base
        name as the current translation source file. The release manager's
        command line tool lrelease
        performs the same function on \e all of an application's translation
        source files.
        \li \gui {Release As...} \BR pops up a save as file dialog. The
        filename entered will be a Qt message QM file of the translation
        based on the current translation source file. The release manager's
        command line tool lrelease
        performs the same function on \e all of an application's translation
        source files.
        \li \gui {Print... Ctrl+P} \BR pops up a print dialog. If you click
        OK the translation source and the translations will be printed.
        \li \gui {Exit Ctrl+Q} \BR closes \QL.
        \endlist

    \li \gui {Edit}
        \list
        \li \gui {Undo Ctrl+Z} \BR undoes the last editing action in the
        translation pane.
        \li \gui {Redo Ctrl+Y} \BR redoes the last editing action in the
        translation pane.
        \li \gui {Cut Ctrl+X} \BR deletes any highlighted text in the
        translation pane and saves a copy to the clipboard.
        \li \gui {Copy Ctrl+C} \BR copies the highlighted text in the
        translation pane to the clipboard.
        \li \gui {Paste Ctrl+V} \BR pastes the clipboard text into the
        translation pane.
    \omit
        \li \gui {Delete} \BR deletes the highlighted text in the
        translation pane.
    \endomit
        \li \gui {Select All Ctrl+A} \BR selects all the text in the
        translation pane ready for copying or deleting.
        \li \gui {Find... Ctrl+F} \BR pops up the
        Find dialog. When the dialog pops up
        enter the text to be found and click the \gui {Find Next} button.
        Source phrases, translations and comments may be searched.
        \li \gui {Find Next F3} \BR finds the next occurrence of the text that
        was last entered in the Find dialog.
        \li \gui {Search and Translate...} \BR pops up the Search and
        Replace Dialog. Use this dialog to translate the same text in multiple items.
        \li \gui {Translation File Settings...} \BR let you configure the target
        language and the country/region of a translation source file.
        \endlist

    \li \gui {Translation}
        \list
        \li \gui {Prev Unfinished Ctrl+K} \BR moves to the nearest previous
        unfinished source phrase (unfinished means non-translated or
        translated but failed validation).
        \li \gui {Next Unfinished Ctrl+L} \BR moves to the next unfinished source
        phrase.
        \li \gui {Prev Shift+Ctrl+K} \BR moves to the previous source phrase.
        \li \gui {Next Shift+Ctrl+L} \BR moves to the next source phrase.
        \li \gui {Done \& Next Ctrl+Enter} \BR mark this phrase as 'done'
        (translated) and move to the next unfinished source phrase.
        \li \gui {Copy from source text Ctrl+B} \BR copies the source text into
        the translation.
        \endlist

    \li \gui {Validation} (See \l{Validation Tests})
        \list
        \li \gui {Accelerators} \BR toggles validation on or off for Alt
        accelerators.
        \li \gui {Ending Punctuation} \BR switches validation on or off
        for phrase ending punctuation, e.g. ellipsis, exclamation mark,
        question mark, etc.
        \li \gui {Phrase Matches} \BR sets validation on or off for
        matching against translations that are in the current phrase book.
        \li \gui {Place Marker Matches} \BR sets validation on or off for
        the use of the same place markers in the source and translation.
        \endlist

    \li \gui {Phrases} (See the section \l {Phrase Books} for details.)
        \list

        \li \gui {New Phrase Book... Ctrl+N} \BR pops up a save as file
        dialog.  You must enter a filename to be used for the phrase
        book and save the file. Once saved you should open the phrase
        book to begin using it.

        \li \gui {Open Phrase Book... Ctrl+H} \BR pops up an open file
        dialog.  Find and choose a phrase book to open.

        \li \gui {Close Phrase Book} \BR displays the list of phrase
        books currently opened. Clicking on one of the items will
        close the phrase book. If the phrase book has been modified, a
        dialog box asks whether \QL should save the changes.

        \li \gui {Edit Phrase Book...} \BR displays the list of phrase
        books currently opened. Clicking on one of the items will open
        the \l{Creating and Editing Phrase Books}{Phrase Book Dialog}
        where you can add, edit or delete phrases.

        \li \gui {Print Phrase Book...} \BR displays the list of phrase
        books currently opened. Clicking on one of the items pops up a
        print dialog.  If you click OK the phrase book will be
        printed.

        \li \gui {Add to Phrase Book Ctrl+T} \BR Adds the source text
        and translation currently shown in the \l{The Translation
        Area} {translation area} to a phrase book.  If multiple phrase
        books are loaded, a dialog box let you specify select one.

        \endlist

    \li \gui {Tools}
        \list

        \li \gui {Batch Translation...} \BR Opens a \l{Batch
        Translation}{dialog} which let you automatically insert
        translations for source texts which are in a phrase book.

        \li \gui {Open/Refresh Form Preview F3} \BR Opens the \l{Form
        Preview}.  This window let you instantly see translations for
        forms created with \QD.  \endlist

    \li \gui {View}
        \list

        \li \gui {Revert Sorting} \BR puts the items in the \l{Context
        Window} {context list} and in the \l{Strings Window} {string
        list} into their original order.

        \li \gui {Display Guesses} \BR turns the display of phrases and
        guesses on or off.

        \li \gui {Statistics} \BR toggles the visibility of the
        Statistics dialog.

        \li \gui {Views} \BR toggles the visibility of the \l{Context
        Window}, \l{Strings Window}, \l{Phrases and Guesses Window},
        \l{Warnings Window}, or \l{Sources and Forms Window}.

        \li \gui {Toolbars} \BR toggles the visibility of the different
        toolbars.

        \endlist

    \li \gui {Help}
        \list
        \li \gui {Manual F1} \BR opens this manual.
        \li \gui {About Qt Linguist} \BR Shows information about \QL.
        \li \gui {About Qt} \BR Shows information about \e{Qt}.
        \li \gui {What's This? Shift+F1} \BR Click on one item in the main window
        to get additional information about it.
        \endlist

    \endlist

    \section2 The Toolbar

    \image linguist-toolbar.png

    \list
    \li \inlineimage linguist-fileopen.png
    \BR
    Pops up the open file dialog to open a new translation source TS file.

    \li \inlineimage linguist-filesave.png
    \BR
    Saves the current translation source TS file.

    \li \inlineimage linguist-fileprint.png
    \BR
    Prints the current translation source TS file.

    \li \inlineimage linguist-phrasebookopen.png
    \BR
    Pops up the file open dialog to open a new phrase book \c .qph file.

    \li \inlineimage linguist-editundo.png
    \BR
    Undoes the last editing action in the translation pane.

    \li \inlineimage linguist-editredo.png
    \BR
    Redoes the last editing action in the translation pane.

    \li \inlineimage linguist-editcut.png
    \BR
    Deletes any highlighted text in the translation pane and save a copy to
    the clipboard.

    \li \inlineimage linguist-editcopy.png
    \BR
    Copies the highlighted text in the translation pane to the clipboard.

    \li \inlineimage linguist-editpaste.png
    \BR
    Pastes the clipboard text into the translation pane.

    \li \inlineimage linguist-editfind.png
    \BR
    Pops up the Find dialog .

    \li \inlineimage linguist-prev.png
    \BR
    Moves to the previous source phrase.

    \li \inlineimage linguist-next.png
    \BR
    Moves to the next source phrase.

    \li \inlineimage linguist-prevunfinished.png
    \BR
    Moves to the previous unfinished source phrase.

    \li \inlineimage linguist-nextunfinished.png
    \BR
    Moves to the next unfinished source phrase.

    \li \inlineimage linguist-doneandnext.png
    \BR
    Marks the phrase as 'done' (translated) and move to the next
    unfinished source phrase.

    \li \inlineimage linguist-validateaccelerators.png
    \BR
    Toggles accelerator validation on and off.

    \li \inlineimage linguist-validatepunctuation.png
    \BR
    Toggles phrase ending punctuation validation on and off.

    \li \inlineimage linguist-validatephrases.png
    \BR
    Toggles phrase book validation on or off.

    \li \inlineimage linguist-validateplacemarkers.png
    \BR
    Toggles place marker validation on or off.

    \endlist

*/

/*!
    \page linguist-programmers.html
    \title Qt Linguist Manual: Developers
    \ingroup internationalization

    \contentspage {Qt Linguist Manual}{Contents}
    \previouspage Qt Linguist Manual: Translators
    \nextpage Qt Linguist Manual: TS File Format

    Support for multiple languages is extremely simple in Qt
    applications, and adds little overhead to the developer's workload.

    Qt minimizes the performance cost of using translations by
    translating the phrases for each window as they are created. In most
    applications the main window is created just once. Dialogs are often
    created once and then shown and hidden as required. Once the initial
    translation has taken place there is no further runtime overhead for
    the translated windows. Only those windows that are created,
    destroyed and subsequently created will have a translation
    performance cost.

    Creating applications that can switch language at runtime is possible
    with Qt, but requires a certain amount of developer intervention and
    will of course incur some runtime performance cost.

    \section1 Making the Application Translation-Aware

    Developers should make their application look for and load the
    appropriate translation file and mark user-visible text and Ctrl
    keyboard accelerators as targets for translation.

    Each piece of text that requires translating requires context to help
    the translator identify where in the program the text occurs. In the
    case of multiple identical texts that require different translations,
    the translator also requires some information to disambiguate the
    source texts. Marking text for translation will automatically cause
    the class name to be used as basic context information. In some cases
    the developer may be required to add additional information to help
    the translator.

    You can develop applications that use both C++ and QML sources in the same
    application and even have user interface strings in both sources. The tools
    create a single combined translation file and the strings are accessible
    from C++ and QML. The following sections describe how to make C++ sources
    translatable. For more information about making QML sources translatable, see
    \l{Internationalization and Localization with Qt Quick}.

    \section2 Creating Translation Files

    Translation files consist of all the user-visible text and Ctrl key
    accelerators in an application and translations of that text.
    Translation files are created as follows:

    \list 1
    \li Run lupdate to generate the first set of TS translation source files
        with all the user-visible text but no translations.
    \li Give the TS files to the translator who adds translations using \QL. \QL
        takes care of any changed or deleted source text.
    \li Run lupdate to incorporate any new text added to the application.
        lupdate synchronizes the user-visible text from the application with the
        translations. It does not destroy any data.
    \li To release the application, run lrelease to read the TS files and
        produce the QM files used by the application at runtime.
    \endlist

    For lupdate to work successfully, it must know which translation files to
    produce. The files are
    listed in the application's \c .pro Qt project file, for example:

    \snippet arrowpad/arrowpad.pro 1

    If your sources contain genuine non-Latin1 strings,
    lupdate needs
    to be told about it in the \c .pro file by using, for example,
    the following line:

    \code
        CODECFORTR = UTF-8
    \endcode

    For more information, see \l{Using lupdate} and \l{Using lrelease}.

    \section2 Loading Translations

    \snippet hellotr/main.cpp 1
    \snippet hellotr/main.cpp 3

    This is how a simple \c main() function of a Qt application begins.

    \snippet hellotr/main.cpp 1
    \snippet hellotr/main.cpp 4

    For a translation-aware application a translator object is created, a
    translation is loaded and the translator object installed into the
    application.

    \snippet arrowpad/main.cpp 0
    \snippet arrowpad/main.cpp 1

    For non-Latin1 strings in the sources you will also need for example:

    \code
            QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
    \endcode

    In production applications a more flexible approach, for example,
    loading translations according to locale, might be more appropriate. If
    the TS files are all named according to a convention such as
    \e appname_locale, e.g. \c tt2_fr, \c tt2_de etc, then the
    code above will load the current locale's translation at runtime.

    If there is no translation file for the current locale the application
    will fall back to using the original source text.

    Note that if you need to programmatically add translations at
    runtime, you can reimplement QTranslator::translate().

    \section2 Making the Application Translate User-Visible Strings

    User-visible strings are marked as translation targets by wrapping them
    in a \c tr() call, for example:

    \snippet doc_src_linguist-manual.cpp 6

    would become

    \snippet doc_src_linguist-manual.cpp 7

    All QObject subclasses that use the \c Q_OBJECT macro implement
    the \c tr() function.

    Although the \c tr() call is normally made directly since it is
    usually called as a member function of a QObject subclass, in
    other cases an explicit class name can be supplied, for example:

    \snippet doc_src_linguist-manual.cpp 8

    or

    \snippet doc_src_linguist-manual.cpp 9

    \section2 Distinguishing Between Identical Translatable Strings

    The lupdate tool automatically
    provides a \e context for every source text. This context is the class
    name of the class that contains the \c tr() call. This is sufficient in
    the vast majority of cases. Sometimes however, the translator will need
    further information to uniquely identify a source text; for example,
    a dialog that contained two separate frames, each of which contained an
    "Enabled" option would need each identified because in some languages the
    translation would differ between the two. This is easily achieved using the
    two argument form of the \c tr() call, e.g.

    \snippet doc_src_linguist-manual.cpp 10

    and

    \snippet doc_src_linguist-manual.cpp 11

    Ctrl key accelerators are also translatable:

    \snippet trollprint/mainwindow.cpp 2

    It is strongly recommended that the two argument form of \c tr() is used
    for Ctrl key accelerators. The second argument is the only clue the
    translator has as to the function performed by the accelerator.

    \section2 Helping the Translator with Navigation Information

    In large complex applications it may be difficult for the translator to
    see where a particular source text comes from. This problem can be
    solved by adding a comment using the keyword \e TRANSLATOR which
    describes the navigation steps to reach the text in question; e.g.

    \snippet doc_src_linguist-manual.cpp 12

    These comments are particularly useful for widget classes.

    \section2 Handling Plural Forms

    Qt includes a \c tr() overload that will make it very easy to
    write "plural-aware" internationalized applications. This overload
    has the following signature:

    \snippet doc_src_linguist-manual.cpp 17

    Depending on the value of \c n, the \c tr() function will return a different
    translation, with the correct grammatical number for the target language.
    Also, any occurrence of \c %n is replaced with \c{n}'s value. For example:

    \snippet doc_src_linguist-manual.cpp 18

    If a French translation is loaded, this will expand to "0 item
    remplac\unicode{233}", "1 item remplac\unicode{233}", "2 items
    remplac\unicode{233}s", etc., depending on \c{n}'s value.
    And if no translation is loaded, the original string is used, with \c %n
    replaced with count's value (e.g., "6 item(s) replaced").

    To handle plural forms in the native language, you need to load a
    translation file for this language, too.
    The lupdate tool has the
    \c -pluralonly command line option, which allows the creation of
    TS files containing only entries with plural forms.

    See the \l{Qt Quarterly} Article
    \l{http://doc.qt.digia.com/qq/qq19-plurals.html}{Plural Forms in Translations}
    for further details on this issue.

    \section2 Coping With C++ Namespaces

    C++ namespaces and the \c {using namespace} statement can confuse
    lupdate. It will interpret
    \c MyClass::tr() as meaning just that, not as
    \c MyNamespace::MyClass::tr(), even if \c MyClass is
    defined in the \c MyNamespace namespace. Runtime translation of
    these strings will fail because of that.

    You can work around this limitation by putting a \e TRANSLATOR
    comment at the beginning of the source files that use \c
    MyClass::tr():

    \snippet doc_src_linguist-manual.cpp 13

    After the comment, all references to \c MyClass::tr() will be
    understood as meaning \c MyNamespace::MyClass::tr().

    \section2 Translating Text That is Outside of a QObject Subclass

    \section3 Using QCoreApplication::translate()

    If the quoted text is not in a member function of a QObject subclass,
    use either the tr() function of an appropriate class, or the
    QCoreApplication::translate() function directly:

    \snippet doc_src_linguist-manual.cpp 14

    \section3 Using QT_TR_NOOP() and QT_TRANSLATE_NOOP()

    If you need to have translatable text completely outside a function,
    there are two macros to help: QT_TR_NOOP() and QT_TRANSLATE_NOOP().
    These macros merely mark the text for extraction by
    lupdate.
    The macros expand to just the text (without the context).

    Example of QT_TR_NOOP():
    \snippet doc_src_linguist-manual.cpp 15

    Example of QT_TRANSLATE_NOOP():
    \snippet doc_src_linguist-manual.cpp 16

    \section1 Tutorials

    Three tutorials are presented:

    \list 1
    \li \l{hellotr}{Hello tr()} demonstrates the creation of
        a \l QTranslator object. It also shows the simplest use of
        the \c tr() function to mark user-visible source text for
        translation.

    \li \l{arrowpad}{Arrow Pad} explains how to make the application load the
       translation file applicable to the current locale. It also shows the
       use of the two-argument form of \c tr() which provides additional
       information to the translator.

    \li \l{trollprint}{Troll Print} explains how
        identical source texts can be distinguished even when they occur in
        the same context. This tutorial also discusses how the translation
        tools help minimize the translator's work when an application is
        upgraded.
    \endlist

    These tutorials cover all that you need to know to prepare your Qt
    applications for translation.

    At the beginning of a project add the translation source files to be
    used to the project file and add calls to
    lupdate and lrelease to the Makefile.

    During the project all the developer must do is wrap any user-visible
    text in \c tr() calls. They should also use the two argument form for
    Ctrl key accelerators, or when asked by the translator for the cases
    where the same text translates into two different forms in the same
    context. The developer should also include \c TRANSLATION comments to
    help the translator navigate the application.
*/

/*!
    \page linguist-ts-file-format.html
    \title Qt Linguist Manual: TS File Format
    \ingroup internationalization

    \contentspage {Qt Linguist Manual}{Contents}
    \previouspage Qt Linguist Manual: Developers
    \nextpage Qt Linguist Manual: Text ID Based Translations

    The TS file format used by \QL is described by the
    \l{http://www.w3.org/TR/1998/REC-xml-19980210}{DTD} presented below,
    which we include for your convenience. Be aware that the format
    may change in future Qt releases.

    \quotefile ../../../shared/ts.dtd

*/

/*!
    \page linguist-id-based-i18n.html
    \title Qt Linguist Manual: Text ID Based Translations
    \ingroup internationalization

    \contentspage {Qt Linguist Manual}{Contents}
    \previouspage Qt Linguist Manual: TS File Format

    \brief Text ID based internationalization provides support for large scale
    projects with many target locales and many texts to translate.

    The text ID translation mechanism is an "industrial strength" system for
    internationalization and localization. Each text in the application is assigned
    a unique identifier (text ID) and these identifiers are used directly in the
    source code in place of the plain texts. This requires a little more work for
    the user interface developers but makes it much easier to manage large numbers
    of translated texts.

    \note You must use only plain-text-based or only text-ID-based functions in
    one application. If you mix them, you will end up with an incomplete set of
    texts to be translated.


    \section1 Internationalizing With Text IDs

    When using text IDs instead of plain text, the general method of
    internationalizing an application is the same but the details are a bit
    different:

    \list 1

        \li The functions and macros for the text-ID-based translation system are
        different to the plain-text system. You use the \c qsTrId() function instead
        of qsTr(), and the \c QT_TRID_NOOP() macro instead of QT_TR_NOOP().

        \li Use text IDs as user interface strings rather than plain text
        strings. For example, \c {qsTrId("id-back-not-front")}

        \li You cannot specify a context parameter with a text ID. If there are
        identically spelled words with different meanings, these need separate
        text IDs. For example, \c {qsTrId("id-back-backstep")} will
        differentiate the back-step "Back" from the back-of-the-object "Back".

        \li The "Engineering English" text that you see in the user interface for
        development builds is indicated with a \c {//%} comment. If you do not
        include this, the text ID will be shown in the user interface. This is
        especially important when you have texts with parameters. The \c {//%}
        comment needs to include the parameters indicators in the string. For
        example, \c {//% "Number of files: %1"}

        \li The \c {//:} comments that provide extra information to the translator
        are optional in the plain-text system. However, with the text-ID-based
        system, this extra information becomes essential because without it you only
        have the text ID and the translator might not be able to make a sensible
        translation from without any other context. You can use long descriptive
        text ID and no comments but comments are often easier to understand.

    \endlist

    The side-by-side code snippets below show a comparison of text-ID -based and
    plain-text-based translations:

    \table
        \header
            \li text-ID-based
            \li plain-text-based
        \row
            \li
            \code
            Text {
                id: backTxt;
                //: The back of the object, not the front
                //% "Back"
                //~ Context Not related to back-stepping
                text: qsTrId("id-back-not-front");
            }
            \endcode

            \li
            \code
            Text {
                id: backTxt;
                //: The back of the object, not the front
                //~ Context Not related to back-stepping
                text: qsTr("Back","Not front")
            }
            \endcode
    \endtable

    \section1 Localizing With Text IDs

    Localizing with text IDs follows much the same process as for plain text.

    The \c lupdate tool is used the same way and translations are made into
    the .ts files:

    \code
    lupdate <myapp>.pro
    \endcode

    Note that the source values in the translation files will be text IDs rather
    than plain text. This means you need very descriptive text IDs, or good
    additional comments, or both to ensure that the translator makes a correct
    translation.

    The example text-ID-based user interface text from above results in the following
    content in the .ts file:

    \code
    <message id="id-back-not-front">
        <source>Back</source>
        <extracomment>The back of the object, not the front</extracomment>
        <translation type="unfinished"></translation>
        <extra-Context>Not related to back-stepping</extra-Context>
    </message>
    \endcode

    When using \c lrelease, you need to specify that the keys for translated
    texts are based on text IDs, rather than plain texts. If strings in the code
    are specified with \c qsTr() there is no "id" attribute set so they are
    ignored by \c lrelease.

    This command produces all the compiled translation .qm files for your
    application:

    \code
    lrelease -idbased <myapp>.pro
    \endcode

    However, if there is no translation available for a given text (which is
    generally the case until late in development), the text ID will be shown in
    the user interface rather than a proper text. In order to make the application
    more usable for testing, you can make \c lrelease use the "Engineering English"
    source text (from the \c {//%} comments) as the translated text and mark it with
    some indicator so you can see texts that are not yet translated.

    For example, this command builds the .qm files and puts a "!" in front of the
    untranslated texts:

    \code
    lrelease -idbased -markuntranslated ! <myapp>.pro
    \endcode



    \section1 Advanced Usage

    For projects that target a large number of locales, you can remove the
    TRANSLATIONS info from the .pro file and, instead, manage the translations
    with a separate script. The script can call lrelease and lupdate for each of
    the desired targets.

    The updates could be scripted something like this:

    \code
    lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_GB.ts
    lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_US.ts
    ...
    \endcode

    The generation of the final .qm files could be scripted something like this:

    \code
    lrelease -idbased <project-dir>/i18n/myapp-text_en_GB.ts
    lrelease -idbased <project-dir>/i18n/myapp-text_en_US.ts
    ...
    \endcode

*/
