summaryrefslogtreecommitdiffstats
path: root/tools/linguist
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:24:15 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:24:15 -0500
commitbd0f3345a938b35ce6a12f6150373b0955b8dd12 (patch)
tree7a520322212d48ebcb9fbe1087e7fca28b76185c /tools/linguist
downloadqt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.tar.gz
qt3-bd0f3345a938b35ce6a12f6150373b0955b8dd12.zip
Add Qt3 development HEAD version
Diffstat (limited to 'tools/linguist')
-rw-r--r--tools/linguist/LICENSE.GPL280
-rw-r--r--tools/linguist/book/images/doneandnext.pngbin0 -> 445 bytes
-rw-r--r--tools/linguist/book/images/editcopy.pngbin0 -> 587 bytes
-rw-r--r--tools/linguist/book/images/editcut.pngbin0 -> 480 bytes
-rw-r--r--tools/linguist/book/images/editfind.pngbin0 -> 776 bytes
-rw-r--r--tools/linguist/book/images/editpaste.pngbin0 -> 664 bytes
-rw-r--r--tools/linguist/book/images/editredo.pngbin0 -> 362 bytes
-rw-r--r--tools/linguist/book/images/editundo.pngbin0 -> 353 bytes
-rw-r--r--tools/linguist/book/images/fileopen.pngbin0 -> 523 bytes
-rw-r--r--tools/linguist/book/images/fileprint.pngbin0 -> 767 bytes
-rw-r--r--tools/linguist/book/images/filesave.pngbin0 -> 510 bytes
-rw-r--r--tools/linguist/book/images/finddialog.pngbin0 -> 3165 bytes
-rw-r--r--tools/linguist/book/images/linguist.pngbin0 -> 22819 bytes
-rw-r--r--tools/linguist/book/images/menubar.pngbin0 -> 511 bytes
-rw-r--r--tools/linguist/book/images/next.pngbin0 -> 418 bytes
-rw-r--r--tools/linguist/book/images/nextunfinished.pngbin0 -> 456 bytes
-rw-r--r--tools/linguist/book/images/phrasebookdialog.pngbin0 -> 4857 bytes
-rw-r--r--tools/linguist/book/images/phrasebookopen.pngbin0 -> 883 bytes
-rw-r--r--tools/linguist/book/images/prev.pngbin0 -> 412 bytes
-rw-r--r--tools/linguist/book/images/prevunfinished.pngbin0 -> 449 bytes
-rw-r--r--tools/linguist/book/images/toolbar.pngbin0 -> 5397 bytes
-rw-r--r--tools/linguist/book/images/tt1_en.pngbin0 -> 872 bytes
-rw-r--r--tools/linguist/book/images/tt1_la.pngbin0 -> 894 bytes
-rw-r--r--tools/linguist/book/images/tt2_en.pngbin0 -> 1615 bytes
-rw-r--r--tools/linguist/book/images/tt2_fr.pngbin0 -> 1854 bytes
-rw-r--r--tools/linguist/book/images/tt2_nl.pngbin0 -> 1881 bytes
-rw-r--r--tools/linguist/book/images/tt3_10_en.pngbin0 -> 2286 bytes
-rw-r--r--tools/linguist/book/images/tt3_10_pt_bad.pngbin0 -> 2411 bytes
-rw-r--r--tools/linguist/book/images/tt3_10_pt_good.pngbin0 -> 2485 bytes
-rw-r--r--tools/linguist/book/images/tt3_11_about_pt.pngbin0 -> 2720 bytes
-rw-r--r--tools/linguist/book/images/tt3_11_en.pngbin0 -> 2368 bytes
-rw-r--r--tools/linguist/book/images/tt3_11_pt.pngbin0 -> 2537 bytes
-rw-r--r--tools/linguist/book/images/validateaccelerators.pngbin0 -> 387 bytes
-rw-r--r--tools/linguist/book/images/validatephrases.pngbin0 -> 293 bytes
-rw-r--r--tools/linguist/book/images/validatepunctuation.pngbin0 -> 373 bytes
-rw-r--r--tools/linguist/book/linguist-manager.leaf138
-rw-r--r--tools/linguist/book/linguist-manual.book90
-rw-r--r--tools/linguist/book/linguist-programmer.leaf1145
-rw-r--r--tools/linguist/book/linguist-translator.leaf582
-rw-r--r--tools/linguist/linguist.pro11
-rw-r--r--tools/linguist/linguist/about.ui223
-rw-r--r--tools/linguist/linguist/finddialog.cpp183
-rw-r--r--tools/linguist/linguist/finddialog.h68
-rw-r--r--tools/linguist/linguist/images/accelerator.pngbin0 -> 782 bytes
-rw-r--r--tools/linguist/linguist/images/appicon.pngbin0 -> 1936 bytes
-rw-r--r--tools/linguist/linguist/images/book.pngbin0 -> 825 bytes
-rw-r--r--tools/linguist/linguist/images/d_accelerator.pngbin0 -> 487 bytes
-rw-r--r--tools/linguist/linguist/images/d_book.pngbin0 -> 557 bytes
-rw-r--r--tools/linguist/linguist/images/d_doneandnext.pngbin0 -> 457 bytes
-rw-r--r--tools/linguist/linguist/images/d_editcopy.pngbin0 -> 526 bytes
-rw-r--r--tools/linguist/linguist/images/d_editcut.pngbin0 -> 800 bytes
-rw-r--r--tools/linguist/linguist/images/d_editpaste.pngbin0 -> 610 bytes
-rw-r--r--tools/linguist/linguist/images/d_fileopen.pngbin0 -> 406 bytes
-rw-r--r--tools/linguist/linguist/images/d_filesave.pngbin0 -> 267 bytes
-rw-r--r--tools/linguist/linguist/images/d_next.pngbin0 -> 446 bytes
-rw-r--r--tools/linguist/linguist/images/d_nextunfinished.pngbin0 -> 522 bytes
-rw-r--r--tools/linguist/linguist/images/d_phrase.pngbin0 -> 290 bytes
-rw-r--r--tools/linguist/linguist/images/d_prev.pngbin0 -> 425 bytes
-rw-r--r--tools/linguist/linguist/images/d_prevunfinished.pngbin0 -> 542 bytes
-rw-r--r--tools/linguist/linguist/images/d_print.pngbin0 -> 595 bytes
-rw-r--r--tools/linguist/linguist/images/d_punctuation.pngbin0 -> 356 bytes
-rw-r--r--tools/linguist/linguist/images/d_redo.pngbin0 -> 465 bytes
-rw-r--r--tools/linguist/linguist/images/d_s_check_danger.pngbin0 -> 270 bytes
-rw-r--r--tools/linguist/linguist/images/d_s_check_obs.pngbin0 -> 220 bytes
-rw-r--r--tools/linguist/linguist/images/d_s_check_off.pngbin0 -> 348 bytes
-rw-r--r--tools/linguist/linguist/images/d_s_check_on.pngbin0 -> 220 bytes
-rw-r--r--tools/linguist/linguist/images/d_searchfind.pngbin0 -> 501 bytes
-rw-r--r--tools/linguist/linguist/images/d_undo.pngbin0 -> 471 bytes
-rw-r--r--tools/linguist/linguist/images/doneandnext.pngbin0 -> 532 bytes
-rw-r--r--tools/linguist/linguist/images/editcopy.pngbin0 -> 491 bytes
-rw-r--r--tools/linguist/linguist/images/editcut.pngbin0 -> 649 bytes
-rw-r--r--tools/linguist/linguist/images/editpaste.pngbin0 -> 864 bytes
-rw-r--r--tools/linguist/linguist/images/fileopen.pngbin0 -> 681 bytes
-rw-r--r--tools/linguist/linguist/images/filesave.pngbin0 -> 328 bytes
-rw-r--r--tools/linguist/linguist/images/next.pngbin0 -> 541 bytes
-rw-r--r--tools/linguist/linguist/images/nextunfinished.pngbin0 -> 649 bytes
-rw-r--r--tools/linguist/linguist/images/pagecurl.pngbin0 -> 1247 bytes
-rw-r--r--tools/linguist/linguist/images/phrase.pngbin0 -> 366 bytes
-rw-r--r--tools/linguist/linguist/images/prev.pngbin0 -> 542 bytes
-rw-r--r--tools/linguist/linguist/images/prevunfinished.pngbin0 -> 725 bytes
-rw-r--r--tools/linguist/linguist/images/print.pngbin0 -> 766 bytes
-rw-r--r--tools/linguist/linguist/images/punctuation.pngbin0 -> 502 bytes
-rw-r--r--tools/linguist/linguist/images/redo.pngbin0 -> 592 bytes
-rw-r--r--tools/linguist/linguist/images/s_check_danger.pngbin0 -> 326 bytes
-rw-r--r--tools/linguist/linguist/images/s_check_obs.pngbin0 -> 245 bytes
-rw-r--r--tools/linguist/linguist/images/s_check_off.pngbin0 -> 439 bytes
-rw-r--r--tools/linguist/linguist/images/s_check_on.pngbin0 -> 235 bytes
-rw-r--r--tools/linguist/linguist/images/searchfind.pngbin0 -> 843 bytes
-rw-r--r--tools/linguist/linguist/images/splash.pngbin0 -> 31939 bytes
-rw-r--r--tools/linguist/linguist/images/undo.pngbin0 -> 572 bytes
-rw-r--r--tools/linguist/linguist/images/whatsthis.xpm24
-rw-r--r--tools/linguist/linguist/linguist.icnsbin0 -> 47620 bytes
-rw-r--r--tools/linguist/linguist/linguist.icobin0 -> 10134 bytes
-rw-r--r--tools/linguist/linguist/linguist.pro109
-rw-r--r--tools/linguist/linguist/linguist.rc1
-rw-r--r--tools/linguist/linguist/linguist_de.ts993
-rw-r--r--tools/linguist/linguist/linguist_fr.ts993
-rw-r--r--tools/linguist/linguist/listviews.cpp350
-rw-r--r--tools/linguist/linguist/listviews.h135
-rw-r--r--tools/linguist/linguist/main.cpp89
-rw-r--r--tools/linguist/linguist/msgedit.cpp834
-rw-r--r--tools/linguist/linguist/msgedit.h244
-rw-r--r--tools/linguist/linguist/phrase.cpp189
-rw-r--r--tools/linguist/linguist/phrase.h74
-rw-r--r--tools/linguist/linguist/phrasebookbox.cpp244
-rw-r--r--tools/linguist/linguist/phrasebookbox.h84
-rw-r--r--tools/linguist/linguist/phraselv.cpp171
-rw-r--r--tools/linguist/linguist/phraselv.h83
-rw-r--r--tools/linguist/linguist/printout.cpp182
-rw-r--r--tools/linguist/linguist/printout.h126
-rw-r--r--tools/linguist/linguist/simtexth.cpp239
-rw-r--r--tools/linguist/linguist/simtexth.h64
-rw-r--r--tools/linguist/linguist/statistics.ui259
-rw-r--r--tools/linguist/linguist/statistics.ui.h53
-rw-r--r--tools/linguist/linguist/trwindow.cpp2071
-rw-r--r--tools/linguist/linguist/trwindow.h237
-rw-r--r--tools/linguist/lrelease/lrelease.pro17
-rw-r--r--tools/linguist/lrelease/main.cpp203
-rw-r--r--tools/linguist/lupdate/fetchtr.cpp824
-rw-r--r--tools/linguist/lupdate/lupdate.pro21
-rw-r--r--tools/linguist/lupdate/main.cpp241
-rw-r--r--tools/linguist/lupdate/merge.cpp129
-rw-r--r--tools/linguist/lupdate/numberh.cpp248
-rw-r--r--tools/linguist/lupdate/sametexth.cpp97
-rw-r--r--tools/linguist/phrasebooks/danish.qph1018
-rw-r--r--tools/linguist/phrasebooks/dutch.qph1044
-rw-r--r--tools/linguist/phrasebooks/finnish.qph1033
-rw-r--r--tools/linguist/phrasebooks/french.qph1104
-rw-r--r--tools/linguist/phrasebooks/german.qph1075
-rw-r--r--tools/linguist/phrasebooks/italian.qph1105
-rw-r--r--tools/linguist/phrasebooks/norwegian.qph1004
-rw-r--r--tools/linguist/phrasebooks/russian.qph982
-rw-r--r--tools/linguist/phrasebooks/spanish.qph1086
-rw-r--r--tools/linguist/phrasebooks/swedish.qph1010
-rw-r--r--tools/linguist/qdoc.conf15
-rw-r--r--tools/linguist/qm2ts/main.cpp128
-rw-r--r--tools/linguist/qm2ts/qm2ts.155
-rw-r--r--tools/linguist/qm2ts/qm2ts.pro15
-rw-r--r--tools/linguist/shared/metatranslator.cpp601
-rw-r--r--tools/linguist/shared/metatranslator.h120
-rw-r--r--tools/linguist/shared/proparser.cpp217
-rw-r--r--tools/linguist/shared/proparser.h42
-rw-r--r--tools/linguist/tutorial/tt1/main.cpp25
-rw-r--r--tools/linguist/tutorial/tt1/tt1.pro4
-rw-r--r--tools/linguist/tutorial/tt2/arrowpad.cpp31
-rw-r--r--tools/linguist/tutorial/tt2/arrowpad.h22
-rw-r--r--tools/linguist/tutorial/tt2/main.cpp26
-rw-r--r--tools/linguist/tutorial/tt2/mainwindow.cpp26
-rw-r--r--tools/linguist/tutorial/tt2/mainwindow.h19
-rw-r--r--tools/linguist/tutorial/tt2/tt2.pro9
-rw-r--r--tools/linguist/tutorial/tt3/main.cpp26
-rw-r--r--tools/linguist/tutorial/tt3/mainwindow.cpp47
-rw-r--r--tools/linguist/tutorial/tt3/mainwindow.h23
-rw-r--r--tools/linguist/tutorial/tt3/printpanel.cpp37
-rw-r--r--tools/linguist/tutorial/tt3/printpanel.h19
-rw-r--r--tools/linguist/tutorial/tt3/tt3.pro8
-rw-r--r--tools/linguist/tutorial/tt3/tt3_pt.ts65
157 files changed, 24389 insertions, 0 deletions
diff --git a/tools/linguist/LICENSE.GPL b/tools/linguist/LICENSE.GPL
new file mode 100644
index 0000000..3221c03
--- /dev/null
+++ b/tools/linguist/LICENSE.GPL
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/tools/linguist/book/images/doneandnext.png b/tools/linguist/book/images/doneandnext.png
new file mode 100644
index 0000000..47efaec
--- /dev/null
+++ b/tools/linguist/book/images/doneandnext.png
Binary files differ
diff --git a/tools/linguist/book/images/editcopy.png b/tools/linguist/book/images/editcopy.png
new file mode 100644
index 0000000..efe8d03
--- /dev/null
+++ b/tools/linguist/book/images/editcopy.png
Binary files differ
diff --git a/tools/linguist/book/images/editcut.png b/tools/linguist/book/images/editcut.png
new file mode 100644
index 0000000..146388a
--- /dev/null
+++ b/tools/linguist/book/images/editcut.png
Binary files differ
diff --git a/tools/linguist/book/images/editfind.png b/tools/linguist/book/images/editfind.png
new file mode 100644
index 0000000..59c63bf
--- /dev/null
+++ b/tools/linguist/book/images/editfind.png
Binary files differ
diff --git a/tools/linguist/book/images/editpaste.png b/tools/linguist/book/images/editpaste.png
new file mode 100644
index 0000000..13f9a0f
--- /dev/null
+++ b/tools/linguist/book/images/editpaste.png
Binary files differ
diff --git a/tools/linguist/book/images/editredo.png b/tools/linguist/book/images/editredo.png
new file mode 100644
index 0000000..6a30e26
--- /dev/null
+++ b/tools/linguist/book/images/editredo.png
Binary files differ
diff --git a/tools/linguist/book/images/editundo.png b/tools/linguist/book/images/editundo.png
new file mode 100644
index 0000000..38a7357
--- /dev/null
+++ b/tools/linguist/book/images/editundo.png
Binary files differ
diff --git a/tools/linguist/book/images/fileopen.png b/tools/linguist/book/images/fileopen.png
new file mode 100644
index 0000000..44107d3
--- /dev/null
+++ b/tools/linguist/book/images/fileopen.png
Binary files differ
diff --git a/tools/linguist/book/images/fileprint.png b/tools/linguist/book/images/fileprint.png
new file mode 100644
index 0000000..2936658
--- /dev/null
+++ b/tools/linguist/book/images/fileprint.png
Binary files differ
diff --git a/tools/linguist/book/images/filesave.png b/tools/linguist/book/images/filesave.png
new file mode 100644
index 0000000..03e10f9
--- /dev/null
+++ b/tools/linguist/book/images/filesave.png
Binary files differ
diff --git a/tools/linguist/book/images/finddialog.png b/tools/linguist/book/images/finddialog.png
new file mode 100644
index 0000000..c3b0f43
--- /dev/null
+++ b/tools/linguist/book/images/finddialog.png
Binary files differ
diff --git a/tools/linguist/book/images/linguist.png b/tools/linguist/book/images/linguist.png
new file mode 100644
index 0000000..519c185
--- /dev/null
+++ b/tools/linguist/book/images/linguist.png
Binary files differ
diff --git a/tools/linguist/book/images/menubar.png b/tools/linguist/book/images/menubar.png
new file mode 100644
index 0000000..7ba43c6
--- /dev/null
+++ b/tools/linguist/book/images/menubar.png
Binary files differ
diff --git a/tools/linguist/book/images/next.png b/tools/linguist/book/images/next.png
new file mode 100644
index 0000000..7434fa2
--- /dev/null
+++ b/tools/linguist/book/images/next.png
Binary files differ
diff --git a/tools/linguist/book/images/nextunfinished.png b/tools/linguist/book/images/nextunfinished.png
new file mode 100644
index 0000000..618fc94
--- /dev/null
+++ b/tools/linguist/book/images/nextunfinished.png
Binary files differ
diff --git a/tools/linguist/book/images/phrasebookdialog.png b/tools/linguist/book/images/phrasebookdialog.png
new file mode 100644
index 0000000..d1a323a
--- /dev/null
+++ b/tools/linguist/book/images/phrasebookdialog.png
Binary files differ
diff --git a/tools/linguist/book/images/phrasebookopen.png b/tools/linguist/book/images/phrasebookopen.png
new file mode 100644
index 0000000..4f76b7d
--- /dev/null
+++ b/tools/linguist/book/images/phrasebookopen.png
Binary files differ
diff --git a/tools/linguist/book/images/prev.png b/tools/linguist/book/images/prev.png
new file mode 100644
index 0000000..f9fbd93
--- /dev/null
+++ b/tools/linguist/book/images/prev.png
Binary files differ
diff --git a/tools/linguist/book/images/prevunfinished.png b/tools/linguist/book/images/prevunfinished.png
new file mode 100644
index 0000000..25cc1a2
--- /dev/null
+++ b/tools/linguist/book/images/prevunfinished.png
Binary files differ
diff --git a/tools/linguist/book/images/toolbar.png b/tools/linguist/book/images/toolbar.png
new file mode 100644
index 0000000..5e6021f
--- /dev/null
+++ b/tools/linguist/book/images/toolbar.png
Binary files differ
diff --git a/tools/linguist/book/images/tt1_en.png b/tools/linguist/book/images/tt1_en.png
new file mode 100644
index 0000000..66e54e0
--- /dev/null
+++ b/tools/linguist/book/images/tt1_en.png
Binary files differ
diff --git a/tools/linguist/book/images/tt1_la.png b/tools/linguist/book/images/tt1_la.png
new file mode 100644
index 0000000..a701349
--- /dev/null
+++ b/tools/linguist/book/images/tt1_la.png
Binary files differ
diff --git a/tools/linguist/book/images/tt2_en.png b/tools/linguist/book/images/tt2_en.png
new file mode 100644
index 0000000..c71e201
--- /dev/null
+++ b/tools/linguist/book/images/tt2_en.png
Binary files differ
diff --git a/tools/linguist/book/images/tt2_fr.png b/tools/linguist/book/images/tt2_fr.png
new file mode 100644
index 0000000..acc2515
--- /dev/null
+++ b/tools/linguist/book/images/tt2_fr.png
Binary files differ
diff --git a/tools/linguist/book/images/tt2_nl.png b/tools/linguist/book/images/tt2_nl.png
new file mode 100644
index 0000000..4631de2
--- /dev/null
+++ b/tools/linguist/book/images/tt2_nl.png
Binary files differ
diff --git a/tools/linguist/book/images/tt3_10_en.png b/tools/linguist/book/images/tt3_10_en.png
new file mode 100644
index 0000000..e95bff9
--- /dev/null
+++ b/tools/linguist/book/images/tt3_10_en.png
Binary files differ
diff --git a/tools/linguist/book/images/tt3_10_pt_bad.png b/tools/linguist/book/images/tt3_10_pt_bad.png
new file mode 100644
index 0000000..05cb5f3
--- /dev/null
+++ b/tools/linguist/book/images/tt3_10_pt_bad.png
Binary files differ
diff --git a/tools/linguist/book/images/tt3_10_pt_good.png b/tools/linguist/book/images/tt3_10_pt_good.png
new file mode 100644
index 0000000..b0f855f
--- /dev/null
+++ b/tools/linguist/book/images/tt3_10_pt_good.png
Binary files differ
diff --git a/tools/linguist/book/images/tt3_11_about_pt.png b/tools/linguist/book/images/tt3_11_about_pt.png
new file mode 100644
index 0000000..4467314
--- /dev/null
+++ b/tools/linguist/book/images/tt3_11_about_pt.png
Binary files differ
diff --git a/tools/linguist/book/images/tt3_11_en.png b/tools/linguist/book/images/tt3_11_en.png
new file mode 100644
index 0000000..7d98b98
--- /dev/null
+++ b/tools/linguist/book/images/tt3_11_en.png
Binary files differ
diff --git a/tools/linguist/book/images/tt3_11_pt.png b/tools/linguist/book/images/tt3_11_pt.png
new file mode 100644
index 0000000..02910cf
--- /dev/null
+++ b/tools/linguist/book/images/tt3_11_pt.png
Binary files differ
diff --git a/tools/linguist/book/images/validateaccelerators.png b/tools/linguist/book/images/validateaccelerators.png
new file mode 100644
index 0000000..68201fe
--- /dev/null
+++ b/tools/linguist/book/images/validateaccelerators.png
Binary files differ
diff --git a/tools/linguist/book/images/validatephrases.png b/tools/linguist/book/images/validatephrases.png
new file mode 100644
index 0000000..62fe5f2
--- /dev/null
+++ b/tools/linguist/book/images/validatephrases.png
Binary files differ
diff --git a/tools/linguist/book/images/validatepunctuation.png b/tools/linguist/book/images/validatepunctuation.png
new file mode 100644
index 0000000..8ce2648
--- /dev/null
+++ b/tools/linguist/book/images/validatepunctuation.png
Binary files differ
diff --git a/tools/linguist/book/linguist-manager.leaf b/tools/linguist/book/linguist-manager.leaf
new file mode 100644
index 0000000..aa99e01
--- /dev/null
+++ b/tools/linguist/book/linguist-manager.leaf
@@ -0,0 +1,138 @@
+\chapter Release Manager
+
+\index Release Manager
+
+Two tools are provided for the release manager, \l lupdate and \l
+lrelease. These tools depend on \e qmake project files. You don't
+have to use \e qmake, though.
+
+A third tool, \c qm2ts, can be used for converting Qt 2.x message
+files to \c .ts files.
+
+\section1 Qt Project Files
+
+\index .pro Files
+\index Project Files
+\index qmake!Project Files
+
+\l lupdate and \l lrelease depend on information in the application's
+\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:
+
+\index TRANSLATIONS!in Project Files
+
+\quotefile tt2/tt2.pro
+\skipto TRANSLATIONS
+\printline tt2_fr
+\printline tt2_nl
+
+Using a locale within the translation file name is useful for
+determining which language to load at runtime. This is explained in
+\link Programmers Chapter 4: Programmers \endlink.
+
+\index HEADERS!in Project Files
+\index SOURCES!in Project Files
+\index FORMS!in Project Files
+\index TRANSLATIONS!in Project Files
+
+An example of a complete \c .pro file with four translation source files:
+\code
+ HEADERS = main-dlg.h \
+ options-dlg.h
+ SOURCES = main-dlg.cpp \
+ options-dlg.cpp \
+ main.cpp
+ FORMS = search-dlg.ui
+ TRANSLATIONS = superapp_dk.ts \
+ superapp_fi.ts \
+ superapp_no.ts \
+ superapp_se.ts
+\endcode
+
+\index QApplication!defaultCodec()
+\index defaultCodec()!QApplication
+\index DEFAULTCODEC!in Project Files
+\index Chinese Language
+\index Japanese Language
+
+\l 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 Latin-1.
+
+If you do use the \l QTextCodec::codecForTr() mechanism in your
+application, \e {Qt Linguist} needs you to set the \c DEFAULTCODEC
+entry in the \c .pro file as well. For example:
+\code
+ DEFAULTCODEC = ISO-8859-5
+\endcode
+
+\section1 lupdate
+
+\index lupdate
+
+Usage: \c {lupdate myproject.pro}
+
+ \index Qt Designer
+
+This is a simple command line tool. \l lupdate reads a Qt \c .pro
+project file, finds the translatable strings in the specified source,
+header and \e {Qt Designer} interface files, and produces or updates
+the \c .ts translation files listed in the project file. The
+translation files are given to the translator who uses \e {Qt
+Linguist} to read the files and insert the translations.
+
+Companies that have their own translators in-house may find it useful
+to run \l 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 \l
+lupdate only a few times in the application's 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 \l lupdate runs
+would probably take place during the final beta phase.
+
+\index .ts Files
+\index Translation Source Files
+\index XML
+
+The \c .ts file format is a simple human-readable XML format that can
+be used with version control systems if required.
+
+\section1 lrelease
+
+\index lrelease
+
+Usage: \c {lrelease myproject.pro}
+
+\index .qm Files
+\index Qt Message Files
+
+This is another simple command line tool. It reads a Qt \c .pro
+project file and produces the \c .qm files used by the application,
+one for each \c .ts translation source file listed in the project
+file. The \c .qm file format is a compact binary format that provides
+extremely fast lookups for translations.
+
+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 \c
+.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 programmers placed in the source
+files. Once the \c .qm files are available the application will
+detect them and use them automatically.
+
+Note that \l lrelease will only incorporate translations that are
+marked as "done". If a translation is missing, or has failed
+validation, the original text will be used instead.
+
+\section1 Missing Translations
+
+Both \l lupdate and \l lrelease may be used with \c .ts translation
+source files which are incomplete. Missing translations will be replaced
+with the native language phrases at runtime.
diff --git a/tools/linguist/book/linguist-manual.book b/tools/linguist/book/linguist-manual.book
new file mode 100644
index 0000000..b98cd9b
--- /dev/null
+++ b/tools/linguist/book/linguist-manual.book
@@ -0,0 +1,90 @@
+\title Guide to the Qt Translation Tools
+\granularity chapter
+
+\chapter Introduction
+
+Qt provides excellent support for translating applications into local
+languages. This Guide explains how to use Qt's translation tools for
+each of the roles involved in translating an application. The Guide
+begins with a brief overview of the issues that must be considered,
+followed by chapters devoted to each role and the supporting tools
+provided.
+
+\link Release... Chapter 2: Release Manager \endlink is aimed at the
+person with overall responsibility for the release of the
+application. They will typically coordinate the work of the software
+engineers and the translator. The chapter describes the use of two
+tools. The \l lupdate tool is used to synchronize source code and
+translations. The \l lrelease tool is used to create runtime
+translation files for use by the released application.
+
+\link Translators Chapter 3: Translators \endlink is for translators.
+It describes the use of the \e {Qt Linguist} tool. No computer
+knowledge beyond the ability to start a program and use a text editor
+or word processor is required.
+
+\link Programmers Chapter 4: Programmers \endlink is for Qt
+programmers. It explains how to create Qt applications that are able
+to use translated text. It also provides guidance on how to help the
+translator identify the context in which phrases appear. This
+chapter's three short tutorials cover everything the programmer needs
+to do.
+
+\section1 Overview of the Translation Process
+
+Most of the text that must be translated in an application program
+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 programmer 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
+programmer 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 \e {Qt
+Linguist}, 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. \e {Qt Linguist} also
+provides a phrase book facility to help ensure consistent
+translations across multiple applications and projects.
+
+Translators and programmers must address a number of issues because
+of the subtleties and complexities of human language:
+
+\list
+\i A single phrase may need to be translated into several different
+forms depending on context, e.g. \e open in English might become \e
+\OEFFNEN, "open file", or \e aufbauen, "open internet connection", in
+German.
+\i 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.
+\i Phrases that contain variables, for example, "The 25 files selected will
+take 63 seconds to process", where the two numbers are inserted
+programmatically at runtime 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.
+
+\RULE
+
+Please send comments and suggestions regarding this tutorial to the
+\link mailto:doc@trolltech.com?subject=Translation_Tutorial Qt doc
+team \endlink. Bugs in the tools should be sent to \link
+mailto:qt-bugs@trolltech.com?subject=Translation_Tutorial
+qt-bugs\endlink.
+
+\input linguist-manager.leaf
+\input linguist-translator.leaf
+\input linguist-programmer.leaf
diff --git a/tools/linguist/book/linguist-programmer.leaf b/tools/linguist/book/linguist-programmer.leaf
new file mode 100644
index 0000000..d2a079b
--- /dev/null
+++ b/tools/linguist/book/linguist-programmer.leaf
@@ -0,0 +1,1145 @@
+\chapter Programmers
+
+Support for multiple languages is extremely simple in Qt
+applications, and adds little overhead to the programmer'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 programmer intervention and
+will of course incur some runtime performance cost.
+
+\section1 Making the Application Translation Aware
+
+Programmers 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 programmer may be required to add additional information to help
+the translator.
+
+\section2 Creating Translation Files
+
+\index .ts Files
+\index Translation Source 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:
+
+\index lupdate
+\index lrelease
+
+\list 1
+\i Run \l lupdate initially to generate the first set of \c .ts
+translation source files with all the user-visible text but no
+translations.
+\i The \c .ts files are given to the translator who adds translations
+using \e {Qt Linguist}. \e {Qt Linguist} takes care of any changed
+or deleted source text.
+\i Run \l lupdate to incorporate any new text added to the
+application. \l lupdate synchronizes the user-visible text from the
+application with the translations; it does not destroy any data.
+\i Steps 2 and 3 are repeated as often as necessary.
+\i When a release of the application is needed \l lrelease is run to
+read the \c .ts files and produce the \c .qm files used by the
+application at runtime.
+\endlist
+
+\index .pro Files
+\index Project Files
+\index qmake!Project Files
+
+For \l lupdate to work successfully, it must know which translation
+files to produce. The files are simply listed in the application's \c
+.pro Qt project file, for example:
+\quotefile tt2/tt2.pro
+\skipto TRANSLATIONS
+\printline TRANSLATIONS
+\printline
+
+See the \link lupdate "lupdate" \endlink and \link lrelease
+"lrelease" \endlink sections.
+
+\section2 Loading Translations
+
+\quotefile tt1/main.cpp
+\skipto main(
+\printline main(
+\printuntil QApplication
+
+\index main()
+
+This is how a simple \c main() function of a Qt application begins.
+
+\index QTranslator!load()
+\index load()!QTranslator
+\index QApplication!installTranslator()
+\index installTranslator()!QApplication
+
+\quotefile tt1/main.cpp
+\skipto main(
+\printline main(
+\printuntil app.installTrans
+
+For a translation-aware application a translator object is created, a
+translation is loaded and the translator object installed into the
+application.
+
+\quotefile tt2/main.cpp
+\skipto main(
+\printline main(
+\printuntil app.installTrans
+
+In production applications a more flexible approach, for example,
+loading translations according to locale, might be more appropriate. If
+the \c .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.
+
+\section2 Making the Application Translate User-Visible Strings
+
+\index tr()
+\index QObject!tr()
+
+User-visible strings are marked as translation targets by wrapping them
+in a \c tr() call, for example:
+\code
+ button = new QPushButton( "&Quit", this );
+\endcode
+
+would become
+
+\code
+ button = new QPushButton( tr("&Quit"), this);
+\endcode
+
+\index Q_OBJECT
+
+All \l 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 \l QObject subclass, in
+other cases an explicit class name can be supplied, for example:
+
+\code
+ QPushButton::tr("&Quit")
+\endcode
+
+or
+
+\code
+ QObject::tr("&Quit")
+\endcode
+
+\section2 Distinguishing Identical Strings That Require Different
+Translations
+
+\index Translation Contexts
+\index Contexts!for Translation
+\index lupdate
+
+The \l lupdate program 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.
+
+\code
+ rbc = new QRadioButton( tr("Enabled", "Color frame"), this );
+\endcode
+
+and
+
+\code
+ rbh = new QRadioButton( tr("Enabled", "Hue frame"), this );
+\endcode
+
+\index Ctrl Key
+
+Ctrl key accelerators are also translatable:
+
+\quotefile tt3/mainwindow.cpp
+\skipto quit()
+\printline quit()
+\printuntil Quit
+
+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
+
+\index TRANSLATOR!in Comments
+\index Translator Comments
+\index Comments!for Translators
+
+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.
+
+\code
+ /* TRANSLATOR FindDialog
+
+ Choose Edit|Find from the menu bar or press Ctrl+F to pop up the
+ Find dialog.
+ */
+\endcode
+
+These comments are particularly useful for widget classes.
+
+\section2 Coping With C++ Namespaces
+
+\index Namespaces
+\index C++!Namespaces
+\index lupdate
+
+C++ namespaces and the \c {using namespace} statement can confuse
+\l 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.
+
+\index TRANSLATOR!in Comments
+\index Translator Comments
+\index Comments!for Translators
+
+You can work around this limitation by putting a \e TRANSLATOR
+comment at the beginning of the source files that use \c
+MyClass::tr():
+\code
+ /* TRANSLATOR MyNamespace::MyClass */
+\endcode
+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 QApplication::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
+QApplication::translate() function directly:
+
+\code
+ void some_global_function( LoginWidget *logwid )
+ {
+ QLabel *label = new QLabel(
+ LoginWidget::tr("Password:"), logwid );
+ }
+
+ void same_global_function( LoginWidget *logwid )
+ {
+ QLabel *label = new QLabel(
+ qApp->translate("LoginWidget", "Password:"),
+ logwid );
+ }
+\endcode
+
+\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 \l{lupdate}.
+The macros expand to just the text (without the context).
+
+Example of QT_TR_NOOP():
+\code
+ QString FriendlyConversation::greeting( int greet_type )
+ {
+ static const char* greeting_strings[] = {
+ QT_TR_NOOP( "Hello" ),
+ QT_TR_NOOP( "Goodbye" )
+ };
+ return tr( greeting_strings[greet_type] );
+ }
+\endcode
+
+Example of QT_TRANSLATE_NOOP():
+\code
+ static const char* greeting_strings[] = {
+ QT_TRANSLATE_NOOP( "FriendlyConversation", "Hello" ),
+ QT_TRANSLATE_NOOP( "FriendlyConversation", "Goodbye" )
+ };
+
+ QString FriendlyConversation::greeting( int greet_type )
+ {
+ return tr( greeting_strings[greet_type] );
+ }
+
+ QString global_greeting( int greet_type )
+ {
+ return qApp->translate( "FriendlyConversation",
+ greeting_strings[greet_type] );
+ }
+\endcode
+
+\section1 Tutorials
+
+Three tutorials are presented. The first 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. The
+second tutorial 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. The third tutorial 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.
+
+\section2 Tutorial 1: Loading and Using Translations
+
+\img tt1_en.png
+\caption Tutorial 1 Screenshot, English version
+
+\include tt1/tt1.pro
+\caption \c tt1.pro
+
+\include tt1/main.cpp
+\caption \c main.cpp
+
+This example is a reworking of the \link tutorial1-01.html
+"hello-world" \endlink example from \link tutorial.html Tutorial
+#1\endlink, with a Latin translation. The \e {Tutorial 1 Screenshot,
+English version}, above, shows the English version.
+
+\quotefile tt1/main.cpp
+
+\section3 Line by Line Walk-through
+
+\quotefile tt1/main.cpp
+
+\skipto qtranslator
+\printline qtranslator
+
+\index QTranslator
+
+This line includes the definition of the \l QTranslator class.
+Objects of this class provide translations for user-visible text.
+
+\skipto QTranslator
+\printuntil tor
+
+Creates a \l QTranslator object without a parent.
+
+\printline load
+
+\index tt1_la.qm
+
+Tries to load a file called \c tt1_la.qm (the \c .qm file extension is
+implicit) that contains Latin translations for the source texts used in
+the program. No error will occur if the file is not found.
+
+\index QApplication!installTranslator()
+\index installTranslator()!QApplication
+
+\printline installTranslator
+
+Adds the translations from \c tt1_la.qm to the pool of translations used
+by the program.
+
+\index Hello World
+
+\printline hello
+
+Creates a push button that displays "Hello world!". If \c tt1_la.qm
+was found and contains a translation for "Hello world!", the
+translation appears; if not, the source text appears.
+
+\index tr()
+\index QObject!tr()
+
+All classes that inherit \l QObject have a \c tr() function. Inside
+a member function of a \l QObject class, we simply write \c tr("Hello
+world!") instead of \c QPushButton::tr("Hello world!") or \c
+QObject::tr("Hello world!").
+
+\section3 Running the Application in English
+
+\index English Language
+
+Since we haven't made the translation file \c tt1_la.qm, the source text
+is shown when we run the application:
+
+\img tt1_en.png
+\caption Tutorial 1 Screenshot, English version
+
+\section3 Creating a Latin Message File
+
+\index tt1.pro
+\index Latin
+
+The first step is to create a project file, \c tt1.pro, that lists
+all the source files for the project. The project file can be a qmake
+project file, or even an ordinary makefile. Any file that contains
+
+\index SOURCES!in Project Files
+\index TRANSLATIONS!in Project Files
+
+\quotefile tt1/tt1.pro
+\skipto SOURCES
+\printline SOURCES
+\skipto TRANSLATIONS
+\printline TRANSLATIONS
+
+will work. \e TRANSLATIONS specifies the message files we want to
+maintain. In this example, we just maintain one set of translations,
+namely Latin.
+
+\index .ts Files
+\index Translation Source Files
+\index .qm Files
+\index Qt Message Files
+
+Note that the file extension is \c .ts, not \c .qm. The \c .ts
+translation source format is designed for use during the
+application's development. Programmers or release managers run the \l
+lupdate program to generate and update \c .ts files with the source
+text that is extracted from the source code. Translators read and
+update the \c .ts files using \e {Qt Linguist} adding and editing
+their translations.
+
+\index XML
+
+The \c .ts format is human-readable XML that can be emailed directly
+and is easy to put under version control. If you edit this file
+manually, be aware that the default encoding for XML is UTF-8, not
+Latin-1 (ISO 8859-1). One way to type in a Latin-1 character such as
+'\OSLASH' (Norwegian o with slash) is to use an XML entity:
+"\&#xf8;". This will work for any Unicode character.
+
+Once the translations are complete the \l lrelease program is used to
+convert the \c .ts files into the \c .qm Qt message file format. The
+\c .qm format is a compact binary format designed to deliver very
+fast lookup performance. Both \l lupdate and \l lrelease read all the
+project's source and header files (as specified in the HEADERS and
+SOURCES lines of the project file) and extract the strings that
+appear in \c tr() function calls.
+
+\index lupdate
+
+\l lupdate is used to create and update the message files (\c tt1_la.ts
+in this case) to keep them in sync with the source code. It is safe to
+run \l lupdate at any time, as \l lupdate does not remove any
+information. For example, you can put it in the makefile, so the \c .ts
+files are updated whenever the source changes.
+
+\index .ts Files
+\index Translation Source Files
+\index XML
+
+Try running \l lupdate right now, like this:
+\code
+ lupdate -verbose tt1.pro
+\endcode
+(The \c -verbose option instructs \c lupdate to display messages that
+explain what it is doing.) You should now have a file \c tt1_la.ts in
+the current directory, containing this:
+\code
+ <!DOCTYPE TS><TS>
+ <context>
+ <name>QPushButton</name>
+ <message>
+ <source>Hello world!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ </context>
+ </TS>
+\endcode
+You don't need to understand the file format since it is read and
+updated using tools (\l lupdate, \e {Qt Linguist}, \l lrelease).
+
+\section3 Translating to Latin with Qt Linguist
+
+\index Qt Linguist
+\index Linguist
+
+We will use \e {Qt Linguist} to provide the translation, although
+you can use any XML or plain text editor to enter a translation into a
+\c .ts file.
+
+To start \e {Qt Linguist}, type
+\code
+ linguist tt1_la.ts
+\endcode
+
+You should now see the text "QPushButton" in the top left pane.
+Double-click it, then click on "Hello world!" and enter "Orbis, te
+saluto!" in the \e Translation pane (the middle right of the
+window). Don't forget the exclamation mark!
+
+Click the \e Done checkbox and choose \e File|Save from the
+menu bar. The \c .ts file will no longer contain
+\code
+ <translation type='unfinished'></translation>
+\endcode
+but instead will have
+\code
+ <translation>Orbis, te saluto!</translation>
+\endcode
+
+\section3 Running the Application in Latin
+
+\index Latin
+\index lrelease
+
+To see the application running in Latin, we have to generate a \c .qm
+file from the \c .ts file. Generating a \c .qm file can be achieved
+either from within \e {Qt Linguist} (for a single \c .ts file), or
+by using the command line program \l lrelease which will produce one \c
+.qm file for each of the \c .ts files listed in the project file.
+Generate \c tt1_la.qm from \c tt1_la.ts by choosing
+\e File|Release from \e {Qt Linguist}'s menu bar and pressing
+\e Save in the file save dialog that pops up. Now run the \e tt1 example
+program again. This time the button will be labelled "Orbis, te
+saluto!".
+
+\img tt1_la.png
+\caption Tutorial 1 Screenshot, Latin version
+
+\section2 Tutorial 2: Using Two or More Languages
+
+\img tt2_en.png
+\caption Tutorial 2 Screenshot, English version
+
+\index .pro Files
+\index Project Files
+\index qmake!Project Files
+
+\include tt2/tt2.pro
+\caption tt2.pro
+
+\index Translation Contexts
+\index Contexts!for Translation
+
+This example is a slightly more involved and introduces a key
+\e {Qt Linguist} concept: "contexts".
+
+\list
+\i \c arrowpad.h contains the definition of \c ArrowPad, a custom widget;
+\i \c arrowpad.cpp contains the implementation of \c ArrowPad;
+\i \c mainwindow.h contains the definition of \c MainWindow, a subclass of
+ \l QMainWindow
+\i \c mainwindow.cpp contains the implementation of \c MainWindow;
+\i \c main.cpp contains main().
+\endlist
+
+\index tt2.pro
+\index French Language
+\index Dutch Language
+
+We will use two translations, French and Dutch, although there is no
+effective limit on the number of possible translations that can be used
+with an application. The relevant lines of \c tt2.pro are
+
+\quotefile tt2/tt2.pro
+\skipto HEADERS
+\printuntil tt2_nl.ts
+
+\index lupdate
+\index tt2_fr.ts
+\index tt2_nl.ts
+
+Run \l lupdate; it should produce two identical message files
+\c tt2_fr.ts and \c tt2_nl.ts. These files will contain all the source
+texts marked for translation with \c tr() calls and their contexts.
+
+\section3 Line by Line Walk-through
+
+\index ArrowPad!in Translation Tutorial
+\index English Language
+
+In \c arrowpad.h we define the \c ArrowPad subclass which is a
+subclass of \l QWidget. In the \e {Tutorial 2 Screenshot, English
+version}, above, the central widget with the four buttons is an
+\c ArrowPad.
+
+\quotefile tt2/arrowpad.h
+\skipto class ArrowPad
+\printline class ArrowPad
+
+\index Q_OBJECT
+\index tr()
+\index QObject!tr()
+\index Translation Contexts
+\index Contexts!for Translation
+
+When \l lupdate is run it not only extracts the source texts but it
+also groups them into contexts. A context is the name of the class in
+which the source text appears. Thus, in this example, "ArrowPad" is a
+context: it is the context of the texts in the \c ArrowPad class.
+The \c Q_OBJECT macro defines \c tr(x) in \c ArrowPad like this
+
+\index QApplication!translate()
+\index translate()!QApplication
+
+\code
+ qApp->translate( "ArrowPad", x )
+\endcode
+
+Knowing which class each source text appears in enables \e {Qt
+Linguist} to group texts that are logically related together, e.g.
+all the text in a dialog will have the context of the dialog's class
+name and will be shown together. This provides useful information for
+the translator since the context in which text appears may influence how
+it should be translated. For some translations keyboard
+accelerators may need to be changed and having all the source texts in a
+particular context (class) grouped together makes it easier for the
+translator to perform any accelerator changes without introducing
+conflicts.
+
+In \c arrowpad.cpp we implement the \c ArrowPad class.
+
+\quotefile tt2/arrowpad.cpp
+\skipto QPushButton
+\printline QPushButton
+
+We call \c ArrowPad::tr() for each button's label since the labels are
+user-visible text.
+
+\img tt2_en.png
+\caption Tutorial 2 Screenshot, English version
+
+\index Q_OBJECT
+\index MainWindow!in Translation Tutorial
+
+\quotefile tt2/mainwindow.h
+\skipto QMainWindow
+\printline QMainWindow
+\printuntil Q_OBJECT
+
+In the \e {Tutorial 2 Screenshot, English version}, above, the whole
+window is a \c MainWindow. This is defined in the \c mainwindow.h
+header file. Here too, we use \c Q_OBJECT, so that \c MainWindow will
+become a context in \e {Qt Linguist}.
+
+In the implementation of \c MainWindow, \c mainwindow.cpp, we create
+an instance of our \c ArrowPad class
+
+\quotefile tt2/mainwindow.cpp
+\skipto arrow pad
+\printline arrow pad
+
+We also call \c MainWindow::tr() twice, once for the menu item and
+once for the accelerator.
+
+\index Ctrl Key
+\index Alt Key
+
+\skipto quit()
+\printline quit()
+\printuntil Ctrl+Q
+
+Note the use of \c tr() to support different keys in other languages.
+"Ctrl+Q" is a good choice for Quit in English, but a Dutch translator
+might want to use "Ctrl+A" (for Afsluiten) and a German translator
+"Strg+E" (for Beenden). When using \c tr() for Ctrl key accelerators,
+the two argument form should be used with the second argument
+describing the function that the accelerator performs.
+
+\index main()
+
+Our \c main() function is defined in \c main.cpp as usual.
+
+\quotefile tt2/main.cpp
+\skipto QTranslator
+\printline QTranslator
+\printuntil install
+
+\index QTextCodec!locale()
+\index locale()!QTextCodec
+\index LANG!Environment Variable
+\index Environment Variables!LANG
+
+We choose which translation to use according to the current locale.
+\l QTextCodec::locale() can be influenced by setting the \c LANG
+environment variable, for example. Notice that the use of a naming
+convention that incorporates the locale for \c .qm message files,
+(and \c .ts files), makes it easy to implement choosing the
+translation file according to locale.
+
+If there is no \c .qm message file for the locale chosen the original
+source text will be used and no error raised.
+
+\section3 Translating to French and Dutch
+
+We'll begin by translating the example application into French. Start
+\e {Qt Linguist} with \c tt2_fr.ts. You should get the seven source
+texts ("\&Up", "\&Left", etc.) grouped in two contexts ("ArrowPad"
+and "MainWindow").
+
+Now, enter the following translations:
+
+\list
+\i \c ArrowPad
+ \list
+ \i \&Up - \&Haut
+ \i \&Left - \&Gauche
+ \i \&Right - \&Droite
+ \i \&Down - \&Bas
+ \endlist
+\i \c MainWindow
+ \list
+ \i E\&xit - \&Quitter
+ \i Ctrl+Q - Ctrl+Q
+ \i \&File - \&Fichier
+ \endlist
+\endlist
+
+It's quickest to press \Key Alt+D (which clicks the \e {Done \& Next}
+button) after typing each translation, since this marks the
+translation as done and moves on to the next source text.
+
+Save the file and do the same for Dutch working with \c tt2_nl.ts:
+
+\list
+\i \c ArrowPad
+ \list
+ \i \&Up - \&Boven
+ \i \&Left - \&Links
+ \i \&Right - \&Rechts
+ \i \&Down - \&Onder
+ \endlist
+\i \c MainWindow
+ \list
+ \i E\&xit - \&Afsluiten
+ \i Ctrl+Q - Ctrl+A
+ \i File - \&Bestand
+ \endlist
+\endlist
+
+We have to convert the \c tt1_fr.ts and \c tt1_nl.ts translation source
+files into \c .qm files. We could use \e {Qt Linguist} as we've done
+before; however using the command line tool \l lrelease ensures that
+\e all the \c .qm files for the application are created without us
+having to remember to load and \e File|Release each one
+individually from \e {Qt Linguist}.
+
+In practice we would include calls to \l lupdate and \l lrelease in the
+application's makefile to ensure that the latest translations are
+used.
+
+\omit
+an example of a makefile or .pro file that did this would be nice
+\endomit
+
+Type
+
+\code
+ lrelease tt2.pro
+\endcode
+
+\index LANG!Environment Variable
+\index export!Unix Command
+\index setenv!Unix Command
+
+This should create both \c tt2_fr.qm and \c tt2_nl.qm. Set the \c
+LANG environment variable to \c fr. In Unix, one of the two following
+commands should work
+
+\code
+ export LANG=fr
+ setenv LANG fr
+\endcode
+
+\index
+
+\index autoexec.bat
+\index set!Windows Command
+
+In Windows, either modify \c autoexec.bat or run
+
+\code
+ set LANG=fr
+\endcode
+
+When you run the program, you should now see the French version:
+
+\img tt2_fr.png
+\caption Tutorial 2 Screenshot, French version
+
+Try the same with Dutch, by setting \c LANG=nl. Now the Dutch
+version should appear:
+
+\img tt2_nl.png
+\caption Tutorial 2 Screenshot, Dutch version
+
+\section3 Exercises
+
+Mark one of the translations in \e {Qt Linguist} as not done, i.e.
+by unchecking the "done" checkbox; run \l lupdate, then \l lrelease,
+then the example. What effect did this change have?
+
+\index Canada
+\index French Canada
+
+Set \c LANG=fr_CA (French Canada) and run the example program again.
+Explain why the result is the same as with \c LANG=fr.
+
+Change one of the accelerators in the Dutch translation to eliminate the
+conflict between \e \&Bestand and \e \&Boven.
+
+
+\section2 Tutorial 3: Disambiguating Identical Strings
+
+\img tt3_10_en.png
+\caption Tutorial 3 Screenshot, "Troll Print 1.0", English version
+
+\include tt3/tt3.pro
+\caption \c tt3.pro
+
+\index Portuguese Language
+\index Brazilian Language
+
+We've included a translation file, \c tt3_pt.ts, which contains some
+Portuguese translations for this example.
+
+\index Troll Print
+
+We will consider two releases of the same application: Troll Print
+1.0 and 1.1. We will learn to reuse the translations created for one
+release in a subsequent release. (In this tutorial, you need to edit
+some source files. It's probably best to copy all the files to a new
+temporary directory and work from there.)
+
+Troll Print is a toy example application that lets the user choose
+printer settings. It comes in two versions: English and Portuguese.
+
+Version 1.0 consists of these files:
+
+\index tt3.pro
+\index tt3_pt.ts
+
+\list
+\i \c printpanel.h contains the definition of PrintPanel;
+\i \c printpanel.cpp contains the implementation of PrintPanel;
+\i \c mainwindow.h contains the definition of \c MainWindow;
+\i \c mainwindow.cpp contains the implementation of \c MainWindow;
+\i \c main.cpp contains main();
+\i \c tt3.pro is the \e qmake project file.
+\i \c tt3_pt.ts is the Portuguese message file.
+\endlist
+
+\section3 Line by Line Walk-through
+
+The PrintPanel is defined in \c printpanel.h.
+
+\quotefile tt3/printpanel.h
+\skipto QVBox
+\printline QVBox
+\printuntil Q_OBJECT
+
+\index Q_OBJECT
+
+\index PrintPanel!in Translation Tutorial
+
+PrintPanel is a \l QWidget. It needs the \c Q_OBJECT macro for \c
+tr() to work properly.
+
+The implementation file is \c printpanel.cpp.
+
+\quotefile tt3/printpanel.cpp
+\skipto setSpacing
+\skipto /
+\printline /
+\printline
+\printline
+\printline
+
+\index Troll Print
+
+Some of the code is commented out in Troll Print 1.0; you will uncomment
+it later, for Troll Print 1.1.
+
+\quotefile tt3/printpanel.cpp
+\skipto twoSided
+\printline twoSided
+\printuntil toggle
+\printline
+\printuntil toggle
+
+Notice the two occurrences of \c tr("Enabled") and of \c
+tr("Disabled") in PrintPanel. Since both "Enabled"s and "Disabled"s
+appear in the same context \e {Qt Linguist} will only display one
+occurrence of each and will use the same translations for the
+duplicates that it doesn't display. Whilst this is a useful
+timesaver, in some languages, such as Portuguese, the second
+occurrence requires a separate translation. We will see how \e {Qt
+Linguist} can be made to display all the occurrences for separate
+translation shortly.
+
+\index MainWindow!in Translation Tutorial
+
+The header file for \c MainWindow, \c mainwindow.h, contains no
+surprises. In the implementation, \c mainwindow.cpp, we have some
+user-visible source texts that must be marked for translation.
+
+\quotefile tt3/mainwindow.cpp
+\skipto setCaption
+\printline setCaption
+
+We must translate the window's caption.
+
+\skipto quit
+\printline quit
+\printuntil Help
+
+We also need to translate the menu items. Note that the two argument
+form of \c tr() is used for the keyboard accelerator, "Ctrl+Q", since
+the second argument is the only clue the translator has to indicate
+what function that accelerator will perform.
+
+\quotefile tt3/main.cpp
+\skipto QTranslator
+\printuntil installTranslator
+
+\index main()
+
+The \c main() function in \c main.cpp is the same as the one in \link
+{Tutorial 2...} Tutorial 2 \endlink. In particular it chooses a
+translation file based on the current locale.
+
+\section3 Running Troll Print 1.0 in English and in Portuguese
+
+We will use the translations in the \c tt3_pt.ts file that is provided.
+
+Set the \c LANG environment variable to \c pt, and then run \c tt3.
+You should still see the English version, as shown in the \e
+{Tutorial 3 Screenshot, "Troll Print 1.0", English version}, above.
+Now run \l lrelease, e.g. \c {lrelease tt3.pro}, and then run the
+example again. Now you should see the Portuguese edition (Troll
+Imprimir 1.0):
+
+\img tt3_10_pt_bad.png
+\caption Tutorial 3 Screenshot, "Troll Imprimir 1.0", (Bad) Portuguese version
+
+Whilst the translation has appeared correctly, it is in fact wrong. In
+good Portuguese, the second occurrence of "Enabled" should be
+"Ativadas", not "Ativado" and the ending for the second translation of
+"Disabled" must change similarly too.
+
+If you open \c tt3_pt.ts using \e {Qt Linguist}, you will see that
+there is just one occurrence of "Enabled" and of "Disabled" in the
+translation source file, even though there are two of each in the
+source code. This is because \e {Qt Linguist} tries to minimize the
+translator's work by using the same translation for duplicate source
+texts. In cases such as this where an identical translation is wrong,
+the programmer must disambiguate the duplicate occurrences. This is
+easily achieved by using the two argument form of \c tr().
+
+We can easily determine which file must be changed because the
+translator's "context" is in fact the class name for the class where
+the texts that must be changed appears. In this case the file is \c
+printpanel.cpp, where the there are four lines to change. Add the
+second argument "two-sided" in the appropriate \c tr() calls to the
+first pair of radio buttons:
+
+\code
+ but = new QRadioButton( tr("Enabled", "two-sided"), twoSided );
+ but = new QRadioButton( tr("Disabled", "two-sided"), twoSided );
+\endcode
+
+and add the second argument "colors" in the appropriate \c tr() calls
+for the second pair of radio buttons:
+
+\code
+ but = new QRadioButton( tr("Enabled", "colors"), colors );
+ but = new QRadioButton( tr("Disabled", "colors"), colors );
+\endcode
+
+\index lupdate
+\index tt3_pt.ts
+
+Now run \l lupdate and open \c tt3_pt.ts with \e {Qt Linguist}. You
+should now see two changes.
+
+First, the translation source file now contains \e three "Enabled",
+"Disabled" pairs. The first pair is marked "(obs.)" signifying that they
+are obsolete. This is because these texts appeared in \c tr() calls that
+have been replaced by new calls with two arguments. The second pair has
+"two-sided" as their comment, and the third pair has "colors" as their
+comment. The comments are shown in the \e {Source text and comments}
+area in \e {Qt Linguist}.
+
+Second, the translation text "Ativado" and "Desativado" have been
+automatically used as translations for the new "Enabled" and "Disabled"
+texts, again to minimize the translator's work. Of course in this case
+these are not correct for the second occurrence of each word, but they
+provide a good starting point.
+
+Change the second "Ativado" into "Ativadas" and the second
+"Desativado" into "Desativadas", then save and quit. Run \l lrelease
+to obtain an up-to-date binary \c tt3_pt.qm file, and run Troll Print
+(or rather Troll Imprimir).
+
+\img tt3_10_pt_good.png
+\caption Tutorial 3 Screenshot, "Troll Imprimir 1.0", (Good) Portuguese version
+
+\index Translator Comments
+\index Comments!for Translators
+
+The second argument to \c tr() calls, called "comments" in \e {Qt
+Linguist}, distinguish between identical source texts that occur in
+the same context (class). They are also useful in other cases to give
+clues to the translator, and in the case of Ctrl key accelerators are
+the only means of conveying the function performed by the accelerator to
+the translator.
+
+\index TRANSLATOR!in Comments
+\index Translator Comments
+\index Comments!for Translators
+
+An additional way of helping the translator is to provide information on
+how to navigate to the particular part of the application that contains
+the source texts they must translate. This helps them see the context
+in which the translation appears and also helps them to find and test
+the translations. This can be achieved by using a \e TRANSLATOR comment
+in the source code:
+\code
+ /* TRANSLATOR MainWindow
+
+ In this application the whole application is a MainWindow.
+ Choose Help|About from the menu bar to see some text
+ belonging to MainWindow.
+ */
+\endcode
+
+Try adding these comments to some source files, particularly to
+dialog classes, describing the navigation necessary to reach the
+dialogs. You could also add them to the example files, e.g. \c
+mainwindow.cpp and \c printpanel.cpp are appropriate files. Run \l
+lupdate and then start \e {Qt Linguist} and load in \c tt3_pt.ts.
+You should see the comments in the \e {Source text and comments} area
+as you browse through the list of source texts.
+
+Sometimes, particularly with large programs, it can be difficult for
+the translator to find their translations and check that they're
+correct. Comments that provide good navigation information can save
+them time:
+
+\code
+ /* TRANSLATOR ZClientErrorDialog
+
+ Choose Client|Edit to reach the Client Edit dialog, then choose
+ Client Specification from the drop down list at the top and pick
+ client Bartel Leendert van der Waerden. Now check the Profile
+ checkbox and then click the Start Processing button. You should
+ now see a pop up window with the text "Error: Name too long!".
+ This window is a ZClientErrorDialog.
+ */
+\endcode
+
+
+\section3 Troll Print 1.1
+
+We'll now prepare release 1.1 of Troll Print. Start your favorite text
+editor and follow these steps:
+
+\list
+\i Uncomment the two lines that create a \l QLabel with the text
+ "\<b\>TROLL PRINT\</b\>" in \c printpanel.cpp.
+\i Word-tidying: Replace "2-sided" by "Two-sided" in \c printpanel.cpp.
+\i Replace "1.0" with "1.1" everywhere it occurs in \c mainwindow.cpp.
+\i Update the copyright year to 1999-2000 in \c mainwindow.cpp.
+\endlist
+
+(Of course the version number and copyright year would be consts or
+#defines in a real application.)
+
+Once finished, run \l lupdate, then open \c tt3_pt.ts in \e {Qt
+Linguist}. The following items are of special interest:
+
+\list
+\i \c MainWindow
+ \list
+ \i Troll Print 1.0 - marked "(obs.)", obsolete
+ \i About Troll Print 1.0 - marked "(obs.)", obsolete
+ \i Troll Print 1.0. Copyright 1999 Macroshaft, Inc. -
+ marked "(obs.)", obsolete
+ \i Troll Print 1.1 - automatically translated as
+ "Troll Imprimir 1.1"
+ \i About Troll Print 1.1 - automatically translated as
+ "Troll Imprimir 1.1"
+ \i Troll Print 1.1. Copyright 1999-2000 Macroshaft,
+ Inc. - automatically translated as "Troll Imprimir 1.1.
+ Copyright 1999-2000 Macroshaft, Inc."
+ \endlist
+\i \c PrintPanel
+ \list
+ \i 2-sided - marked "(obs.)", obsolete
+ \i \<b\>TROLL PRINT\</b\> - unmarked, i.e. untranslated
+ \i Two-sided - unmarked, i.e. untranslated.
+ \endlist
+\endlist
+
+Notice that \l lupdate works hard behind the scenes to make revisions
+easier, and it's pretty smart with numbers.
+
+Go over the translations in \c MainWindow and mark these as "done".
+Translate "\<b\>TROLL PRINT\</b\>" as "\<b\>TROLL IMPRIMIR\</b\>".
+When you're translating "Two-sided", press the \e {Guess Again}
+button to translate "Two-sided", but change the "2" into "Dois".
+
+Save and quit, then run \l lrelease. The Portuguese version
+should look like this:
+
+\img tt3_11_pt.png
+\caption Tutorial 3 Screenshot, "Troll Imprimir 1.1", Portuguese version
+
+Choose \e{Ajuda|Sobre}, (\e{Help|About}), to see the about box
+
+\img tt3_11_about_pt.png
+\caption Tutorial 3 Screenshot, About box, Portuguese version
+
+\index English Language
+\index Translating Qt
+\index Qt!Translating Qt
+
+If you choose \e {Ajuda|Sobre Qt}, (\e {Help|About Qt}), you'll get
+an English dialog. Oops! Qt itself needs to be translated. See the
+document \link i18n.html#qt-itself Internationalization with Qt
+\endlink for details.
+
+Now set \c LANG=en to get the original English version:
+
+\img tt3_11_en.png
+\caption Tutorial 3 Screenshot, "Troll Print 1.1", English version
+
+\section2 Summary
+
+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 \l lupdate and \l lrelease to
+the make file.
+
+During the project all the programmer 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 programmer should also include \e TRANSLATION comments to
+help the translator navigate the application.
diff --git a/tools/linguist/book/linguist-translator.leaf b/tools/linguist/book/linguist-translator.leaf
new file mode 100644
index 0000000..7a71b6a
--- /dev/null
+++ b/tools/linguist/book/linguist-translator.leaf
@@ -0,0 +1,582 @@
+\chapter Translators
+
+\img linguist.png
+\caption Linguist Main Window
+
+\section1 The One Minute Guide to Using Qt Linguist
+
+\index Linguist
+\index Qt Linguist
+\index Contexts!for Translation
+
+\e {Qt Linguist} is a tool for adding translations to Qt
+applications. It introduces the concept of a translation "context"
+which means a group of phrases that appear together on the screen
+e.g. in the same menu or dialog.
+
+To start, run \e {Qt Linguist}, either from the taskbar menu, or by
+double clicking the desktop icon, or type \c {linguist} (followed by
+\Key Enter) at the command line. Once \e {Qt Linguist} has started
+choose \Menu File|Open from the menu bar and select a \c .ts
+translation source file to work on.
+
+\e {Qt Linguist}'s main window is divided into four main areas. The
+left hand side contains the Context list, the top right is the Source
+text area, the middle right is the translation area and the bottom
+right is the phrases and guesses area. We'll describe them in detail
+later.
+
+Click on one of the contexts in the context list (left hand side) and
+then click on one of the phrases that appears in the Source text area
+(top right). The phrase will be copied into the translation area
+(middle right). Click under the word 'Translation' and type in the
+translation. Click \Key Ctrl+Enter (Done \& Next) to confirm that you
+have completed the translation and to move on to the next phrase that
+requires translation.
+
+The cycle of entering a translation then pressing \Key Ctrl+Enter can
+be repeated until all the translations are done or until you finish
+the session. Linguist will attempt to fill the "phrases and guesses"
+area with possible translations from any open phrase books and any
+previous translations. Each has a keyboard shortcut, e.g.
+\Key Ctrl+1, \Key Ctrl+2, etc., which you can use to copy the
+guess into the Translation area. (Mouse users can double click a
+phrase or guess to move it into the Translation area.) At the end of
+the session choose \Menu File|Save from the menu bar and then
+\Menu File|Exit to quit.
+
+\section1 Qt Linguist's Main Window
+
+\section2 Context List
+
+\index Contexts!for Translation
+
+This appears at the left hand side of the main window by default. The
+first column, 'Done', identifies whether or not the translations for the
+context have been done. A tick indicates that all the translations have
+been done and are valid. A question mark indicates that one or more
+translations have not been done or have failed validation. The second
+column, 'Context' is the name of the context in which the translation
+phrases appear. The third column, 'Items' shows two numbers, the first
+is the number of translations that have been done, and the second is the
+number of phrases that are in the context; if the numbers are equal then
+all the translations have been done. Note that a greyed out tick
+indicates an obsolete translation, i.e. a phrase that was translated in
+a previous version of the application but which does not occur in the
+new version.
+
+The contexts are ordered alphabetically. The phrases within each context
+are in the order in which they appear in the source program and this may
+not be the order in which they are shown on screen.
+
+The Context List is a dockable window so it can be dragged to another
+position in the main window, or dragged out of the main window to be a
+window in its own right. If you move the Context List, \e {Qt
+Linguist} will remember its position and restore it whenever you
+start the program.
+
+\section2 Source Text Area
+
+This appears at the top right of the main window by default. The first
+column, 'Done', signifies the status of the translation. A tick
+indicates that the phrase has been translated and passed validation. A
+question mark indicates that the translation has not been done. An
+exclamation mark indicates that the translation has failed validation.
+The second column 'Source text' shows the text that must be translated.
+The third column shows the translation.
+
+\e{Qt Linguist} provides three kinds of validation: accelerator,
+punctuation and phrase. If the source text contains an accelerator
+i.e. an ampersand, '\&' and the translated text does not contain an
+ampersand the translation will fail the accelerator validation.
+Similarly, if the source text ends with a particular punctuation
+mark, e.g. '?', '!' or '.' and the translation ends with a different
+punctuation mark the translation will fail the punctuation
+validation. If the source text has a translation in one of the open
+phrase books that differs from the translation used the translation
+will fail phrase validation. (See \l Validation.)
+
+The Source Text Area is a dockable window.
+
+\section2 Translation Area
+
+This area appears at the middle right of the main window by default. It
+is comprised of three vertical sections. The first section is labelled
+'Source text' below which the source text appears. The second section
+contains contextual information on a light blue background that the
+programmer has added to assist the translator. If no contextual
+information has been given this section does not appear. The third
+section is labelled 'Translation' and this is where you enter the
+translation of the source text.
+
+\section2 Phrases and Guesses Area
+
+\index Phrases!in Qt Linguist
+\index Guesses!in Qt Linguist
+
+This area appears at the bottom right of the main window by default.
+When you move to a new phrase if the phrase is in one of the phrase
+books that has been loaded the phrase will appear in this area with its
+translation. If the phrase is the same or similar to another phrase that
+has already been translated the phrase and translation will be shown in
+this area. To copy a translation from the phrases and guesses area press
+\Key F6 to move to the phrases and guesses area, use the up and down arrow
+keys to move to the phrase you want to use and press Enter to copy it.
+If you decide that you don't want to copy a phrase after all, press Esc.
+In both cases the focus will return to the Translation area.
+Alternatively, double click the translation you want to use and it will
+be copied into the translation area.
+
+The Phrases and Guesses Area is a dockable window.
+
+\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. An unfinished translation is
+one that either has not been translated at all or one which fails
+validation. To move to the next phrase 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 Source Text area.
+
+\section2 Phrases That Require Multiple Translations Depending on Context
+
+\index Contexts!for Translation
+\index Comments!for Translators
+
+The same phrase may occur in two or more contexts without conflict. Once
+a phrase has been translated in one context, \e {Qt Linguist} notes
+that the translation has been made and when the translator reaches a
+later occurrence of the same phrase \e {Qt Linguist} will provide
+the previous translation as a possible translation candidate in the
+phrases and guesses area. If the
+previous translation is acceptable just click the \e {Done \& Next}
+button (press \Key Ctrl+Enter) to move on to the next unfinished phrase.
+
+If a phrase occurs more than once in a particular context it will only
+be shown once in \e {Qt Linguist}'s 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 programmer must provide a distinguishing comment for each of
+the phrases concerned. If such comments are used the duplicate phrases
+will appear in the context list. The programmers comments will appear in
+the translation area on a light blue background.
+
+\section2 Changing Keyboard Accelerators
+
+\index Accelerators
+\index Keyboard Accelerators
+
+A keyboard accelerator is a key combination that when pressed will
+cause an application to perform an action. Keyboard accelerators
+normally come in two forms: Alt key and Ctrl key accelerators.
+
+\index Alt Key
+
+Alt key accelerators are used for menus and buttons. The underlining
+signifies that pressing the Alt key with the underlined letter is the
+same as clicking the menu item with the mouse. For example, most
+applications have a \e File menu with the "F" in the word "file"
+underlined. In these applications the file menu can be invoked either by
+clicking the word "File" on the menu bar or by pressing Alt+F. The
+accelerator key which is underlined is signified by preceeding it with
+an ampersand, e.g. \e \&File. If a source phrase appears with an
+ampersand in it then the translation should also contain an ampersand,
+preferably in front of the same letter. The meaning of Alt key
+accelerators can be determined from the phrase in which the ampersand is
+embedded. The translator may need to change the letter used with the Alt
+key, e.g. if the translated phrase does not contain the original
+accelerator letter. Conflicts with other keys, i.e. having two Alt key
+accelerators using the same letter in the same context, must be avoided.
+Note that some Alt key accelerators, usually those on the menu bar, may
+apply in other contexts.
+
+\index Ctrl Key
+
+Ctrl key accelerators can exist independently of any visual control.
+They are often used to invoke actions in menus that would otherwise
+take several 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 submenu
+item called \e New. In many applications this will appear as "\NEW
+Ctrl+N". This menu option could be invoked by clicking \e File then
+clicking \e New with the mouse. Or you could press Alt+F then press N
+since these letters are underlined. But the same thing can be achieved
+simply by pressing \Key Ctrl+N. Accelerators that use the Ctrl key are
+shown literally in the source text, e.g. \Key Ctrl+Enter. Ctrl key
+accelerators have no phrase so the translator \index Comments!for
+Translators must rely on the programmer to add a "comment" which
+appears in the top right hand pane. This comment should explain what
+action the Ctrl key accelerator performs. Ideally Ctrl key
+accelerators are translated simply by copying them by chossing the \e
+{Begin from Source} entry in the \Menu Translations menu. However in
+some cases the letter will not make sense in the target language and
+must be changed. Whatever letter (or digit) is chosen, the translation
+should always be in the form "Ctrl+" followed by the letter or digit
+in upper case. As with Alt key accelerators, if the translator changes
+the key it must not conflict with any other Ctrl key accelerator.
+
+Later versions of \e {Qt Linguist} are expected to help the
+translator avoid accelerator conflicts.
+
+\section2 Dealing with Phrases that Contain Variables
+
+Some phrases contain variables. Variables are placeholders for items of
+text that are filled in at runtime. They are signified in the source
+text with a percent sign followed by a digit, e.g. \e {After processing
+file %1, file %2 is next in line}. In this example, \c %1 will be
+replaced at runtime with the name of the first file to be processed and
+\c %2 with the name of the next file to be processed. In the translated
+version the variables must still appear. For example a German
+translation might reverse the phrases, e.g. \e {Datei %2 wird
+bearbeitet, wenn. Datei %1 fertig ist}. Note that both variables
+are still used but their order has changed. The order in which variables
+appear does not matter; \c %1 will always be replaced by the same text
+at runtime no matter where it appears in the source text or translation
+and similarly \c %2, etc.
+
+\section2 Reusing Translations
+
+If the translated text is similar to the source text, choose the \e
+{Begin from Source} entry in the \Menu Translations menu (press \Key
+Ctrl+B) which will copy the source text into the translation area.
+
+\e {Qt Linguist} automatically lists phrases from the open phrase
+books and similar or identical phrases that have already been translated
+in the Phrases and guesses area.
+
+\section1 Creating and Using Phrase Books
+
+\index Phrases!in Qt Linguist
+\index Phrase Books
+
+\img phrasebookdialog.png
+\caption Phrase Book Dialog
+
+A \e {Qt Linguist} phrase book is a set of source phrases, target
+(translated) phrases, and optional definitions. Phrase Books are created
+independently of any application, although typically one phrase book
+will be created per application or family of applications.
+
+If the translator reaches an untranslated phrase that is the same as a
+source phrase in the phrase book, \e {Qt Linguist} will show the
+phrase book entry in the \e {Relevant phrases} panel at the bottom
+right of the main window. Phrases which have translations that conflict
+with those given in the phrase book are marked with a question mark in
+the source text pane. 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 and the phrase book
+used for the majority of translations in each application.
+
+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.
+
+To add a new phrase click the \Button {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 -- 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 \e Save button (press Alt+S) and then click the \e Close
+button (press Esc) once you've finished adding (and removing) phrases.
+
+When a phrase or set of phrases appears in the phrase book double
+clicking the required target phrase will copy it to the translation
+pane at the text cursor position. If you want to \e replace the text
+in the translation pane with the target phrase, click the translation
+pane, choose \Menu {Edit|Select All} (press \Key Alt+A) and then
+double click the target phrase.
+
+\section1 Validation
+
+\index Validation of Translations
+\index Accelerators!Validation
+\index Punctuation!Validation
+\index Phrases!Validation
+
+\e {Qt Linguist} provides three kinds of validation on translated
+phrases.
+
+\list 1
+\i \e {Accelerator validation} detects translated phrases
+that do not have an ampersand when the source phrase does and vice
+versa.
+\i \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.
+\i \e {Phrases validation} detects source phrases that are
+also in the phrase book but whose translation differs from that given in
+the phrase book.
+\endlist
+
+Validation may be switched on or off from the menu bar's Validation item
+or using the toolbar buttons. Phrases that fail validation are marked
+with a question mark in the source text pane. If you switch validation
+off and then switch it on later, \e{Qt Linguist} will recheck all
+phrases and mark any that fail validation.
+
+If any phrase in a context is invalid then the context itself will be
+marked with a question mark; if all the phrases in a context are done
+and are valid the context will be marked with a tick.
+
+Note that only phrases which are marked as done (with a tick) will
+appear in the application. Invalid phrases and phrases which are
+translated but not marked as done are kept in the translation source
+file but are not used by the application.
+
+\section1 Qt Linguist Reference
+
+\section2 File Types
+
+\e {Qt Linguist} makes use of three kinds of file:
+
+\index .ts Files
+\index Translation Source Files
+\index .qm Files
+\index Qt Message Files
+\index .qph Files
+\index Qt Phrase Book Files
+
+\list
+\i \c .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 \l lupdate and are specific to an
+application.
+\i \c .qm \e {Qt message files} \BR are binary files that contain
+translations used by an application at runtime. These files are
+generated by \l lrelease, but can also be generated by \e {Qt
+Linguist}.
+\i \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 \e {Qt Linguist} and may be used by any
+number of projects and applications.
+\endlist
+
+\section2 The Menu Bar
+
+\img menubar.png
+\caption Menu Bar
+
+\list
+\i \e {File}
+ \list
+ \i \e {Open... Ctrl+O} \BR pops up an open file dialog from which a
+ translation source \c .ts file can be chosen.
+ \i \e {Save Ctrl+S} \BR saves the current translation source \c .ts file.
+ \i \e {Save As...} \BR pops up a save as file dialog so that the
+ current translation source \c .ts file may be saved with a different
+ name and/or put in a different location.
+ \i \e {Release...} \BR pops up a save as file dialog. The
+ filename entered will be a Qt message \c .qm file of the translation
+ based on the current translation source file. The release manager's
+ command line tool \l lrelease performs the same function on
+ \e all of an application's translation source files.
+ \i \e {Print... Ctrl+P} \BR pops up a print dialog. If you click
+ OK the translation source and the translations will be printed.
+ \i \e {Recently opened files} \BR shows the \c .ts files that
+ have been opened recently, click one to open it.
+ \i \e {Exit Ctrl+Q} \BR closes \e {Qt Linguist}.
+ \endlist
+
+\i \e {Edit}
+ \list
+ \i \e {Undo Ctrl+Z} \BR undoes the last editing action in the
+ translation pane.
+ \i \e {Redo Ctrl+Y} \BR redoes the last editing action in the
+ translation pane.
+ \i \e {Cut Ctrl+X} \BR deletes any highlighted text in the
+ translation pane and saves a copy to the clipboard.
+ \i \e {Copy Ctrl+C} \BR copies the highlighted text in the
+ translation pane to the clipboard.
+ \i \e {Paste Ctrl+V} \BR pastes the clipboard text into the
+ translation pane.
+\omit
+ \i \e {Delete} \BR deletes the highlighted text in the
+ translation pane.
+\endomit
+ \i \e {Select All Ctrl+A} \BR selects all the text in the
+ translation pane ready for copying or deleting.
+ \i \e {Find... Ctrl+F} \BR pops up the
+ \link {The Find Dialog} Find dialog \endlink. When the dialog pops up
+ enter the text to be found and click the \e {Find Next} button.
+ Source phrases, translations and comments may be searched.
+ \i \e {Find Next F3} \BR finds the next occurrence of the text that
+ was last entered in the Find dialog.
+ \endlist
+
+\i \e {Translation}
+ \list
+ \i \e {Prev Unfinished Ctrl+K} \BR moves to the nearest previous
+ unfinished source phrase (unfinished means untranslated or
+ translated but failed validation).
+ \i \e {Next Unfinished Ctrl+L} \BR moves to the next unfinished source
+ phrase.
+ \i \e {Prev Shift+Ctrl+K} \BR moves to the previous source phrase.
+ \i \e {Next Shift+Ctrl+L} \BR moves to the next source phrase.
+ \i \e {Done \& NextCtrl+Enter} \BR mark this phrase as 'done'
+ (translated) and move to the next unfinished source phrase.
+ \i \e {Begin from Source Ctrl+B} \BR copies the source text into
+ the translation.
+ \endlist
+
+\i \e {Validation} (See the \l Validation section)
+ \list
+ \i \e {Accelerators} \BR toggles validation on or off for Alt
+ accelerators.
+ \i \e {Ending Punctuation} \BR switches validation on or off
+ for phrase ending punctuation, e.g. ellipsis, exclamation mark,
+ question mark, etc.
+ \i \e {Phrase Matches} \BR sets validation on or off for
+ matching against translations that are in the current phrase book.
+ \endlist
+
+\i \e {Phrase} (See the section \l {Creating ... Phrase
+Books} for details.)
+ \list
+ \i \e {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.
+ \i \e {Open Phrase Book... Ctrl+H} \BR pops up an open file dialog.
+ Find and choose a phrase book to open.
+ \i \e {Close Phrase Book} \BR closes the current phrase book.
+ This will stop any further phrase validation taking place.
+ The same effect can be achieved by switching off phrase validation
+ using the Validation menu or the phrase toolbar button.
+ \i \e {Edit Phrase Book...} \BR pops up the
+ \link {The Phrase Dialog} phrase book dialog \endlink where you can
+ add, edit or delete phrases.
+ \i \e {Print Phrase Book...} \BR pops up a print dialog. If
+ you click OK the phrase book will be printed.
+ \endlist
+
+\i \e {View}
+ \list
+ \i \e {Revert Sorting} \BR puts the phrases in the source text
+ pane into their original order.
+ \i \e {Display Guesses} \BR turns the display of phrases and
+ guesses on or off.
+ \i \e {Statistics} \BR toggles the visibility of the Statistics dialog.
+ \i \e {Views} \BR toggles the visibility of the Context, Source text and
+ Phrase views.
+ \i \e {Toolbars} \BR toggles the visibility of the different toolbars.
+\omit
+ \i \e {Large Icons} \BR switches between large or standard
+ size icons on the toolbar.
+ \i \e {Text Labels} \BR toggles the use of text labels on the
+ toolbar icons.
+\endomit
+ \endlist
+
+\endlist
+
+\section2 The Toolbar
+
+\img toolbar.png
+\caption Toolbar
+
+\list
+\i \img fileopen.png
+\BR
+Pops up the open file dialog to open a new translation source \c .ts
+file.
+
+\i \img filesave.png
+\BR
+Saves the current translation source \c .ts file.
+
+\i \img fileprint.png
+\BR
+Prints the current translation source \c .ts file.
+
+\i \img phrasebookopen.png
+\BR
+Pops up the file open dialog to open a new phrase book \c .qph file.
+
+\i \img editundo.png
+\BR
+Undoes the last editing action in the translation pane.
+
+\i \img editredo.png
+\BR
+Redoes the last editing action in the translation pane.
+
+\i \img editcut.png
+\BR
+Deletes any highlighted text in the translation pane and save a copy to
+the clipboard.
+
+\i \img editcopy.png
+\BR
+Copies the highlighted text in the translation pane to the clipboard.
+
+\i \img editpaste.png
+\BR
+Pastes the clipboard text into the translation pane.
+
+\i \img editfind.png
+\BR
+Pops up the \link {The Find Dialog} Find dialog \endlink.
+
+\i \img prev.png
+\BR
+Moves to the previous source phrase.
+
+\i \img next.png
+\BR
+Moves to the next source phrase.
+
+\i \img prevunfinished.png
+\BR
+Moves to the previous unfinished source phrase.
+
+\i \img nextunfinished.png
+\BR
+Moves to the next unfinished source phrase.
+
+\i \img doneandnext.png
+\BR
+Marks the phrase as 'done' (translated) and move to the next
+unfinished source phrase.
+
+\i \img validateaccelerators.png
+\BR
+Toggles accelerator validation on and off.
+
+\i \img validatepunctuation.png
+\BR
+Toggles phrase ending punctuation validation on and off.
+
+\i \img validatephrases.png
+\BR
+Toggles phrase book validation on or off.
+\endlist
+
+\section2 The Find Dialog
+
+\img finddialog.png
+\caption The Find Dialog
+
+Choose \Menu Edit|Find from the menu bar or press \Key Ctrl+F to pop
+up the Find dialog. Press \Key F3 to repeat the last search. By
+default the source phrases, translations and comments will all be
+searched and the search will be case-insensitive. These settings can
+be changed by checking or unchecking the checkboxes to reflect your
+preferences.
+
+\section2 The Phrase Dialog
+
+This dialog is explained in the \l {Creating and Using Phrase Books}
+section.
diff --git a/tools/linguist/linguist.pro b/tools/linguist/linguist.pro
new file mode 100644
index 0000000..3f1f286
--- /dev/null
+++ b/tools/linguist/linguist.pro
@@ -0,0 +1,11 @@
+TEMPLATE = subdirs
+SUBDIRS = linguist \
+ tutorial/tt1 \
+ tutorial/tt2 \
+ tutorial/tt3 \
+ lrelease \
+ lupdate \
+ qm2ts
+CONFIG += ordered
+
+REQUIRES=full-config nocrosscompiler
diff --git a/tools/linguist/linguist/about.ui b/tools/linguist/linguist/about.ui
new file mode 100644
index 0000000..b2fb6b4
--- /dev/null
+++ b/tools/linguist/linguist/about.ui
@@ -0,0 +1,223 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AboutDialog</class>
+<comment>*********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AboutDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>484</width>
+ <height>640</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Qt Linguist</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>PixmapLabel1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="pixmap">
+ <pixmap>splash.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>versionLabel</cstring>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Copyright (C) 2000-2008 Trolltech ASA. All Rights Reserved.</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;Qt Commercial Edition license holders: This program is licensed to you under the terms of the Qt Commercial License Agreement. For details, see the file LICENSE that came with this software distribution.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Qt Open Source Edition users: This program is licensed to you under the terms of the GNU General Public License Version 2. For details, see the file LICENSE.GPL that came with this software distribution.&lt;/p&gt;&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter|AlignLeft</set>
+ </property>
+ <property name="wordwrap" stdset="0">
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>AboutDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot access="protected">init()</slot>
+ <slot access="protected">destroy()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/linguist/linguist/finddialog.cpp b/tools/linguist/linguist/finddialog.cpp
new file mode 100644
index 0000000..385bd31
--- /dev/null
+++ b/tools/linguist/linguist/finddialog.cpp
@@ -0,0 +1,183 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+/* TRANSLATOR FindDialog
+
+ Choose Edit|Find from the menu bar or press Ctrl+F to pop up the
+ Find dialog
+*/
+
+#include "finddialog.h"
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+
+FindDialog::FindDialog( bool replace, QWidget *parent, const char *name,
+ bool modal )
+ : QDialog( parent, name, modal )
+{
+ sourceText = 0;
+
+ led = new QLineEdit( this, "find line edit" );
+ QLabel *findWhat = new QLabel( led, tr("Fi&nd what:"), this, "find what" );
+ QLabel *replaceWith = 0;
+ QPushButton *findNxt = new QPushButton( tr("&Find Next"), this,
+ "find next" );
+ findNxt->setDefault( TRUE );
+ connect( findNxt, SIGNAL(clicked()), this, SLOT(emitFindNext()) );
+ QPushButton *cancel = new QPushButton( tr("Cancel"), this, "cancel find" );
+ connect( cancel, SIGNAL(clicked()), this, SLOT(reject()) );
+
+ QVBoxLayout *bl = new QVBoxLayout( 6, "find button layout" );
+ bl->addWidget( findNxt );
+
+ matchCase = new QCheckBox( tr("&Match case"), this, "find match case" );
+ matchCase->setChecked( FALSE );
+
+ if ( replace ) {
+ QWhatsThis::add( this, tr("This window allows you to search and replace"
+ " some text in the translations.") );
+
+ red = new QLineEdit( this, "replace line edit" );
+ replaceWith = new QLabel( red, tr("Replace &with:"), this,
+ "replace with" );
+ setTabOrder( led, red );
+
+ QPushButton *replace = new QPushButton( tr("&Replace"), this,
+ "replace" );
+ connect( replace, SIGNAL(clicked()), this, SLOT(emitReplace()) );
+ QPushButton *replaceAll = new QPushButton( tr("Replace &All"), this,
+ "replace all" );
+ connect( replaceAll, SIGNAL(clicked()), this, SLOT(emitReplaceAll()) );
+ setTabOrder( findNxt, replace );
+ setTabOrder( replace, replaceAll );
+ setTabOrder( replaceAll, cancel );
+
+ QWhatsThis::add( replace, tr("Click here to replace the next occurrence"
+ " of the text you typed in.") );
+ QWhatsThis::add( replaceAll, tr("Click here to replace all occurrences"
+ " of the text you typed in.") );
+
+ bl->addWidget( replace );
+ bl->addWidget( replaceAll );
+
+ QGridLayout *gl = new QGridLayout( this, 4, 3, 11, 11,
+ "find outer layout" );
+ gl->addWidget( findWhat, 0, 0 );
+ gl->addWidget( led, 0, 1 );
+ gl->addWidget( replaceWith, 1, 0 );
+ gl->addWidget( red, 1, 1 );
+ gl->addMultiCellWidget( matchCase, 2, 2, 0, 1 );
+ gl->addMultiCell( bl, 0, 3, 3, 3 );
+ } else {
+ QWhatsThis::add( this, tr("This window allows you to search for some"
+ " text in the translation source file.") );
+
+ sourceText = new QCheckBox( tr("&Source texts"), this,
+ "find in source texts" );
+ sourceText->setChecked( TRUE );
+ translations = new QCheckBox( tr("&Translations"), this,
+ "find in translations" );
+ translations->setChecked( TRUE );
+ comments = new QCheckBox( tr("&Comments"), this, "find in comments" );
+ comments->setChecked( TRUE );
+
+ QWhatsThis::add( sourceText, tr("Source texts are searched when"
+ " checked.") );
+ QWhatsThis::add( translations, tr("Translations are searched when"
+ " checked.") );
+ QWhatsThis::add( comments, tr("Comments and contexts are searched when"
+ " checked.") );
+
+ QVBoxLayout *cl = new QVBoxLayout( 6, "find checkbox layout" );
+
+ QGridLayout *gl = new QGridLayout( this, 3, 4, 11, 11,
+ "find outer layout" );
+ gl->addWidget( findWhat, 0, 0 );
+ gl->addMultiCellWidget( led, 0, 0, 1, 2 );
+ gl->addWidget( matchCase, 1, 2 );
+ gl->addMultiCell( bl, 0, 2, 3, 3 );
+ gl->addMultiCell( cl, 1, 2, 0, 1 );
+ gl->setColStretch( 0, 0 );
+ gl->addColSpacing( 1, 40 );
+ gl->setColStretch( 2, 1 );
+ gl->setColStretch( 3, 0 );
+
+ cl->addWidget( sourceText );
+ cl->addWidget( translations );
+ cl->addWidget( comments );
+ cl->addStretch( 1 );
+ }
+
+ QWhatsThis::add( led, tr("Type in the text to search for.") );
+
+ QWhatsThis::add( matchCase, tr("Texts such as 'TeX' and 'tex' are"
+ " considered as different when checked.") );
+ QWhatsThis::add( findNxt, tr("Click here to find the next occurrence of the"
+ " text you typed in.") );
+ QWhatsThis::add( cancel, tr("Click here to close this window.") );
+
+ bl->addWidget( cancel );
+ bl->addStretch( 1 );
+
+ resize( 400, 1 );
+ setMaximumHeight( height() );
+
+ led->setFocus();
+}
+
+void FindDialog::emitFindNext()
+{
+ int where;
+ if ( sourceText != 0 )
+ where = ( sourceText->isChecked() ? SourceText : 0 ) |
+ ( translations->isChecked() ? Translations : 0 ) |
+ ( comments->isChecked() ? Comments : 0 );
+ else
+ where = Translations;
+ emit findNext( led->text(), where, matchCase->isChecked() );
+}
+
+void FindDialog::emitReplace()
+{
+ emit replace( led->text(), red->text(), matchCase->isChecked(), FALSE );
+}
+
+void FindDialog::emitReplaceAll()
+{
+ emit replace( led->text(), red->text(), matchCase->isChecked(), TRUE );
+}
diff --git a/tools/linguist/linguist/finddialog.h b/tools/linguist/linguist/finddialog.h
new file mode 100644
index 0000000..5d06e8e
--- /dev/null
+++ b/tools/linguist/linguist/finddialog.h
@@ -0,0 +1,68 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef FINDDIALOG_H
+#define FINDDIALOG_H
+
+#include <qdialog.h>
+
+class QCheckBox;
+class QLineEdit;
+
+class FindDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ enum { SourceText = 0x1, Translations = 0x2, Comments = 0x4 };
+
+ FindDialog( bool replace, QWidget *parent = 0, const char *name = 0, bool modal = FALSE );
+
+signals:
+ void findNext( const QString& text, int where, bool matchCase );
+ void replace( const QString& before, const QString& after, bool matchCase, bool all );
+
+private slots:
+ void emitFindNext();
+ void emitReplace();
+ void emitReplaceAll();
+
+private:
+ QLineEdit *led;
+ QLineEdit *red;
+ QCheckBox *sourceText;
+ QCheckBox *translations;
+ QCheckBox *comments;
+ QCheckBox *matchCase;
+};
+
+#endif
diff --git a/tools/linguist/linguist/images/accelerator.png b/tools/linguist/linguist/images/accelerator.png
new file mode 100644
index 0000000..173adb4
--- /dev/null
+++ b/tools/linguist/linguist/images/accelerator.png
Binary files differ
diff --git a/tools/linguist/linguist/images/appicon.png b/tools/linguist/linguist/images/appicon.png
new file mode 100644
index 0000000..90e143b
--- /dev/null
+++ b/tools/linguist/linguist/images/appicon.png
Binary files differ
diff --git a/tools/linguist/linguist/images/book.png b/tools/linguist/linguist/images/book.png
new file mode 100644
index 0000000..dd850ab
--- /dev/null
+++ b/tools/linguist/linguist/images/book.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_accelerator.png b/tools/linguist/linguist/images/d_accelerator.png
new file mode 100644
index 0000000..eaa2be6
--- /dev/null
+++ b/tools/linguist/linguist/images/d_accelerator.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_book.png b/tools/linguist/linguist/images/d_book.png
new file mode 100644
index 0000000..b61d611
--- /dev/null
+++ b/tools/linguist/linguist/images/d_book.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_doneandnext.png b/tools/linguist/linguist/images/d_doneandnext.png
new file mode 100644
index 0000000..e3a3fe1
--- /dev/null
+++ b/tools/linguist/linguist/images/d_doneandnext.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_editcopy.png b/tools/linguist/linguist/images/d_editcopy.png
new file mode 100644
index 0000000..578b591
--- /dev/null
+++ b/tools/linguist/linguist/images/d_editcopy.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_editcut.png b/tools/linguist/linguist/images/d_editcut.png
new file mode 100644
index 0000000..8d50ae0
--- /dev/null
+++ b/tools/linguist/linguist/images/d_editcut.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_editpaste.png b/tools/linguist/linguist/images/d_editpaste.png
new file mode 100644
index 0000000..78cab10
--- /dev/null
+++ b/tools/linguist/linguist/images/d_editpaste.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_fileopen.png b/tools/linguist/linguist/images/d_fileopen.png
new file mode 100644
index 0000000..ddbd33d
--- /dev/null
+++ b/tools/linguist/linguist/images/d_fileopen.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_filesave.png b/tools/linguist/linguist/images/d_filesave.png
new file mode 100644
index 0000000..5d1476d
--- /dev/null
+++ b/tools/linguist/linguist/images/d_filesave.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_next.png b/tools/linguist/linguist/images/d_next.png
new file mode 100644
index 0000000..f455e1f
--- /dev/null
+++ b/tools/linguist/linguist/images/d_next.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_nextunfinished.png b/tools/linguist/linguist/images/d_nextunfinished.png
new file mode 100644
index 0000000..c2b06ec
--- /dev/null
+++ b/tools/linguist/linguist/images/d_nextunfinished.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_phrase.png b/tools/linguist/linguist/images/d_phrase.png
new file mode 100644
index 0000000..acdd253
--- /dev/null
+++ b/tools/linguist/linguist/images/d_phrase.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_prev.png b/tools/linguist/linguist/images/d_prev.png
new file mode 100644
index 0000000..a68fe54
--- /dev/null
+++ b/tools/linguist/linguist/images/d_prev.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_prevunfinished.png b/tools/linguist/linguist/images/d_prevunfinished.png
new file mode 100644
index 0000000..ce956a7
--- /dev/null
+++ b/tools/linguist/linguist/images/d_prevunfinished.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_print.png b/tools/linguist/linguist/images/d_print.png
new file mode 100644
index 0000000..b2791a7
--- /dev/null
+++ b/tools/linguist/linguist/images/d_print.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_punctuation.png b/tools/linguist/linguist/images/d_punctuation.png
new file mode 100644
index 0000000..8eebab8
--- /dev/null
+++ b/tools/linguist/linguist/images/d_punctuation.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_redo.png b/tools/linguist/linguist/images/d_redo.png
new file mode 100644
index 0000000..6e993cc
--- /dev/null
+++ b/tools/linguist/linguist/images/d_redo.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_s_check_danger.png b/tools/linguist/linguist/images/d_s_check_danger.png
new file mode 100644
index 0000000..3fadeb1
--- /dev/null
+++ b/tools/linguist/linguist/images/d_s_check_danger.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_s_check_obs.png b/tools/linguist/linguist/images/d_s_check_obs.png
new file mode 100644
index 0000000..4836e2f
--- /dev/null
+++ b/tools/linguist/linguist/images/d_s_check_obs.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_s_check_off.png b/tools/linguist/linguist/images/d_s_check_off.png
new file mode 100644
index 0000000..58f7fb6
--- /dev/null
+++ b/tools/linguist/linguist/images/d_s_check_off.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_s_check_on.png b/tools/linguist/linguist/images/d_s_check_on.png
new file mode 100644
index 0000000..4836e2f
--- /dev/null
+++ b/tools/linguist/linguist/images/d_s_check_on.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_searchfind.png b/tools/linguist/linguist/images/d_searchfind.png
new file mode 100644
index 0000000..e85e33f
--- /dev/null
+++ b/tools/linguist/linguist/images/d_searchfind.png
Binary files differ
diff --git a/tools/linguist/linguist/images/d_undo.png b/tools/linguist/linguist/images/d_undo.png
new file mode 100644
index 0000000..22ac97f
--- /dev/null
+++ b/tools/linguist/linguist/images/d_undo.png
Binary files differ
diff --git a/tools/linguist/linguist/images/doneandnext.png b/tools/linguist/linguist/images/doneandnext.png
new file mode 100644
index 0000000..1cf8888
--- /dev/null
+++ b/tools/linguist/linguist/images/doneandnext.png
Binary files differ
diff --git a/tools/linguist/linguist/images/editcopy.png b/tools/linguist/linguist/images/editcopy.png
new file mode 100644
index 0000000..804c98c
--- /dev/null
+++ b/tools/linguist/linguist/images/editcopy.png
Binary files differ
diff --git a/tools/linguist/linguist/images/editcut.png b/tools/linguist/linguist/images/editcut.png
new file mode 100644
index 0000000..a911482
--- /dev/null
+++ b/tools/linguist/linguist/images/editcut.png
Binary files differ
diff --git a/tools/linguist/linguist/images/editpaste.png b/tools/linguist/linguist/images/editpaste.png
new file mode 100644
index 0000000..1938141
--- /dev/null
+++ b/tools/linguist/linguist/images/editpaste.png
Binary files differ
diff --git a/tools/linguist/linguist/images/fileopen.png b/tools/linguist/linguist/images/fileopen.png
new file mode 100644
index 0000000..3005290
--- /dev/null
+++ b/tools/linguist/linguist/images/fileopen.png
Binary files differ
diff --git a/tools/linguist/linguist/images/filesave.png b/tools/linguist/linguist/images/filesave.png
new file mode 100644
index 0000000..c137165
--- /dev/null
+++ b/tools/linguist/linguist/images/filesave.png
Binary files differ
diff --git a/tools/linguist/linguist/images/next.png b/tools/linguist/linguist/images/next.png
new file mode 100644
index 0000000..4b29ff4
--- /dev/null
+++ b/tools/linguist/linguist/images/next.png
Binary files differ
diff --git a/tools/linguist/linguist/images/nextunfinished.png b/tools/linguist/linguist/images/nextunfinished.png
new file mode 100644
index 0000000..9892b65
--- /dev/null
+++ b/tools/linguist/linguist/images/nextunfinished.png
Binary files differ
diff --git a/tools/linguist/linguist/images/pagecurl.png b/tools/linguist/linguist/images/pagecurl.png
new file mode 100644
index 0000000..2d3f2ff
--- /dev/null
+++ b/tools/linguist/linguist/images/pagecurl.png
Binary files differ
diff --git a/tools/linguist/linguist/images/phrase.png b/tools/linguist/linguist/images/phrase.png
new file mode 100644
index 0000000..d7dfcb5
--- /dev/null
+++ b/tools/linguist/linguist/images/phrase.png
Binary files differ
diff --git a/tools/linguist/linguist/images/prev.png b/tools/linguist/linguist/images/prev.png
new file mode 100644
index 0000000..4e3556c
--- /dev/null
+++ b/tools/linguist/linguist/images/prev.png
Binary files differ
diff --git a/tools/linguist/linguist/images/prevunfinished.png b/tools/linguist/linguist/images/prevunfinished.png
new file mode 100644
index 0000000..a3bed54
--- /dev/null
+++ b/tools/linguist/linguist/images/prevunfinished.png
Binary files differ
diff --git a/tools/linguist/linguist/images/print.png b/tools/linguist/linguist/images/print.png
new file mode 100644
index 0000000..cc083ed
--- /dev/null
+++ b/tools/linguist/linguist/images/print.png
Binary files differ
diff --git a/tools/linguist/linguist/images/punctuation.png b/tools/linguist/linguist/images/punctuation.png
new file mode 100644
index 0000000..849d4a9
--- /dev/null
+++ b/tools/linguist/linguist/images/punctuation.png
Binary files differ
diff --git a/tools/linguist/linguist/images/redo.png b/tools/linguist/linguist/images/redo.png
new file mode 100644
index 0000000..abdad26
--- /dev/null
+++ b/tools/linguist/linguist/images/redo.png
Binary files differ
diff --git a/tools/linguist/linguist/images/s_check_danger.png b/tools/linguist/linguist/images/s_check_danger.png
new file mode 100644
index 0000000..7005304
--- /dev/null
+++ b/tools/linguist/linguist/images/s_check_danger.png
Binary files differ
diff --git a/tools/linguist/linguist/images/s_check_obs.png b/tools/linguist/linguist/images/s_check_obs.png
new file mode 100644
index 0000000..b171b2a
--- /dev/null
+++ b/tools/linguist/linguist/images/s_check_obs.png
Binary files differ
diff --git a/tools/linguist/linguist/images/s_check_off.png b/tools/linguist/linguist/images/s_check_off.png
new file mode 100644
index 0000000..cf45bc0
--- /dev/null
+++ b/tools/linguist/linguist/images/s_check_off.png
Binary files differ
diff --git a/tools/linguist/linguist/images/s_check_on.png b/tools/linguist/linguist/images/s_check_on.png
new file mode 100644
index 0000000..b5238f7
--- /dev/null
+++ b/tools/linguist/linguist/images/s_check_on.png
Binary files differ
diff --git a/tools/linguist/linguist/images/searchfind.png b/tools/linguist/linguist/images/searchfind.png
new file mode 100644
index 0000000..3f369fd
--- /dev/null
+++ b/tools/linguist/linguist/images/searchfind.png
Binary files differ
diff --git a/tools/linguist/linguist/images/splash.png b/tools/linguist/linguist/images/splash.png
new file mode 100644
index 0000000..8e80718
--- /dev/null
+++ b/tools/linguist/linguist/images/splash.png
Binary files differ
diff --git a/tools/linguist/linguist/images/undo.png b/tools/linguist/linguist/images/undo.png
new file mode 100644
index 0000000..839a823
--- /dev/null
+++ b/tools/linguist/linguist/images/undo.png
Binary files differ
diff --git a/tools/linguist/linguist/images/whatsthis.xpm b/tools/linguist/linguist/images/whatsthis.xpm
new file mode 100644
index 0000000..e45dc26
--- /dev/null
+++ b/tools/linguist/linguist/images/whatsthis.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 3 1",
+" c None",
+"o c #000000000000",
+"a c #000000008000",
+/* pixels */
+"o aaaaa ",
+"oo aaa aaa ",
+"ooo aaa aaa",
+"oooo aa aa",
+"ooooo aa aa",
+"oooooo a aaa",
+"ooooooo aaa ",
+"oooooooo aaa ",
+"ooooooooo aaa ",
+"ooooo aaa ",
+"oo ooo ",
+"o ooo aaa ",
+" ooo aaa ",
+" ooo ",
+" ooo ",
+" ooo "};
diff --git a/tools/linguist/linguist/linguist.icns b/tools/linguist/linguist/linguist.icns
new file mode 100644
index 0000000..f51565e
--- /dev/null
+++ b/tools/linguist/linguist/linguist.icns
Binary files differ
diff --git a/tools/linguist/linguist/linguist.ico b/tools/linguist/linguist/linguist.ico
new file mode 100644
index 0000000..2816c7c
--- /dev/null
+++ b/tools/linguist/linguist/linguist.ico
Binary files differ
diff --git a/tools/linguist/linguist/linguist.pro b/tools/linguist/linguist/linguist.pro
new file mode 100644
index 0000000..da4d782
--- /dev/null
+++ b/tools/linguist/linguist/linguist.pro
@@ -0,0 +1,109 @@
+TEMPLATE = app
+LANGUAGE = C++
+CONFIG += qt warn_on
+
+
+SOURCES += finddialog.cpp \
+ main.cpp \
+ msgedit.cpp \
+ phrase.cpp \
+ phrasebookbox.cpp \
+ phraselv.cpp \
+ printout.cpp \
+ simtexth.cpp \
+ trwindow.cpp \
+ listviews.cpp \
+ ../shared/metatranslator.cpp
+HEADERS += finddialog.h \
+ msgedit.h \
+ phrase.h \
+ phrasebookbox.h \
+ phraselv.h \
+ printout.h \
+ trwindow.h \
+ listviews.h \
+ ../shared/metatranslator.h
+
+
+TRANSLATIONS = linguist_de.ts \
+ linguist_fr.ts
+
+DEFINES += QT_INTERNAL_XML
+include( ../../../src/qt_professional.pri )
+
+DESTDIR = ../../../bin
+TARGET = linguist
+
+
+LIBS += -L$$QT_BUILD_TREE/lib -lqassistantclient
+
+win32:RC_FILE = linguist.rc
+
+mac {
+ staticlib:CONFIG -= global_init_link_order #yuck
+ RC_FILE = linguist.icns
+}
+
+PROJECTNAME = Qt Linguist
+
+target.path=$$bins.path
+INSTALLS += target
+
+linguisttranslations.files = *.qm
+linguisttranslations.path = $$translations.path
+INSTALLS += linguisttranslations
+
+phrasebooks.path=$$data.path/phrasebooks
+phrasebooks.files = ../phrasebooks/*
+INSTALLS += phrasebooks
+FORMS = about.ui \
+ statistics.ui
+IMAGES = images/accelerator.png \
+ images/book.png \
+ images/s_check_danger.png \
+ images/s_check_obs.png \
+ images/s_check_off.png \
+ images/s_check_on.png \
+ images/d_s_check_danger.png \
+ images/d_s_check_obs.png \
+ images/d_s_check_off.png \
+ images/d_s_check_on.png \
+ images/d_accelerator.png \
+ images/d_book.png \
+ images/d_doneandnext.png \
+ images/d_editcopy.png \
+ images/d_editcut.png \
+ images/d_editpaste.png \
+ images/d_fileopen.png \
+ images/d_filesave.png \
+ images/d_next.png \
+ images/d_nextunfinished.png \
+ images/d_prev.png \
+ images/d_prevunfinished.png \
+ images/d_phrase.png \
+ images/d_print.png \
+ images/d_punctuation.png \
+ images/d_redo.png \
+ images/d_searchfind.png \
+ images/d_undo.png \
+ images/doneandnext.png \
+ images/editcopy.png \
+ images/editcut.png \
+ images/editpaste.png \
+ images/punctuation.png \
+ images/fileopen.png \
+ images/filesave.png \
+ images/appicon.png \
+ images/next.png \
+ images/nextunfinished.png \
+ images/pagecurl.png \
+ images/phrase.png \
+ images/prev.png \
+ images/prevunfinished.png \
+ images/print.png \
+ images/redo.png \
+ images/searchfind.png \
+ images/splash.png \
+ images/undo.png \
+ images/whatsthis.xpm
+INCLUDEPATH += ../shared
diff --git a/tools/linguist/linguist/linguist.rc b/tools/linguist/linguist/linguist.rc
new file mode 100644
index 0000000..865e021
--- /dev/null
+++ b/tools/linguist/linguist/linguist.rc
@@ -0,0 +1 @@
+IDI_ICON1 ICON DISCARDABLE "linguist.ico"
diff --git a/tools/linguist/linguist/linguist_de.ts b/tools/linguist/linguist/linguist_de.ts
new file mode 100644
index 0000000..06d818b
--- /dev/null
+++ b/tools/linguist/linguist/linguist_de.ts
@@ -0,0 +1,993 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>AboutDialog</name>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2000-2008 Trolltech ASA. All Rights Reserved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;This program is licensed to you under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation. This gives you legal permission to copy, distribute and/or modify this software under certain conditions. For details, see the file &apos;LICENSE.GPL&apos; that came with this software distribution. If you did not get the file, send email to info@trolltech.com.&lt;/p&gt;
+&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditorPage</name>
+ <message>
+ <source>Source text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FindDialog</name>
+ <comment>Choose Edit|Find from the menu bar or press Ctrl+F to pop up the Find dialog</comment>
+ <message>
+ <source>Fi&amp;nd what:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Find Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Match case</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This window allows you to search and replace some text in the translations.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace &amp;with:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to replace the next occurrence of the text you typed in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to replace all occurrences of the text you typed in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This window allows you to search for some text in the translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Source texts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Translations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Comments</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source texts are searched when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translations are searched when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Comments and contexts are searched when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type in the text to search for.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Texts such as &apos;TeX&apos; and &apos;tex&apos; are considered as different when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to find the next occurrence of the text you typed in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to close this window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageEditor</name>
+ <message>
+ <source>bell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>backspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>carriage return</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>tab</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrases</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrases and guesses:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This whole panel allows you to view and edit the translation of some source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This area shows the source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This area shows a comment that may guide you, and the context in which the text occurs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is where you can enter or modify the translation of some source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Guess</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Guess (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PageCurl</name>
+ <message>
+ <source>Next unfinished phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Previous unfinished phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PhraseBookBox</name>
+ <comment>Go to Phrase &gt; Edit Phrase Book... The dialog that pops up is a PhraseBookBox.</comment>
+ <message>
+ <source>S&amp;ource phrase:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Translation:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Definition:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove Phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This window allows you to add, modify, or delete phrases in a phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is the phrase in the source language.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is the phrase in the target language corresponding to the source phrase.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a definition for the source phrase.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to add the phrase to the phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to remove the phrase from the phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to save the changes made.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to close this window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot save phrase book &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PhraseLV</name>
+ <comment>The phrase list in the right panel of the main window (with Source phrase, Target phrase, and Definition in its header) is a PhraseLV object.</comment>
+ <message>
+ <source>(New Phrase)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a list of phrase entries relevant to the source text. Each phrase is supplemented with a suggested translation and a definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;u&gt;%1:&lt;/u&gt;&amp;nbsp;&amp;nbsp;%2&lt;/p&gt;&lt;p&gt;&lt;u&gt;%3:&lt;/u&gt;&amp;nbsp;&amp;nbsp;%4&lt;/p&gt;&lt;p&gt;&lt;u&gt;%5:&lt;/u&gt;&amp;nbsp;&amp;nbsp;%6&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrWindow</name>
+ <comment>This is the application&apos;s main window.</comment>
+ <message>
+ <source>Context</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MOD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This panel lists the source contexts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This panel lists the source texts. Items that violate validation rules are marked with a warning.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 source phrase(s) loaded.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt translation source (*.ts)
+All files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File saved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot save &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt message files for released applications (*.qm)
+All files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File created.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Context: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>finished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unresolved</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>obsolete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing... (page %1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing completed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search wrapped.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot find the string &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt phrase books (*.qph)
+All files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create New Phrase Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A file called &apos;%1&apos; already exists. Please choose another name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrase book created.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 phrase(s) loaded.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 - %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you want to save &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Linguist by Trolltech</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No phrase to translate.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No untranslated phrases left.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>V&amp;alidation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Phrases</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Release...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+P</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re&amp;cently opened files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Y</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+X</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find &amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Prev Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>P&amp;rev</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ne&amp;xt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done and &amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Enter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Return</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Begin from Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close Phrase Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ending Punctuation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Phrase Matches</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Revert Sorting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Display guesses</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Vie&amp;ws</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Toolbars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a Qt translation source file (TS file) for editing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes made to this Qt translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes made to this Qt translationsource file into a new file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create a Qt message file suitable for released applications from the current message file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print a list of all the phrases in the current Qt translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close this window and exit.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo the last editing operation performed on the translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo an undone editing operation performed on the translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy the selected translation text to the clipboard and deletes it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy the selected translation text to the clipboard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste the clipboard text into the translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select the whole translation text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search for some text in the translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Continue the search where it was left.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search for some text in the translation source file and replace it by another text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create a new phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a phrase book to assist translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle validity checks of accelerators.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle validity checks of ending punctuation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle checking that phrase suggestions are used.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort the items back in the same order as in the message file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set whether or not to display translation guesses.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display the manual for %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display information about %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display information about the Qt toolkit by Trolltech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter What&apos;s This? mode.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copies the source text into the translation field.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the next item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the previous item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the next unfinished item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the previous unfinished item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Marks this item as done and moves to the next unfinished item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Validation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open Phrase Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prev</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prev Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done and Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punctuation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrases</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot read from phrase book &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close this phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow you to add, modify, or delete phrases of this phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print the entries of the phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot create phrase book &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accelerator possibly superfluous in translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accelerator possibly missing in translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation does not end with the same punctuation as the source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A phrase book suggestion for &apos;%1&apos; was ignored.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/tools/linguist/linguist/linguist_fr.ts b/tools/linguist/linguist/linguist_fr.ts
new file mode 100644
index 0000000..06d818b
--- /dev/null
+++ b/tools/linguist/linguist/linguist_fr.ts
@@ -0,0 +1,993 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>AboutDialog</name>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2000-2008 Trolltech ASA. All Rights Reserved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;This program is licensed to you under the terms of the GNU General Public License Version 2 as published by the Free Software Foundation. This gives you legal permission to copy, distribute and/or modify this software under certain conditions. For details, see the file &apos;LICENSE.GPL&apos; that came with this software distribution. If you did not get the file, send email to info@trolltech.com.&lt;/p&gt;
+&lt;p&gt;The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>EditorPage</name>
+ <message>
+ <source>Source text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FindDialog</name>
+ <comment>Choose Edit|Find from the menu bar or press Ctrl+F to pop up the Find dialog</comment>
+ <message>
+ <source>Fi&amp;nd what:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Find Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Match case</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This window allows you to search and replace some text in the translations.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace &amp;with:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to replace the next occurrence of the text you typed in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to replace all occurrences of the text you typed in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This window allows you to search for some text in the translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Source texts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Translations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Comments</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source texts are searched when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translations are searched when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Comments and contexts are searched when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type in the text to search for.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Texts such as &apos;TeX&apos; and &apos;tex&apos; are considered as different when checked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to find the next occurrence of the text you typed in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to close this window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageEditor</name>
+ <message>
+ <source>bell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>backspace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new page</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>new line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>carriage return</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>tab</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrases</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrases and guesses:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This whole panel allows you to view and edit the translation of some source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This area shows the source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This area shows a comment that may guide you, and the context in which the text occurs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is where you can enter or modify the translation of some source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Guess</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Guess (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PageCurl</name>
+ <message>
+ <source>Next unfinished phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Previous unfinished phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PhraseBookBox</name>
+ <comment>Go to Phrase &gt; Edit Phrase Book... The dialog that pops up is a PhraseBookBox.</comment>
+ <message>
+ <source>S&amp;ource phrase:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Translation:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Definition:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove Phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This window allows you to add, modify, or delete phrases in a phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is the phrase in the source language.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is the phrase in the target language corresponding to the source phrase.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a definition for the source phrase.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to add the phrase to the phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to remove the phrase from the phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to save the changes made.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click here to close this window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot save phrase book &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>PhraseLV</name>
+ <comment>The phrase list in the right panel of the main window (with Source phrase, Target phrase, and Definition in its header) is a PhraseLV object.</comment>
+ <message>
+ <source>(New Phrase)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is a list of phrase entries relevant to the source text. Each phrase is supplemented with a suggested translation and a definition.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;&lt;u&gt;%1:&lt;/u&gt;&amp;nbsp;&amp;nbsp;%2&lt;/p&gt;&lt;p&gt;&lt;u&gt;%3:&lt;/u&gt;&amp;nbsp;&amp;nbsp;%4&lt;/p&gt;&lt;p&gt;&lt;u&gt;%5:&lt;/u&gt;&amp;nbsp;&amp;nbsp;%6&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Source phrase</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Definition</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TrWindow</name>
+ <comment>This is the application&apos;s main window.</comment>
+ <message>
+ <source>Context</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Items</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MOD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Linguist</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This panel lists the source contexts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This panel lists the source texts. Items that violate validation rules are marked with a warning.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Loading...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 source phrase(s) loaded.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt translation source (*.ts)
+All files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File saved.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot save &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt message files for released applications (*.qm)
+All files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File created.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Context: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>finished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unresolved</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>obsolete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing... (page %1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing completed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Printing aborted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search wrapped.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot find the string &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt phrase books (*.qph)
+All files (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create New Phrase Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A file called &apos;%1&apos; already exists. Please choose another name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrase book created.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 phrase(s) loaded.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 - %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you want to save &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Qt Linguist by Trolltech</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No phrase to translate.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No untranslated phrases left.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>V&amp;alidation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Phrases</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save &amp;As...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Release...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+P</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re&amp;cently opened files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Z</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Y</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+X</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select &amp;All</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Find...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+F</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find &amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Prev Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Next Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>P&amp;rev</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ne&amp;xt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Shift+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done and &amp;Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Enter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Return</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Begin from Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;New Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Open Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close Phrase Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Print Phrase Book...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ending Punctuation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Phrase Matches</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Revert Sorting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Display guesses</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Vie&amp;ws</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Toolbars</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a Qt translation source file (TS file) for editing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes made to this Qt translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save changes made to this Qt translationsource file into a new file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create a Qt message file suitable for released applications from the current message file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print a list of all the phrases in the current Qt translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close this window and exit.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo the last editing operation performed on the translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo an undone editing operation performed on the translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy the selected translation text to the clipboard and deletes it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy the selected translation text to the clipboard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste the clipboard text into the translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select the whole translation text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search for some text in the translation source file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Continue the search where it was left.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Search for some text in the translation source file and replace it by another text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create a new phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a phrase book to assist translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle validity checks of accelerators.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle validity checks of ending punctuation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Toggle checking that phrase suggestions are used.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sort the items back in the same order as in the message file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set whether or not to display translation guesses.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display the manual for %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display information about %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display information about the Qt toolkit by Trolltech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter What&apos;s This? mode.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copies the source text into the translation field.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the next item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the previous item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the next unfinished item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Moves to the previous unfinished item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Marks this item as done and moves to the next unfinished item.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Validation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open Phrase Book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cut</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Paste</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prev</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prev Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next Unfinished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Done and Next</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accelerators</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Punctuation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phrases</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot read from phrase book &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close this phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow you to add, modify, or delete phrases of this phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Print the entries of the phrase book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot create phrase book &apos;%1&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accelerator possibly superfluous in translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accelerator possibly missing in translation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translation does not end with the same punctuation as the source text.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A phrase book suggestion for &apos;%1&apos; was ignored.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/tools/linguist/linguist/listviews.cpp b/tools/linguist/linguist/listviews.cpp
new file mode 100644
index 0000000..6bf67fd
--- /dev/null
+++ b/tools/linguist/linguist/listviews.cpp
@@ -0,0 +1,350 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "listviews.h"
+
+#include <qpainter.h>
+
+static const int Text0MaxLen = 150;
+static const int Text1MaxLen = 150;
+
+/*
+ LVI implementation
+*/
+
+static QString rho( int n )
+{
+ QString s;
+ s.sprintf( "%.10d", n );
+ return s;
+}
+
+int LVI::count = 0;
+
+LVI::LVI( QListView * parent, QString text )
+ : QListViewItem( parent, text )
+{
+ setText( 0, rho(count++) );
+}
+
+LVI::LVI( QListViewItem * parent, QString text )
+ : QListViewItem( parent, text )
+{
+ setText( 0, rho(count++) );
+}
+
+/*
+ This is a cut-down version of QListViewItem::paintCell() -
+ it is needed to produce the effect we want on obsolete items
+ */
+void LVI::drawObsoleteText( QPainter * p, const QColorGroup & cg, int column,
+ int width, int align )
+{
+ QListView * lv = listView();
+ int marg = lv ? lv->itemMargin() : 1;
+ int r = marg;
+ p->fillRect( 0, 0, width, height(), cg.brush( QColorGroup::Base ) );
+ if ( isSelected() && (column==0 || listView()->allColumnsShowFocus()) )
+ p->fillRect( r - marg, 0, width - r + marg, height(),
+ cg.brush( QColorGroup::Highlight ) );
+
+ // Do the ellipsis thingy
+ QString t = text( column );
+ QString tmp;
+ int i = 0;
+ if ( p->fontMetrics().width( t ) > width ) {
+ tmp = "...";
+ while ( p->fontMetrics().width( tmp + t[i] ) < width )
+ tmp += t[ i++ ];
+ tmp.remove( (uint)0, 3 );
+ if ( tmp.isEmpty() )
+ tmp = t.left( 1 );
+ tmp += "...";
+ t = tmp;
+ }
+ if ( isSelected() )
+ p->setPen( lv->palette().disabled().highlightedText() );
+ else
+ p->setPen( lv->palette().disabled().text() );
+
+ if ( !t.isEmpty() ) {
+ p->drawText( r, 0, width-marg-r, height(),
+ align | AlignVCenter | SingleLine, t );
+ }
+
+}
+
+int LVI::compare( QListViewItem *other, int column, bool ascending ) const
+{
+ QString thisKey = key( column, ascending );
+ QString otherKey = other->key( column, ascending );
+
+ if ( thisKey.contains('&') || otherKey.contains('&') ) {
+ QString nicerThisKey = thisKey;
+ QString nicerOtherKey = otherKey;
+
+ nicerThisKey.replace( "&", "" );
+ nicerOtherKey.replace( "&", "" );
+
+ int delta = nicerThisKey.localeAwareCompare( nicerOtherKey );
+ if ( delta != 0 )
+ return delta;
+ }
+ return thisKey.localeAwareCompare( otherKey );
+}
+
+static QString fixEllipsis( const QString & str, int len )
+{
+ QString shortened = str.simplifyWhiteSpace();
+ if ( (int) shortened.length() > len ) {
+ QString dots = TrWindow::tr( "..." );
+ shortened.truncate( len - dots.length() );
+ shortened.append( dots );
+ }
+ return shortened;
+}
+
+/*
+ MessageLVI implementation
+*/
+MessageLVI::MessageLVI( QListView *parent,
+ const MetaTranslatorMessage & message,
+ const QString& text, const QString& comment,
+ ContextLVI * c )
+ : LVI( parent ), m( message ), tx( text ), com( comment ), ctxt( c )
+{
+ if ( m.translation().isEmpty() ) {
+ QString t = "";
+ m.setTranslation( t );
+ }
+ setText( 1, fixEllipsis( text, Text0MaxLen ) );
+ fini = TRUE;
+ d = FALSE;
+
+ if( m.type() == MetaTranslatorMessage::Unfinished )
+ setFinished( FALSE );
+}
+
+void MessageLVI::updateTranslationText()
+{
+ setText( 2, fixEllipsis( m.translation(), Text1MaxLen ) );
+}
+
+void MessageLVI::paintCell( QPainter * p, const QColorGroup & cg, int column,
+ int width, int align )
+{
+ if ( column == 0 ) {
+ int x = (width/2) - TrWindow::pxOn->width()/2;
+ int y = (height()/2) - TrWindow::pxOn->height()/2;
+
+ int marg = listView() ? listView()->itemMargin() : 1;
+ int r = marg;
+
+ if ( isSelected() )
+ p->fillRect( r - marg, 0, width - r + marg, height(),
+ cg.brush( QColorGroup::Highlight ) );
+ else
+ p->fillRect( 0, 0, width, height(),
+ cg.brush( QColorGroup::Base ) );
+
+ if ( m.type() == MetaTranslatorMessage::Unfinished && danger() )
+ p->drawPixmap( x, y, *TrWindow::pxDanger );
+ else if ( m.type() == MetaTranslatorMessage::Finished )
+ p->drawPixmap( x, y, *TrWindow::pxOn );
+ else if ( m.type() == MetaTranslatorMessage::Unfinished )
+ p->drawPixmap( x, y, *TrWindow::pxOff );
+ else if ( m.type() == MetaTranslatorMessage::Obsolete )
+ p->drawPixmap( x, y, *TrWindow::pxObsolete );
+ } else {
+ if ( m.type() == MetaTranslatorMessage::Obsolete )
+ drawObsoleteText( p, cg, column, width, align );
+ else
+ QListViewItem::paintCell( p, cg, column, width, align );
+ }
+}
+
+
+void MessageLVI::setTranslation( const QString& translation )
+{
+ m.setTranslation( translation );
+}
+
+void MessageLVI::setFinished( bool finished )
+{
+ if ( !fini && finished ) {
+ m.setType( MetaTranslatorMessage::Finished );
+ repaint();
+ ctxt->decrementUnfinishedCount();
+ } else if ( fini && !finished ) {
+ m.setType( MetaTranslatorMessage::Unfinished );
+ repaint();
+ ctxt->incrementUnfinishedCount();
+ }
+ fini = finished;
+}
+
+void MessageLVI::setDanger( bool danger )
+{
+ if ( !d && danger ) {
+ ctxt->incrementDangerCount();
+ repaint();
+ } else if ( d && !danger ) {
+ ctxt->decrementDangerCount();
+ repaint();
+ }
+ d = danger;
+}
+
+QString MessageLVI::context() const
+{
+ return QString( m.context() );
+}
+
+MetaTranslatorMessage MessageLVI::message() const
+{
+ return m;
+}
+
+/*
+ ContextLVI implementation
+*/
+ContextLVI::ContextLVI( QListView *lv, const QString& context )
+ : LVI( lv ), com( "" )
+{
+ messageItems.setAutoDelete( TRUE );
+
+ unfinishedCount = 0;
+ dangerCount = 0;
+ obsoleteCount = 0;
+ itemCount = 0;
+ setText( 1, context );
+}
+
+void ContextLVI::instantiateMessageItem( QListView * lv, MessageLVI * i )
+{
+ itemCount++;
+ appendMessageItem( lv, i );
+}
+
+void ContextLVI::appendMessageItem( QListView * lv, MessageLVI * i )
+{
+ lv->takeItem( i );
+ messageItems.append( i );
+}
+
+void ContextLVI::updateStatus()
+{
+ QString s;
+ s.sprintf( "%d/%d", itemCount - unfinishedCount - obsoleteCount,
+ itemCount - obsoleteCount );
+ setText( 2, s );
+}
+
+void ContextLVI::paintCell( QPainter * p, const QColorGroup & cg, int column,
+ int width, int align )
+{
+ if ( column == 0 ) {
+ int x = (width/2) - TrWindow::pxOn->width()/2;
+ int y = (height()/2) - TrWindow::pxOn->height()/2;
+
+ int marg = listView() ? listView()->itemMargin() : 1;
+ int r = marg;
+
+ if ( isSelected() )
+ p->fillRect( r - marg, 0, width - r + marg, height(),
+ cg.brush( QColorGroup::Highlight ) );
+ else
+ p->fillRect( 0, 0, width, height(),
+ cg.brush( QColorGroup::Base ) );
+
+ if ( isContextObsolete() )
+ p->drawPixmap( x, y, *TrWindow::pxObsolete );
+ else if ( unfinishedCount == 0 )
+ p->drawPixmap( x, y, *TrWindow::pxOn );
+ else
+ p->drawPixmap( x, y, *TrWindow::pxOff );
+
+ } else {
+ if ( isContextObsolete() )
+ drawObsoleteText( p, cg, column, width, align );
+ else
+ QListViewItem::paintCell( p, cg, column, width, align );
+ }
+}
+
+void ContextLVI::appendToComment( const QString& x )
+{
+ if ( !com.isEmpty() )
+ com += QString( "\n\n" );
+ com += x;
+}
+
+void ContextLVI::incrementUnfinishedCount()
+{
+ if ( unfinishedCount++ == 0 )
+ repaint();
+}
+
+void ContextLVI::decrementUnfinishedCount()
+{
+ if ( --unfinishedCount == 0 )
+ repaint();
+}
+
+void ContextLVI::incrementDangerCount()
+{
+ if ( dangerCount++ == 0 )
+ repaint();
+}
+
+void ContextLVI::decrementDangerCount()
+{
+ if ( --dangerCount == 0 )
+ repaint();
+}
+
+void ContextLVI::incrementObsoleteCount()
+{
+ if ( obsoleteCount++ == 0 )
+ repaint();
+}
+
+bool ContextLVI::isContextObsolete()
+{
+ return (obsoleteCount == itemCount);
+}
+
+QString ContextLVI::fullContext() const
+{
+ return comment().stripWhiteSpace();
+}
diff --git a/tools/linguist/linguist/listviews.h b/tools/linguist/linguist/listviews.h
new file mode 100644
index 0000000..f843aa3
--- /dev/null
+++ b/tools/linguist/linguist/listviews.h
@@ -0,0 +1,135 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef LISTVIEWS_H
+#define LISTVIEWS_H
+
+#include "msgedit.h"
+
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qregexp.h>
+#include <qlistview.h>
+
+class LVI : public QListViewItem
+{
+public:
+ LVI( QListView *parent, QString text = QString::null );
+ LVI( QListViewItem *parent, QString text = QString::null );
+ virtual int compare( QListViewItem *other, int column,
+ bool ascending ) const;
+ virtual bool danger() const { return FALSE; }
+
+protected:
+ void drawObsoleteText( QPainter * p, const QColorGroup & cg, int column,
+ int width, int align );
+
+private:
+ static int count;
+};
+
+class MessageLVI;
+class ContextLVI : public LVI
+{
+public:
+ ContextLVI( QListView *lv, const QString& context );
+
+ virtual bool danger() const { return dangerCount > 0; }
+
+ void appendToComment( const QString& x );
+ void incrementUnfinishedCount();
+ void decrementUnfinishedCount();
+ void incrementDangerCount();
+ void decrementDangerCount();
+ void incrementObsoleteCount();
+ bool isContextObsolete();
+ void updateStatus();
+
+ QString context() const { return text( 1 ); }
+ QString comment() const { return com; }
+ QString fullContext() const;
+ bool finished() const { return unfinishedCount == 0; }
+
+ MessageLVI * firstMessageItem() { return messageItems.first(); }
+ MessageLVI * nextMessageItem() { return messageItems.next(); }
+ MessageLVI * takeMessageItem( int i ) { return messageItems.take( i ); }
+ void appendMessageItem( QListView * lv, MessageLVI * i );
+ void instantiateMessageItem( QListView * lv, MessageLVI * i );
+ int messageItemsInList() { return messageItems.count(); }
+
+ void paintCell( QPainter * p, const QColorGroup & cg, int column,
+ int width, int align );
+private:
+ QPtrList<MessageLVI> messageItems;
+ QString com;
+ int unfinishedCount;
+ int dangerCount;
+ int obsoleteCount;
+ int itemCount;
+};
+
+class MessageLVI : public LVI
+{
+public:
+ MessageLVI( QListView *parent, const MetaTranslatorMessage & message,
+ const QString& text, const QString& comment, ContextLVI * c );
+
+ virtual bool danger() const { return d; }
+
+ void setTranslation( const QString& translation );
+ void setFinished( bool finished );
+ void setDanger( bool danger );
+
+ void setContextLVI( ContextLVI * c ) { ctxt = c; }
+ ContextLVI * contextLVI() const { return ctxt; }
+ void updateTranslationText();
+
+ QString context() const;
+ QString sourceText() const { return tx; }
+ QString comment() const { return com; }
+ QString translation() const { return m.translation(); }
+ bool finished() const { return fini; }
+ MetaTranslatorMessage message() const;
+
+ void paintCell( QPainter * p, const QColorGroup & cg, int column,
+ int width, int align );
+private:
+ MetaTranslatorMessage m;
+ QString tx;
+ QString com;
+ bool fini;
+ bool d;
+ ContextLVI * ctxt;
+};
+
+#endif
diff --git a/tools/linguist/linguist/main.cpp b/tools/linguist/linguist/main.cpp
new file mode 100644
index 0000000..e9490af
--- /dev/null
+++ b/tools/linguist/linguist/main.cpp
@@ -0,0 +1,89 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "trwindow.h"
+
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qtimer.h>
+#include <qtextcodec.h>
+#include <qtranslator.h>
+#include <qsettings.h>
+#include <qsplashscreen.h>
+
+int main( int argc, char **argv )
+{
+ QApplication app( argc, argv );
+ QApplication::setOverrideCursor( Qt::waitCursor );
+
+
+ QTranslator translator( 0 );
+ translator.load( QString( "linguist_" ) + QTextCodec::locale(), "." );
+ app.installTranslator( &translator );
+
+ bool showSplash = TRUE;
+
+ QString keybase("/Qt Linguist/3.1/");
+ QSettings config;
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+
+ QRect r( QApplication::desktop()->screenGeometry() );
+ r.setX( config.readNumEntry( keybase + "Geometry/MainwindowX", r.x() ) );
+ r.setY( config.readNumEntry( keybase + "Geometry/MainwindowY", r.y() ) );
+ r.setWidth( config.readNumEntry( keybase + "Geometry/MainwindowWidth", r.width() ) );
+ r.setHeight( config.readNumEntry( keybase + "Geometry/MainwindowHeight", r.height() ) );
+
+ QSplashScreen *splash = 0;
+ if ( showSplash ) {
+ splash = new QSplashScreen( QPixmap::fromMimeSource("splash.png"),
+ Qt::WDestructiveClose );
+ splash->show();
+ }
+
+ TrWindow *tw = new TrWindow;
+ app.setMainWidget( tw );
+
+ if ( app.argc() > 1 )
+ tw->openFile( QString(app.argv()[app.argc() - 1]) );
+
+ if ( config.readBoolEntry( keybase + "Geometry/MainwindowMaximized", FALSE ) )
+ tw->showMaximized();
+ else
+ tw->show();
+ if ( splash )
+ splash->finish( tw );
+ QApplication::restoreOverrideCursor();
+
+ return app.exec();
+}
diff --git a/tools/linguist/linguist/msgedit.cpp b/tools/linguist/linguist/msgedit.cpp
new file mode 100644
index 0000000..09e60a1
--- /dev/null
+++ b/tools/linguist/linguist/msgedit.cpp
@@ -0,0 +1,834 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+/* TRANSLATOR MsgEdit
+
+ This is the right panel of the main window.
+*/
+
+#include "msgedit.h"
+
+#include "trwindow.h"
+#include "phraselv.h"
+#include "simtexth.h"
+
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qclipboard.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtextedit.h>
+#include <qpalette.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtextview.h>
+#include <qwhatsthis.h>
+#include <qvbox.h>
+#include <qmainwindow.h>
+#include <qheader.h>
+#include <qregexp.h>
+#include <qdockarea.h>
+#include <qdockwindow.h>
+#include <qscrollview.h>
+#include <qfont.h>
+#include <qaccel.h>
+#include <private/qrichtext_p.h>
+
+static const int MaxCandidates = 5;
+
+class MED : public QTextEdit
+{
+public:
+ MED( QWidget *parent, const char *name = 0 )
+ : QTextEdit( parent, name ) {}
+
+ int cursorX() const { return textCursor()->x(); }
+ int cursorY() const { return textCursor()->paragraph()->rect().y() +
+ textCursor()->y(); }
+};
+
+
+QString richMeta( const QString& text )
+{
+ return QString( "<small><font color=blue>(" ) + text +
+ QString( ")</font></small>" );
+}
+
+QString richText( const QString& text )
+{
+ const char backTab[] = "\a\b\f\n\r\t";
+ const char * const friendlyBackTab[] = {
+ QT_TRANSLATE_NOOP( "MessageEditor", "bell" ),
+ QT_TRANSLATE_NOOP( "MessageEditor", "backspace" ),
+ QT_TRANSLATE_NOOP( "MessageEditor", "new page" ),
+ QT_TRANSLATE_NOOP( "MessageEditor", "new line" ),
+ QT_TRANSLATE_NOOP( "MessageEditor", "carriage return" ),
+ QT_TRANSLATE_NOOP( "MessageEditor", "tab" )
+ };
+ QString rich;
+
+ for ( int i = 0; i < (int) text.length(); i++ ) {
+ int ch = text[i].unicode();
+
+ if ( ch < 0x20 ) {
+ const char *p = strchr( backTab, ch );
+ if ( p == 0 )
+ rich += richMeta( QString::number(ch, 16) );
+ else
+ rich += richMeta( MessageEditor::tr(friendlyBackTab[p - backTab]) );
+ } else if ( ch == '<' ) {
+ rich += QString( "&lt;" );
+ } else if ( ch == '>' ) {
+ rich += QString( "&gt;" );
+ } else if ( ch == '&' ) {
+ rich += QString( "&amp;" );
+ } else if ( ch == ' ' ) {
+ if ( i == 0 || i == (text.length()-1) || text[i - 1] == ' ' || text[i + 1] == ' ' ) {
+ rich += richMeta( MessageEditor::tr("sp") );
+ } else {
+ rich += ' ';
+ }
+ } else {
+ rich += QChar( ch );
+ }
+ if ( ch == '\n' )
+ rich += QString( "<br>" );
+ }
+ return rich;
+}
+
+/*
+ ShadowWidget class impl.
+
+ Used to create a shadow like effect for a widget
+*/
+ShadowWidget::ShadowWidget( QWidget * parent, const char * name )
+ : QWidget( parent, name ), sWidth( 10 ), wMargin( 3 ), childWgt( 0 )
+{
+}
+
+ShadowWidget::ShadowWidget( QWidget * child, QWidget * parent,
+ const char * name )
+ : QWidget( parent, name ), sWidth( 10 ), wMargin( 3 ), childWgt( 0 )
+{
+ setWidget( child );
+}
+
+void ShadowWidget::setWidget( QWidget * child )
+{
+ childWgt = child;
+ if ( childWgt && childWgt->parent() != this ) {
+ childWgt->reparent( this, QPoint( 0, 0 ), TRUE );
+ }
+}
+
+void ShadowWidget::resizeEvent( QResizeEvent * )
+{
+ if( childWgt ) {
+ childWgt->move( wMargin, wMargin );
+ childWgt->resize( width() - sWidth - wMargin, height() - sWidth -
+ wMargin );
+ }
+}
+
+void ShadowWidget::paintEvent( QPaintEvent * e )
+{
+ QPainter p;
+ int w = width() - sWidth;
+ int h = height() - sWidth;
+
+
+ if ( !((w > 0) && (h > 0)) )
+ return;
+
+ if ( p.begin( this ) ) {
+ p.setPen( colorGroup().shadow() );
+
+ p.drawPoint( w + 5, 6 );
+ p.drawLine( w + 3, 6, w + 5, 8 );
+ p.drawLine( w + 1, 6, w + 5, 10 );
+ int i;
+ for( i=7; i < h; i += 2 )
+ p.drawLine( w, i, w + 5, i + 5 );
+ for( i = w - i + h; i > 6; i -= 2 )
+ p.drawLine( i, h, i + 5, h + 5 );
+ for( ; i > 0 ; i -= 2 )
+ p.drawLine( 6, h + 6 - i, i + 5, h + 5 );
+
+// p.eraseRect( w, 0, sWidth, 45 ); // Cheap hack for the page curl..
+ p.end();
+ }
+ QWidget::paintEvent( e );
+}
+
+/*
+ EditorPage class impl.
+
+ A frame that contains the source text, translated text and any
+ source code comments and hints.
+*/
+EditorPage::EditorPage( QWidget * parent, const char * name )
+ : QFrame( parent, name )
+{
+ setLineWidth( 1 );
+ setFrameStyle( QFrame::Box | QFrame::Plain );
+
+ // Use white explicitly as the background color for the editor page.
+ QPalette p = palette();
+ p.setColor( QPalette::Active, QColorGroup::Base, QColor( white ) );
+ p.setColor( QPalette::Inactive, QColorGroup::Base, QColor( white ) );
+ p.setColor( QPalette::Disabled, QColorGroup::Base, QColor( white ) );
+ p.setColor( QPalette::Active, QColorGroup::Background,
+ p.active().color( QColorGroup::Base ) );
+ p.setColor( QPalette::Inactive, QColorGroup::Background,
+ p.inactive().color( QColorGroup::Base ) );
+ p.setColor( QPalette::Disabled, QColorGroup::Background,
+ p.disabled().color( QColorGroup::Base ) );
+ setPalette( p );
+
+ srcTextLbl = new QLabel( tr("Source text"), this, "source text label" );
+ transLbl = new QLabel( tr("Translation"), this, "translation label" );
+
+ QFont fnt = font();
+ fnt.setBold( TRUE );
+ srcTextLbl->setFont( fnt );
+ transLbl->setFont( fnt );
+
+ srcText = new QTextView( this, "source text view" );
+ srcText->setFrameStyle( QFrame::NoFrame );
+ srcText->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding,
+ QSizePolicy::Minimum ) );
+ srcText->setResizePolicy( QScrollView::AutoOne );
+ srcText->setHScrollBarMode( QScrollView::AlwaysOff );
+ srcText->setVScrollBarMode( QScrollView::AlwaysOff );
+ p = srcText->palette();
+ p.setColor( QPalette::Disabled, QColorGroup::Base, p.active().base() );
+ srcText->setPalette( p );
+ connect( srcText, SIGNAL(textChanged()), SLOT(handleSourceChanges()) );
+
+ cmtText = new QTextView( this, "comment/context view" );
+ cmtText->setFrameStyle( QFrame::NoFrame );
+ cmtText->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding,
+ QSizePolicy::Minimum ) );
+ cmtText->setResizePolicy( QScrollView::AutoOne );
+ cmtText->setHScrollBarMode( QScrollView::AlwaysOff );
+ cmtText->setVScrollBarMode( QScrollView::AlwaysOff );
+ p = cmtText->palette();
+ p.setColor( QPalette::Active, QColorGroup::Base, QColor( 236,245,255 ) );
+ p.setColor( QPalette::Inactive, QColorGroup::Base, QColor( 236,245,255 ) );
+ cmtText->setPalette( p );
+ connect( cmtText, SIGNAL(textChanged()), SLOT(handleCommentChanges()) );
+
+ translationMed = new MED( this, "translation editor" );
+ translationMed->setFrameStyle( QFrame::NoFrame );
+ translationMed->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding,
+ QSizePolicy::MinimumExpanding ) );
+ translationMed->setHScrollBarMode( QScrollView::AlwaysOff );
+ translationMed->setVScrollBarMode( QScrollView::AlwaysOff );
+ translationMed->setResizePolicy( QScrollView::AutoOne );
+ translationMed->setWrapPolicy( QTextView::AtWhiteSpace );
+ translationMed->setWordWrap( QTextView::WidgetWidth );
+ translationMed->setTextFormat( QTextView::PlainText );
+ p = translationMed->palette();
+ p.setColor( QPalette::Disabled, QColorGroup::Base, p.active().base() );
+ translationMed->setPalette( p );
+ connect( translationMed, SIGNAL(textChanged()),
+ SLOT(handleTranslationChanges()) );
+
+ pageCurl = new PageCurl( this, "page curl" );
+
+ // Focus
+ setFocusPolicy( StrongFocus );
+ transLbl->setFocusProxy( translationMed );
+ srcTextLbl->setFocusProxy( translationMed );
+ cmtText->setFocusProxy( translationMed );
+ srcText->setFocusProxy( translationMed );
+ setFocusProxy( translationMed );
+
+ updateCommentField();
+}
+
+/*
+ Don't show the comment field if there are no comments.
+*/
+void EditorPage::updateCommentField()
+{
+ if( cmtText->text().isEmpty() )
+ cmtText->hide();
+ else
+ cmtText->show();
+
+ layoutWidgets();
+}
+
+/*
+ Handle the widget layout manually
+*/
+void EditorPage::layoutWidgets()
+ {
+ int margin = 6;
+ int space = 2;
+ int w = width();
+
+ pageCurl->move( width() - pageCurl->width(), 0 );
+
+ QFontMetrics fm( srcTextLbl->font() );
+ srcTextLbl->move( margin, margin );
+ srcTextLbl->resize( fm.width( srcTextLbl->text() ), srcTextLbl->height() );
+
+ srcText->move( margin, srcTextLbl->y() + srcTextLbl->height() + space );
+ srcText->resize( w - margin*2, srcText->height() );
+
+ cmtText->move( margin, srcText->y() + srcText->height() + space );
+ cmtText->resize( w - margin*2, cmtText->height() );
+
+ if( cmtText->isHidden() )
+ transLbl->move( margin, srcText->y() + srcText->height() + space );
+ else
+ transLbl->move( margin, cmtText->y() + cmtText->height() + space );
+ transLbl->resize( w - margin*2, transLbl->height() );
+
+ translationMed->move( margin, transLbl->y() + transLbl->height() + space );
+ translationMed->resize( w - margin*2, translationMed->height() );
+
+ // Calculate the total height for the editor page - emit a signal
+ // if the actual page size is larger/smaller
+ int totHeight = margin + srcTextLbl->height() +
+ srcText->height() + space +
+ transLbl->height() + space +
+ translationMed->height() + space +
+ frameWidth()*lineWidth()*2 + space * 3;
+
+ if( !cmtText->isHidden() )
+ totHeight += cmtText->height() + space;
+
+ if( height() != totHeight )
+ emit pageHeightUpdated( totHeight );
+}
+
+void EditorPage::resizeEvent( QResizeEvent * )
+{
+ handleTranslationChanges();
+ handleSourceChanges();
+ handleCommentChanges();
+ layoutWidgets();
+}
+
+void EditorPage::handleTranslationChanges()
+{
+ calculateFieldHeight( (QTextView *) translationMed );
+}
+
+void EditorPage::handleSourceChanges()
+{
+ calculateFieldHeight( srcText );
+}
+
+void EditorPage::handleCommentChanges()
+{
+ calculateFieldHeight( cmtText );
+}
+
+/*
+ Check if the translation text field is big enough to show all text
+ that has been entered. If it isn't, resize it.
+*/
+void EditorPage::calculateFieldHeight( QTextView * field )
+{
+ field->sync(); // make sure the text formatting is done!
+ int contentsHeight = field->contentsHeight();
+
+ if( contentsHeight != field->height() ) {
+ int oldHeight = field->height();
+ if( contentsHeight < 30 )
+ contentsHeight = 30;
+ field->resize( field->width(), contentsHeight );
+ emit pageHeightUpdated( height() + (field->height() - oldHeight) );
+ }
+}
+
+void EditorPage::fontChange( const QFont & )
+{
+ QFont fnt = font();
+
+ fnt.setBold( TRUE );
+ QFontMetrics fm( fnt );
+ srcTextLbl->setFont( fnt );
+ srcTextLbl->resize( fm.width( srcTextLbl->text() ), srcTextLbl->height() );
+ transLbl->setFont( fnt );
+ transLbl->resize( fm.width( transLbl->text() ), transLbl->height() );
+ update();
+}
+
+/*
+ MessageEditor class impl.
+
+ Handle layout of dock windows and the editor page.
+*/
+MessageEditor::MessageEditor( MetaTranslator * t, QWidget * parent,
+ const char * name )
+ : QWidget( parent, name ),
+ tor( t )
+{
+ doGuesses = TRUE;
+ v = new QVBoxLayout( this );
+ topDock = new QDockArea( Qt::Horizontal, QDockArea::Normal, this,
+ "top dock area" );
+ topDock->setMinimumHeight( 10 );
+ topDock->setSizePolicy( QSizePolicy( QSizePolicy::Minimum,
+ QSizePolicy::Minimum) );
+
+ topDockWnd = new QDockWindow( QDockWindow::InDock, topDock,
+ "top dock window" );
+ QMainWindow *mw = (QMainWindow*)topLevelWidget();
+ if ( mw ) {
+ mw->setDockEnabled( topDockWnd, Qt::DockTop, TRUE );
+ mw->setDockEnabled( topDockWnd, Qt::DockLeft, TRUE );
+ mw->setDockEnabled( topDockWnd, Qt::DockRight, TRUE );
+ mw->setDockEnabled( topDockWnd, Qt::DockBottom, TRUE );
+ }
+
+ topDockWnd->setCaption( tr("Source text") );
+ topDockWnd->setCloseMode( QDockWindow::Always );
+ topDockWnd->setResizeEnabled( TRUE );
+ topDockWnd->setFixedExtentHeight( 110 );
+
+ srcTextList = new QListView( topDockWnd, "source text list view" );
+ srcTextList->setShowSortIndicator( TRUE );
+ srcTextList->setAllColumnsShowFocus( TRUE );
+ srcTextList->setSorting( 0 );
+ QFontMetrics fm( font() );
+ srcTextList->addColumn( tr("Done"), fm.width( tr("Done") ) + 10 );
+ srcTextList->addColumn( tr("Source text") );
+ srcTextList->addColumn( tr("Translation"), 300 );
+ srcTextList->setColumnAlignment( 0, Qt::AlignCenter );
+ srcTextList->setColumnWidthMode( 1, QListView::Manual );
+ srcTextList->header()->setStretchEnabled( TRUE, 1 );
+ srcTextList->setMinimumSize( QSize( 50, 50 ) );
+ srcTextList->setHScrollBarMode( QScrollView::AlwaysOff );
+ srcTextList->installEventFilter( this );
+ topDockWnd->setWidget( srcTextList );
+
+ sv = new QScrollView( this, "scroll view" );
+ sv->setHScrollBarMode( QScrollView::AlwaysOff );
+ sv->viewport()->setBackgroundMode( PaletteBackground );
+
+ editorPage = new EditorPage( sv, "editor page" );
+ connect( editorPage, SIGNAL(pageHeightUpdated(int)),
+ SLOT(updatePageHeight(int)) );
+
+ editorPage->translationMed->installEventFilter( this );
+
+ sw = new ShadowWidget( editorPage, sv, "editor page shadow" );
+ sw->setSizePolicy( QSizePolicy( QSizePolicy::Expanding,
+ QSizePolicy::Expanding) );
+ sw->setMinimumSize( QSize( 100, 150 ) );
+ sv->addChild( sw );
+
+ bottomDock = new QDockArea( Qt::Horizontal, QDockArea::Reverse,
+ this, "bottom dock area" );
+ bottomDock->setMinimumHeight( 10 );
+ bottomDock->setSizePolicy( QSizePolicy( QSizePolicy::Minimum,
+ QSizePolicy::Minimum) );
+ bottomDockWnd = new QDockWindow( QDockWindow::InDock, bottomDock,
+ "bottom dock window" );
+ if ( mw ) {
+ mw->setDockEnabled( bottomDockWnd, Qt::DockTop, TRUE );
+ mw->setDockEnabled( bottomDockWnd, Qt::DockLeft, TRUE );
+ mw->setDockEnabled( bottomDockWnd, Qt::DockRight, TRUE );
+ mw->setDockEnabled( bottomDockWnd, Qt::DockBottom, TRUE );
+ }
+ bottomDockWnd->setCaption( tr("Phrases") );
+ bottomDockWnd->setCloseMode( QDockWindow::Always );
+ bottomDockWnd->setResizeEnabled( TRUE );
+
+ QWidget * w = new QWidget( bottomDockWnd );
+ w->setSizePolicy( QSizePolicy( QSizePolicy::Minimum,
+ QSizePolicy::Minimum ) );
+ QHBoxLayout *hl = new QHBoxLayout( w, 6 );
+ QVBoxLayout *vl = new QVBoxLayout( 6 );
+
+ phraseLbl = new QLabel( tr("Phrases and guesses:"), w );
+ phraseLv = new PhraseLV( w, "phrase list view" );
+ phraseLv->setSorting( PhraseLVI::DefinitionText );
+ phraseLv->installEventFilter( this );
+ hl->addLayout( vl );
+ vl->addWidget( phraseLbl );
+ vl->addWidget( phraseLv );
+
+ accel = new QAccel( this, "accel" );
+ connect( accel, SIGNAL(activated(int)), this, SLOT(guessActivated(int)) );
+ for ( int i = 0; i < 9; i++ )
+ accel->insertItem( CTRL + (Key_1 + i), i + 1 );
+
+ bottomDockWnd->setWidget( w );
+
+ v->addWidget( topDock );
+ v->addWidget( sv );
+ v->addWidget( bottomDock );
+
+ // Signals
+ connect( editorPage->pageCurl, SIGNAL(nextPage()),
+ SIGNAL(nextUnfinished()) );
+ connect( editorPage->pageCurl, SIGNAL(prevPage()),
+ SIGNAL(prevUnfinished()) );
+
+ connect( editorPage->translationMed, SIGNAL(textChanged()),
+ this, SLOT(emitTranslationChanged()) );
+ connect( editorPage->translationMed, SIGNAL(textChanged()),
+ this, SLOT(updateButtons()) );
+ connect( editorPage->translationMed, SIGNAL(undoAvailable(bool)),
+ this, SIGNAL(undoAvailable(bool)) );
+ connect( editorPage->translationMed, SIGNAL(redoAvailable(bool)),
+ this, SIGNAL(redoAvailable(bool)) );
+ connect( editorPage->translationMed, SIGNAL(copyAvailable(bool)),
+ this, SIGNAL(cutAvailable(bool)) );
+ connect( editorPage->translationMed, SIGNAL(copyAvailable(bool)),
+ this, SIGNAL(copyAvailable(bool)) );
+ connect( qApp->clipboard(), SIGNAL(dataChanged()),
+ this, SLOT(updateCanPaste()) );
+ connect( phraseLv, SIGNAL(doubleClicked(QListViewItem *)),
+ this, SLOT(insertPhraseInTranslation(QListViewItem *)) );
+ connect( phraseLv, SIGNAL(returnPressed(QListViewItem *)),
+ this, SLOT(insertPhraseInTranslationAndLeave(QListViewItem *)) );
+
+ // What's this
+ QWhatsThis::add( this, tr("This whole panel allows you to view and edit "
+ "the translation of some source text.") );
+ QWhatsThis::add( editorPage->srcText,
+ tr("This area shows the source text.") );
+ QWhatsThis::add( editorPage->cmtText, tr("This area shows a comment that"
+ " may guide you, and the context in which the text"
+ " occurs.") );
+ QWhatsThis::add( editorPage->translationMed,
+ tr("This is where you can enter or modify"
+ " the translation of some source text.") );
+}
+
+void MessageEditor::toggleFinished()
+{
+ if ( itemFinished )
+ itemFinished = FALSE;
+ else
+ itemFinished = TRUE;
+ emit finished( itemFinished );
+}
+
+bool MessageEditor::eventFilter( QObject *o, QEvent *e )
+{
+ // Handle keypresses in the message editor - scroll the view if the current
+ // line is hidden.
+ if ( e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease ) {
+ QKeyEvent * ke = (QKeyEvent*)e;
+ const int k = ke->key();
+
+ if ( ::qt_cast<QTextEdit*>(o) ) {
+ if ( e->type() == QEvent::KeyPress ) {
+ // Hardcode the Tab key to do focus changes when pressed
+ // inside the editor
+ if ( k == Key_BackTab ) {
+ emit focusSourceList();
+ return TRUE;
+ }
+ } else if ( e->type() == QEvent::KeyRelease ) {
+ MED * ed = (MED *) o;
+ switch( k ) {
+ case Key_Up:
+ if (ed->cursorY() < 10)
+ sv->verticalScrollBar()->subtractLine();
+ break;
+
+ case Key_Down:
+ if (ed->cursorY() >= ed->height() - 20)
+ sv->verticalScrollBar()->addLine();
+ break;
+
+ case Key_PageUp:
+ if (ed->cursorY() < 10)
+ sv->verticalScrollBar()->subtractPage();
+ break;
+
+ case Key_PageDown:
+ if (ed->cursorY() >= ed->height() - 50)
+ sv->verticalScrollBar()->addPage();
+ break;
+ default:
+ sv->ensureVisible( sw->margin() + ed->x() + ed->cursorX(),
+ sw->margin() + ed->y() + ed->cursorY() );
+ break;
+ }
+ }
+ } else if ( ::qt_cast<QListView*>(o) ) {
+ // handle the ESC key in the list views
+ if ( e->type() == QEvent::KeyRelease && k == Key_Escape )
+ editorPage->translationMed->setFocus();
+ }
+ }
+ return QWidget::eventFilter( o, e );
+}
+
+void MessageEditor::updatePageHeight( int height )
+{
+ sw->resize( sw->width(), height + sw->margin() + sw->shadowWidth() );
+}
+
+void MessageEditor::resizeEvent( QResizeEvent * )
+{
+ sw->resize( sv->viewport()->width(), sw->height() );
+}
+
+QListView * MessageEditor::sourceTextList() const
+{
+ return srcTextList;
+}
+
+QListView * MessageEditor::phraseList() const
+{
+ return phraseLv;
+}
+
+void MessageEditor::showNothing()
+{
+ editorPage->srcText->setText( "" );
+ showContext( QString(""), FALSE );
+}
+
+void MessageEditor::showContext( const QString& context, bool finished )
+{
+ setEditionEnabled( FALSE );
+ sourceText = QString::null;
+ guesses.clear();
+
+ if( context.isEmpty() )
+ editorPage->cmtText->setText("");
+ else
+ editorPage->cmtText->setText( richText(context.simplifyWhiteSpace()) );
+ setTranslation( QString(""), FALSE );
+ setFinished( finished );
+ phraseLv->clear();
+ editorPage->handleSourceChanges();
+ editorPage->handleCommentChanges();
+ editorPage->handleTranslationChanges();
+ editorPage->updateCommentField();
+}
+
+void MessageEditor::showMessage( const QString& text,
+ const QString& comment,
+ const QString& fullContext,
+ const QString& translation,
+ MetaTranslatorMessage::Type type,
+ const QValueList<Phrase>& phrases )
+{
+ bool obsolete = ( type == MetaTranslatorMessage::Obsolete );
+ setEditionEnabled( !obsolete );
+ sourceText = text;
+ guesses.clear();
+
+ editorPage->srcText->setText( QString("<p>") + richText( text ) +
+ QString("</p>") );
+
+ if ( !fullContext.isEmpty() && !comment.isEmpty() )
+ editorPage->cmtText->setText( richText(fullContext.simplifyWhiteSpace()) +
+ "\n" + richText(comment.simplifyWhiteSpace()) );
+ else if ( !fullContext.isEmpty() && comment.isEmpty() )
+ editorPage->cmtText->setText(richText(fullContext.simplifyWhiteSpace() ) );
+ else if ( fullContext.isEmpty() && !comment.isEmpty() )
+ editorPage->cmtText->setText( richText(comment.simplifyWhiteSpace() ) );
+ else
+ editorPage->cmtText->setText( "" );
+
+ setTranslation( translation, FALSE );
+ setFinished( type != MetaTranslatorMessage::Unfinished );
+ QValueList<Phrase>::ConstIterator p;
+ phraseLv->clear();
+ for ( p = phrases.begin(); p != phrases.end(); ++p )
+ (void) new PhraseLVI( phraseLv, *p );
+
+ if ( doGuesses && !sourceText.isEmpty() ) {
+ CandidateList cl = similarTextHeuristicCandidates( tor,
+ sourceText.latin1(),
+ MaxCandidates );
+ int n = 0;
+ QValueList<Candidate>::Iterator it = cl.begin();
+ while ( it != cl.end() ) {
+ QString def;
+ if ( n < 9 )
+ def = tr( "Guess (%1)" ).arg( QString(QKeySequence(CTRL | (Key_0 + (n + 1)))) );
+ else
+ def = tr( "Guess" );
+ (void) new PhraseLVI( phraseLv,
+ Phrase((*it).source, (*it).target, def),
+ n + 1 );
+ n++;
+ ++it;
+ }
+ }
+ editorPage->handleSourceChanges();
+ editorPage->handleCommentChanges();
+ editorPage->handleTranslationChanges();
+ editorPage->updateCommentField();
+}
+
+void MessageEditor::setTranslation( const QString& translation, bool emitt )
+{
+ // Block signals so that 'textChanged()' is not emitted when
+ // for example a new source text item is selected and *not*
+ // the actual translation.
+ editorPage->translationMed->blockSignals( !emitt );
+ editorPage->translationMed->setText( translation );
+ editorPage->translationMed->blockSignals( FALSE );
+ if ( !emitt )
+ updateButtons();
+ emit cutAvailable( FALSE );
+ emit copyAvailable( FALSE );
+}
+
+void MessageEditor::setEditionEnabled( bool enabled )
+{
+ editorPage->transLbl->setEnabled( enabled );
+ editorPage->translationMed->setReadOnly( !enabled );
+
+ phraseLbl->setEnabled( enabled );
+ phraseLv->setEnabled( enabled );
+ updateCanPaste();
+}
+
+void MessageEditor::undo()
+{
+ editorPage->translationMed->undo();
+}
+
+void MessageEditor::redo()
+{
+ editorPage->translationMed->redo();
+}
+
+void MessageEditor::cut()
+{
+ editorPage->translationMed->cut();
+}
+
+void MessageEditor::copy()
+{
+ editorPage->translationMed->copy();
+}
+
+void MessageEditor::paste()
+{
+ editorPage->translationMed->paste();
+}
+
+void MessageEditor::del()
+{
+ editorPage->translationMed->del();
+}
+
+void MessageEditor::selectAll()
+{
+ editorPage->translationMed->selectAll();
+}
+
+void MessageEditor::emitTranslationChanged()
+{
+ emit translationChanged( editorPage->translationMed->text() );
+}
+
+void MessageEditor::guessActivated( int accelKey )
+{
+ QListViewItem *item = phraseLv->firstChild();
+ while ( item != 0 && ((PhraseLVI *) item)->accelKey() != accelKey )
+ item = item->nextSibling();
+ if ( item != 0 )
+ insertPhraseInTranslation( item );
+}
+
+void MessageEditor::insertPhraseInTranslation( QListViewItem *item )
+{
+ editorPage->translationMed->insert(((PhraseLVI *) item)->phrase().target());
+ emit translationChanged( editorPage->translationMed->text() );
+}
+
+void MessageEditor::insertPhraseInTranslationAndLeave( QListViewItem *item )
+{
+ editorPage->translationMed->insert(((PhraseLVI *) item)->phrase().target());
+ emit translationChanged( editorPage->translationMed->text() );
+ editorPage->translationMed->setFocus();
+}
+
+void MessageEditor::updateButtons()
+{
+ bool overwrite = ( !editorPage->translationMed->isReadOnly() &&
+ (editorPage->translationMed->text().stripWhiteSpace().isEmpty() ||
+ mayOverwriteTranslation) );
+ mayOverwriteTranslation = FALSE;
+ emit updateActions( overwrite );
+}
+
+void MessageEditor::beginFromSource()
+{
+ mayOverwriteTranslation = TRUE;
+ setTranslation( sourceText, TRUE );
+ if ( !editorPage->hasFocus() )
+ editorPage->setFocus();
+}
+
+void MessageEditor::finishAndNext()
+{
+ setFinished( TRUE );
+ emit nextUnfinished();
+ if ( !editorPage->hasFocus() )
+ editorPage->setFocus();
+}
+
+void MessageEditor::updateCanPaste()
+{
+ bool oldCanPaste = canPaste;
+ canPaste = ( !editorPage->translationMed->isReadOnly() &&
+ !qApp->clipboard()->text().isNull() );
+ if ( canPaste != oldCanPaste )
+ emit pasteAvailable( canPaste );
+}
+
+void MessageEditor::setFinished( bool finished )
+{
+ if ( !finished != !itemFinished )
+ toggleFinished();
+}
+
+void MessageEditor::toggleGuessing()
+{
+ doGuesses = !doGuesses;
+ if ( !doGuesses ) {
+ phraseLv->clear();
+ }
+}
diff --git a/tools/linguist/linguist/msgedit.h b/tools/linguist/linguist/msgedit.h
new file mode 100644
index 0000000..bf73483
--- /dev/null
+++ b/tools/linguist/linguist/msgedit.h
@@ -0,0 +1,244 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef MSGEDIT_H
+#define MSGEDIT_H
+
+#include "trwindow.h"
+#include "phrase.h"
+
+#include <metatranslator.h>
+
+#include <qsplitter.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <qscrollview.h>
+#include <qpixmap.h>
+#include <qbitmap.h>
+#include <qtooltip.h>
+
+class QAccel;
+class QDockArea;
+class QDockWindow;
+class QLabel;
+class QListView;
+class QListViewItem;
+class QTextView;
+class QVBoxLayout;
+
+class EditorPage;
+class MED;
+class PhraseLV;
+
+class PageCurl : public QWidget
+{
+ Q_OBJECT
+public:
+ PageCurl( QWidget * parent = 0, const char * name = 0,
+ WFlags f = 0 )
+ : QWidget( parent, name, f )
+ {
+ QPixmap px = TrWindow::pageCurl();
+ if ( px.mask() ) {
+ setMask( *px.mask() );
+ }
+ setBackgroundPixmap( px );
+ setFixedSize( px.size() );
+
+ QRect r( 34, 0, width()-34, 19 );
+ QToolTip::add( this, r, tr("Next unfinished phrase") );
+ r.setSize( QSize(width()-34, height()-20) );
+ r.setX( 0 );
+ r.setY( 20 );
+ QToolTip::add( this, r, tr("Previous unfinished phrase") );
+ }
+
+protected:
+ void mouseReleaseEvent( QMouseEvent * e )
+ {
+ int x = e->pos().x() - 14;
+ int y = e->pos().y() - 8;
+
+ if ( y <= x )
+ emit nextPage();
+ else
+ emit prevPage();
+ }
+
+signals:
+ void prevPage();
+ void nextPage();
+};
+
+class ShadowWidget : public QWidget
+{
+public:
+ ShadowWidget( QWidget * parent = 0, const char * name = 0 );
+ ShadowWidget( QWidget * child, QWidget * parent = 0, const char * name = 0 );
+
+ void setShadowWidth( int width ) { sWidth = width; }
+ int shadowWidth() const { return sWidth; }
+ void setMargin( int margin ){ wMargin = margin; }
+ int margin() const { return wMargin; }
+ void setWidget( QWidget * child);
+
+protected:
+ void resizeEvent( QResizeEvent * e );
+ void paintEvent( QPaintEvent * e );
+
+private:
+ int sWidth;
+ int wMargin;
+ QWidget * childWgt;
+};
+
+class EditorPage : public QFrame
+{
+ Q_OBJECT
+public:
+ EditorPage( QWidget * parent = 0, const char * name = 0 );
+
+protected:
+ void resizeEvent( QResizeEvent * );
+ void layoutWidgets();
+ void updateCommentField();
+ void calculateFieldHeight( QTextView * field );
+ void fontChange( const QFont & );
+
+private:
+ PageCurl * pageCurl;
+ QLabel * srcTextLbl;
+ QLabel * transLbl;
+ QTextView * srcText;
+ QTextView * cmtText;
+ MED * translationMed;
+
+ friend class MessageEditor;
+
+private slots:
+ void handleTranslationChanges();
+ void handleSourceChanges();
+ void handleCommentChanges();
+
+signals:
+ void pageHeightUpdated( int height );
+};
+
+class MessageEditor : public QWidget
+{
+ Q_OBJECT
+public:
+ MessageEditor( MetaTranslator * t, QWidget * parent = 0,
+ const char * name = 0 );
+ QListView * sourceTextList() const;
+ QListView * phraseList() const;
+
+ void showNothing();
+ void showContext( const QString& context, bool finished );
+ void showMessage( const QString& text, const QString& comment,
+ const QString& fullContext, const QString& translation,
+ MetaTranslatorMessage::Type type,
+ const QValueList<Phrase>& phrases );
+ void setFinished( bool finished );
+ bool eventFilter( QObject *, QEvent * );
+
+signals:
+ void translationChanged( const QString& translation );
+ void finished( bool finished );
+ void prevUnfinished();
+ void nextUnfinished();
+ void updateActions( bool enable );
+
+ void undoAvailable( bool avail );
+ void redoAvailable( bool avail );
+ void cutAvailable( bool avail );
+ void copyAvailable( bool avail );
+ void pasteAvailable( bool avail );
+
+ void focusSourceList();
+ void focusPhraseList();
+
+public slots:
+ void undo();
+ void redo();
+ void cut();
+ void copy();
+ void paste();
+ void del();
+ void selectAll();
+ void beginFromSource();
+ void toggleGuessing();
+ void finishAndNext();
+
+private slots:
+ void emitTranslationChanged();
+ void guessActivated( int accelKey );
+ void insertPhraseInTranslation( QListViewItem *item );
+ void insertPhraseInTranslationAndLeave( QListViewItem *item );
+ void updateButtons();
+ void updateCanPaste();
+ void toggleFinished();
+
+ void updatePageHeight( int height );
+
+protected:
+ void resizeEvent( QResizeEvent * );
+
+private:
+ void setTranslation( const QString& translation, bool emitt );
+ void setEditionEnabled( bool enabled );
+
+ QListView * srcTextList;
+ QDockArea * topDock, * bottomDock;
+ QDockWindow * topDockWnd, *bottomDockWnd;
+ EditorPage * editorPage;
+ QVBoxLayout * v;
+
+ QLabel * phraseLbl;
+ PhraseLV * phraseLv;
+ QAccel * accel;
+ bool itemFinished;
+
+ ShadowWidget * sw;
+ QScrollView * sv;
+
+ MetaTranslator *tor;
+ QString sourceText;
+ QStringList guesses;
+ bool mayOverwriteTranslation;
+ bool canPaste;
+ bool doGuesses;
+};
+
+#endif
diff --git a/tools/linguist/linguist/phrase.cpp b/tools/linguist/linguist/phrase.cpp
new file mode 100644
index 0000000..da702a5
--- /dev/null
+++ b/tools/linguist/linguist/phrase.cpp
@@ -0,0 +1,189 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "phrase.h"
+
+#include <qapplication.h>
+#include <qcstring.h>
+#include <qfile.h>
+#include <qmessagebox.h>
+#include <qregexp.h>
+#include <qtextstream.h>
+#include <qxml.h>
+
+static QString protect( const QString& str )
+{
+ QString p = str;
+ p.replace( "&", "&amp;" );
+ p.replace( "\"", "&quot;" );
+ p.replace( ">", "&gt;" );
+ p.replace( "<", "&lt;" );
+ p.replace( "'", "&apos;" );
+ return p;
+}
+
+Phrase::Phrase( const QString& source, const QString& target,
+ const QString& definition )
+ : s( source ), t( target ), d( definition )
+{
+}
+
+bool operator==( const Phrase& p, const Phrase& q )
+{
+ return p.source() == q.source() && p.target() == q.target() &&
+ p.definition() == q.definition();
+}
+
+class QphHandler : public QXmlDefaultHandler
+{
+public:
+ QphHandler( PhraseBook *phraseBook )
+ : pb( phraseBook ), ferrorCount( 0 ) { }
+
+ virtual bool startElement( const QString& namespaceURI,
+ const QString& localName, const QString& qName,
+ const QXmlAttributes& atts );
+ virtual bool endElement( const QString& namespaceURI,
+ const QString& localName, const QString& qName );
+ virtual bool characters( const QString& ch );
+ virtual bool fatalError( const QXmlParseException& exception );
+
+private:
+ PhraseBook *pb;
+ QString source;
+ QString target;
+ QString definition;
+
+ QString accum;
+ int ferrorCount;
+};
+
+bool QphHandler::startElement( const QString& /* namespaceURI */,
+ const QString& /* localName */,
+ const QString& qName,
+ const QXmlAttributes& /* atts */ )
+{
+ if ( qName == QString("phrase") ) {
+ source.truncate( 0 );
+ target.truncate( 0 );
+ definition.truncate( 0 );
+ }
+ accum.truncate( 0 );
+ return TRUE;
+}
+
+bool QphHandler::endElement( const QString& /* namespaceURI */,
+ const QString& /* localName */,
+ const QString& qName )
+{
+ if ( qName == QString("source") )
+ source = accum;
+ else if ( qName == QString("target") )
+ target = accum;
+ else if ( qName == QString("definition") )
+ definition = accum;
+ else if ( qName == QString("phrase") )
+ pb->append( Phrase(source, target, definition) );
+ return TRUE;
+}
+
+bool QphHandler::characters( const QString& ch )
+{
+ accum += ch;
+ return TRUE;
+}
+
+bool QphHandler::fatalError( const QXmlParseException& exception )
+{
+ if ( ferrorCount++ == 0 ) {
+ QString msg;
+ msg.sprintf( "Parse error at line %d, column %d (%s).",
+ exception.lineNumber(), exception.columnNumber(),
+ exception.message().latin1() );
+ QMessageBox::information( qApp->mainWidget(),
+ QObject::tr("Qt Linguist"), msg );
+ }
+ return FALSE;
+}
+
+bool PhraseBook::load( const QString& filename )
+{
+ QFile f( filename );
+ if ( !f.open(IO_ReadOnly) )
+ return FALSE;
+
+ QTextStream t( &f );
+ QXmlInputSource in( t );
+ QXmlSimpleReader reader;
+ // don't click on these!
+ reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE );
+ reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", TRUE );
+ reader.setFeature( "http://trolltech.com/xml/features/report-whitespace"
+ "-only-CharData", FALSE );
+ QXmlDefaultHandler *hand = new QphHandler( this );
+ reader.setContentHandler( hand );
+ reader.setErrorHandler( hand );
+
+ bool ok = reader.parse( in );
+ reader.setContentHandler( 0 );
+ reader.setErrorHandler( 0 );
+ delete hand;
+ f.close();
+ if ( !ok )
+ clear();
+ return ok;
+}
+
+bool PhraseBook::save( const QString& filename ) const
+{
+ QFile f( filename );
+ if ( !f.open(IO_WriteOnly) )
+ return FALSE;
+
+ QTextStream t( &f );
+ t.setEncoding(QTextStream::UnicodeUTF8);
+ t << "<!DOCTYPE QPH><QPH>\n";
+ ConstIterator p;
+ for ( p = begin(); p != end(); ++p ) {
+ t << "<phrase>\n";
+ t << " <source>" << protect( (*p).source() ) << "</source>\n";
+ t << " <target>" << protect( (*p).target() ) << "</target>\n";
+ if ( !(*p).definition().isEmpty() )
+ t << " <definition>" << protect( (*p).definition() )
+ << "</definition>\n";
+ t << "</phrase>\n";
+ }
+ t << "</QPH>\n";
+ f.close();
+ return TRUE;
+}
diff --git a/tools/linguist/linguist/phrase.h b/tools/linguist/linguist/phrase.h
new file mode 100644
index 0000000..8b32a0c
--- /dev/null
+++ b/tools/linguist/linguist/phrase.h
@@ -0,0 +1,74 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PHRASE_H
+#define PHRASE_H
+
+#include <qstring.h>
+#include <qvaluelist.h>
+
+class Phrase
+{
+public:
+ Phrase() { }
+ Phrase( const QString& source, const QString& target,
+ const QString& definition );
+
+ QString source() const { return s; }
+ void setSource( const QString& ns ) { s = ns; }
+ QString target() const { return t; }
+ void setTarget( const QString& nt ) { t = nt; }
+ QString definition() const { return d; }
+ void setDefinition ( const QString& nd ) { d = nd; }
+
+private:
+ QString s;
+ QString t;
+ QString d;
+};
+
+bool operator==( const Phrase& p, const Phrase& q );
+inline bool operator!=( const Phrase& p, const Phrase& q ) {
+ return !( p == q );
+}
+
+class PhraseBook : public QValueList<Phrase>
+{
+public:
+ PhraseBook() { }
+
+ bool load( const QString& filename );
+ bool save( const QString& filename ) const;
+};
+
+#endif
diff --git a/tools/linguist/linguist/phrasebookbox.cpp b/tools/linguist/linguist/phrasebookbox.cpp
new file mode 100644
index 0000000..b8c6fab
--- /dev/null
+++ b/tools/linguist/linguist/phrasebookbox.cpp
@@ -0,0 +1,244 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+/* TRANSLATOR PhraseBookBox
+
+ Go to Phrase > Edit Phrase Book... The dialog that pops up is a
+ PhraseBookBox.
+*/
+
+#include "phrasebookbox.h"
+#include "phraselv.h"
+
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qmessagebox.h>
+#include <qpushbutton.h>
+#include <qwhatsthis.h>
+
+PhraseBookBox::PhraseBookBox( const QString& filename,
+ const PhraseBook& phraseBook, QWidget *parent,
+ const char *name, bool modal )
+ : QDialog( parent, name, modal ), fn( filename ), pb( phraseBook )
+{
+ QGridLayout *gl = new QGridLayout( this, 4, 3, 11, 11,
+ "phrase book outer layout" );
+ QVBoxLayout *bl = new QVBoxLayout( 6, "phrase book button layout" );
+
+ sourceLed = new QLineEdit( this, "source line edit" );
+ QLabel *source = new QLabel( sourceLed, tr("S&ource phrase:"), this,
+ "source label" );
+ targetLed = new QLineEdit( this, "target line edit" );
+ QLabel *target = new QLabel( targetLed, tr("&Translation:"), this,
+ "target label" );
+ definitionLed = new QLineEdit( this, "definition line edit" );
+ QLabel *definition = new QLabel( definitionLed, tr("&Definition:"), this,
+ "target label" );
+ lv = new PhraseLV( this, "phrase book list view" );
+
+ newBut = new QPushButton( tr("&New Phrase"), this );
+ newBut->setDefault( TRUE );
+
+ removeBut = new QPushButton( tr("&Remove Phrase"), this );
+ removeBut->setEnabled( FALSE );
+ QPushButton *saveBut = new QPushButton( tr("&Save"), this );
+ QPushButton *closeBut = new QPushButton( tr("Close"), this );
+
+ gl->addWidget( source, 0, 0 );
+ gl->addWidget( sourceLed, 0, 1 );
+ gl->addWidget( target, 1, 0 );
+ gl->addWidget( targetLed, 1, 1 );
+ gl->addWidget( definition, 2, 0 );
+ gl->addWidget( definitionLed, 2, 1 );
+ gl->addMultiCellWidget( lv, 3, 3, 0, 1 );
+ gl->addMultiCell( bl, 0, 3, 2, 2 );
+
+ bl->addWidget( newBut );
+ bl->addWidget( removeBut );
+ bl->addWidget( saveBut );
+ bl->addWidget( closeBut );
+ bl->addStretch( 1 );
+
+ connect( sourceLed, SIGNAL(textChanged(const QString&)),
+ this, SLOT(sourceChanged(const QString&)) );
+ connect( targetLed, SIGNAL(textChanged(const QString&)),
+ this, SLOT(targetChanged(const QString&)) );
+ connect( definitionLed, SIGNAL(textChanged(const QString&)),
+ this, SLOT(definitionChanged(const QString&)) );
+ connect( lv, SIGNAL(selectionChanged(QListViewItem *)),
+ this, SLOT(selectionChanged(QListViewItem *)) );
+ connect( newBut, SIGNAL(clicked()), this, SLOT(newPhrase()) );
+ connect( removeBut, SIGNAL(clicked()), this, SLOT(removePhrase()) );
+ connect( saveBut, SIGNAL(clicked()), this, SLOT(save()) );
+ connect( closeBut, SIGNAL(clicked()), this, SLOT(accept()) );
+
+ PhraseBook::ConstIterator it;
+ for ( it = phraseBook.begin(); it != phraseBook.end(); ++it )
+ (void) new PhraseLVI( lv, (*it) );
+ enableDisable();
+
+ QWhatsThis::add( this, tr("This window allows you to add, modify, or delete"
+ " phrases in a phrase book.") );
+ QWhatsThis::add( sourceLed, tr("This is the phrase in the source"
+ " language.") );
+ QWhatsThis::add( targetLed, tr("This is the phrase in the target language"
+ " corresponding to the source phrase.") );
+ QWhatsThis::add( definitionLed, tr("This is a definition for the source"
+ " phrase.") );
+ QWhatsThis::add( newBut, tr("Click here to add the phrase to the phrase"
+ " book.") );
+ QWhatsThis::add( removeBut, tr("Click here to remove the phrase from the"
+ " phrase book.") );
+ QWhatsThis::add( saveBut, tr("Click here to save the changes made.") );
+ QWhatsThis::add( closeBut, tr("Click here to close this window.") );
+}
+
+void PhraseBookBox::keyPressEvent( QKeyEvent *ev )
+{
+ if ( ev->key() == Key_Down || ev->key() == Key_Up ||
+ ev->key() == Key_Next || ev->key() == Key_Prior )
+ QApplication::sendEvent( lv,
+ new QKeyEvent(ev->type(), ev->key(), ev->ascii(), ev->state(),
+ ev->text(), ev->isAutoRepeat(), ev->count()) );
+ else
+ QDialog::keyPressEvent( ev );
+}
+
+void PhraseBookBox::newPhrase()
+{
+ Phrase ph;
+ ph.setSource( NewPhrase );
+ QListViewItem *item = new PhraseLVI( lv, ph );
+ selectItem( item );
+}
+
+void PhraseBookBox::removePhrase()
+{
+ QListViewItem *item = lv->currentItem();
+ QListViewItem *next = item->itemBelow() != 0 ? item->itemBelow()
+ : item->itemAbove();
+ delete item;
+ if ( next != 0 )
+ selectItem( next );
+ enableDisable();
+}
+
+void PhraseBookBox::save()
+{
+ pb.clear();
+ QListViewItem *item = lv->firstChild();
+ while ( item != 0 ) {
+ if ( !item->text(PhraseLVI::SourceTextShown).isEmpty() &&
+ item->text(PhraseLVI::SourceTextShown) != NewPhrase )
+ pb.append( Phrase(((PhraseLVI *) item)->phrase()) );
+ item = item->nextSibling();
+ }
+ if ( !pb.save( fn ) )
+ QMessageBox::warning( this, tr("Qt Linguist"),
+ tr("Cannot save phrase book '%1'.").arg(fn) );
+}
+
+void PhraseBookBox::sourceChanged( const QString& source )
+{
+ if ( lv->currentItem() != 0 ) {
+ lv->currentItem()->setText( PhraseLVI::SourceTextShown,
+ source.stripWhiteSpace() );
+ lv->currentItem()->setText( PhraseLVI::SourceTextOriginal, source );
+ lv->sort();
+ lv->ensureItemVisible( lv->currentItem() );
+ }
+}
+
+void PhraseBookBox::targetChanged( const QString& target )
+{
+ if ( lv->currentItem() != 0 ) {
+ lv->currentItem()->setText( PhraseLVI::TargetTextShown,
+ target.stripWhiteSpace() );
+ lv->currentItem()->setText( PhraseLVI::TargetTextOriginal, target );
+ lv->sort();
+ lv->ensureItemVisible( lv->currentItem() );
+ }
+}
+
+void PhraseBookBox::definitionChanged( const QString& definition )
+{
+ if ( lv->currentItem() != 0 ) {
+ lv->currentItem()->setText( PhraseLVI::DefinitionText, definition );
+ lv->sort();
+ lv->ensureItemVisible( lv->currentItem() );
+ }
+}
+
+void PhraseBookBox::selectionChanged( QListViewItem * /* item */ )
+{
+ enableDisable();
+}
+
+void PhraseBookBox::selectItem( QListViewItem *item )
+{
+ lv->setSelected( item, TRUE );
+ lv->ensureItemVisible( item );
+}
+
+void PhraseBookBox::enableDisable()
+{
+ QListViewItem *item = lv->currentItem();
+
+ sourceLed->blockSignals( TRUE );
+ targetLed->blockSignals( TRUE );
+ definitionLed->blockSignals( TRUE );
+
+ if ( item == 0 ) {
+ sourceLed->setText( QString::null );
+ targetLed->setText( QString::null );
+ definitionLed->setText( QString::null );
+ } else {
+ sourceLed->setText( item->text(0) );
+ targetLed->setText( item->text(1) );
+ definitionLed->setText( item->text(2) );
+ }
+ sourceLed->setEnabled( item != 0 );
+ targetLed->setEnabled( item != 0 );
+ definitionLed->setEnabled( item != 0 );
+ removeBut->setEnabled( item != 0 );
+
+ sourceLed->blockSignals( FALSE );
+ targetLed->blockSignals( FALSE );
+ definitionLed->blockSignals( FALSE );
+
+ QLineEdit *led = ( sourceLed->text() == NewPhrase ? sourceLed : targetLed );
+ led->setFocus();
+ led->selectAll();
+}
diff --git a/tools/linguist/linguist/phrasebookbox.h b/tools/linguist/linguist/phrasebookbox.h
new file mode 100644
index 0000000..0f922b1
--- /dev/null
+++ b/tools/linguist/linguist/phrasebookbox.h
@@ -0,0 +1,84 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PHRASEBOOKBOX_H
+#define PHRASEBOOKBOX_H
+
+#include "phrase.h"
+
+#include <qdialog.h>
+#include <qvaluelist.h>
+
+class QLineEdit;
+class QPushButton;
+class QListViewItem;
+
+class PhraseLV;
+
+class PhraseBookBox : public QDialog
+{
+ Q_OBJECT
+public:
+ PhraseBookBox( const QString& filename, const PhraseBook& phraseBook,
+ QWidget *parent = 0, const char *name = 0,
+ bool modal = FALSE );
+
+ const PhraseBook& phraseBook() const { return pb; }
+
+protected:
+ virtual void keyPressEvent( QKeyEvent *ev );
+
+private slots:
+ void newPhrase();
+ void removePhrase();
+ void save();
+ void sourceChanged( const QString& source );
+ void targetChanged( const QString& target );
+ void definitionChanged( const QString& definition );
+ void selectionChanged( QListViewItem *item );
+
+private:
+ void selectItem( QListViewItem *item );
+ void enableDisable();
+
+ QLineEdit *sourceLed;
+ QLineEdit *targetLed;
+ QLineEdit *definitionLed;
+ QPushButton *newBut;
+ QPushButton *removeBut;
+ PhraseLV *lv;
+ QString fn;
+ PhraseBook pb;
+};
+
+#endif
diff --git a/tools/linguist/linguist/phraselv.cpp b/tools/linguist/linguist/phraselv.cpp
new file mode 100644
index 0000000..fa454f8
--- /dev/null
+++ b/tools/linguist/linguist/phraselv.cpp
@@ -0,0 +1,171 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+/* TRANSLATOR PhraseLV
+
+ The phrase list in the right panel of the main window (with Source phrase,
+ Target phrase, and Definition in its header) is a PhraseLV object.
+*/
+
+#include "phraselv.h"
+
+#include <qregexp.h>
+#include <qwhatsthis.h>
+#include <qheader.h>
+
+class WhatPhrase : public QWhatsThis
+{
+public:
+ WhatPhrase( PhraseLV *w );
+
+ virtual QString text( const QPoint& p );
+
+private:
+ PhraseLV *parent;
+};
+
+WhatPhrase::WhatPhrase( PhraseLV *w )
+ : QWhatsThis( w )
+{
+ parent = w;
+}
+
+QString WhatPhrase::text( const QPoint& p )
+{
+ QListViewItem *item = parent->itemAt( p );
+ if ( item == 0 )
+ return PhraseLV::tr( "This is a list of phrase entries relevant to the"
+ " source text. Each phrase is supplemented with a suggested"
+ " translation and a definition." );
+ else
+ return QString( PhraseLV::tr("<p><u>%1:</u>&nbsp;&nbsp;%2</p>"
+ "<p><u>%3:</u>&nbsp;&nbsp;%4</p>"
+ "<p><u>%5:</u>&nbsp;&nbsp;%6</p>") )
+ .arg( parent->columnText(PhraseLVI::SourceTextShown) )
+ .arg( item->text(PhraseLVI::SourceTextShown) )
+ .arg( parent->columnText(PhraseLVI::TargetTextShown) )
+ .arg( item->text(PhraseLVI::TargetTextShown) )
+ .arg( parent->columnText(PhraseLVI::DefinitionText) )
+ .arg( item->text(PhraseLVI::DefinitionText) );
+}
+
+PhraseLVI::PhraseLVI( PhraseLV *parent, const Phrase& phrase, int accelKey )
+ : QListViewItem( parent ),
+ akey( accelKey )
+{
+ setPhrase( phrase );
+}
+
+QString PhraseLVI::key( int column, bool ascending ) const
+{
+ if ( column == SourceTextShown ) {
+ if ( sourceTextKey.isEmpty() ) {
+ if ( ascending ) {
+ return "";
+ } else {
+ return QString::null;
+ }
+ } else {
+ return sourceTextKey;
+ }
+ } else if ( column == TargetTextShown ) {
+ return targetTextKey;
+ } else {
+ return QChar( '0' + akey ) + text( column );
+ }
+}
+
+void PhraseLVI::setText( int column, const QString& text )
+{
+ if ( column == SourceTextShown ) {
+ sourceTextKey = makeKey( text );
+ } else if ( column == TargetTextShown ) {
+ targetTextKey = makeKey( text );
+ }
+ QListViewItem::setText( column, text );
+}
+
+void PhraseLVI::setPhrase( const Phrase& phrase )
+{
+ setText( SourceTextShown, phrase.source().simplifyWhiteSpace() );
+ setText( TargetTextShown, phrase.target().simplifyWhiteSpace() );
+ setText( DefinitionText, phrase.definition() );
+ setText( SourceTextOriginal, phrase.source() );
+ setText( TargetTextOriginal, phrase.target() );
+}
+
+Phrase PhraseLVI::phrase() const
+{
+ return Phrase( text(SourceTextOriginal), text(TargetTextOriginal),
+ text(DefinitionText) );
+}
+
+QString PhraseLVI::makeKey( const QString& text ) const
+{
+ if ( text == NewPhrase )
+ return QString::null;
+
+ QString key;
+ for ( int i = 0; i < (int) text.length(); i++ ) {
+ if ( text[i] != QChar('&') )
+ key += text[i].lower();
+ }
+ // see Section 5, Exercise 4 of The Art of Computer Programming
+ key += QChar::null;
+ key += text;
+ return key;
+}
+
+PhraseLV::PhraseLV( QWidget *parent, const char *name )
+ : QListView( parent, name )
+{
+ setAllColumnsShowFocus( TRUE );
+ setShowSortIndicator( TRUE );
+ for ( int i = 0; i < 3; i++ )
+ addColumn( QString::null, 120 );
+ setColumnText( PhraseLVI::SourceTextShown, tr("Source phrase") );
+ setColumnText( PhraseLVI::TargetTextShown, tr("Translation") );
+ setColumnText( PhraseLVI::DefinitionText, tr("Definition") );
+ header()->setStretchEnabled( TRUE, -1 );
+ what = new WhatPhrase( this );
+}
+
+PhraseLV::~PhraseLV()
+{
+// delete what;
+}
+
+QSize PhraseLV::sizeHint() const
+{
+ return QSize( QListView::sizeHint().width(), 50 );
+}
diff --git a/tools/linguist/linguist/phraselv.h b/tools/linguist/linguist/phraselv.h
new file mode 100644
index 0000000..cb06090
--- /dev/null
+++ b/tools/linguist/linguist/phraselv.h
@@ -0,0 +1,83 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PHRASELV_H
+#define PHRASELV_H
+
+#include "phrase.h"
+
+#include <qlistview.h>
+
+class QWhatsThis;
+
+class PhraseLV;
+
+#define NewPhrase PhraseLV::tr( "(New Phrase)" )
+
+class PhraseLVI : public QListViewItem
+{
+public:
+ enum { SourceTextShown, TargetTextShown, DefinitionText, SourceTextOriginal,
+ TargetTextOriginal };
+
+ PhraseLVI( PhraseLV *parent, const Phrase& phrase, int accelKey = 0 );
+
+ virtual void setText( int column, const QString& text );
+ virtual QString key( int column, bool ascending ) const;
+
+ void setPhrase( const Phrase& phrase );
+ Phrase phrase() const;
+ int accelKey() const { return akey; }
+
+private:
+ QString makeKey( const QString& text ) const;
+
+ int akey;
+ QString sourceTextKey;
+ QString targetTextKey;
+};
+
+class PhraseLV : public QListView
+{
+ Q_OBJECT
+public:
+ PhraseLV( QWidget *parent, const char *name );
+ ~PhraseLV();
+
+ virtual QSize sizeHint() const;
+
+private:
+ QWhatsThis *what;
+};
+
+#endif
diff --git a/tools/linguist/linguist/printout.cpp b/tools/linguist/linguist/printout.cpp
new file mode 100644
index 0000000..53d944a
--- /dev/null
+++ b/tools/linguist/linguist/printout.cpp
@@ -0,0 +1,182 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "printout.h"
+
+#include <qprinter.h>
+#include <qfontmetrics.h>
+
+PrintOut::PrintOut( QPrinter *printer )
+ : pr( printer ), pdmetrics( printer ), nextRule( NoRule ), page( 0 )
+{
+ p.begin( pr );
+ QFont f( "Arial" );
+ f8 = f;
+ f8.setPointSize( 8 );
+ f10 = f;
+ f10.setPointSize( 10 );
+ p.setFont( f10 );
+ fmetrics = new QFontMetrics( p.fontMetrics() );
+ hmargin = 5 * pdmetrics.width() / pdmetrics.widthMM(); // 5 mm
+ vmargin = 5 * pdmetrics.height() / pdmetrics.heightMM(); // 5 mm
+ hsize = pdmetrics.width() - 2 * hmargin;
+ vsize = pdmetrics.height() - vmargin;
+ dateTime = QDateTime::currentDateTime();
+ breakPage();
+ vsize -= voffset;
+ cp = Paragraph( QPoint(hmargin, voffset) );
+}
+
+PrintOut::~PrintOut()
+{
+ flushLine();
+ delete fmetrics;
+ p.end();
+}
+
+void PrintOut::setRule( Rule rule )
+{
+ if ( (int) nextRule < (int) rule )
+ nextRule = rule;
+}
+
+void PrintOut::setGuide( const QString& guide )
+{
+ g = guide;
+}
+
+void PrintOut::vskip()
+{
+ if ( !firstParagraph )
+ voffset += 14;
+}
+
+void PrintOut::flushLine( bool /* mayBreak */ )
+{
+ if ( voffset + cp.rect.height() > vsize )
+ breakPage();
+ else if ( !firstParagraph )
+ drawRule( nextRule );
+
+ for ( int i = 0; i < (int) cp.boxes.count(); i++ ) {
+ Box b = cp.boxes[i];
+ b.rect.moveBy( 0, voffset );
+ QRect r = b.rect;
+ p.setFont( b.font );
+ p.drawText( r, b.align, b.text );
+ }
+ voffset += cp.rect.height();
+
+ nextRule = NoRule;
+ cp = Paragraph( QPoint(hmargin, voffset) );
+ firstParagraph = FALSE;
+}
+
+void PrintOut::addBox( int percent, const QString& text, Style style,
+ int halign )
+{
+ int align = halign | Qt::AlignTop;
+ QFont f = f10;
+ if ( style == Strong )
+ f.setBold( TRUE );
+ else if ( style == Emphasis )
+ f.setItalic( TRUE );
+ int wd = hsize * percent / 100;
+ QRect r( cp.rect.x() + cp.rect.width(), 0, wd, vsize );
+ int ht = p.boundingRect( r, align, text ).height();
+
+ Box b( r, text, f, align );
+ cp.boxes.append( b );
+ cp.rect.setSize( QSize(cp.rect.width() + wd, QMAX(cp.rect.height(), ht)) );
+}
+
+void PrintOut::breakPage()
+{
+ static const int LeftAlign = Qt::AlignLeft | Qt::AlignTop;
+ static const int RightAlign = Qt::AlignRight | Qt::AlignTop;
+ QRect r1, r2;
+ int h1 = 0;
+ int h2 = 0;
+
+ if ( page++ > 0 )
+ pr->newPage();
+ voffset = 0;
+
+ p.setFont( f10 );
+ r1 = QRect( hmargin, voffset, 3 * hsize / 4, vsize );
+ r2 = QRect( r1.x() + r1.width(), voffset, hsize - r1.width(), vsize );
+ h1 = p.boundingRect( r1, LeftAlign, pr->docName() ).height();
+ p.drawText( r1, LeftAlign, pr->docName() );
+ h2 = p.boundingRect( r2, RightAlign, QString::number(page) ).height();
+ p.drawText( r2, RightAlign, QString::number(page) );
+ voffset += QMAX( h1, h2 );
+
+ r1 = QRect( hmargin, voffset, hsize / 2, LeftAlign );
+ p.setFont( f8 );
+ h1 = p.boundingRect( r1, LeftAlign, dateTime.toString() ).height();
+ p.drawText( r1, LeftAlign, dateTime.toString() );
+ p.setFont( f10 );
+ voffset += QMAX( h1, h2 );
+
+ voffset += 4;
+ p.drawLine( QPoint(hmargin, voffset), QPoint(hmargin + hsize, voffset) );
+ voffset += 14;
+ firstParagraph = TRUE;
+}
+
+void PrintOut::drawRule( Rule rule )
+{
+ QPen pen;
+
+ switch ( rule ) {
+ case NoRule:
+ voffset += 5;
+ break;
+ case ThinRule:
+ pen.setColor( QColor(192, 192, 192) );
+ pen.setStyle( QPen::DotLine );
+ pen.setWidth( 0 );
+ p.setPen( pen );
+ voffset += 5;
+ p.drawLine( QPoint(hmargin, voffset),
+ QPoint(hmargin + hsize, voffset) );
+ p.setPen( QPen() );
+ voffset += 2;
+ break;
+ case ThickRule:
+ voffset += 7;
+ p.drawLine( QPoint(hmargin, voffset),
+ QPoint(hmargin + hsize, voffset) );
+ voffset += 4;
+ }
+}
diff --git a/tools/linguist/linguist/printout.h b/tools/linguist/linguist/printout.h
new file mode 100644
index 0000000..d67191c
--- /dev/null
+++ b/tools/linguist/linguist/printout.h
@@ -0,0 +1,126 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PRINTOUT_H
+#define PRINTOUT_H
+
+#include <qfont.h>
+#include <qpaintdevicemetrics.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qvaluelist.h>
+#include <qdatetime.h>
+
+class QPrinter;
+class QFontMetrics;
+
+class PrintOut
+{
+public:
+ enum Rule { NoRule, ThinRule, ThickRule };
+ enum Style { Normal, Strong, Emphasis };
+
+ PrintOut( QPrinter *printer );
+ ~PrintOut();
+
+ void setRule( Rule rule );
+ void setGuide( const QString& guide );
+ void vskip();
+ void flushLine( bool mayBreak = FALSE );
+ void addBox( int percent, const QString& text = QString::null,
+ Style style = Normal,
+ int halign = Qt::AlignLeft | Qt::WordBreak );
+
+ int pageNum() const { return page; }
+
+ struct Box
+ {
+ QRect rect;
+ QString text;
+ QFont font;
+ int align;
+
+ Box() : align( 0 ) { }
+ Box( const QRect& r, const QString& t, const QFont& f, int a )
+ : rect( r ), text( t ), font( f ), align( a ) { }
+ Box( const Box& b )
+ : rect( b.rect ), text( b.text ), font( b.font ),
+ align( b.align ) { }
+
+ Box& operator=( const Box& b ) {
+ rect = b.rect;
+ text = b.text;
+ font = b.font;
+ align = b.align;
+ return *this;
+ }
+
+ bool operator==( const Box& b ) const {
+ return rect == b.rect && text == b.text && font == b.font &&
+ align == b.align;
+ }
+ };
+
+private:
+ void breakPage();
+ void drawRule( Rule rule );
+
+ struct Paragraph {
+ QRect rect;
+ QValueList<Box> boxes;
+
+ Paragraph() { }
+ Paragraph( QPoint p ) : rect( p, QSize(0, 0) ) { }
+ };
+
+ QPrinter *pr;
+ QPainter p;
+ QFont f8;
+ QFont f10;
+ QFontMetrics *fmetrics;
+ QPaintDeviceMetrics pdmetrics;
+ Rule nextRule;
+ Paragraph cp;
+ int page;
+ bool firstParagraph;
+ QString g;
+ QDateTime dateTime;
+
+ int hmargin;
+ int vmargin;
+ int voffset;
+ int hsize;
+ int vsize;
+};
+
+#endif
diff --git a/tools/linguist/linguist/simtexth.cpp b/tools/linguist/linguist/simtexth.cpp
new file mode 100644
index 0000000..8bed388
--- /dev/null
+++ b/tools/linguist/linguist/simtexth.cpp
@@ -0,0 +1,239 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "simtexth.h"
+
+#include <metatranslator.h>
+
+#include <qcstring.h>
+#include <qdict.h>
+#include <qmap.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+
+#include <string.h>
+
+typedef QValueList<MetaTranslatorMessage> TML;
+
+/*
+ How similar are two texts? The approach used here relies on co-occurrence
+ matrices and is very efficient.
+
+ Let's see with an example: how similar are "here" and "hither"? The
+ co-occurrence matrix M for "here" is M[h,e] = 1, M[e,r] = 1, M[r,e] = 1, and 0
+ elsewhere; the matrix N for "hither" is N[h,i] = 1, N[i,t] = 1, ...,
+ N[h,e] = 1, N[e,r] = 1, and 0 elsewhere. The union U of both matrices is the
+ matrix U[i,j] = max { M[i,j], N[i,j] }, and the intersection V is
+ V[i,j] = min { M[i,j], N[i,j] }. The score for a pair of texts is
+
+ score = (sum of V[i,j] over all i, j) / (sum of U[i,j] over all i, j),
+
+ a formula suggested by Arnt Gulbrandsen. Here we have
+
+ score = 2 / 6,
+
+ or one third.
+
+ The implementation differs from this in a few details. Most importantly,
+ repetitions are ignored; for input "xxx", M[x,x] equals 1, not 2.
+*/
+
+/*
+ Every character is assigned to one of 20 buckets so that the co-occurrence
+ matrix requires only 20 * 20 = 400 bits, not 256 * 256 = 65536 bits or even
+ more if we want the whole Unicode. Which character falls in which bucket is
+ arbitrary.
+
+ The second half of the table is a replica of the first half, because of
+ laziness.
+*/
+static const int indexOf[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// ! " # $ % & ' ( ) * + , - . /
+ 0, 2, 6, 7, 10, 12, 15, 19, 2, 6, 7, 10, 12, 15, 19, 0,
+// 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+ 1, 3, 4, 5, 8, 9, 11, 13, 14, 16, 2, 6, 7, 10, 12, 15,
+// @ A B C D E F G H I J K L M N O
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14,
+// P Q R S T U V W X Y Z [ \ ] ^ _
+ 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0,
+// ` a b c d e f g h i j k l m n o
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14,
+// p q r s t u v w x y z { | } ~
+ 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2, 6, 7, 10, 12, 15, 19, 2, 6, 7, 10, 12, 15, 19, 0,
+ 1, 3, 4, 5, 8, 9, 11, 13, 14, 16, 2, 6, 7, 10, 12, 15,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14,
+ 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 10, 11, 12, 13, 14,
+ 15, 12, 16, 17, 18, 19, 2, 10, 15, 7, 19, 2, 6, 7, 10, 0
+};
+
+/*
+ The entry bitCount[i] (for i between 0 and 255) is the number of bits used to
+ represent i in binary.
+*/
+static const int bitCount[256] = {
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
+
+struct CoMatrix
+{
+ /*
+ The matrix has 20 * 20 = 400 entries. This requires 50 bytes, or 13
+ words. Some operations are performed on words for more efficiency.
+ */
+ union {
+ Q_UINT8 b[52];
+ Q_UINT32 w[13];
+ };
+
+ CoMatrix() { memset( b, 0, 52 ); }
+ CoMatrix( const char *text ) {
+ char c = '\0', d;
+ memset( b, 0, 52 );
+ /*
+ The Knuth books are not in the office only for show; they help make
+ loops 30% faster and 20% as readable.
+ */
+ while ( (d = *text) != '\0' ) {
+ setCoocc( c, d );
+ if ( (c = *++text) != '\0' ) {
+ setCoocc( d, c );
+ text++;
+ }
+ }
+ }
+
+ void setCoocc( char c, char d ) {
+ int k = indexOf[(uchar) c] + 20 * indexOf[(uchar) d];
+ b[k >> 3] |= k & 0x7;
+ }
+
+ int worth() const {
+ int w = 0;
+ for ( int i = 0; i < 50; i++ )
+ w += bitCount[b[i]];
+ return w;
+ }
+};
+
+static inline CoMatrix reunion( const CoMatrix& m, const CoMatrix& n )
+{
+ CoMatrix p;
+ for ( int i = 0; i < 13; i++ )
+ p.w[i] = m.w[i] | n.w[i];
+ return p;
+}
+
+static inline CoMatrix intersection( const CoMatrix& m, const CoMatrix& n )
+{
+ CoMatrix p;
+ for ( int i = 0; i < 13; i++ )
+ p.w[i] = m.w[i] & n.w[i];
+ return p;
+}
+
+CandidateList similarTextHeuristicCandidates( const MetaTranslator *tor,
+ const char *text,
+ int maxCandidates )
+{
+ QValueList<int> scores;
+ CandidateList candidates;
+ CoMatrix cmTarget( text );
+ int targetLen = qstrlen( text );
+
+ TML all = tor->translatedMessages();
+ TML::Iterator it;
+
+ for ( it = all.begin(); it != all.end(); ++it ) {
+ if ( (*it).type() == MetaTranslatorMessage::Unfinished ||
+ (*it).translation().isEmpty() )
+ continue;
+
+ QString s = tor->toUnicode( (*it).sourceText(), (*it).utf8() );
+ CoMatrix cm( s.latin1() );
+ int delta = QABS( (int) s.length() - targetLen );
+
+ /*
+ Here is the score formula. A comment above contains a
+ discussion on a similar (but simpler) formula.
+ */
+ int score = ( (intersection(cm, cmTarget).worth() + 1) << 10 ) /
+ ( reunion(cm, cmTarget).worth() + (delta << 1) + 1 );
+
+ if ( (int) candidates.count() == maxCandidates &&
+ score > scores[maxCandidates - 1] )
+ candidates.remove( candidates.last() );
+ if ( (int) candidates.count() < maxCandidates && score >= 190 ) {
+ Candidate cand( s, (*it).translation() );
+
+ int i;
+ for ( i = 0; i < (int) candidates.count(); i++ ) {
+ if ( score >= scores[i] ) {
+ if ( score == scores[i] ) {
+ if ( candidates[i] == cand )
+ goto continue_outer_loop;
+ } else {
+ break;
+ }
+ }
+ }
+ scores.insert( scores.at(i), score );
+ candidates.insert( candidates.at(i), cand );
+ }
+ continue_outer_loop:
+ ;
+ }
+ return candidates;
+}
diff --git a/tools/linguist/linguist/simtexth.h b/tools/linguist/linguist/simtexth.h
new file mode 100644
index 0000000..91d8cbd
--- /dev/null
+++ b/tools/linguist/linguist/simtexth.h
@@ -0,0 +1,64 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef SIMTEXTH_H
+#define SIMTEXTH_H
+
+#include <qstring.h>
+#include <qvaluelist.h>
+
+class MetaTranslator;
+
+struct Candidate {
+ QString source;
+ QString target;
+
+ Candidate() { }
+ Candidate( const QString& source0, const QString& target0 )
+ : source( source0 ), target( target0 ) { }
+};
+
+inline bool operator==( const Candidate& c, const Candidate& d ) {
+ return c.target == d.target && c.source == d.source;
+}
+inline bool operator!=( const Candidate& c, const Candidate& d ) {
+ return !operator==( c, d );
+}
+
+typedef QValueList<Candidate> CandidateList;
+
+CandidateList similarTextHeuristicCandidates( const MetaTranslator *tor,
+ const char *text,
+ int maxCandidates );
+
+#endif
diff --git a/tools/linguist/linguist/statistics.ui b/tools/linguist/linguist/statistics.ui
new file mode 100644
index 0000000..c897b78
--- /dev/null
+++ b/tools/linguist/linguist/statistics.ui
@@ -0,0 +1,259 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>Statistics</class>
+<comment>*********************************************************************
+** Copyright (C) 2002-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+*********************************************************************</comment>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>Statistics</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>336</width>
+ <height>164</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Statistics</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>closeBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QFrame" row="0" column="0">
+ <property name="name">
+ <cstring>frame4</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>GroupBoxPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Translation</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Source</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>untrWords</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>trWords</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Words:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="2">
+ <property name="name">
+ <cstring>trChars</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>untrChars</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Characters:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Characters (with spaces):</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="2">
+ <property name="name">
+ <cstring>trCharsSpc</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>untrCharsSpc</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>closeBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>Statistics</receiver>
+ <slot>close()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">statistics.ui.h</include>
+</includes>
+<signals>
+ <signal>closed()</signal>
+</signals>
+<slots>
+ <slot>updateStats( int w1, int c1, int cs1, int w2, int c2, int cs2 )</slot>
+ <slot>closeEvent( QCloseEvent * e )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/tools/linguist/linguist/statistics.ui.h b/tools/linguist/linguist/statistics.ui.h
new file mode 100644
index 0000000..fe9b448
--- /dev/null
+++ b/tools/linguist/linguist/statistics.ui.h
@@ -0,0 +1,53 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+void Statistics::init()
+{
+ setFixedHeight( sizeHint().height() );
+}
+
+void Statistics::updateStats( int w1, int c1, int cs1, int w2, int c2, int cs2 )
+{
+ untrWords->setText( QString::number( w1 ) );
+ untrChars->setText( QString::number( c1 ) );
+ untrCharsSpc->setText( QString::number( cs1 ) );
+ trWords->setText( QString::number( w2 ) );
+ trChars->setText( QString::number( c2 ) );
+ trCharsSpc->setText( QString::number( cs2 ) );
+}
+
+void Statistics::closeEvent( QCloseEvent * e )
+{
+ emit closed();
+ QDialog::closeEvent( e );
+}
diff --git a/tools/linguist/linguist/trwindow.cpp b/tools/linguist/linguist/trwindow.cpp
new file mode 100644
index 0000000..e8725e5
--- /dev/null
+++ b/tools/linguist/linguist/trwindow.cpp
@@ -0,0 +1,2071 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+/* TRANSLATOR TrWindow
+
+ This is the application's main window.
+*/
+
+#include "trwindow.h"
+#include "listviews.h"
+#include "finddialog.h"
+#include "msgedit.h"
+#include "phrasebookbox.h"
+#include "printout.h"
+#include "about.h"
+#include "phraselv.h"
+#include "statistics.h"
+
+#include <qaccel.h>
+#include <qaction.h>
+#include <qapplication.h>
+#include <qbitmap.h>
+#include <qdict.h>
+#include <qdockarea.h>
+#include <qdockwindow.h>
+#include <qfile.h>
+#include <qfiledialog.h>
+#include <qfileinfo.h>
+#include <qheader.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qmenubar.h>
+#include <qmessagebox.h>
+#include <qpopupmenu.h>
+#include <qregexp.h>
+#include <qsettings.h>
+#include <qstatusbar.h>
+#include <qtoolbar.h>
+#include <qwhatsthis.h>
+#include <qprocess.h>
+#include <qassistantclient.h>
+
+#include <stdlib.h>
+
+#define pagecurl_mask_width 53
+#define pagecurl_mask_height 51
+static const uchar pagecurl_mask_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x0f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0x0f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,
+ 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0xff,
+ 0xff, 0xff, 0x0f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
+ 0xfc, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x0f,
+ 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff,
+ 0xff, 0x0f, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xf0,
+ 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff,
+ 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff,
+ 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,
+ 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f,
+ 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff,
+ 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0,
+ 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00,
+ 0x00, 0xe0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff,
+ 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xfc,
+ 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
+
+typedef QValueList<MetaTranslatorMessage> TML;
+
+static const int ErrorMS = 600000; // for error messages
+static const int MessageMS = 2500;
+
+QPixmap * TrWindow::pxOn = 0;
+QPixmap * TrWindow::pxOff = 0;
+QPixmap * TrWindow::pxObsolete = 0;
+QPixmap * TrWindow::pxDanger = 0;
+
+enum Ending { End_None, End_FullStop, End_Interrobang, End_Colon,
+ End_Ellipsis };
+
+static Ending ending( QString str )
+{
+ str = str.simplifyWhiteSpace();
+ int ch = 0;
+ if ( !str.isEmpty() )
+ ch = str.right( 1 )[0].unicode();
+
+ switch ( ch ) {
+ case 0x002e: // full stop
+ if ( str.endsWith(QString("...")) )
+ return End_Ellipsis;
+ else
+ return End_FullStop;
+ case 0x0589: // armenian full stop
+ case 0x06d4: // arabic full stop
+ case 0x3002: // ideographic full stop
+ return End_FullStop;
+ case 0x0021: // exclamation mark
+ case 0x003f: // question mark
+ case 0x00a1: // inverted exclamation mark
+ case 0x00bf: // inverted question mark
+ case 0x01c3: // latin letter retroflex click
+ case 0x037e: // greek question mark
+ case 0x061f: // arabic question mark
+ case 0x203c: // double exclamation mark
+ case 0x203d: // interrobang
+ case 0x2048: // question exclamation mark
+ case 0x2049: // exclamation question mark
+ case 0x2762: // heavy exclamation mark ornament
+ return End_Interrobang;
+ case 0x003a: // colon
+ return End_Colon;
+ case 0x2026: // horizontal ellipsis
+ return End_Ellipsis;
+ default:
+ return End_None;
+ }
+}
+
+class Action : public QAction
+{
+public:
+ Action( QPopupMenu *pop, const QString& menuText, QObject *receiver,
+ const char *member, const QString &imageName = QString::null,
+ int accel = 0, bool toggle = FALSE );
+ Action( QPopupMenu *pop, const QString& menuText, int accel = 0,
+ bool toggle = FALSE );
+
+ virtual void setWhatsThis( const QString& whatsThis );
+
+ bool addToToolbar( QToolBar *tb, const QString& text );
+};
+
+Action::Action( QPopupMenu *pop, const QString& menuText, QObject *receiver,
+ const char *member, const QString &imageName, int accel,
+ bool toggle )
+ : QAction( pop->parent(), (const char *) 0, toggle )
+{
+ setMenuText( menuText );
+ setAccel( accel );
+
+ if ( !imageName.isEmpty() ) {
+ QPixmap enabledPix = QPixmap::fromMimeSource( imageName );
+ QIconSet s( enabledPix );
+ if ( imageName != "whatsthis.xpm" ) {
+ QPixmap disabledPix = QPixmap::fromMimeSource( "d_" + imageName );
+ s.setPixmap( disabledPix, QIconSet::Small, QIconSet::Disabled );
+ }
+ setIconSet( s );
+ }
+ QAction::addTo( pop );
+ connect( this, SIGNAL(activated()), receiver, member );
+}
+
+Action::Action( QPopupMenu *pop, const QString& menuText, int accel,
+ bool toggle )
+ : QAction( pop->parent(), (const char *) 0, toggle )
+{
+ QAction::addTo( pop );
+ setMenuText( menuText );
+ setAccel( accel );
+}
+
+void Action::setWhatsThis( const QString& whatsThis )
+{
+ QAction::setWhatsThis( whatsThis );
+ setStatusTip( whatsThis );
+}
+
+bool Action::addToToolbar( QToolBar *tb, const QString& text )
+{
+ setText( text );
+ return QAction::addTo( tb );
+}
+
+const QPixmap TrWindow::pageCurl()
+{
+ QPixmap pixmap;
+ pixmap = QPixmap::fromMimeSource( "pagecurl.png" );
+ if ( !pixmap.isNull() ) {
+ QBitmap pageCurlMask( pagecurl_mask_width, pagecurl_mask_height,
+ pagecurl_mask_bits, TRUE );
+ pixmap.setMask( pageCurlMask );
+ }
+
+ return pixmap;
+}
+
+TrWindow::TrWindow()
+ : QMainWindow( 0, "translation window", WType_TopLevel | WDestructiveClose )
+{
+
+#ifndef Q_WS_MACX
+ setIcon( QPixmap::fromMimeSource( "appicon.png" ) );
+#endif
+
+ // Create the application global listview symbols
+ pxOn = new QPixmap( QPixmap::fromMimeSource( "s_check_on.png" ) );
+ pxOff = new QPixmap( QPixmap::fromMimeSource( "s_check_off.png" ) );
+ pxObsolete = new QPixmap( QPixmap::fromMimeSource( "d_s_check_obs.png" ) );
+ pxDanger = new QPixmap( QPixmap::fromMimeSource( "s_check_danger.png" ) );
+
+ // Set up the Scope dock window
+ QDockWindow * dwScope = new QDockWindow( QDockWindow::InDock, this,
+ "context");
+ dwScope->setResizeEnabled( TRUE );
+ dwScope->setCloseMode( QDockWindow::Always );
+ addDockWindow( dwScope, tr("Context"), Qt::DockLeft );
+ dwScope->setCaption( tr("Context") );
+ dwScope->setFixedExtentWidth( 200 );
+ lv = new QListView( dwScope, "context list view" );
+ lv->setShowSortIndicator( TRUE );
+ lv->setAllColumnsShowFocus( TRUE );
+ lv->header()->setStretchEnabled( TRUE, 1 );
+ QFontMetrics fm( font() );
+ lv->addColumn( tr("Done"), fm.width( tr("Done") ) + 10 );
+ lv->addColumn( tr("Context") );
+ lv->addColumn( tr("Items"), 55 );
+ lv->setColumnAlignment( 0, Qt::AlignCenter );
+ lv->setColumnAlignment( 2, Qt::AlignRight );
+ lv->setSorting( 0 );
+ lv->setHScrollBarMode( QScrollView::AlwaysOff );
+ dwScope->setWidget( lv );
+
+ messageIsShown = FALSE;
+ me = new MessageEditor( &tor, this, "message editor" );
+ setCentralWidget( me );
+ slv = me->sourceTextList();
+ plv = me->phraseList();
+
+ setupMenuBar();
+ setupToolBars();
+
+ progress = new QLabel( statusBar(), "progress" );
+ statusBar()->addWidget( progress, 0, TRUE );
+ modified = new QLabel( QString(" %1 ").arg(tr("MOD")), statusBar(),
+ "modified?" );
+ statusBar()->addWidget( modified, 0, TRUE );
+
+ dirtyItem = -1;
+ numFinished = 0;
+ numNonobsolete = 0;
+ numMessages = 0;
+ updateProgress();
+
+ dirty = FALSE;
+ updateCaption();
+
+ phraseBooks.setAutoDelete( TRUE );
+
+ f = new FindDialog( FALSE, this, "find", FALSE );
+ f->setCaption( tr("Qt Linguist") );
+ h = new FindDialog( TRUE, this, "replace", FALSE );
+ h->setCaption( tr("Qt Linguist") );
+ findMatchCase = FALSE;
+ findWhere = 0;
+ foundItem = 0;
+ foundScope = 0;
+ foundWhere = 0;
+ foundOffset = 0;
+
+ connect( lv, SIGNAL(selectionChanged(QListViewItem *)),
+ this, SLOT(showNewScope(QListViewItem *)) );
+
+ connect( slv, SIGNAL(currentChanged(QListViewItem *)),
+ this, SLOT(showNewCurrent(QListViewItem *)) );
+
+ connect( slv, SIGNAL(clicked(QListViewItem *, const QPoint&, int)),
+ this, SLOT(showNewCurrent(QListViewItem *)) );
+
+ connect( slv, SIGNAL(clicked(QListViewItem *, const QPoint&, int)),
+ this, SLOT(toggleFinished(QListViewItem *, const QPoint&, int)) );
+
+ connect( me, SIGNAL(translationChanged(const QString&)),
+ this, SLOT(updateTranslation(const QString&)) );
+ connect( me, SIGNAL(finished(bool)), this, SLOT(updateFinished(bool)) );
+ connect( me, SIGNAL(prevUnfinished()), this, SLOT(prevUnfinished()) );
+ connect( me, SIGNAL(nextUnfinished()), this, SLOT(nextUnfinished()) );
+ connect( me, SIGNAL(focusSourceList()), this, SLOT(focusSourceList()) );
+ connect( me, SIGNAL(focusPhraseList()), this, SLOT(focusPhraseList()) );
+ connect( f, SIGNAL(findNext(const QString&, int, bool)),
+ this, SLOT(findNext(const QString&, int, bool)) );
+
+ QWhatsThis::add( lv, tr("This panel lists the source contexts.") );
+
+ QWhatsThis::add( slv, tr("This panel lists the source texts. "
+ "Items that violate validation rules "
+ "are marked with a warning.") );
+ showNewCurrent( 0 );
+
+ QSize as( qApp->desktop()->size() );
+ as -= QSize( 30, 30 );
+ resize( QSize( 1000, 800 ).boundedTo( as ) );
+ readConfig();
+ stats = 0;
+ srcWords = 0;
+ srcChars = 0;
+ srcCharsSpc = 0;
+}
+
+TrWindow::~TrWindow()
+{
+ writeConfig();
+ delete stats;
+}
+
+void TrWindow::openFile( const QString& name )
+{
+ if ( !name.isEmpty() ) {
+ statusBar()->message( tr("Loading...") );
+ qApp->processEvents();
+ tor.clear();
+ if ( tor.load(name) ) {
+ slv->clear();
+ slv->repaint();
+ slv->viewport()->repaint();
+ slv->setUpdatesEnabled( FALSE );
+ slv->viewport()->setUpdatesEnabled( FALSE );
+ lv->clear();
+ lv->repaint();
+ lv->viewport()->repaint();
+ lv->setUpdatesEnabled( FALSE );
+ lv->viewport()->setUpdatesEnabled( FALSE );
+ setEnabled( FALSE );
+ numFinished = 0;
+ numNonobsolete = 0;
+ numMessages = 0;
+ foundScope = 0;
+
+ TML all = tor.messages();
+ TML::Iterator it;
+ QDict<ContextLVI> contexts( 1009 );
+
+ srcWords = 0;
+ srcChars = 0;
+ srcCharsSpc = 0;
+ for ( it = all.begin(); it != all.end(); ++it ) {
+ qApp->processEvents();
+ ContextLVI *c = contexts.find( QString((*it).context()) );
+ if ( c == 0 ) {
+ c = new ContextLVI( lv, tor.toUnicode((*it).context(),
+ (*it).utf8()) );
+ contexts.insert( QString((*it).context()), c );
+ }
+ if ( QCString((*it).sourceText()) == ContextComment ) {
+ c->appendToComment( tor.toUnicode((*it).comment(),
+ (*it).utf8()) );
+ } else {
+ MessageLVI * tmp = new MessageLVI( slv, *it,
+ tor.toUnicode((*it).sourceText(),
+ (*it).utf8()),
+ tor.toUnicode((*it).comment(),
+ (*it).utf8()), c );
+ tmp->setDanger( danger(tmp->sourceText(),
+ tmp->translation()) &&
+ tmp->message().type() ==
+ MetaTranslatorMessage::Finished );
+ c->instantiateMessageItem( slv, tmp );
+ if ( (*it).type() != MetaTranslatorMessage::Obsolete ) {
+ numNonobsolete++;
+ if ( (*it).type() == MetaTranslatorMessage::Finished )
+ numFinished++;
+ doCharCounting( tmp->sourceText(), srcWords, srcChars, srcCharsSpc );
+ } else {
+ c->incrementObsoleteCount();
+ }
+ numMessages++;
+ }
+ c->updateStatus();
+ }
+ slv->viewport()->setUpdatesEnabled( TRUE );
+ slv->setUpdatesEnabled( TRUE );
+ lv->viewport()->setUpdatesEnabled( TRUE );
+ lv->setUpdatesEnabled( TRUE );
+ setEnabled( TRUE );
+ slv->repaint();
+ slv->viewport()->repaint();
+ lv->triggerUpdate();
+ updateProgress();
+ filename = name;
+ dirty = FALSE;
+ updateCaption();
+ me->showNothing();
+ doneAndNextAct->setEnabled( FALSE );
+ doneAndNextAlt->setEnabled( FALSE );
+ messageIsShown = FALSE;
+ statusBar()->message(
+ tr("%1 source phrase(s) loaded.").arg(numMessages),
+ MessageMS );
+
+ foundItem = 0;
+ foundWhere = 0;
+ foundOffset = 0;
+ if ( lv->childCount() > 0 ) {
+ findAct->setEnabled( TRUE );
+ findAgainAct->setEnabled( FALSE );
+#ifdef notyet
+ replaceAct->setEnabled( TRUE );
+#endif
+ lv->setCurrentItem( lv->firstChild() );
+ }
+ addRecentlyOpenedFile( name, recentFiles );
+ updateStatistics();
+ } else {
+ statusBar()->clear();
+ QMessageBox::warning( this, tr("Qt Linguist"),
+ tr("Cannot open '%1'.").arg(name) );
+ }
+ }
+}
+
+void TrWindow::open()
+{
+ if ( maybeSave() ) {
+ QString newFilename = QFileDialog::getOpenFileName( filename,
+ tr("Qt translation source (*.ts)\n"
+ "All files (*)"),
+ this, "open" );
+ openFile( newFilename );
+ }
+}
+
+void TrWindow::save()
+{
+ if ( filename.isEmpty() )
+ return;
+
+ if ( tor.save(filename) ) {
+ dirty = FALSE;
+ updateCaption();
+ statusBar()->message( tr("File saved."), MessageMS );
+ } else {
+ QMessageBox::warning( this, tr("Qt Linguist"), tr("Cannot save '%1'.")
+ .arg(filename) );
+ }
+}
+
+void TrWindow::saveAs()
+{
+ QString newFilename = QFileDialog::getSaveFileName( filename,
+ tr( "Qt translation source (*.ts)\n"
+ "All files (*)"),
+ this, "save_as" );
+ if ( !newFilename.isEmpty() ) {
+ filename = newFilename;
+ save();
+ updateCaption();
+ }
+}
+
+void TrWindow::release()
+{
+ QString newFilename = filename;
+ newFilename.replace( QRegExp(".ts$"), "" );
+ newFilename += QString( ".qm" );
+
+ newFilename = QFileDialog::getSaveFileName( newFilename,
+ tr("Qt message files for released applications (*.qm)\n"
+ "All files (*)"),
+ this, "release",
+ tr("Release") );
+ if ( !newFilename.isEmpty() ) {
+ if ( tor.release(newFilename) )
+ statusBar()->message( tr("File created."), MessageMS );
+ else
+ QMessageBox::warning( this, tr("Qt Linguist"),
+ tr("Cannot save '%1'.").arg(newFilename) );
+ }
+}
+
+void TrWindow::print()
+{
+ int pageNum = 0;
+
+ if ( printer.setup(this) ) {
+ QApplication::setOverrideCursor( WaitCursor );
+ printer.setDocName( filename );
+ statusBar()->message( tr("Printing...") );
+ PrintOut pout( &printer );
+ ContextLVI *c = (ContextLVI *) lv->firstChild();
+ while ( c != 0 ) {
+ setCurrentContextItem( c );
+ pout.vskip();
+ pout.setRule( PrintOut::ThickRule );
+ pout.setGuide( c->context() );
+ pout.addBox( 100, tr("Context: %1").arg(c->context()),
+ PrintOut::Strong );
+ pout.flushLine();
+ pout.addBox( 4 );
+ pout.addBox( 92, c->comment(), PrintOut::Emphasis );
+ pout.flushLine();
+ pout.setRule( PrintOut::ThickRule );
+
+ MessageLVI *m = (MessageLVI *) slv->firstChild();
+ while ( m != 0 ) {
+ pout.setRule( PrintOut::ThinRule );
+
+ QString type;
+ switch ( m->message().type() ) {
+ case MetaTranslatorMessage::Finished:
+ type = tr( "finished" );
+ break;
+ case MetaTranslatorMessage::Unfinished:
+ type = m->danger() ? tr( "unresolved" ) : QString( "unfinished" );
+ break;
+ case MetaTranslatorMessage::Obsolete:
+ type = tr( "obsolete" );
+ break;
+ default:
+ type = QString( "" );
+ }
+ pout.addBox( 40, m->sourceText() );
+ pout.addBox( 4 );
+ pout.addBox( 40, m->translation() );
+ pout.addBox( 4 );
+ pout.addBox( 12, type, PrintOut::Normal, Qt::AlignRight );
+ if ( !m->comment().isEmpty() ) {
+ pout.flushLine();
+ pout.addBox( 4 );
+ pout.addBox( 92, m->comment(), PrintOut::Emphasis );
+ }
+ pout.flushLine( TRUE );
+
+ if ( pout.pageNum() != pageNum ) {
+ pageNum = pout.pageNum();
+ statusBar()->message( tr("Printing... (page %1)")
+ .arg(pageNum) );
+ }
+ m = (MessageLVI *) m->nextSibling();
+ }
+ c = (ContextLVI *) c->nextSibling();
+ }
+ pout.flushLine( TRUE );
+ QApplication::restoreOverrideCursor();
+ statusBar()->message( tr("Printing completed"), MessageMS );
+ } else {
+ statusBar()->message( tr("Printing aborted"), MessageMS );
+ }
+}
+
+void TrWindow::find()
+{
+ h->hide();
+ f->show();
+ f->setActiveWindow();
+ f->raise();
+}
+
+void TrWindow::findAgain()
+{
+ int pass = 0;
+ int oldItemNo = itemToIndex( slv, slv->currentItem() );
+ QString delayedMsg;
+ QListViewItem * j = foundScope;
+ QListViewItem * k = indexToItem( slv, foundItem );
+ QListViewItem * oldScope = lv->currentItem();
+
+ if ( lv->childCount() == 0 )
+ return;
+#if 1
+ /*
+ As long as we don't implement highlighting of the text in the QTextView,
+ we may have only one match per message.
+ */
+ foundOffset = (int) 0x7fffffff;
+#else
+ foundOffset++;
+#endif
+ slv->setUpdatesEnabled( FALSE );
+ do {
+ // Iterate through every item in all contexts
+ if ( j == 0 ) {
+ j = lv->firstChild();
+ setCurrentContextItem( j );
+ if ( foundScope != 0 )
+ delayedMsg = tr("Search wrapped.");
+ }
+ if ( k == 0 )
+ k = slv->firstChild();
+
+ while ( k ) {
+ MessageLVI * m = (MessageLVI *) k;
+ switch ( foundWhere ) {
+ case 0:
+ foundWhere = FindDialog::SourceText;
+ foundOffset = 0;
+ // fall-through
+ case FindDialog::SourceText:
+ if ( searchItem( m->sourceText(), j, k ) ) {
+ f->hide();
+ if ( !delayedMsg.isEmpty() )
+ statusBar()->message( delayedMsg, MessageMS );
+ return;
+ }
+ foundWhere = FindDialog::Translations;
+ foundOffset = 0;
+ // fall-through
+ case FindDialog::Translations:
+ if ( searchItem( m->translation(), j, k ) ) {
+ f->hide();
+ if ( !delayedMsg.isEmpty() )
+ statusBar()->message( delayedMsg, MessageMS );
+ return;
+ }
+ foundWhere = FindDialog::Comments;
+ foundOffset = 0;
+ // fall-through
+ case FindDialog::Comments:
+ if ( searchItem( ((ContextLVI *) j)->fullContext(), j, k) ) {
+ f->hide();
+ if ( !delayedMsg.isEmpty() )
+ statusBar()->message( delayedMsg, MessageMS );
+ return;
+ }
+ foundWhere = 0;
+ foundOffset = 0;
+ }
+ k = k->nextSibling();
+ }
+
+ j = j->nextSibling();
+ if ( j ) {
+ setCurrentContextItem( j );
+ k = slv->firstChild();
+ }
+ } while ( pass++ != lv->childCount() );
+
+ // This is just to keep the current scope and source text item
+ // selected after a search failed.
+ if ( oldScope ) {
+ setCurrentContextItem( oldScope );
+ QListViewItem * tmp = indexToItem( slv, oldItemNo );
+ if( tmp )
+ setCurrentMessageItem( tmp );
+ } else {
+ if( lv->firstChild() )
+ setCurrentContextItem( lv->firstChild() );
+ if( slv->firstChild() )
+ setCurrentMessageItem( slv->firstChild() );
+ }
+
+ slv->setUpdatesEnabled( TRUE );
+ slv->triggerUpdate();
+ qApp->beep();
+ QMessageBox::warning( this, tr("Qt Linguist"),
+ QString( tr("Cannot find the string '%1'.") ).arg(findText) );
+ foundItem = 0;
+ foundWhere = 0;
+ foundOffset = 0;
+}
+
+void TrWindow::replace()
+{
+ f->hide();
+ h->show();
+ h->setActiveWindow();
+ h->raise();
+}
+
+int TrWindow::itemToIndex( QListView * view, QListViewItem * item )
+{
+ int no = 0;
+ QListViewItem * tmp;
+
+ if( view && item ){
+ if( (tmp = view->firstChild()) != 0 )
+ do {
+ no++;
+ tmp = tmp->nextSibling();
+ } while( tmp && (tmp != item) );
+ }
+ return no;
+}
+
+QListViewItem * TrWindow::indexToItem( QListView * view, int index )
+{
+ QListViewItem * item = 0;
+
+ if ( view && index > 0 ) {
+ item = view->firstChild();
+ while( item && index-- > 0 )
+ item = item->nextSibling();
+ }
+ return item;
+}
+
+bool TrWindow::searchItem( const QString & searchWhat, QListViewItem * j,
+ QListViewItem * k )
+{
+ if ( (findWhere & foundWhere) != 0 ) {
+ foundOffset = searchWhat.find( findText, foundOffset, findMatchCase );
+ if ( foundOffset >= 0 ) {
+ foundItem = itemToIndex( slv, k );
+ foundScope = j;
+ setCurrentMessageItem( k );
+ slv->setUpdatesEnabled( TRUE );
+ slv->triggerUpdate();
+ return TRUE;
+ }
+ }
+ foundOffset = 0;
+ return FALSE;
+}
+
+void TrWindow::newPhraseBook()
+{
+ QString name;
+ for (;;) {
+ name = QFileDialog::getSaveFileName( QString::null,
+ tr("Qt phrase books (*.qph)\n"
+ "All files (*)"),
+ this, "new_phrasebook",
+ tr("Create New Phrase Book") );
+ if ( !QFile::exists(name) )
+ break;
+ QMessageBox::warning( this, tr("Qt Linguist"),
+ tr("A file called '%1' already exists."
+ " Please choose another name.").arg(name) );
+ }
+ if ( !name.isEmpty() ) {
+ PhraseBook pb;
+ if ( savePhraseBook(name, pb) ) {
+ if ( openPhraseBook(name) )
+ statusBar()->message( tr("Phrase book created."), MessageMS );
+ }
+ }
+}
+
+void TrWindow::openPhraseBook()
+{
+ QString phrasebooks( qInstallPathData() );
+ QString name = QFileDialog::getOpenFileName( phrasebooks + "/phrasebooks",
+ tr("Qt phrase books (*.qph)\n"
+ "All files (*)"),
+ this, "open_phrasebook",
+ tr("Open Phrase Book") );
+ if ( !name.isEmpty() && !phraseBookNames.contains(name) ) {
+ if ( openPhraseBook(name) ) {
+ int n = (int)(phraseBooks.at( phraseBooks.count() - 1 )->count());
+ statusBar()->message( tr("%1 phrase(s) loaded.").arg(n),
+ MessageMS );
+ }
+ }
+}
+
+void TrWindow::closePhraseBook( int id )
+{
+ int index = closePhraseBookp->indexOf( id );
+ phraseBooks.remove( index );
+ phraseBookNames.remove( phraseBookNames.at(index) );
+ updatePhraseDict();
+
+ dirtyItem = index; // remove the item next time the menu is opened
+ editPhraseBookp->removeItem( editPhraseBookp->idAt(index) );
+ printPhraseBookp->removeItem( printPhraseBookp->idAt(index) );
+}
+
+void TrWindow::editPhraseBook( int id )
+{
+ int index = editPhraseBookp->indexOf( id );
+ PhraseBookBox box( phraseBookNames[index], *phraseBooks.at(index), this,
+ "phrase book box", TRUE );
+ box.setCaption( tr("%1 - %2").arg(tr("Qt Linguist"))
+ .arg(friendlyPhraseBookName(index)) );
+ box.resize( 500, 300 );
+ box.exec();
+ *phraseBooks.at( index ) = box.phraseBook();
+ updatePhraseDict();
+}
+
+void TrWindow::printPhraseBook( int id )
+{
+ int index = printPhraseBookp->indexOf( id );
+ int pageNum = 0;
+
+ if ( printer.setup(this) ) {
+ printer.setDocName( phraseBookNames[index] );
+ statusBar()->message( tr("Printing...") );
+ PrintOut pout( &printer );
+ PhraseBook *phraseBook = phraseBooks.at( index );
+ PhraseBook::Iterator p;
+ pout.setRule( PrintOut::ThinRule );
+ for ( p = phraseBook->begin(); p != phraseBook->end(); ++p ) {
+ pout.setGuide( (*p).source() );
+ pout.addBox( 29, (*p).source() );
+ pout.addBox( 4 );
+ pout.addBox( 29, (*p).target() );
+ pout.addBox( 4 );
+ pout.addBox( 34, (*p).definition(), PrintOut::Emphasis );
+
+ if ( pout.pageNum() != pageNum ) {
+ pageNum = pout.pageNum();
+ statusBar()->message( tr("Printing... (page %1)")
+ .arg(pageNum) );
+ }
+ pout.setRule( PrintOut::NoRule );
+ pout.flushLine( TRUE );
+ }
+ pout.flushLine( TRUE );
+ statusBar()->message( tr("Printing completed"), MessageMS );
+ } else {
+ statusBar()->message( tr("Printing aborted"), MessageMS );
+ }
+}
+
+void TrWindow::revertSorting()
+{
+ lv->setSorting( 0 );
+ slv->setSorting( 0 );
+}
+
+void TrWindow::manual()
+{
+ QAssistantClient *ac = new QAssistantClient( qInstallPathBins(), this );
+ ac->showPage( QString( qInstallPathDocs() ) + "/html/linguist-manual.html" );
+}
+
+void TrWindow::about()
+{
+ AboutDialog about( this, 0, TRUE );
+ about.versionLabel->setText( tr("Version %1").arg(QT_VERSION_STR) );
+ about.exec();
+}
+
+void TrWindow::aboutQt()
+{
+ QMessageBox::aboutQt( this, tr("Qt Linguist") );
+}
+
+void TrWindow::setupPhrase()
+{
+ bool enabled = !phraseBooks.isEmpty();
+ phrasep->setItemEnabled( closePhraseBookId, enabled );
+ phrasep->setItemEnabled( editPhraseBookId, enabled );
+ phrasep->setItemEnabled( printPhraseBookId, enabled );
+}
+
+void TrWindow::closeEvent( QCloseEvent *e )
+{
+ if ( maybeSave() )
+ e->accept();
+ else
+ e->ignore();
+}
+
+bool TrWindow::maybeSave()
+{
+ if ( dirty ) {
+ switch ( QMessageBox::information(this, tr("Qt Linguist"),
+ tr("Do you want to save '%1'?")
+ .arg(filename),
+ QMessageBox::Yes | QMessageBox::Default,
+ QMessageBox::No,
+ QMessageBox::Cancel | QMessageBox::Escape ) )
+ {
+ case QMessageBox::Cancel:
+ return FALSE;
+ case QMessageBox::Yes:
+ save();
+ return !dirty;
+ case QMessageBox::No:
+ break;
+ }
+ }
+ return TRUE;
+}
+
+void TrWindow::updateCaption()
+{
+ QString cap;
+ bool enable = !filename.isEmpty();
+ saveAct->setEnabled( enable );
+ saveAsAct->setEnabled( enable );
+ releaseAct->setEnabled( enable );
+ printAct->setEnabled( enable );
+ acceleratorsAct->setEnabled( enable );
+ endingPunctuationAct->setEnabled( enable );
+ phraseMatchesAct->setEnabled( enable );
+ revertSortingAct->setEnabled( enable );
+
+ if ( filename.isEmpty() )
+ cap = tr( "Qt Linguist by Trolltech" );
+ else
+ cap = tr( "%1 - %2" ).arg( tr("Qt Linguist by Trolltech") )
+ .arg( filename );
+ setCaption( cap );
+ modified->setEnabled( dirty );
+}
+
+//
+// New scope selected - build a new list of source text items
+// for that scope.
+//
+void TrWindow::showNewScope( QListViewItem *item )
+{
+ static ContextLVI * oldContext = 0;
+
+ if( item != 0 ) {
+ ContextLVI * c = (ContextLVI *) item;
+ bool upe = slv->isUpdatesEnabled();
+ slv->setUpdatesEnabled( FALSE );
+ slv->viewport()->setUpdatesEnabled( FALSE );
+ if ( oldContext != 0 ) {
+ MessageLVI * tmp;
+ slv->blockSignals( TRUE );
+ while ( (tmp = (MessageLVI *) slv->firstChild()) != 0 )
+ oldContext->appendMessageItem( slv, tmp );
+ slv->blockSignals( FALSE );
+ }
+ MessageLVI * tmp;
+ while ( c->messageItemsInList() ) {
+ tmp = c->takeMessageItem( c->messageItemsInList() - 1);
+ slv->insertItem( tmp );
+ tmp->updateTranslationText();
+ }
+
+ // Make sure that we update the source text and translation text. Use the first message in the new scope.
+ setCurrentMessageItem(slv->firstChild());
+ // This must be explicitly called since the signal is not emitted if the context only contains one item
+ showNewCurrent(slv->firstChild());
+ slv->viewport()->setUpdatesEnabled( upe );
+ slv->setUpdatesEnabled( upe );
+ if( upe )
+ slv->triggerUpdate();
+ oldContext = (ContextLVI *) item;
+ statusBar()->clear();
+ }
+}
+
+void TrWindow::showNewCurrent( QListViewItem *item )
+{
+ messageIsShown = (item != 0);
+ MessageLVI *m = (MessageLVI *) item;
+ ContextLVI *c = (ContextLVI *) m ? m->contextLVI() : 0;
+
+ if ( messageIsShown ) {
+ me->showMessage( m->sourceText(), m->comment(), c->fullContext(),
+ m->translation(), m->message().type(),
+ getPhrases(m->sourceText()) );
+ if ( (m->message().type() != MetaTranslatorMessage::Finished) &&
+ m->danger() )
+ danger( m->sourceText(), m->translation(), TRUE );
+ else
+ statusBar()->clear();
+
+ doneAndNextAct->setEnabled( m->message().type() !=
+ MetaTranslatorMessage::Obsolete );
+ } else {
+ if ( item == 0 )
+ me->showNothing();
+ else
+ me->showContext( c->fullContext(), c->finished() );
+ doneAndNextAct->setEnabled( FALSE );
+ }
+ doneAndNextAlt->setEnabled( doneAndNextAct->isEnabled() );
+
+ selectAllAct->setEnabled( messageIsShown );
+}
+
+void TrWindow::updateTranslation( const QString& translation )
+{
+ QListViewItem *item = slv->currentItem();
+ if ( item != 0 ) {
+ MessageLVI *m = (MessageLVI *) item;
+ if ( translation != m->translation() ) {
+ bool dngr;
+ m->setTranslation( translation );
+ if ( m->finished() &&
+ (dngr = danger( m->sourceText(), m->translation(), TRUE )) ) {
+ numFinished -= 1;
+ m->setDanger( dngr );
+ m->setFinished( FALSE );
+ m->contextLVI()->updateStatus();
+ updateProgress();
+ }
+ tor.insert( m->message() );
+ if ( !dirty ) {
+ dirty = TRUE;
+ updateCaption();
+ }
+ m->updateTranslationText();
+ }
+ }
+}
+
+void TrWindow::updateFinished( bool finished )
+{
+ QListViewItem *item = slv->currentItem();
+ if ( item != 0 ) {
+ MessageLVI *m = (MessageLVI *) item;
+ if ( finished != m->finished() ) {
+ numFinished += finished ? +1 : -1;
+ updateProgress();
+ m->setFinished( finished );
+ bool oldDanger = m->danger();
+ m->setDanger( /*m->finished() &&*/
+ danger(m->sourceText(), m->translation(),
+ !oldDanger) );
+ if ( !oldDanger && m->danger() )
+ qApp->beep();
+ tor.insert( m->message() );
+ if ( !dirty ) {
+ dirty = TRUE;
+ updateCaption();
+ }
+ }
+ }
+}
+
+void TrWindow::doneAndNext()
+{
+ MessageLVI * m = (MessageLVI *) slv->currentItem();
+ bool dngr = FALSE;
+
+ if ( !m ) return;
+ dngr = danger( m->sourceText(), m->translation(), TRUE );
+ if ( !dngr ) {
+ me->finishAndNext();
+ m->contextLVI()->updateStatus();
+ } else {
+ if ( m->danger() != dngr )
+ m->setDanger( dngr );
+ tor.insert( m->message() );
+ if ( !dirty ) {
+ dirty = TRUE;
+ updateCaption();
+ }
+ qApp->beep();
+ }
+ updateStatistics();
+}
+
+void TrWindow::toggleFinished( QListViewItem *item, const QPoint& /* p */,
+ int column )
+{
+ if ( item != 0 && column == 0 ) {
+ MessageLVI *m = (MessageLVI *) item;
+ bool dngr = FALSE;
+
+ if ( m->message().type() == MetaTranslatorMessage::Unfinished ) {
+ dngr = danger( m->sourceText(), m->translation(), TRUE );
+ }
+ if ( !dngr && m->message().type() != MetaTranslatorMessage::Obsolete) {
+ setCurrentMessageItem( m );
+ me->setFinished( !m->finished() );
+ m->contextLVI()->updateStatus();
+ } else {
+ bool oldDanger = m->danger();
+ m->setDanger( danger(m->sourceText(), m->translation(),
+ !oldDanger) );
+ if ( !oldDanger && m->danger() )
+ qApp->beep();
+ tor.insert( m->message() );
+ if ( !dirty ) {
+ dirty = TRUE;
+ updateCaption();
+ }
+ }
+ updateStatistics();
+ }
+}
+
+void TrWindow::nextUnfinished()
+{
+ if ( nextUnfinishedAct->isEnabled() ) {
+ // Select a message to translate, grab the first available if
+ // there are no current selection.
+ QListViewItem * cItem = lv->currentItem(); // context item
+ QListViewItem * mItem = slv->currentItem(); // message item
+
+ // Make sure an item is selected from both the context and the
+ // message list.
+ if( (mItem == 0) && !(mItem = slv->firstChild()) ) {
+ if( (cItem == 0) && !(cItem = lv->firstChild()) ) {
+ statusBar()->message( tr("No phrase to translate."),
+ MessageMS );
+ qApp->beep();
+ return;
+ } else {
+ showNewScope( cItem );
+ while( cItem && !(mItem = slv->firstChild()) ) {
+ // no children in this node - try next one
+ cItem = cItem->nextSibling();
+ showNewScope( cItem );
+ }
+ setCurrentContextItem( cItem );
+ if( mItem ) {
+ setCurrentMessageItem( mItem );
+ } else {
+ statusBar()->message( tr("No phrase to translate."),
+ MessageMS );
+ qApp->beep();
+ return;
+ }
+ }
+ } else {
+ setCurrentMessageItem( mItem );
+ }
+
+ MessageLVI * m = (MessageLVI *) mItem;
+ MessageLVI * n;
+ ContextLVI * p = (ContextLVI *) cItem;
+ ContextLVI * q;
+
+ // Find the next Unfinished sibling within the same context.
+ m = (MessageLVI *) mItem->nextSibling();
+ n = m;
+ do {
+ if ( n == 0 )
+ break;
+ if ( n && !n->finished() && n != mItem ) {
+ setCurrentMessageItem( n );
+ return;
+ }
+ n = (MessageLVI *) n->nextSibling();
+ } while ( n != m );
+
+ // If all siblings are Finished or Obsolete, look in the first
+ // Unfinished context.
+ p = (ContextLVI *) p->nextSibling();
+ q = p;
+ do {
+ if ( q == 0 )
+ q = (ContextLVI *) lv->firstChild();
+ if ( q && !q->finished() ) {
+ showNewScope( q );
+ setCurrentContextItem( q );
+ n = (MessageLVI *) slv->firstChild();
+ while ( n && n->finished() )
+ n = (MessageLVI *) n->nextSibling();
+ if ( n && q ) {
+ setCurrentMessageItem( n );
+ showNewCurrent( n );
+ return;
+ }
+ }
+ q = (ContextLVI *) q->nextSibling();
+ } while ( q != p );
+ }
+
+ // If no Unfinished message is left, the user has finished the job. We
+ // congratulate on a job well done with this ringing bell.
+ statusBar()->message( tr("No untranslated phrases left."), MessageMS );
+ qApp->beep();
+}
+
+static QListViewItem * lastChild( QListView * view )
+{
+ if ( view ) {
+ QListViewItem * ret, * tmp;
+ ret = view->firstChild();
+ while ( ret ) {
+ tmp = ret->nextSibling();
+ if ( tmp == 0 )
+ return ret;
+ ret = tmp;
+ }
+ }
+ return 0;
+}
+
+void TrWindow::prevUnfinished()
+{
+ if ( prevUnfinishedAct->isEnabled() ) {
+ // Select a message to translate, grab the first available if
+ // there are no current selection.
+ QListViewItem * cItem = lv->currentItem(); // context item
+ QListViewItem * mItem = slv->currentItem(); // message item
+
+ // Make sure an item is selected from both the context and the
+ // message list.
+ if( (mItem == 0) && !(mItem = slv->firstChild()) ) {
+ if( (cItem == 0) && !(cItem = lv->firstChild()) ) {
+ statusBar()->message( tr("No phrase to translate."),
+ MessageMS );
+ qApp->beep();
+ return;
+ } else {
+ showNewScope( cItem );
+ while( cItem && !(mItem = slv->firstChild()) ) {
+ // no children in this node - try next one
+ cItem = cItem->nextSibling();
+ showNewScope( cItem );
+ }
+ setCurrentContextItem( cItem );
+ if( mItem ) {
+ setCurrentMessageItem( cItem );
+ } else {
+ statusBar()->message( tr("No phrase to translate."),
+ MessageMS );
+ qApp->beep();
+ return;
+ }
+ }
+ } else {
+ setCurrentMessageItem( mItem );
+ }
+
+ MessageLVI * m = (MessageLVI *) mItem;
+ MessageLVI * n;
+ ContextLVI * p = (ContextLVI *) cItem;
+ ContextLVI * q;
+
+ // Find the next Unfinished sibling within the same context.
+ n = m;
+ do {
+ n = (MessageLVI * ) n->itemAbove();
+ if ( n == 0 )
+ break;
+ if ( n && !n->finished() ) {
+ setCurrentMessageItem( n );
+ return;
+ }
+ } while ( !((ContextLVI *) cItem)->finished() && n != 0 );
+
+ // If all siblings are Finished or Obsolete, look in the prev
+ // Unfinished context.
+ q = p;
+ do {
+ q = (ContextLVI *) q->itemAbove();
+ if ( q == 0 )
+ q = (ContextLVI *) lastChild( lv );
+ if ( q && !q->finished() ) {
+ showNewScope( q );
+ setCurrentContextItem( q );
+ n = (MessageLVI *) lastChild( slv );
+ while ( n && n->finished() )
+ n = (MessageLVI *) n->itemAbove();
+ if ( n && q ) {
+ setCurrentMessageItem( n );
+ return;
+ }
+ }
+ } while ( q != 0 );
+ }
+ statusBar()->message( tr("No untranslated phrases left."), MessageMS );
+ qApp->beep();
+}
+
+void TrWindow::prev()
+{
+ QListViewItem * cItem = lv->currentItem(); // context item
+ QListViewItem * mItem = slv->currentItem(); // message item
+ QListViewItem * tmp;
+
+ if ( !cItem ) {
+ cItem = lv->firstChild();
+ if ( !cItem ) return;
+ setCurrentContextItem( cItem );
+ }
+
+ if ( !mItem ) {
+ mItem = lastChild( slv );
+ if ( !mItem ) return;
+ setCurrentMessageItem( mItem );
+ } else {
+ if ( (tmp = mItem->itemAbove()) != 0 ) {
+ setCurrentMessageItem( tmp );
+ return;
+ } else {
+ if ( (tmp = cItem->itemAbove()) == 0 ) {
+ tmp = lastChild( lv );
+ }
+ if ( !tmp ) return;
+ setCurrentContextItem( tmp );
+ setCurrentMessageItem( lastChild( slv ) );
+ }
+ }
+}
+
+void TrWindow::next()
+{
+ QListViewItem * cItem = lv->currentItem(); // context item
+ QListViewItem * mItem = slv->currentItem(); // message item
+ QListViewItem * tmp;
+
+ if ( !cItem ) {
+ cItem = lv->firstChild();
+ if ( !cItem ) return;
+ setCurrentContextItem( cItem );
+ }
+
+ if ( !mItem ) {
+ mItem = slv->firstChild();
+ if ( !mItem ) return;
+ setCurrentMessageItem( mItem );
+ } else {
+ if ( (tmp = mItem->nextSibling()) != 0 ) {
+ setCurrentMessageItem( tmp );
+ return;
+ } else {
+ if ( (tmp = cItem->nextSibling()) == 0 ) {
+ tmp = lv->firstChild();
+ }
+ if ( !tmp ) return;
+ setCurrentContextItem( tmp );
+ setCurrentMessageItem( slv->firstChild() );
+ }
+ }
+}
+
+
+void TrWindow::findNext( const QString& text, int where, bool matchCase )
+{
+ findText = text;
+ if ( findText.isEmpty() )
+ findText = QString( "magicwordthatyoushouldavoid" );
+ findWhere = where;
+ findMatchCase = matchCase;
+ findAgainAct->setEnabled( TRUE );
+ findAgain();
+}
+
+void TrWindow::revalidate()
+{
+ ContextLVI *c = (ContextLVI *) lv->firstChild();
+ QListViewItem * oldScope = lv->currentItem();
+ int oldItemNo = itemToIndex( slv, slv->currentItem() );
+ slv->setUpdatesEnabled( FALSE );
+
+ while ( c != 0 ) {
+ showNewScope( c );
+ MessageLVI *m = (MessageLVI *) slv->firstChild();
+ while ( m != 0 ) {
+ m->setDanger( danger(m->sourceText(), m->translation()) &&
+ m->message().type() == MetaTranslatorMessage::Finished );
+ m = (MessageLVI *) m->nextSibling();
+ }
+ c = (ContextLVI *) c->nextSibling();
+ }
+
+ if ( oldScope ){
+ showNewScope( oldScope );
+ QListViewItem * tmp = indexToItem( slv, oldItemNo );
+ if( tmp )
+ setCurrentMessageItem( tmp );
+ }
+ slv->setUpdatesEnabled( TRUE );
+ slv->triggerUpdate();
+}
+
+QString TrWindow::friendlyString( const QString& str )
+{
+ QString f = str.lower();
+ f.replace( QRegExp(QString("[.,:;!?()-]")), QString(" ") );
+ f.replace( "&", QString("") );
+ f = f.simplifyWhiteSpace();
+ f = f.lower();
+ return f;
+}
+
+void TrWindow::setupMenuBar()
+{
+ QMenuBar * m = menuBar();
+ QPopupMenu * filep = new QPopupMenu( this );
+ QPopupMenu * editp = new QPopupMenu( this );
+ QPopupMenu * translationp = new QPopupMenu( this );
+ QPopupMenu * validationp = new QPopupMenu( this );
+ validationp->setCheckable( TRUE );
+ phrasep = new QPopupMenu( this );
+ closePhraseBookp = new QPopupMenu( this );
+ editPhraseBookp = new QPopupMenu( this );
+ printPhraseBookp = new QPopupMenu( this );
+ QPopupMenu * viewp = new QPopupMenu( this );
+ viewp->setCheckable( TRUE );
+ QPopupMenu * helpp = new QPopupMenu( this );
+
+ m->insertItem( tr("&File"), filep );
+ m->insertItem( tr("&Edit"), editp );
+ m->insertItem( tr("&Translation"), translationp );
+ m->insertItem( tr("V&alidation"), validationp );
+ m->insertItem( tr("&Phrases"), phrasep );
+ m->insertItem( tr("&View"), viewp );
+ m->insertSeparator();
+ m->insertItem( tr("&Help"), helpp );
+
+ connect( closePhraseBookp, SIGNAL(activated(int)),
+ this, SLOT(closePhraseBook(int)) );
+ connect( closePhraseBookp, SIGNAL(aboutToShow()),
+ this, SLOT(updateClosePhraseBook()) );
+ connect( editPhraseBookp, SIGNAL(activated(int)),
+ this, SLOT(editPhraseBook(int)) );
+ connect( printPhraseBookp, SIGNAL(activated(int)),
+ this, SLOT(printPhraseBook(int)) );
+ // File menu
+ openAct = new Action( filep, tr("&Open..."), this, SLOT(open()),
+ "fileopen.png", QAccel::stringToKey(tr("Ctrl+O")) );
+
+ filep->insertSeparator();
+
+ saveAct = new Action( filep, tr("&Save"), this, SLOT(save()),
+ "filesave.png", QAccel::stringToKey(tr("Ctrl+S")) );
+ saveAsAct = new Action( filep, tr("Save &As..."), this, SLOT(saveAs()) );
+ releaseAct = new Action( filep, tr("&Release..."), this, SLOT(release()) );
+ filep->insertSeparator();
+ printAct = new Action( filep, tr("&Print..."), this, SLOT(print()),
+ "print.png", QAccel::stringToKey(tr("Ctrl+P")) );
+
+ filep->insertSeparator();
+
+ recentFilesMenu = new QPopupMenu( this );
+ filep->insertItem( tr("Re&cently opened files"), recentFilesMenu );
+ connect( recentFilesMenu, SIGNAL(aboutToShow()), this,
+ SLOT(setupRecentFilesMenu()) );
+ connect( recentFilesMenu, SIGNAL(activated( int )), this,
+ SLOT(recentFileActivated( int )) );
+
+ filep->insertSeparator();
+
+ exitAct = new Action( filep, tr("E&xit"), this, SLOT(close()),
+ QString::null, QAccel::stringToKey(tr("Ctrl+Q")) );
+ // Edit menu
+ undoAct = new Action( editp, tr("&Undo"), me, SLOT(undo()),
+ "undo.png", QAccel::stringToKey(tr("Ctrl+Z")) );
+ undoAct->setEnabled( FALSE );
+ connect( me, SIGNAL(undoAvailable(bool)), undoAct, SLOT(setEnabled(bool)) );
+ redoAct = new Action( editp, tr("&Redo"), me, SLOT(redo()),
+ "redo.png", QAccel::stringToKey(tr("Ctrl+Y")) );
+ redoAct->setEnabled( FALSE );
+ connect( me, SIGNAL(redoAvailable(bool)), redoAct, SLOT(setEnabled(bool)) );
+ editp->insertSeparator();
+ cutAct = new Action( editp, tr("Cu&t"), me, SLOT(cut()),
+ "editcut.png", QAccel::stringToKey(tr("Ctrl+X")) );
+ cutAct->setEnabled( FALSE );
+ connect( me, SIGNAL(cutAvailable(bool)), cutAct, SLOT(setEnabled(bool)) );
+ copyAct = new Action( editp, tr("&Copy"), me, SLOT(copy()),
+ "editcopy.png", QAccel::stringToKey(tr("Ctrl+C")) );
+ copyAct->setEnabled( FALSE );
+ connect( me, SIGNAL(copyAvailable(bool)), copyAct, SLOT(setEnabled(bool)) );
+ pasteAct = new Action( editp, tr("&Paste"), me, SLOT(paste()),
+ "editpaste.png", QAccel::stringToKey(tr("Ctrl+V")) );
+ pasteAct->setEnabled( FALSE );
+ connect( me, SIGNAL(pasteAvailable(bool)),
+ pasteAct, SLOT(setEnabled(bool)) );
+ selectAllAct = new Action( editp, tr("Select &All"), me, SLOT(selectAll()),
+ QString::null, QAccel::stringToKey(tr("Ctrl+A")) );
+ selectAllAct->setEnabled( FALSE );
+ editp->insertSeparator();
+ findAct = new Action( editp, tr("&Find..."), this, SLOT(find()),
+ "searchfind.png", QAccel::stringToKey(tr("Ctrl+F")) );
+ findAct->setEnabled( FALSE );
+ findAgainAct = new Action( editp, tr("Find &Next"),
+ this, SLOT(findAgain()), QString::null, Key_F3 );
+ findAgainAct->setEnabled( FALSE );
+#ifdef notyet
+ replaceAct = new Action( editp, tr("&Replace..."), this, SLOT(replace()),
+ QAccel::stringToKey(tr("Ctrl+H")) );
+ replaceAct->setEnabled( FALSE );
+#endif
+
+ // Translation menu
+ // when updating the accelerators, remember the status bar
+ prevUnfinishedAct = new Action( translationp, tr("&Prev Unfinished"),
+ this, SLOT(prevUnfinished()),
+ "prevunfinished.png", QAccel::stringToKey(tr("Ctrl+K")) );
+ nextUnfinishedAct = new Action( translationp, tr("&Next Unfinished"),
+ this, SLOT(nextUnfinished()),
+ "nextunfinished.png", QAccel::stringToKey(tr("Ctrl+L")) );
+
+ prevAct = new Action( translationp, tr("P&rev"),
+ this, SLOT(prev()), "prev.png",
+ QAccel::stringToKey(tr("Ctrl+Shift+K")) );
+ nextAct = new Action( translationp, tr("Ne&xt"),
+ this, SLOT(next()), "next.png",
+ QAccel::stringToKey(tr("Ctrl+Shift+L")) );
+ doneAndNextAct = new Action( translationp, tr("Done and &Next"),
+ this, SLOT(doneAndNext()), "doneandnext.png",
+ QAccel::stringToKey(tr("Ctrl+Enter")) );
+ doneAndNextAlt = new QAction( this );
+ doneAndNextAlt->setAccel( QAccel::stringToKey(tr("Ctrl+Return")) );
+ connect( doneAndNextAlt, SIGNAL(activated()), this, SLOT(doneAndNext()) );
+ beginFromSourceAct = new Action( translationp, tr("&Begin from Source"),
+ me, SLOT(beginFromSource()),
+ QString::null, QAccel::stringToKey(tr("Ctrl+B")) );
+ connect( me, SIGNAL(updateActions(bool)), beginFromSourceAct,
+ SLOT(setEnabled(bool)) );
+
+ // Phrasebook menu
+ newPhraseBookAct = new Action( phrasep, tr("&New Phrase Book..."),
+ this, SLOT(newPhraseBook()),
+ QString::null, QAccel::stringToKey(tr("Ctrl+N")) );
+ openPhraseBookAct = new Action( phrasep, tr("&Open Phrase Book..."),
+ this, SLOT(openPhraseBook()),
+ "book.png", QAccel::stringToKey(tr("Ctrl+H")) );
+ closePhraseBookId = phrasep->insertItem( tr("&Close Phrase Book"),
+ closePhraseBookp );
+ phrasep->insertSeparator();
+ editPhraseBookId = phrasep->insertItem( tr("&Edit Phrase Book..."),
+ editPhraseBookp );
+ printPhraseBookId = phrasep->insertItem( tr("&Print Phrase Book..."),
+ printPhraseBookp );
+ connect( phrasep, SIGNAL(aboutToShow()), this, SLOT(setupPhrase()) );
+
+ // Validation menu
+ acceleratorsAct = new Action( validationp, tr("&Accelerators"),
+ this, SLOT(revalidate()), "accelerator.png", 0, TRUE );
+ acceleratorsAct->setOn( TRUE );
+ endingPunctuationAct = new Action( validationp, tr("&Ending Punctuation"),
+ this, SLOT(revalidate()), "punctuation.png", 0, TRUE );
+ endingPunctuationAct->setOn( TRUE );
+ phraseMatchesAct = new Action( validationp, tr("&Phrase Matches"),
+ this, SLOT(revalidate()), "phrase.png", 0, TRUE );
+ phraseMatchesAct->setOn( TRUE );
+
+ // View menu
+ revertSortingAct = new Action( viewp, tr("&Revert Sorting"),
+ this, SLOT(revertSorting()) );
+ doGuessesAct = new Action( viewp, tr("&Display guesses"),
+ this, SLOT(toggleGuessing()) );
+ doGuessesAct->setToggleAction( TRUE );
+ doGuessesAct->setOn( TRUE );
+ toggleStats = new Action( viewp, tr("&Statistics"), this, SLOT(toggleStatistics()) );
+ toggleStats->setToggleAction( TRUE );
+ viewp->insertSeparator();
+ viewp->insertItem( tr("Vie&ws"), createDockWindowMenu( NoToolBars ) );
+ viewp->insertItem( tr("&Toolbars"), createDockWindowMenu( OnlyToolBars ) );
+
+ // Help
+ manualAct = new Action( helpp, tr("&Manual"), this, SLOT(manual()), 0,
+ Key_F1 );
+ helpp->insertSeparator();
+ aboutAct = new Action( helpp, tr("&About"), this, SLOT(about()) );
+ aboutQtAct = new Action( helpp, tr("About &Qt"), this, SLOT(aboutQt()) );
+ helpp->insertSeparator();
+ whatsThisAct = new Action( helpp, tr("&What's This?"),
+ this, SLOT(whatsThis()), "whatsthis.xpm", SHIFT + Key_F1 );
+
+ openAct->setWhatsThis( tr("Open a Qt translation source file (TS file) for"
+ " editing.") );
+ saveAct->setWhatsThis( tr("Save changes made to this Qt translation "
+ "source file.") );
+ saveAsAct->setWhatsThis( tr("Save changes made to this Qt translation"
+ "source file into a new file.") );
+ releaseAct->setWhatsThis( tr("Create a Qt message file suitable for"
+ " released applications"
+ " from the current message file.") );
+ printAct->setWhatsThis( tr("Print a list of all the phrases in the current"
+ " Qt translation source file.") );
+ exitAct->setWhatsThis( tr("Close this window and exit.") );
+
+ undoAct->setWhatsThis( tr("Undo the last editing operation performed on the"
+ " translation.") );
+ redoAct->setWhatsThis( tr("Redo an undone editing operation performed on"
+ " the translation.") );
+ cutAct->setWhatsThis( tr("Copy the selected translation text to the"
+ " clipboard and deletes it.") );
+ copyAct->setWhatsThis( tr("Copy the selected translation text to the"
+ " clipboard.") );
+ pasteAct->setWhatsThis( tr("Paste the clipboard text into the"
+ " translation.") );
+ selectAllAct->setWhatsThis( tr("Select the whole translation text.") );
+ findAct->setWhatsThis( tr("Search for some text in the translation "
+ "source file.") );
+ findAgainAct->setWhatsThis( tr("Continue the search where it was left.") );
+#ifdef notyet
+ replaceAct->setWhatsThis( tr("Search for some text in the translation"
+ " source file and replace it by another"
+ " text.") );
+#endif
+
+ newPhraseBookAct->setWhatsThis( tr("Create a new phrase book.") );
+ openPhraseBookAct->setWhatsThis( tr("Open a phrase book to assist"
+ " translation.") );
+ acceleratorsAct->setWhatsThis( tr("Toggle validity checks of"
+ " accelerators.") );
+ endingPunctuationAct->setWhatsThis( tr("Toggle validity checks"
+ " of ending punctuation.") );
+ phraseMatchesAct->setWhatsThis( tr("Toggle checking that phrase"
+ " suggestions are used.") );
+
+ revertSortingAct->setWhatsThis( tr("Sort the items back in the same order"
+ " as in the message file.") );
+
+ doGuessesAct->setWhatsThis( tr("Set whether or not to display translation guesses.") );
+ manualAct->setWhatsThis( tr("Display the manual for %1.")
+ .arg(tr("Qt Linguist")) );
+ aboutAct->setWhatsThis( tr("Display information about %1.")
+ .arg(tr("Qt Linguist")) );
+ aboutQtAct->setWhatsThis( tr("Display information about the Qt toolkit by"
+ " Trolltech.") );
+ whatsThisAct->setWhatsThis( tr("Enter What's This? mode.") );
+
+ beginFromSourceAct->setWhatsThis( tr("Copies the source text into"
+ " the translation field.") );
+ nextAct->setWhatsThis( tr("Moves to the next item.") );
+ prevAct->setWhatsThis( tr("Moves to the previous item.") );
+ nextUnfinishedAct->setWhatsThis( tr("Moves to the next unfinished item.") );
+ prevUnfinishedAct->setWhatsThis( tr("Moves to the previous unfinished item.") );
+ doneAndNextAct->setWhatsThis( tr("Marks this item as done and moves to the"
+ " next unfinished item.") );
+ doneAndNextAlt->setWhatsThis( doneAndNextAct->whatsThis() );
+}
+
+void TrWindow::setupToolBars()
+{
+ QToolBar *filet = new QToolBar( tr("File"), this );
+ QToolBar *editt = new QToolBar( tr("Edit"), this );
+ QToolBar *translationst = new QToolBar( tr("Translation"), this );
+ QToolBar *validationt = new QToolBar( tr("Validation"), this );
+ QToolBar *helpt = new QToolBar( tr("Help"), this );
+
+ openAct->addToToolbar( filet, tr("Open") );
+ saveAct->addToToolbar( filet, tr("Save") );
+ printAct->addToToolbar( filet, tr("Print") );
+ filet->addSeparator();
+ openPhraseBookAct->addToToolbar( filet, tr("Open Phrase Book") );
+
+ undoAct->addToToolbar( editt, tr("Undo") );
+ redoAct->addToToolbar( editt, tr("Redo") );
+ editt->addSeparator();
+ cutAct->addToToolbar( editt, tr("Cut") );
+ copyAct->addToToolbar( editt, tr("Copy") );
+ pasteAct->addToToolbar( editt, tr("Paste") );
+ editt->addSeparator();
+ findAct->addToToolbar( editt, tr("Find") );
+#ifdef notyet
+ replaceAct->addToToolbar( editt, tr("Replace") );
+#endif
+
+ // beginFromSourceAct->addToToolbar( translationst,
+ // tr("Begin from Source"), "searchfind" );
+ prevAct->addToToolbar( translationst, tr("Prev") );
+ nextAct->addToToolbar( translationst, tr("Next") );
+ prevUnfinishedAct->addToToolbar( translationst, tr("Prev Unfinished") );
+ nextUnfinishedAct->addToToolbar( translationst, tr("Next Unfinished") );
+ doneAndNextAct->addToToolbar( translationst, tr("Done and Next") );
+
+ acceleratorsAct->addToToolbar( validationt, tr("Accelerators") );
+ endingPunctuationAct->addToToolbar( validationt, tr("Punctuation") );
+ phraseMatchesAct->addToToolbar( validationt, tr("Phrases") );
+
+ whatsThisAct->addToToolbar( helpt, tr("What's This?") );
+}
+
+void TrWindow::setCurrentContextItem( QListViewItem *item )
+{
+ lv->ensureItemVisible( item );
+ lv->setSelected( item, TRUE );
+}
+
+void TrWindow::setCurrentMessageItem( QListViewItem *item )
+{
+ slv->ensureItemVisible( item );
+ slv->setSelected( item, TRUE );
+}
+
+QString TrWindow::friendlyPhraseBookName( int k )
+{
+ return QFileInfo( phraseBookNames[k] ).fileName();
+}
+
+bool TrWindow::openPhraseBook( const QString& name )
+{
+ PhraseBook *pb = new PhraseBook;
+ if ( !pb->load(name) ) {
+ QMessageBox::warning( this, tr("Qt Linguist"),
+ tr("Cannot read from phrase book '%1'.")
+ .arg(name) );
+ return FALSE;
+ }
+
+ int index = (int) phraseBooks.count();
+ phraseBooks.append( pb );
+ phraseBookNames.append( name );
+ int id = closePhraseBookp->insertItem( friendlyPhraseBookName(index) );
+ closePhraseBookp->setWhatsThis( id, tr("Close this phrase book.") );
+ id = editPhraseBookp->insertItem( friendlyPhraseBookName(index) );
+ editPhraseBookp->setWhatsThis( id, tr("Allow you to add, modify, or delete"
+ " phrases of this phrase book.") );
+ id = printPhraseBookp->insertItem( friendlyPhraseBookName(index) );
+ printPhraseBookp->setWhatsThis( id, tr("Print the entries of the phrase"
+ " book.") );
+ updatePhraseDict();
+ return TRUE;
+}
+
+bool TrWindow::savePhraseBook( QString& name, const PhraseBook& pb )
+{
+ if ( !name.contains( ".qph" ) && !name.contains(".") )
+ name += ".qph";
+
+ if ( !pb.save(name) ) {
+ QMessageBox::warning( this, tr("Qt Linguist"),
+ tr("Cannot create phrase book '%1'.")
+ .arg(name) );
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void TrWindow::updateProgress()
+{
+ if ( numNonobsolete == 0 )
+ progress->setText( QString(" " " ") );
+ else
+ progress->setText( QString(" %1/%2 ").arg(numFinished)
+ .arg(numNonobsolete) );
+ prevUnfinishedAct->setEnabled( numFinished != numNonobsolete );
+ nextUnfinishedAct->setEnabled( numFinished != numNonobsolete );
+ prevAct->setEnabled( lv->firstChild() != 0 );
+ nextAct->setEnabled( lv->firstChild() != 0 );
+}
+
+void TrWindow::updatePhraseDict()
+{
+ QPtrListIterator<PhraseBook> pb = phraseBooks;
+ PhraseBook::Iterator p;
+ PhraseBook *ent;
+ phraseDict.clear();
+ while ( pb.current() != 0 ) {
+ for ( p = (*pb)->begin(); p != (*pb)->end(); ++p ) {
+ QString f = friendlyString( (*p).source() );
+ if ( f.length() > 0 ) {
+ f = QStringList::split( QChar(' '), f ).first();
+ ent = phraseDict.find( f );
+ if ( ent == 0 ) {
+ ent = new PhraseBook;
+ phraseDict.insert( f, ent );
+ }
+ ent->append( *p );
+ }
+ }
+ ++pb;
+ }
+ revalidate();
+}
+
+PhraseBook TrWindow::getPhrases( const QString& source )
+{
+ PhraseBook phrases;
+ QString f = friendlyString( source );
+ QStringList lookupWords = QStringList::split( QChar(' '), f );
+ QStringList::Iterator w;
+ PhraseBook::Iterator p;
+
+ for ( w = lookupWords.begin(); w != lookupWords.end(); ++w ) {
+ PhraseBook *ent = phraseDict.find( *w );
+ if ( ent != 0 ) {
+ for ( p = ent->begin(); p != ent->end(); ++p ) {
+ if ( f.find(friendlyString((*p).source())) >= 0 )
+ phrases.append( *p );
+ }
+ }
+ }
+ return phrases;
+}
+
+bool TrWindow::danger( const QString& source, const QString& translation,
+ bool verbose )
+{
+ if ( acceleratorsAct->isOn() ) {
+ int sk = QAccel::shortcutKey( source );
+ int tk = QAccel::shortcutKey( translation );
+ if ( sk == 0 && tk != 0 ) {
+ if ( verbose )
+ statusBar()->message( tr("Accelerator possibly superfluous in"
+ " translation."), ErrorMS );
+ return TRUE;
+ } else if ( sk != 0 && tk == 0 ) {
+ if ( verbose )
+ statusBar()->message( tr("Accelerator possibly missing in"
+ " translation."), ErrorMS );
+ return TRUE;
+ }
+ }
+ if ( endingPunctuationAct->isOn() ) {
+ if ( ending(source) != ending(translation) ) {
+ if ( verbose )
+ statusBar()->message( tr("Translation does not end with the"
+ " same punctuation as the source"
+ " text."), ErrorMS );
+ return TRUE;
+ }
+ }
+ if ( phraseMatchesAct->isOn() ) {
+ QString fsource = friendlyString( source );
+ QString ftranslation = friendlyString( translation );
+ QStringList lookupWords = QStringList::split( QChar(' '), fsource );
+ QStringList::Iterator w;
+ PhraseBook::Iterator p;
+
+ for ( w = lookupWords.begin(); w != lookupWords.end(); ++w ) {
+ PhraseBook *ent = phraseDict.find( *w );
+ if ( ent != 0 ) {
+ for ( p = ent->begin(); p != ent->end(); ++p ) {
+ if ( fsource.find(friendlyString((*p).source())) < 0 ||
+ ftranslation.find(friendlyString((*p).target())) >= 0 )
+ break;
+ }
+ if ( p == ent->end() ) {
+ if ( verbose )
+ statusBar()->message( tr("A phrase book suggestion for"
+ " '%1' was ignored.")
+ .arg(*w), ErrorMS );
+ return TRUE;
+ }
+ }
+ }
+ }
+ if ( verbose )
+ statusBar()->clear();
+
+ return FALSE;
+}
+
+void TrWindow::readConfig()
+{
+ QString keybase( "/Qt Linguist/" +
+ QString::number( (QT_VERSION >> 16) & 0xff ) +
+ "." + QString::number( (QT_VERSION >> 8) & 0xff ) + "/" );
+ QSettings config;
+
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+
+ QRect r( pos(), size() );
+ recentFiles = config.readListEntry( keybase + "RecentlyOpenedFiles" );
+ if ( !config.readBoolEntry( keybase + "Geometry/MainwindowMaximized", FALSE ) ) {
+ r.setX( config.readNumEntry( keybase + "Geometry/MainwindowX", r.x() ) );
+ r.setY( config.readNumEntry( keybase + "Geometry/MainwindowY", r.y() ) );
+ r.setWidth( config.readNumEntry( keybase + "Geometry/MainwindowWidth", r.width() ) );
+ r.setHeight( config.readNumEntry( keybase + "Geometry/MainwindowHeight", r.height() ) );
+
+ QRect desk = QApplication::desktop()->geometry();
+ QRect inter = desk.intersect( r );
+ resize( r.size() );
+ if ( inter.width() * inter.height() > ( r.width() * r.height() / 20 ) ) {
+ move( r.topLeft() );
+ }
+ }
+
+ QDockWindow * dw;
+ dw = (QDockWindow *) lv->parent();
+ int place;
+ place = config.readNumEntry( keybase + "Geometry/ContextwindowInDock" );
+ r.setX( config.readNumEntry( keybase + "Geometry/ContextwindowX" ) );
+ r.setY( config.readNumEntry( keybase + "Geometry/ContextwindowY" ) );
+ r.setWidth( config.readNumEntry( keybase +
+ "Geometry/ContextwindowWidth" ) );
+ r.setHeight( config.readNumEntry( keybase +
+ "Geometry/ContextwindowHeight" ) );
+ if ( place == QDockWindow::OutsideDock ) {
+ dw->undock();
+ dw->show();
+ }
+ dw->setGeometry( r );
+
+ dw = (QDockWindow *) slv->parent();
+ place = config.readNumEntry( keybase + "Geometry/SourcewindowInDock" );
+ r.setX( config.readNumEntry( keybase + "Geometry/SourcewindowX" ) );
+ r.setY( config.readNumEntry( keybase + "Geometry/SourcewindowY" ) );
+ r.setWidth( config.readNumEntry( keybase +
+ "Geometry/SourcewindowWidth" ) );
+ r.setHeight( config.readNumEntry( keybase +
+ "Geometry/SourcewindowHeight" ) );
+ if ( place == QDockWindow::OutsideDock ) {
+ dw->undock();
+ dw->show();
+ }
+ dw->setGeometry( r );
+
+ dw = (QDockWindow *) plv->parent()->parent();
+ place = config.readNumEntry( keybase + "Geometry/PhrasewindowInDock" );
+ r.setX( config.readNumEntry( keybase + "Geometry/PhrasewindowX" ) );
+ r.setY( config.readNumEntry( keybase + "Geometry/PhrasewindowY" ) );
+ r.setWidth( config.readNumEntry( keybase +
+ "Geometry/PhrasewindowWidth" ) );
+ r.setHeight( config.readNumEntry( keybase +
+ "Geometry/PhrasewindowHeight" ) );
+ if ( place == QDockWindow::OutsideDock ) {
+ dw->undock();
+ dw->show();
+ }
+ dw->setGeometry( r );
+ QApplication::sendPostedEvents();
+}
+
+void TrWindow::writeConfig()
+{
+ QString keybase( "/Qt Linguist/" +
+ QString::number( (QT_VERSION >> 16) & 0xff ) +
+ "." + QString::number( (QT_VERSION >> 8) & 0xff ) + "/" );
+ QSettings config;
+
+ config.insertSearchPath( QSettings::Windows, "/Trolltech" );
+ config.writeEntry( keybase + "RecentlyOpenedFiles", recentFiles );
+ config.writeEntry( keybase + "Geometry/MainwindowMaximized", isMaximized() );
+ config.writeEntry( keybase + "Geometry/MainwindowX", x() );
+ config.writeEntry( keybase + "Geometry/MainwindowY", y() );
+ config.writeEntry( keybase + "Geometry/MainwindowWidth", width() );
+ config.writeEntry( keybase + "Geometry/MainwindowHeight", height() );
+
+ QDockWindow * dw =(QDockWindow *) lv->parent();
+ config.writeEntry( keybase + "Geometry/ContextwindowInDock", dw->place() );
+ config.writeEntry( keybase + "Geometry/ContextwindowX", dw->x() );
+ config.writeEntry( keybase + "Geometry/ContextwindowY", dw->y() );
+ config.writeEntry( keybase + "Geometry/ContextwindowWidth", dw->width() );
+ config.writeEntry( keybase + "Geometry/ContextwindowHeight", dw->height() );
+
+ dw =(QDockWindow *) slv->parent();
+ config.writeEntry( keybase + "Geometry/SourcewindowInDock",
+ dw->place() );
+ config.writeEntry( keybase + "Geometry/SourcewindowX", dw->geometry().x() );
+ config.writeEntry( keybase + "Geometry/SourcewindowY", dw->geometry().y() );
+ config.writeEntry( keybase + "Geometry/SourcewindowWidth", dw->width() );
+ config.writeEntry( keybase + "Geometry/SourcewindowHeight", dw->height() );
+
+ dw =(QDockWindow *) plv->parent()->parent();
+ config.writeEntry( keybase + "Geometry/PhrasewindowInDock",
+ dw->place() );
+ config.writeEntry( keybase + "Geometry/PhrasewindowX", dw->geometry().x() );
+ config.writeEntry( keybase + "Geometry/PhrasewindowY", dw->geometry().y() );
+ config.writeEntry( keybase + "Geometry/PhrasewindowWidth", dw->width() );
+ config.writeEntry( keybase + "Geometry/PhrasewindowHeight", dw->height() );
+}
+
+void TrWindow::setupRecentFilesMenu()
+{
+ recentFilesMenu->clear();
+ int id = 0;
+ QStringList::Iterator it = recentFiles.begin();
+ for ( ; it != recentFiles.end(); ++it )
+ {
+ recentFilesMenu->insertItem( *it, id );
+ id++;
+ }
+}
+
+void TrWindow::recentFileActivated( int id )
+{
+ if ( id != -1 ) {
+ if ( maybeSave() )
+ openFile( *recentFiles.at( id ) );
+ }
+}
+
+void TrWindow::addRecentlyOpenedFile( const QString &fn, QStringList &lst )
+{
+ if ( lst.find( fn ) != lst.end() )
+ return;
+ if ( lst.count() >= 10 )
+ lst.remove( lst.begin() );
+ lst << fn;
+}
+
+void TrWindow::toggleGuessing()
+{
+ me->toggleGuessing();
+}
+
+void TrWindow::focusSourceList()
+{
+ slv->setFocus();
+}
+
+void TrWindow::focusPhraseList()
+{
+ plv->setFocus();
+}
+
+void TrWindow::updateClosePhraseBook()
+{
+ if ( dirtyItem != -1 ) {
+ closePhraseBookp->removeItem( closePhraseBookp->idAt(dirtyItem) );
+ dirtyItem = -1;
+ }
+}
+
+void TrWindow::toggleStatistics()
+{
+ if ( toggleStats->isOn() ) {
+ if ( !stats ) {
+ stats = new Statistics( this, "linguist_stats" );
+ connect( this, SIGNAL(statsChanged(int,int,int,int,int,int)), stats,
+ SLOT(updateStats(int,int,int,int,int,int)) );
+ connect( stats, SIGNAL(closed()), toggleStats, SLOT(toggle()) );
+ }
+ updateStatistics();
+ stats->show();
+ } else if ( stats ) {
+ stats->close();
+ }
+}
+
+void TrWindow::updateStatistics()
+{
+ QListViewItem * ci = lv->firstChild();
+ int trW = 0;
+ int trC = 0;
+ int trCS = 0;
+ while ( ci ) {
+ countStats( ci, ((ContextLVI *)ci)->firstMessageItem(), trW, trC, trCS );
+ ci = ci->nextSibling();
+ }
+ // ..and the items in the source list
+ countStats( 0, slv->firstChild(), trW, trC, trCS );
+ emit statsChanged( srcWords, srcChars, srcCharsSpc, trW, trC, trCS );
+}
+
+
+void TrWindow::countStats( QListViewItem* ci, QListViewItem* mi, int& trW, int& trC, int& trCS )
+{
+ MessageLVI * m;
+ while ( mi ) {
+ m = (MessageLVI *) mi;
+ if ( m->finished() && !(m->message().type() == MetaTranslatorMessage::Obsolete) )
+ doCharCounting( m->translation(), trW, trC, trCS );
+ if ( ci )
+ mi = ((ContextLVI *)ci)->nextMessageItem();
+ else
+ mi = mi->nextSibling();
+ }
+}
+
+void TrWindow::doCharCounting( const QString& text, int& trW, int& trC, int& trCS )
+{
+ trCS += text.length();
+ bool inWord = FALSE;
+ for ( int i = 0; i < (int) text.length(); i++ ) {
+ if ( text[i].isLetterOrNumber() || text[i] == QChar('_') ) {
+ if ( !inWord ) {
+ trW++;
+ inWord = TRUE;
+ }
+ } else {
+ inWord = FALSE;
+ }
+ if ( !text[i].isSpace() )
+ trC++;
+ }
+}
diff --git a/tools/linguist/linguist/trwindow.h b/tools/linguist/linguist/trwindow.h
new file mode 100644
index 0000000..38cba25
--- /dev/null
+++ b/tools/linguist/linguist/trwindow.h
@@ -0,0 +1,237 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef TRWINDOW_H
+#define TRWINDOW_H
+
+#include "phrase.h"
+
+#include <metatranslator.h>
+
+#include <qmainwindow.h>
+#include <qptrlist.h>
+#include <qdict.h>
+#include <qprinter.h>
+#include <qstringlist.h>
+#include <qpixmap.h>
+#include <qlistview.h>
+
+class QAction;
+class QDialog;
+class QLabel;
+class QListView;
+class QListViewItem;
+class QPrinter;
+
+class Action;
+class FindDialog;
+class MessageEditor;
+
+class PhraseLV;
+class ContextLVI;
+class Statistics;
+
+class TrWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ static QPixmap * pxOn;
+ static QPixmap * pxOff;
+ static QPixmap * pxObsolete;
+ static QPixmap * pxDanger;
+ static const QPixmap pageCurl();
+
+ TrWindow();
+ ~TrWindow();
+
+ void openFile( const QString& name );
+
+protected:
+ void readConfig();
+ void writeConfig();
+ void closeEvent( QCloseEvent * );
+
+signals:
+ void statsChanged( int w, int c, int cs, int w2, int c2, int cs2 );
+
+private slots:
+ void doneAndNext();
+ void prev();
+ void next();
+ void recentFileActivated( int );
+ void setupRecentFilesMenu();
+ void open();
+ void save();
+ void saveAs();
+ void release();
+ void print();
+ void find();
+ void findAgain();
+ void replace();
+ void newPhraseBook();
+ void openPhraseBook();
+ void closePhraseBook( int id );
+ void editPhraseBook( int id );
+ void printPhraseBook( int id );
+ void manual();
+ void revertSorting();
+ void about();
+ void aboutQt();
+
+ void setupPhrase();
+ bool maybeSave();
+ void updateCaption();
+ void showNewScope( QListViewItem *item );
+ void showNewCurrent( QListViewItem *item );
+ void updateTranslation( const QString& translation );
+ void updateFinished( bool finished );
+ void toggleFinished( QListViewItem *item, const QPoint& p, int column );
+ void prevUnfinished();
+ void nextUnfinished();
+ void findNext( const QString& text, int where, bool matchCase );
+ void revalidate();
+ void toggleGuessing();
+ void focusSourceList();
+ void focusPhraseList();
+ void updateClosePhraseBook();
+ void toggleStatistics();
+ void updateStatistics();
+
+private:
+ typedef QPtrList<PhraseBook> PBL;
+ typedef QDict<PhraseBook> PBD;
+
+ static QString friendlyString( const QString& str );
+
+ void addRecentlyOpenedFile( const QString & fn, QStringList & lst );
+ void setupMenuBar();
+ void setupToolBars();
+ void setCurrentContextItem( QListViewItem *item );
+ void setCurrentMessageItem( QListViewItem *item );
+ QString friendlyPhraseBookName( int k );
+ bool openPhraseBook( const QString& name );
+ bool savePhraseBook( QString& name, const PhraseBook& pb );
+ void updateProgress();
+ void updatePhraseDict();
+ PhraseBook getPhrases( const QString& source );
+ bool danger( const QString& source, const QString& translation,
+ bool verbose = FALSE );
+
+ int itemToIndex( QListView * view, QListViewItem * item );
+ QListViewItem * indexToItem( QListView * view, int index );
+ bool searchItem( const QString & searchWhat, QListViewItem * j,
+ QListViewItem * k );
+ void countStats( QListViewItem * ci, QListViewItem * mi, int& trW, int& trC, int& trCS );
+ void doCharCounting( const QString& text, int& trW, int& trC, int& trCS );
+
+ QListView * plv;
+ QListView * lv;
+ QListView * slv;
+ MessageEditor * me;
+ QLabel * progress;
+ QLabel * modified;
+ MetaTranslator tor;
+ bool dirty;
+ bool messageIsShown;
+ int numFinished;
+ int numNonobsolete;
+ int numMessages;
+ int dirtyItem;
+ QStringList recentFiles;
+ QString filename;
+
+ PBD phraseDict;
+ PBL phraseBooks;
+ QStringList phraseBookNames;
+
+ QPrinter printer;
+
+ FindDialog *f;
+ FindDialog *h;
+ QString findText;
+ int findWhere;
+ bool findMatchCase;
+ int foundItem;
+ QListViewItem *foundScope;
+ int foundWhere;
+ int foundOffset;
+
+ QPopupMenu * phrasep;
+ QPopupMenu * closePhraseBookp;
+ QPopupMenu * editPhraseBookp;
+ QPopupMenu * printPhraseBookp;
+ QPopupMenu * recentFilesMenu;
+ int closePhraseBookId;
+ int editPhraseBookId;
+ int printPhraseBookId;
+ Action *openAct;
+ Action *saveAct;
+ Action *saveAsAct;
+ Action *releaseAct;
+ Action *printAct;
+ Action *exitAct;
+ Action *undoAct;
+ Action *redoAct;
+ Action *cutAct;
+ Action *copyAct;
+ Action *pasteAct;
+ Action *selectAllAct;
+ Action *findAct;
+ Action *findAgainAct;
+ Action *replaceAct;
+ Action *newPhraseBookAct;
+ Action *openPhraseBookAct;
+ Action *acceleratorsAct;
+ Action *endingPunctuationAct;
+ Action *phraseMatchesAct;
+ Action *revertSortingAct;
+ Action *aboutAct;
+ Action *aboutQtAct;
+ Action *manualAct;
+ Action *whatsThisAct;
+ Action *beginFromSourceAct;
+ Action *prevAct;
+ Action *nextAct;
+ Action *prevUnfinishedAct;
+ Action *nextUnfinishedAct;
+ Action *doneAndNextAct;
+ QAction *doneAndNextAlt;
+ Action *doGuessesAct;
+ Action *toggleStats;
+ Statistics * stats;
+ int srcWords;
+ int srcChars;
+ int srcCharsSpc;
+};
+
+#endif
diff --git a/tools/linguist/lrelease/lrelease.pro b/tools/linguist/lrelease/lrelease.pro
new file mode 100644
index 0000000..755ea46
--- /dev/null
+++ b/tools/linguist/lrelease/lrelease.pro
@@ -0,0 +1,17 @@
+TEMPLATE = app
+CONFIG += qt warn_on console
+HEADERS = ../shared/metatranslator.h \
+ ../shared/proparser.h
+SOURCES = main.cpp \
+ ../shared/metatranslator.cpp \
+ ../shared/proparser.cpp
+
+DEFINES += QT_INTERNAL_XML
+include( ../../../src/qt_professional.pri )
+
+TARGET = lrelease
+INCLUDEPATH += ../shared
+DESTDIR = ../../../bin
+
+target.path=$$bins.path
+INSTALLS += target
diff --git a/tools/linguist/lrelease/main.cpp b/tools/linguist/lrelease/main.cpp
new file mode 100644
index 0000000..c76a034
--- /dev/null
+++ b/tools/linguist/lrelease/main.cpp
@@ -0,0 +1,203 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <metatranslator.h>
+#include <proparser.h>
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+
+#include <errno.h>
+
+typedef QValueList<MetaTranslatorMessage> TML;
+
+static void printUsage()
+{
+ fprintf( stderr, "Usage:\n"
+ " lrelease [options] project-file\n"
+ " lrelease [options] ts-files [-qm qm-file]\n"
+ "Options:\n"
+ " -help Display this information and exit\n"
+ " -nocompress\n"
+ " Do not compress the .qm files\n"
+ " -verbose\n"
+ " Explain what is being done\n"
+ " -version\n"
+ " Display the version of lrelease and exit\n" );
+}
+
+static bool loadTsFile( MetaTranslator& tor, const QString& tsFileName,
+ bool /* verbose */ )
+{
+ QString qmFileName = tsFileName;
+ qmFileName.replace( QRegExp("\\.ts$"), "" );
+ qmFileName += ".qm";
+
+ bool ok = tor.load( tsFileName );
+ if ( !ok )
+ fprintf( stderr,
+ "lrelease warning: For some reason, I cannot load '%s'\n",
+ tsFileName.latin1() );
+ return ok;
+}
+
+static void releaseMetaTranslator( const MetaTranslator& tor,
+ const QString& qmFileName, bool verbose,
+ bool stripped )
+{
+ if ( verbose )
+ fprintf( stderr, "Updating '%s'...\n", qmFileName.latin1() );
+ if ( !tor.release(qmFileName, verbose,
+ stripped ? QTranslator::Stripped
+ : QTranslator::Everything) )
+ fprintf( stderr,
+ "lrelease warning: For some reason, I cannot save '%s'\n",
+ qmFileName.latin1() );
+}
+
+static void releaseTsFile( const QString& tsFileName, bool verbose,
+ bool stripped )
+{
+ MetaTranslator tor;
+ if ( loadTsFile(tor, tsFileName, verbose) ) {
+ QString qmFileName = tsFileName;
+ qmFileName.replace( QRegExp("\\.ts$"), "" );
+ qmFileName += ".qm";
+ releaseMetaTranslator( tor, qmFileName, verbose, stripped );
+ }
+}
+
+int main( int argc, char **argv )
+{
+ bool verbose = FALSE;
+ bool stripped = TRUE;
+ bool metTranslations = FALSE;
+ MetaTranslator tor;
+ QString outputFile;
+ int numFiles = 0;
+ int i;
+
+ for ( i = 1; i < argc; i++ ) {
+ if ( qstrcmp(argv[i], "-nocompress") == 0 ) {
+ stripped = FALSE;
+ continue;
+ } else if ( qstrcmp(argv[i], "-verbose") == 0 ) {
+ verbose = TRUE;
+ continue;
+ } else if ( qstrcmp(argv[i], "-version") == 0 ) {
+ fprintf( stderr, "lrelease version %s\n", QT_VERSION_STR );
+ return 0;
+ } else if ( qstrcmp(argv[i], "-qm") == 0 ) {
+ if ( i == argc - 1 ) {
+ printUsage();
+ return 1;
+ } else {
+ i++;
+ outputFile = argv[i];
+ argv[i][0] = '-';
+ }
+ } else if ( qstrcmp(argv[i], "-help") == 0 ) {
+ printUsage();
+ return 0;
+ } else if ( argv[i][0] == '-' ) {
+ printUsage();
+ return 1;
+ } else {
+ numFiles++;
+ }
+ }
+
+ if ( numFiles == 0 ) {
+ printUsage();
+ return 1;
+ }
+
+ for ( i = 1; i < argc; i++ ) {
+ if ( argv[i][0] == '-' )
+ continue;
+
+ QFile f( argv[i] );
+ if ( !f.open(IO_ReadOnly) ) {
+ fprintf( stderr,
+ "lrelease error: Cannot open file '%s': %s\n", argv[i],
+ strerror(errno) );
+ return 1;
+ }
+
+ QTextStream t( &f );
+ QString fullText = t.read();
+ f.close();
+
+ if ( fullText.find(QString("<!DOCTYPE TS>")) >= 0 ) {
+ if ( outputFile.isEmpty() ) {
+ releaseTsFile( argv[i], verbose, stripped );
+ } else {
+ loadTsFile( tor, argv[i], verbose );
+ }
+ } else {
+ QString oldDir = QDir::currentDirPath();
+ QDir::setCurrent( QFileInfo(argv[i]).dirPath() );
+
+ QMap<QString, QString> tagMap = proFileTagMap( fullText );
+ QMap<QString, QString>::Iterator it;
+
+ for ( it = tagMap.begin(); it != tagMap.end(); ++it ) {
+ QStringList toks = QStringList::split( ' ', it.data() );
+ QStringList::Iterator t;
+
+ for ( t = toks.begin(); t != toks.end(); ++t ) {
+ if ( it.key() == QString("TRANSLATIONS") ) {
+ metTranslations = TRUE;
+ releaseTsFile( *t, verbose, stripped );
+ }
+ }
+ }
+ if ( !metTranslations )
+ fprintf( stderr,
+ "lrelease warning: Met no 'TRANSLATIONS' entry in"
+ " project file '%s'\n",
+ argv[i] );
+ QDir::setCurrent( oldDir );
+ }
+ }
+
+ if ( !outputFile.isEmpty() )
+ releaseMetaTranslator( tor, outputFile, verbose, stripped );
+
+ return 0;
+}
diff --git a/tools/linguist/lupdate/fetchtr.cpp b/tools/linguist/lupdate/fetchtr.cpp
new file mode 100644
index 0000000..ce8fb98
--- /dev/null
+++ b/tools/linguist/lupdate/fetchtr.cpp
@@ -0,0 +1,824 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <metatranslator.h>
+
+#include <qfile.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextstream.h>
+#include <qvaluestack.h>
+#include <qxml.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+/* qmake ignore Q_OBJECT */
+
+static const char MagicComment[] = "TRANSLATOR ";
+
+static QMap<QCString, int> needs_Q_OBJECT;
+static QMap<QCString, int> lacks_Q_OBJECT;
+
+/*
+ The first part of this source file is the C++ tokenizer. We skip
+ most of C++; the only tokens that interest us are defined here.
+ Thus, the code fragment
+
+ int main()
+ {
+ printf( "Hello, world!\n" );
+ return 0;
+ }
+
+ is broken down into the following tokens (Tok_ omitted):
+
+ Ident Ident LeftParen RightParen
+ LeftBrace
+ Ident LeftParen String RightParen Semicolon
+ return Semicolon
+ RightBrace.
+
+ The 0 doesn't produce any token.
+*/
+
+enum { Tok_Eof, Tok_class, Tok_namespace, Tok_return, Tok_tr,
+ Tok_trUtf8, Tok_translate, Tok_Q_OBJECT, Tok_Ident,
+ Tok_Comment, Tok_String, Tok_Arrow, Tok_Colon,
+ Tok_Gulbrandsen, Tok_LeftBrace, Tok_RightBrace, Tok_LeftParen,
+ Tok_RightParen, Tok_Comma, Tok_Semicolon };
+
+/*
+ The tokenizer maintains the following global variables. The names
+ should be self-explanatory.
+*/
+static QCString yyFileName;
+static int yyCh;
+static char yyIdent[128];
+static size_t yyIdentLen;
+static char yyComment[65536];
+static size_t yyCommentLen;
+static char yyString[65536];
+static size_t yyStringLen;
+static QValueStack<int> yySavedBraceDepth;
+static QValueStack<int> yySavedParenDepth;
+static int yyBraceDepth;
+static int yyParenDepth;
+static int yyLineNo;
+static int yyCurLineNo;
+static int yyBraceLineNo;
+static int yyParenLineNo;
+
+// the file to read from (if reading from a file)
+static FILE *yyInFile;
+
+// the string to read from and current position in the string (otherwise)
+static QString yyInStr;
+static int yyInPos;
+
+static int (*getChar)();
+
+static int getCharFromFile()
+{
+ int c = getc( yyInFile );
+ if ( c == '\n' )
+ yyCurLineNo++;
+ return c;
+}
+
+static int getCharFromString()
+{
+ if ( yyInPos == (int) yyInStr.length() ) {
+ return EOF;
+ } else {
+ return yyInStr[yyInPos++].latin1();
+ }
+}
+
+static void startTokenizer( const char *fileName, int (*getCharFunc)() )
+{
+ yyInPos = 0;
+ getChar = getCharFunc;
+
+ yyFileName = fileName;
+ yyCh = getChar();
+ yySavedBraceDepth.clear();
+ yySavedParenDepth.clear();
+ yyBraceDepth = 0;
+ yyParenDepth = 0;
+ yyCurLineNo = 1;
+ yyBraceLineNo = 1;
+ yyParenLineNo = 1;
+}
+
+static int getToken()
+{
+ const char tab[] = "abfnrtv";
+ const char backTab[] = "\a\b\f\n\r\t\v";
+ uint n;
+
+ yyIdentLen = 0;
+ yyCommentLen = 0;
+ yyStringLen = 0;
+
+ while ( yyCh != EOF ) {
+ yyLineNo = yyCurLineNo;
+
+ if ( isalpha(yyCh) || yyCh == '_' ) {
+ do {
+ if ( yyIdentLen < sizeof(yyIdent) - 1 )
+ yyIdent[yyIdentLen++] = (char) yyCh;
+ yyCh = getChar();
+ } while ( isalnum(yyCh) || yyCh == '_' );
+ yyIdent[yyIdentLen] = '\0';
+
+ switch ( yyIdent[0] ) {
+ case 'Q':
+ if ( strcmp(yyIdent + 1, "_OBJECT") == 0 ) {
+ return Tok_Q_OBJECT;
+ } else if ( strcmp(yyIdent + 1, "T_TR_NOOP") == 0 ) {
+ return Tok_tr;
+ } else if ( strcmp(yyIdent + 1, "T_TRANSLATE_NOOP") == 0 ) {
+ return Tok_translate;
+ }
+ break;
+ case 'T':
+ // TR() for when all else fails
+ if ( qstricmp(yyIdent + 1, "R") == 0 )
+ return Tok_tr;
+ break;
+ case 'c':
+ if ( strcmp(yyIdent + 1, "lass") == 0 )
+ return Tok_class;
+ break;
+ case 'f':
+ /*
+ QTranslator::findMessage() has the same parameters as
+ QApplication::translate().
+ */
+ if ( strcmp(yyIdent + 1, "indMessage") == 0 )
+ return Tok_translate;
+ break;
+ case 'n':
+ if ( strcmp(yyIdent + 1, "amespace") == 0 )
+ return Tok_namespace;
+ break;
+ case 'r':
+ if ( strcmp(yyIdent + 1, "eturn") == 0 )
+ return Tok_return;
+ break;
+ case 's':
+ if ( strcmp(yyIdent + 1, "truct") == 0 )
+ return Tok_class;
+ break;
+ case 't':
+ if ( strcmp(yyIdent + 1, "r") == 0 ) {
+ return Tok_tr;
+ } else if ( qstrcmp(yyIdent + 1, "rUtf8") == 0 ) {
+ return Tok_trUtf8;
+ } else if ( qstrcmp(yyIdent + 1, "ranslate") == 0 ) {
+ return Tok_translate;
+ }
+ }
+ return Tok_Ident;
+ } else {
+ switch ( yyCh ) {
+ case '#':
+ /*
+ Early versions of lupdate complained about
+ unbalanced braces in the following code:
+
+ #ifdef ALPHA
+ while ( beta ) {
+ #else
+ while ( gamma ) {
+ #endif
+ delta;
+ }
+
+ The code contains, indeed, two opening braces for
+ one closing brace; yet there's no reason to panic.
+
+ The solution is to remember yyBraceDepth as it was
+ when #if, #ifdef or #ifndef was met, and to set
+ yyBraceDepth to that value when meeting #elif or
+ #else.
+ */
+ do {
+ yyCh = getChar();
+ } while ( isspace(yyCh) && yyCh != '\n' );
+
+ switch ( yyCh ) {
+ case 'i':
+ yyCh = getChar();
+ if ( yyCh == 'f' ) {
+ // if, ifdef, ifndef
+ yySavedBraceDepth.push( yyBraceDepth );
+ yySavedParenDepth.push( yyParenDepth );
+ }
+ break;
+ case 'e':
+ yyCh = getChar();
+ if ( yyCh == 'l' ) {
+ // elif, else
+ if ( !yySavedBraceDepth.isEmpty() ) {
+ yyBraceDepth = yySavedBraceDepth.top();
+ yyParenDepth = yySavedParenDepth.top();
+ }
+ } else if ( yyCh == 'n' ) {
+ // endif
+ if ( !yySavedBraceDepth.isEmpty() ) {
+ yySavedBraceDepth.pop();
+ yySavedParenDepth.pop();
+ }
+ }
+ }
+ while ( isalnum(yyCh) || yyCh == '_' )
+ yyCh = getChar();
+ break;
+ case '/':
+ yyCh = getChar();
+ if ( yyCh == '/' ) {
+ do {
+ yyCh = getChar();
+ } while ( yyCh != EOF && yyCh != '\n' );
+ } else if ( yyCh == '*' ) {
+ bool metAster = FALSE;
+ bool metAsterSlash = FALSE;
+
+ while ( !metAsterSlash ) {
+ yyCh = getChar();
+ if ( yyCh == EOF ) {
+ fprintf( stderr,
+ "%s: Unterminated C++ comment starting at"
+ " line %d\n",
+ (const char *) yyFileName, yyLineNo );
+ yyComment[yyCommentLen] = '\0';
+ return Tok_Comment;
+ }
+ if ( yyCommentLen < sizeof(yyComment) - 1 )
+ yyComment[yyCommentLen++] = (char) yyCh;
+
+ if ( yyCh == '*' )
+ metAster = TRUE;
+ else if ( metAster && yyCh == '/' )
+ metAsterSlash = TRUE;
+ else
+ metAster = FALSE;
+ }
+ yyCh = getChar();
+ yyCommentLen -= 2;
+ yyComment[yyCommentLen] = '\0';
+ return Tok_Comment;
+ }
+ break;
+ case '"':
+ yyCh = getChar();
+
+ while ( yyCh != EOF && yyCh != '\n' && yyCh != '"' ) {
+ if ( yyCh == '\\' ) {
+ yyCh = getChar();
+
+ if ( yyCh == '\n' ) {
+ yyCh = getChar();
+ } else if ( yyCh == 'x' ) {
+ QCString hex = "0";
+
+ yyCh = getChar();
+ while ( isxdigit(yyCh) ) {
+ hex += (char) yyCh;
+ yyCh = getChar();
+ }
+ sscanf( hex, "%x", &n );
+ if ( yyStringLen < sizeof(yyString) - 1 )
+ yyString[yyStringLen++] = (char) n;
+ } else if ( yyCh >= '0' && yyCh < '8' ) {
+ QCString oct = "";
+
+ do {
+ oct += (char) yyCh;
+ yyCh = getChar();
+ } while ( yyCh >= '0' && yyCh < '8' );
+ sscanf( oct, "%o", &n );
+ if ( yyStringLen < sizeof(yyString) - 1 )
+ yyString[yyStringLen++] = (char) n;
+ } else {
+ const char *p = strchr( tab, yyCh );
+ if ( yyStringLen < sizeof(yyString) - 1 )
+ yyString[yyStringLen++] = ( p == 0 ) ?
+ (char) yyCh : backTab[p - tab];
+ yyCh = getChar();
+ }
+ } else {
+ if ( yyStringLen < sizeof(yyString) - 1 )
+ yyString[yyStringLen++] = (char) yyCh;
+ yyCh = getChar();
+ }
+ }
+ yyString[yyStringLen] = '\0';
+
+ if ( yyCh != '"' )
+ qWarning( "%s:%d: Unterminated C++ string",
+ (const char *) yyFileName, yyLineNo );
+
+ if ( yyCh == EOF ) {
+ return Tok_Eof;
+ } else {
+ yyCh = getChar();
+ return Tok_String;
+ }
+ break;
+ case '-':
+ yyCh = getChar();
+ if ( yyCh == '>' ) {
+ yyCh = getChar();
+ return Tok_Arrow;
+ }
+ break;
+ case ':':
+ yyCh = getChar();
+ if ( yyCh == ':' ) {
+ yyCh = getChar();
+ return Tok_Gulbrandsen;
+ }
+ return Tok_Colon;
+ case '\'':
+ yyCh = getChar();
+ if ( yyCh == '\\' )
+ yyCh = getChar();
+
+ do {
+ yyCh = getChar();
+ } while ( yyCh != EOF && yyCh != '\'' );
+ yyCh = getChar();
+ break;
+ case '{':
+ if (yyBraceDepth == 0)
+ yyBraceLineNo = yyCurLineNo;
+ yyBraceDepth++;
+ yyCh = getChar();
+ return Tok_LeftBrace;
+ case '}':
+ if (yyBraceDepth == 0)
+ yyBraceLineNo = yyCurLineNo;
+ yyBraceDepth--;
+ yyCh = getChar();
+ return Tok_RightBrace;
+ case '(':
+ if (yyParenDepth == 0)
+ yyParenLineNo = yyCurLineNo;
+ yyParenDepth++;
+ yyCh = getChar();
+ return Tok_LeftParen;
+ case ')':
+ if (yyParenDepth == 0)
+ yyParenLineNo = yyCurLineNo;
+ yyParenDepth--;
+ yyCh = getChar();
+ return Tok_RightParen;
+ case ',':
+ yyCh = getChar();
+ return Tok_Comma;
+ case ';':
+ yyCh = getChar();
+ return Tok_Semicolon;
+ default:
+ yyCh = getChar();
+ }
+ }
+ }
+ return Tok_Eof;
+}
+
+/*
+ The second part of this source file is the parser. It accomplishes
+ a very easy task: It finds all strings inside a tr() or translate()
+ call, and possibly finds out the context of the call. It supports
+ three cases: (1) the context is specified, as in
+ FunnyDialog::tr("Hello") or translate("FunnyDialog", "Hello");
+ (2) the call appears within an inlined function; (3) the call
+ appears within a function defined outside the class definition.
+*/
+
+static int yyTok;
+
+static bool match( int t )
+{
+ bool matches = ( yyTok == t );
+ if ( matches )
+ yyTok = getToken();
+ return matches;
+}
+
+static bool matchString( QCString *s )
+{
+ bool matches = ( yyTok == Tok_String );
+ *s = "";
+ while ( yyTok == Tok_String ) {
+ *s += yyString;
+ yyTok = getToken();
+ }
+ return matches;
+}
+
+static bool matchEncoding( bool *utf8 )
+{
+ if ( yyTok == Tok_Ident ) {
+ if ( strcmp(yyIdent, "QApplication") == 0 ) {
+ yyTok = getToken();
+ if ( yyTok == Tok_Gulbrandsen )
+ yyTok = getToken();
+ }
+ *utf8 = QString( yyIdent ).endsWith( QString("UTF8") );
+ yyTok = getToken();
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+static void parse( MetaTranslator *tor, const char *initialContext,
+ const char *defaultContext )
+{
+ QMap<QCString, QCString> qualifiedContexts;
+ QStringList namespaces;
+ QCString context;
+ QCString text;
+ QCString com;
+ QCString functionContext = initialContext;
+ QCString prefix;
+ bool utf8 = FALSE;
+ bool missing_Q_OBJECT = FALSE;
+
+ yyTok = getToken();
+ while ( yyTok != Tok_Eof ) {
+ switch ( yyTok ) {
+ case Tok_class:
+ /*
+ Partial support for inlined functions.
+ */
+ yyTok = getToken();
+ if ( yyBraceDepth == (int) namespaces.count() &&
+ yyParenDepth == 0 ) {
+ do {
+ /*
+ This code should execute only once, but we play
+ safe with impure definitions such as
+ 'class Q_EXPORT QMessageBox', in which case
+ 'QMessageBox' is the class name, not 'Q_EXPORT'.
+ */
+ functionContext = yyIdent;
+ yyTok = getToken();
+ } while ( yyTok == Tok_Ident );
+
+ while ( yyTok == Tok_Gulbrandsen ) {
+ yyTok = getToken();
+ functionContext += "::";
+ functionContext += yyIdent;
+ yyTok = getToken();
+ }
+
+ if ( yyTok == Tok_Colon ) {
+ missing_Q_OBJECT = TRUE;
+ } else {
+ functionContext = defaultContext;
+ }
+ }
+ break;
+ case Tok_namespace:
+ yyTok = getToken();
+ if ( yyTok == Tok_Ident ) {
+ QCString ns = yyIdent;
+ yyTok = getToken();
+ if ( yyTok == Tok_LeftBrace &&
+ yyBraceDepth == (int) namespaces.count() + 1 )
+ namespaces.append( QString(ns) );
+ }
+ break;
+ case Tok_tr:
+ case Tok_trUtf8:
+ utf8 = ( yyTok == Tok_trUtf8 );
+ yyTok = getToken();
+ if ( match(Tok_LeftParen) && matchString(&text) ) {
+ com = "";
+ if ( match(Tok_RightParen) || (match(Tok_Comma) &&
+ matchString(&com) && match(Tok_RightParen)) ) {
+ if ( prefix.isNull() ) {
+ context = functionContext;
+ if ( !namespaces.isEmpty() )
+ context.prepend( (namespaces.join(QString("::")) +
+ QString("::")).latin1() );
+ } else {
+ context = prefix;
+ }
+ prefix = (const char *) 0;
+
+ if ( qualifiedContexts.contains(context) )
+ context = qualifiedContexts[context];
+ tor->insert( MetaTranslatorMessage(context, text, com,
+ QString::null, utf8) );
+
+ if ( lacks_Q_OBJECT.contains(context) ) {
+ qWarning( "%s:%d: Class '%s' lacks Q_OBJECT macro",
+ (const char *) yyFileName, yyLineNo,
+ (const char *) context );
+ lacks_Q_OBJECT.remove( context );
+ } else {
+ needs_Q_OBJECT.insert( context, 0 );
+ }
+ }
+ }
+ break;
+ case Tok_translate:
+ utf8 = FALSE;
+ yyTok = getToken();
+ if ( match(Tok_LeftParen) &&
+ matchString(&context) &&
+ match(Tok_Comma) &&
+ matchString(&text) ) {
+ com = "";
+ if ( match(Tok_RightParen) ||
+ (match(Tok_Comma) &&
+ matchString(&com) &&
+ (match(Tok_RightParen) ||
+ match(Tok_Comma) &&
+ matchEncoding(&utf8) &&
+ match(Tok_RightParen))) )
+ tor->insert( MetaTranslatorMessage(context, text, com,
+ QString::null, utf8) );
+ }
+ break;
+ case Tok_Q_OBJECT:
+ missing_Q_OBJECT = FALSE;
+ yyTok = getToken();
+ break;
+ case Tok_Ident:
+ if ( !prefix.isNull() )
+ prefix += "::";
+ prefix += yyIdent;
+ yyTok = getToken();
+ if ( yyTok != Tok_Gulbrandsen )
+ prefix = (const char *) 0;
+ break;
+ case Tok_Comment:
+ com = yyComment;
+ com = com.simplifyWhiteSpace();
+ if ( com.left(sizeof(MagicComment) - 1) == MagicComment ) {
+ com.remove( 0, sizeof(MagicComment) - 1 );
+ int k = com.find( ' ' );
+ if ( k == -1 ) {
+ context = com;
+ } else {
+ context = com.left( k );
+ com.remove( 0, k + 1 );
+ tor->insert( MetaTranslatorMessage(context, "", com,
+ QString::null, FALSE) );
+ }
+
+ /*
+ Provide a backdoor for people using "using
+ namespace". See the manual for details.
+ */
+ k = 0;
+ while ( (k = context.find("::", k)) != -1 ) {
+ qualifiedContexts.insert( context.mid(k + 2), context );
+ k++;
+ }
+ }
+ yyTok = getToken();
+ break;
+ case Tok_Arrow:
+ yyTok = getToken();
+ if ( yyTok == Tok_tr || yyTok == Tok_trUtf8 )
+ qWarning( "%s:%d: Cannot invoke tr() like this",
+ (const char *) yyFileName, yyLineNo );
+ break;
+ case Tok_Gulbrandsen:
+ // at top level?
+ if ( yyBraceDepth == (int) namespaces.count() && yyParenDepth == 0 )
+ functionContext = prefix;
+ yyTok = getToken();
+ break;
+ case Tok_RightBrace:
+ case Tok_Semicolon:
+ if ( yyBraceDepth >= 0 &&
+ yyBraceDepth + 1 == (int) namespaces.count() )
+ namespaces.remove( namespaces.fromLast() );
+ if ( yyBraceDepth == (int) namespaces.count() ) {
+ if ( missing_Q_OBJECT ) {
+ if ( needs_Q_OBJECT.contains(functionContext) ) {
+ qWarning( "%s:%d: Class '%s' lacks Q_OBJECT macro",
+ (const char *) yyFileName, yyLineNo,
+ (const char *) functionContext );
+ } else {
+ lacks_Q_OBJECT.insert( functionContext, 0 );
+ }
+ }
+ functionContext = defaultContext;
+ missing_Q_OBJECT = FALSE;
+ }
+ yyTok = getToken();
+ break;
+ default:
+ yyTok = getToken();
+ }
+ }
+
+ if ( yyBraceDepth != 0 )
+ fprintf( stderr,
+ "%s:%d: Unbalanced braces in C++ code (or abuse of the C++"
+ " preprocessor)\n",
+ (const char *)yyFileName, yyBraceLineNo );
+ else if ( yyParenDepth != 0 )
+ fprintf( stderr,
+ "%s:%d: Unbalanced parentheses in C++ code (or abuse of the C++"
+ " preprocessor)\n",
+ (const char *)yyFileName, yyParenLineNo );
+}
+
+void fetchtr_cpp( const char *fileName, MetaTranslator *tor,
+ const char *defaultContext, bool mustExist )
+{
+ yyInFile = fopen( fileName, "r" );
+ if ( yyInFile == 0 ) {
+ if ( mustExist )
+ fprintf( stderr,
+ "lupdate error: Cannot open C++ source file '%s': %s\n",
+ fileName, strerror(errno) );
+ return;
+ }
+
+ startTokenizer( fileName, getCharFromFile );
+ parse( tor, 0, defaultContext );
+ fclose( yyInFile );
+}
+
+/*
+ In addition to C++, we support Qt Designer UI files.
+*/
+
+/*
+ Fetches tr() calls in C++ code in UI files (inside "<function>"
+ tag). This mechanism is obsolete.
+*/
+void fetchtr_inlined_cpp( const char *fileName, const QString& in,
+ MetaTranslator *tor, const char *context )
+{
+ yyInStr = in;
+ startTokenizer( fileName, getCharFromString );
+ parse( tor, context, 0 );
+ yyInStr = QString::null;
+}
+
+class UiHandler : public QXmlDefaultHandler
+{
+public:
+ UiHandler( MetaTranslator *translator, const char *fileName )
+ : tor( translator ), fname( fileName ), comment( "" ) { }
+
+ virtual bool startElement( const QString& namespaceURI,
+ const QString& localName, const QString& qName,
+ const QXmlAttributes& atts );
+ virtual bool endElement( const QString& namespaceURI,
+ const QString& localName, const QString& qName );
+ virtual bool characters( const QString& ch );
+ virtual bool fatalError( const QXmlParseException& exception );
+
+private:
+ void flush();
+
+ MetaTranslator *tor;
+ QCString fname;
+ QString context;
+ QString source;
+ QString comment;
+
+ QString accum;
+};
+
+bool UiHandler::startElement( const QString& /* namespaceURI */,
+ const QString& /* localName */,
+ const QString& qName,
+ const QXmlAttributes& atts )
+{
+ if ( qName == QString("item") ) {
+ flush();
+ if ( !atts.value(QString("text")).isEmpty() )
+ source = atts.value( QString("text") );
+ } else if ( qName == QString("string") ) {
+ flush();
+ }
+ accum.truncate( 0 );
+ return TRUE;
+}
+
+bool UiHandler::endElement( const QString& /* namespaceURI */,
+ const QString& /* localName */,
+ const QString& qName )
+{
+ accum.replace( QRegExp(QString("\r\n")), "\n" );
+
+ if ( qName == QString("class") ) {
+ if ( context.isEmpty() )
+ context = accum;
+ } else if ( qName == QString("string") ) {
+ source = accum;
+ } else if ( qName == QString("comment") ) {
+ comment = accum;
+ flush();
+ } else if ( qName == QString("function") ) {
+ fetchtr_inlined_cpp( (const char *) fname, accum, tor,
+ context.latin1() );
+ } else {
+ flush();
+ }
+ return TRUE;
+}
+
+bool UiHandler::characters( const QString& ch )
+{
+ accum += ch;
+ return TRUE;
+}
+
+bool UiHandler::fatalError( const QXmlParseException& exception )
+{
+ QString msg;
+ msg.sprintf( "Parse error at line %d, column %d (%s).",
+ exception.lineNumber(), exception.columnNumber(),
+ exception.message().latin1() );
+ fprintf( stderr, "XML error: %s\n", msg.latin1() );
+ return FALSE;
+}
+
+void UiHandler::flush()
+{
+ if ( !context.isEmpty() && !source.isEmpty() )
+ tor->insert( MetaTranslatorMessage(context.utf8(), source.utf8(),
+ comment.utf8(), QString::null,
+ TRUE) );
+ source.truncate( 0 );
+ comment.truncate( 0 );
+}
+
+void fetchtr_ui( const char *fileName, MetaTranslator *tor,
+ const char * /* defaultContext */, bool mustExist )
+{
+ QFile f( fileName );
+ if ( !f.open(IO_ReadOnly) ) {
+ if ( mustExist )
+ fprintf( stderr, "lupdate error: cannot open UI file '%s': %s\n",
+ fileName, strerror(errno) );
+ return;
+ }
+
+ QTextStream t( &f );
+ QXmlInputSource in( t );
+ QXmlSimpleReader reader;
+ reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE );
+ reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", TRUE );
+ reader.setFeature( "http://trolltech.com/xml/features/report-whitespace"
+ "-only-CharData", FALSE );
+ QXmlDefaultHandler *hand = new UiHandler( tor, fileName );
+ reader.setContentHandler( hand );
+ reader.setErrorHandler( hand );
+
+ if ( !reader.parse(in) )
+ fprintf( stderr, "%s: Parse error in UI file\n", fileName );
+ reader.setContentHandler( 0 );
+ reader.setErrorHandler( 0 );
+ delete hand;
+ f.close();
+}
diff --git a/tools/linguist/lupdate/lupdate.pro b/tools/linguist/lupdate/lupdate.pro
new file mode 100644
index 0000000..1dad999
--- /dev/null
+++ b/tools/linguist/lupdate/lupdate.pro
@@ -0,0 +1,21 @@
+TEMPLATE = app
+CONFIG += qt warn_on console
+HEADERS = ../shared/metatranslator.h \
+ ../shared/proparser.h
+SOURCES = fetchtr.cpp \
+ main.cpp \
+ merge.cpp \
+ numberh.cpp \
+ sametexth.cpp \
+ ../shared/metatranslator.cpp \
+ ../shared/proparser.cpp
+
+DEFINES += QT_INTERNAL_XML
+include( ../../../src/qt_professional.pri )
+
+TARGET = lupdate
+INCLUDEPATH += ../shared
+DESTDIR = ../../../bin
+
+target.path=$$bins.path
+INSTALLS += target
diff --git a/tools/linguist/lupdate/main.cpp b/tools/linguist/lupdate/main.cpp
new file mode 100644
index 0000000..73c23aa
--- /dev/null
+++ b/tools/linguist/lupdate/main.cpp
@@ -0,0 +1,241 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <metatranslator.h>
+#include <proparser.h>
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+
+#include <errno.h>
+#include <string.h>
+
+// defined in fetchtr.cpp
+extern void fetchtr_cpp( const char *fileName, MetaTranslator *tor,
+ const char *defaultContext, bool mustExist );
+extern void fetchtr_ui( const char *fileName, MetaTranslator *tor,
+ const char *defaultContext, bool mustExist );
+
+// defined in merge.cpp
+extern void merge( MetaTranslator *tor, const MetaTranslator *virginTor,
+ bool verbose );
+
+typedef QValueList<MetaTranslatorMessage> TML;
+
+static void printUsage()
+{
+ fprintf( stderr, "Usage:\n"
+ " lupdate [options] project-file\n"
+ " lupdate [options] source-files -ts ts-files\n"
+ "Options:\n"
+ " -help Display this information and exit\n"
+ " -noobsolete\n"
+ " Drop all obsolete strings\n"
+ " -verbose\n"
+ " Explain what is being done\n"
+ " -version\n"
+ " Display the version of lupdate and exit\n" );
+}
+
+static void updateTsFiles( const MetaTranslator& fetchedTor,
+ const QStringList& tsFileNames, const QString& codec,
+ bool noObsolete, bool verbose )
+{
+ QStringList::ConstIterator t = tsFileNames.begin();
+ while ( t != tsFileNames.end() ) {
+ MetaTranslator tor;
+ tor.load( *t );
+ if ( !codec.isEmpty() )
+ tor.setCodec( codec );
+ if ( verbose )
+ fprintf( stderr, "Updating '%s'...\n", (*t).latin1() );
+ merge( &tor, &fetchedTor, verbose );
+ if ( noObsolete )
+ tor.stripObsoleteMessages();
+ tor.stripEmptyContexts();
+ if ( !tor.save(*t) )
+ fprintf( stderr, "lupdate error: Cannot save '%s': %s\n",
+ (*t).latin1(), strerror(errno) );
+ ++t;
+ }
+}
+
+int main( int argc, char **argv )
+{
+ QString defaultContext = "@default";
+ MetaTranslator fetchedTor;
+ QCString codec;
+ QStringList tsFileNames;
+
+ bool verbose = FALSE;
+ bool noObsolete = FALSE;
+ bool metSomething = FALSE;
+ int numFiles = 0;
+ bool standardSyntax = TRUE;
+ bool metTsFlag = FALSE;
+
+ int i;
+
+ for ( i = 1; i < argc; i++ ) {
+ if ( qstrcmp(argv[i], "-ts") == 0 )
+ standardSyntax = FALSE;
+ }
+
+ for ( i = 1; i < argc; i++ ) {
+ if ( qstrcmp(argv[i], "-help") == 0 ) {
+ printUsage();
+ return 0;
+ } else if ( qstrcmp(argv[i], "-noobsolete") == 0 ) {
+ noObsolete = TRUE;
+ continue;
+ } else if ( qstrcmp(argv[i], "-verbose") == 0 ) {
+ verbose = TRUE;
+ continue;
+ } else if ( qstrcmp(argv[i], "-version") == 0 ) {
+ fprintf( stderr, "lupdate version %s\n", QT_VERSION_STR );
+ return 0;
+ } else if ( qstrcmp(argv[i], "-ts") == 0 ) {
+ metTsFlag = TRUE;
+ continue;
+ }
+
+ numFiles++;
+
+ QString fullText;
+
+ if ( !metTsFlag ) {
+ QFile f( argv[i] );
+ if ( !f.open(IO_ReadOnly) ) {
+ fprintf( stderr, "lupdate error: Cannot open file '%s': %s\n",
+ argv[i], strerror(errno) );
+ return 1;
+ }
+
+ QTextStream t( &f );
+ fullText = t.read();
+ f.close();
+ }
+
+ QString oldDir = QDir::currentDirPath();
+ QDir::setCurrent( QFileInfo(argv[i]).dirPath() );
+
+ if ( standardSyntax ) {
+ fetchedTor = MetaTranslator();
+ codec.truncate( 0 );
+ tsFileNames.clear();
+
+ QMap<QString, QString> tagMap = proFileTagMap( fullText );
+ QMap<QString, QString>::Iterator it;
+
+ for ( it = tagMap.begin(); it != tagMap.end(); ++it ) {
+ QStringList toks = QStringList::split( ' ', it.data() );
+ QStringList::Iterator t;
+
+ for ( t = toks.begin(); t != toks.end(); ++t ) {
+ if ( it.key() == "HEADERS" || it.key() == "SOURCES" ) {
+ fetchtr_cpp( *t, &fetchedTor, defaultContext, TRUE );
+ metSomething = TRUE;
+ } else if ( it.key() == "INTERFACES" ||
+ it.key() == "FORMS" ) {
+ fetchtr_ui( *t, &fetchedTor, defaultContext, TRUE );
+ fetchtr_cpp( *t + ".h", &fetchedTor, defaultContext,
+ FALSE );
+ metSomething = TRUE;
+ } else if ( it.key() == "TRANSLATIONS" ) {
+ tsFileNames.append( *t );
+ metSomething = TRUE;
+ } else if ( it.key() == "CODEC" ||
+ it.key() == "DEFAULTCODEC" ) {
+ codec = (*t).latin1();
+ }
+ }
+ }
+
+ updateTsFiles( fetchedTor, tsFileNames, codec, noObsolete,
+ verbose );
+
+ if ( !metSomething ) {
+ fprintf( stderr,
+ "lupdate warning: File '%s' does not look like a"
+ " project file\n",
+ argv[i] );
+ } else if ( tsFileNames.isEmpty() ) {
+ fprintf( stderr,
+ "lupdate warning: Met no 'TRANSLATIONS' entry in"
+ " project file '%s'\n",
+ argv[i] );
+ }
+ } else {
+ if ( metTsFlag ) {
+ if ( QString(argv[i]).lower().endsWith(".ts") ) {
+ QFileInfo fi( argv[i] );
+ if ( !fi.exists() || fi.isWritable() ) {
+ tsFileNames.append( argv[i] );
+ } else {
+ fprintf( stderr,
+ "lupdate warning: For some reason, I cannot"
+ " save '%s'\n",
+ argv[i] );
+ }
+ } else {
+ fprintf( stderr,
+ "lupdate error: File '%s' lacks .ts extension\n",
+ argv[i] );
+ }
+ } else {
+ QFileInfo fi(argv[i]);
+ if ( QString(argv[i]).lower().endsWith(".ui") ) {
+ fetchtr_ui( fi.fileName(), &fetchedTor, defaultContext, TRUE );
+ fetchtr_cpp( QString(fi.fileName()) + ".h", &fetchedTor,
+ defaultContext, FALSE );
+ } else {
+ fetchtr_cpp( fi.fileName(), &fetchedTor, defaultContext, TRUE );
+ }
+ }
+ }
+ QDir::setCurrent( oldDir );
+ }
+
+ if ( !standardSyntax )
+ updateTsFiles( fetchedTor, tsFileNames, codec, noObsolete, verbose );
+
+ if ( numFiles == 0 ) {
+ printUsage();
+ return 1;
+ }
+ return 0;
+}
diff --git a/tools/linguist/lupdate/merge.cpp b/tools/linguist/lupdate/merge.cpp
new file mode 100644
index 0000000..831a2fe
--- /dev/null
+++ b/tools/linguist/lupdate/merge.cpp
@@ -0,0 +1,129 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <metatranslator.h>
+
+// defined in numberh.cpp
+extern void applyNumberHeuristic( MetaTranslator *tor, bool verbose );
+// defined in sametexth.cpp
+extern void applySameTextHeuristic( MetaTranslator *tor, bool verbose );
+
+typedef QValueList<MetaTranslatorMessage> TML;
+
+/*
+ Merges two MetaTranslator objects into the first one. The first one
+ is a set of source texts and translations for a previous version of
+ the internationalized program; the second one is a set of fresh
+ source texts newly extracted from the source code, without any
+ translation yet.
+*/
+
+void merge( MetaTranslator *tor, const MetaTranslator *virginTor, bool verbose )
+{
+ int known = 0;
+ int neww = 0;
+ int obsoleted = 0;
+ TML all = tor->messages();
+ TML::Iterator it;
+
+ /*
+ The types of all the messages from the vernacular translator
+ are updated according to the virgin translator.
+ */
+ for ( it = all.begin(); it != all.end(); ++it ) {
+ MetaTranslatorMessage::Type newType;
+ MetaTranslatorMessage m = *it;
+
+ // skip context comment
+ if ( !QCString((*it).sourceText()).isEmpty() ) {
+ if ( !virginTor->contains((*it).context(), (*it).sourceText(),
+ (*it).comment()) ) {
+ newType = MetaTranslatorMessage::Obsolete;
+ if ( m.type() != MetaTranslatorMessage::Obsolete )
+ obsoleted++;
+ } else {
+ switch ( m.type() ) {
+ case MetaTranslatorMessage::Finished:
+ newType = MetaTranslatorMessage::Finished;
+ known++;
+ break;
+ case MetaTranslatorMessage::Unfinished:
+ default:
+ newType = MetaTranslatorMessage::Unfinished;
+ known++;
+ break;
+ case MetaTranslatorMessage::Obsolete:
+ newType = MetaTranslatorMessage::Unfinished;
+ neww++;
+ }
+ }
+
+ if ( newType != m.type() ) {
+ m.setType( newType );
+ tor->insert( m );
+ }
+ }
+ }
+
+ /*
+ Messages found only in the virgin translator are added to the
+ vernacular translator. Among these are all the context comments.
+ */
+ all = virginTor->messages();
+
+ for ( it = all.begin(); it != all.end(); ++it ) {
+ if ( !tor->contains((*it).context(), (*it).sourceText(),
+ (*it).comment()) ) {
+ tor->insert( *it );
+ if ( !QCString((*it).sourceText()).isEmpty() )
+ neww++;
+ }
+ }
+
+ /*
+ The same-text heuristic handles cases where a message has an
+ obsolete counterpart with a different context or comment.
+ */
+ applySameTextHeuristic( tor, verbose );
+
+ /*
+ The number heuristic handles cases where a message has an
+ obsolete counterpart with mostly numbers differing in the
+ source text.
+ */
+ applyNumberHeuristic( tor, verbose );
+
+ if ( verbose )
+ fprintf( stderr, " %d known, %d new and %d obsoleted messages\n", known,
+ neww, obsoleted );
+}
diff --git a/tools/linguist/lupdate/numberh.cpp b/tools/linguist/lupdate/numberh.cpp
new file mode 100644
index 0000000..b10477a
--- /dev/null
+++ b/tools/linguist/lupdate/numberh.cpp
@@ -0,0 +1,248 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <metatranslator.h>
+
+#include <qmemarray.h>
+#include <qcstring.h>
+#include <qmap.h>
+#include <qstringlist.h>
+
+#include <ctype.h>
+
+typedef QMap<QCString, MetaTranslatorMessage> TMM;
+typedef QValueList<MetaTranslatorMessage> TML;
+
+static bool isDigitFriendly( int c )
+{
+ return ispunct((uchar)c) || isspace((uchar)c);
+}
+
+static int numberLength( const char *s )
+{
+ int i = 0;
+
+ if ( isdigit((uchar)s[0]) ) {
+ do {
+ i++;
+ } while (isdigit((uchar)s[i]) ||
+ (isDigitFriendly(s[i]) &&
+ (isdigit((uchar)s[i + 1]) ||
+ (isDigitFriendly(s[i + 1]) && isdigit((uchar)s[i + 2])))));
+ }
+ return i;
+}
+
+/*
+ Returns a version of 'key' where all numbers have been replaced by zeroes. If
+ there were none, returns "".
+*/
+static QCString zeroKey( const char *key )
+{
+ QCString zeroed( (int)strlen(key) + 1 );
+ char *z = zeroed.data();
+ int i = 0, j = 0;
+ int len;
+ bool metSomething = FALSE;
+
+ while ( key[i] != '\0' ) {
+ len = numberLength( key + i );
+ if ( len > 0 ) {
+ i += len;
+ z[j++] = '0';
+ metSomething = TRUE;
+ } else {
+ z[j++] = key[i++];
+ }
+ }
+ z[j] = '\0';
+
+ if ( metSomething )
+ return zeroed;
+ else
+ return "";
+}
+
+static QString translationAttempt( const QString& oldTranslation,
+ const char *oldSource,
+ const char *newSource )
+{
+ int p = zeroKey( oldSource ).contains( '0' );
+ int oldSourceLen = qstrlen( oldSource );
+ QString attempt;
+ QStringList oldNumbers;
+ QStringList newNumbers;
+ QMemArray<bool> met( p );
+ QMemArray<int> matchedYet( p );
+ int i, j;
+ int k = 0, ell, best;
+ int m, n;
+ int pass;
+
+ /*
+ This algorithm is hard to follow, so we'll consider an example
+ all along: oldTranslation is "XeT 3.0", oldSource is "TeX 3.0"
+ and newSource is "XeT 3.1".
+
+ First, we set up two tables: oldNumbers and newNumbers. In our
+ example, oldNumber[0] is "3.0" and newNumber[0] is "3.1".
+ */
+ for ( i = 0, j = 0; i < oldSourceLen; i++, j++ ) {
+ m = numberLength( oldSource + i );
+ n = numberLength( newSource + j );
+ if ( m > 0 ) {
+ oldNumbers.append( QCString(oldSource + i, m + 1) );
+ newNumbers.append( QCString(newSource + j, n + 1) );
+ i += m;
+ j += n;
+ met[k] = FALSE;
+ matchedYet[k] = 0;
+ k++;
+ }
+ }
+
+ /*
+ We now go over the old translation, "XeT 3.0", one letter at a
+ time, looking for numbers found in oldNumbers. Whenever such a
+ number is met, it is replaced with its newNumber equivalent. In
+ our example, the "3.0" of "XeT 3.0" becomes "3.1".
+ */
+ for ( i = 0; i < (int) oldTranslation.length(); i++ ) {
+ attempt += oldTranslation[i];
+ for ( k = 0; k < p; k++ ) {
+ if ( oldTranslation[i] == oldNumbers[k][matchedYet[k]] )
+ matchedYet[k]++;
+ else
+ matchedYet[k] = 0;
+ }
+
+ /*
+ Let's find out if the last character ended a match. We make
+ two passes over the data. In the first pass, we try to
+ match only numbers that weren't matched yet; if that fails,
+ the second pass does the trick. This is useful in some
+ suspicious cases, flagged below.
+ */
+ for ( pass = 0; pass < 2; pass++ ) {
+ best = p; // an impossible value
+ for ( k = 0; k < p; k++ ) {
+ if ( (!met[k] || pass > 0) &&
+ matchedYet[k] == (int) oldNumbers[k].length() &&
+ numberLength(oldTranslation.latin1() + (i + 1) -
+ matchedYet[k]) == matchedYet[k] ) {
+ // the longer the better
+ if ( best == p || matchedYet[k] > matchedYet[best] )
+ best = k;
+ }
+ }
+ if ( best != p ) {
+ attempt.truncate( attempt.length() - matchedYet[best] );
+ attempt += newNumbers[best];
+ met[best] = TRUE;
+ for ( k = 0; k < p; k++ )
+ matchedYet[k] = 0;
+ break;
+ }
+ }
+ }
+
+ /*
+ We flag two kinds of suspicious cases. They are identified as
+ such with comments such as "{2000?}" at the end.
+
+ Example of the first kind: old source text "TeX 3.0" translated
+ as "XeT 2.0" is flagged "TeX 2.0 {3.0?}", no matter what the
+ new text is.
+ */
+ for ( k = 0; k < p; k++ ) {
+ if ( !met[k] )
+ attempt += QString( " {" ) + newNumbers[k] + QString( "?}" );
+ }
+
+ /*
+ Example of the second kind: "1 of 1" translated as "1 af 1",
+ with new source text "1 of 2", generates "1 af 2 {1 or 2?}"
+ because it's not clear which of "1 af 2" and "2 af 1" is right.
+ */
+ for ( k = 0; k < p; k++ ) {
+ for ( ell = 0; ell < p; ell++ ) {
+ if ( k != ell && oldNumbers[k] == oldNumbers[ell] &&
+ newNumbers[k] < newNumbers[ell] )
+ attempt += QString( " {" ) + newNumbers[k] + QString( " or " ) +
+ newNumbers[ell] + QString( "?}" );
+ }
+ }
+ return attempt;
+}
+
+/*
+ Augments a MetaTranslator with translations easily derived from
+ similar existing (probably obsolete) translations.
+
+ For example, if "TeX 3.0" is translated as "XeT 3.0" and "TeX 3.1"
+ has no translation, "XeT 3.1" is added to the translator and is
+ marked Unfinished.
+*/
+void applyNumberHeuristic( MetaTranslator *tor, bool verbose )
+{
+ TMM translated, untranslated;
+ TMM::Iterator t, u;
+ TML all = tor->messages();
+ TML::Iterator it;
+ int inserted = 0;
+
+ for ( it = all.begin(); it != all.end(); ++it ) {
+ if ( (*it).type() == MetaTranslatorMessage::Unfinished ) {
+ if ( (*it).translation().isEmpty() )
+ untranslated.insert(QCString((*it).context()) + "\n" + (*it).sourceText() + "\n"
+ + (*it).comment(), *it);
+ } else if ( !(*it).translation().isEmpty() ) {
+ translated.insert( zeroKey((*it).sourceText()), *it );
+ }
+ }
+
+ for ( u = untranslated.begin(); u != untranslated.end(); ++u ) {
+ t = translated.find( zeroKey((*u).sourceText()) );
+ if ( t != translated.end() && !t.key().isEmpty() &&
+ qstrcmp((*t).sourceText(), (*u).sourceText()) != 0 ) {
+ MetaTranslatorMessage m( *u );
+ m.setTranslation(translationAttempt((*t).translation(), (*t).sourceText(),
+ (*u).sourceText()));
+ tor->insert( m );
+ inserted++;
+ }
+ }
+ if ( verbose && inserted != 0 )
+ fprintf( stderr, " number heuristic provided %d translation%s\n",
+ inserted, inserted == 1 ? "" : "s" );
+}
diff --git a/tools/linguist/lupdate/sametexth.cpp b/tools/linguist/lupdate/sametexth.cpp
new file mode 100644
index 0000000..8059f1c
--- /dev/null
+++ b/tools/linguist/lupdate/sametexth.cpp
@@ -0,0 +1,97 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <metatranslator.h>
+
+#include <qcstring.h>
+#include <qmap.h>
+
+typedef QMap<QCString, MetaTranslatorMessage> TMM;
+typedef QValueList<MetaTranslatorMessage> TML;
+
+/*
+ Augments a MetaTranslator with trivially derived translations.
+
+ For example, if "Enabled:" is consistendly translated as "Eingeschaltet:" no
+ matter the context or the comment, "Eingeschaltet:" is added as the
+ translation of any untranslated "Enabled:" text and is marked Unfinished.
+*/
+
+void applySameTextHeuristic( MetaTranslator *tor, bool verbose )
+{
+ TMM translated;
+ TMM avoid;
+ TMM::Iterator t;
+ TML untranslated;
+ TML::Iterator u;
+ TML all = tor->messages();
+ TML::Iterator it;
+ int inserted = 0;
+
+ for ( it = all.begin(); it != all.end(); ++it ) {
+ if ( (*it).type() == MetaTranslatorMessage::Unfinished ) {
+ if ( (*it).translation().isEmpty() )
+ untranslated.append( *it );
+ } else {
+ QCString key = (*it).sourceText();
+ t = translated.find( key );
+ if ( t != translated.end() ) {
+ /*
+ The same source text is translated at least two
+ different ways. Do nothing then.
+ */
+ if ( (*t).translation() != (*it).translation() ) {
+ translated.remove( key );
+ avoid.insert( key, *it );
+ }
+ } else if ( !avoid.contains(key) &&
+ !(*it).translation().isEmpty() ) {
+ translated.insert( key, *it );
+ }
+ }
+ }
+
+ for ( u = untranslated.begin(); u != untranslated.end(); ++u ) {
+ QCString key = (*u).sourceText();
+ t = translated.find( key );
+ if ( t != translated.end() ) {
+ MetaTranslatorMessage m( *u );
+ m.setTranslation( (*t).translation() );
+ tor->insert( m );
+ inserted++;
+ }
+ }
+ if ( verbose && inserted != 0 )
+ fprintf( stderr, " same-text heuristic provided %d translation%s\n",
+ inserted, inserted == 1 ? "" : "s" );
+}
diff --git a/tools/linguist/phrasebooks/danish.qph b/tools/linguist/phrasebooks/danish.qph
new file mode 100644
index 0000000..c4926bd
--- /dev/null
+++ b/tools/linguist/phrasebooks/danish.qph
@@ -0,0 +1,1018 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Om</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>hurtigtast</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>brugervenlighed</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>genvejshåndtag</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>aktiv</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>markeringsafslutning</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>aktivt objekt</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>aktivt vindue</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>værktøjselement</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Altid øverst</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>forankringspunkt</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Anvend</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>tekstboks med automatisk udgang</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>automatisk gentagelse</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>automatisk kæde</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>automatisk rulning</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>automatisk rulning</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Tilbage</target>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Gennemse</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Annuller</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>undermenu</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>afkrydsningsfelt</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>afkrydsning</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>underordnet vindue</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>vælge</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>klikke</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Udklipsholder</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Luk</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>lukknap</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>skjule</target>
+ <definition>outline/disposition</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>kolonneoverskrift</target>
+ <definition>control/kontrolelement</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>kombinationsboks</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>kommandoknap</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>objektbeholder</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>kontekstafhængig hjælp</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>kontekstafhængig</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>kontrolelement</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Kopier</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Kopier hertil</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Opret genvej</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Opret genvej her</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Klip</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>standard</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>standardknap</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Slet</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>skrivebord</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>destination</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>dialogboks</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>handicap</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>usammenhængende markering</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>forankre</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>dokument</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>dobbeltklikke</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>trække</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>trække og slippe</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>kombinationsboks med rullepil</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>rulleliste</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>rullemenu</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Rediger</target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>Menuen Rediger</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>ellipse</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>integreret objekt</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Afslut</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>udvide</target>
+ <definition>an outline/en disposition</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Stifinder</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>udvidet markering</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>liste</target>
+ <definition>der tillader udvidet markering</definition>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>fil</target>
+</phrase>
+<phrase>
+ <source>File menu</source>
+ <target>Menuen Filer</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Søg</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Find næste</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Søg efter</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>mappe</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>skrifttype</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>skriftstørrelse</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>typografi</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>funktionstast</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>gruppeboks</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>håndtag</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Hjælp</target>
+</phrase>
+<phrase>
+ <source>Help menu</source>
+ <target>Menuen Hjælp</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Skjul</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>hierarkisk markering</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>holde nede</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>aktivt punkt</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>aktiv zone</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>ikon</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>ikke-aktiv</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>ikke-aktivt vindue</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>inputfokus</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>Menuen Indsæt</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Indsæt objekt</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>indsætningspunkt</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>kursiv</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>etiket</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>liggende</target>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>sammenkæde</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>kæde</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Indsæt kæde her</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>liste</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>listevisningsboks</target>
+ <definition>control/kontrolelement</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>manuel kæde</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Maksimer</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>maksimeringsknap</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>menu</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>menulinje</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>menuknap</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>menupunkt</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>menutitel</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>meddelelsesboks</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Minimer</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>minimeringsknap</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>blandet værdi</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>modal</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>tilstand</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>ikke-modal</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>ændringstast</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>mus</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Flyt</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Flyt hertil</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>multiple document interface</target>
+ <definition>MDI</definition>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>liste</target>
+ <definition>der tillader flere markeringer</definition>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Denne computer</target>
+ <definition>icon/ikon</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Andre computere</target>
+ <definition>icon/ikon</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Ny</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Næste</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>objekt</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>OLE-træk og slip</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>integreret OLE-objekt</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>sammenkædet OLE-objekt</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>interaktiv OLE-træk og slip</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Åbn</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Åbn med</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>alternativknap</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>aktiveret indstilling</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>objektpakke</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Sideopsætning</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>paletvindue</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>rude</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>overordnet vindue</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>adgangskode</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Sæt ind</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Indsæt kæde</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Indsæt genvej</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Indsæt speciel</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>sti</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Pause</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Afspil</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>punkt</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>pege</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>markør</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>pop-up-menu</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>pop-up-vindue</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>stående</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>trykke på</target>
+ <definition>and hold a mouse button/og holde en museknap nede</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>trykke på</target>
+ <definition>a key/en tast</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>primært destinationsobjekt</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>primært vindue</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Udskriv</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>printer</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>statusindikator</target>
+ <definition>control/kontrolelement</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>projekt</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Egenskaber</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>egenskabsfremviser</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>egenskabsside</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>egenskabsark</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>kontrolelement på egenskabsark</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Hurtig visning</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>skrivebeskyttet</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Papirkurv</target>
+ <definition>Icon/ikon</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Annuller Fortryd</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>områdemarkering</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>registreringsdatabase</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Gentag</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Erstat</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Gendan</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>gendannelsesknap</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Fortsæt</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Forsøg igen</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>tekstboks til formateret tekst</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Kør</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Gem</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Gem som</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>rulle</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>rullepil</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>rullepanel</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>rulleboks</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>sekundært vindue</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>markere</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>vælge</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Marker alt</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>det markerede</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>markeringshåndtag</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Overfør til</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>separator</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Indstillinger</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Indstillinger</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Installation</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>genvej</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>genvejsknap</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>genvejsikon</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>genvejstast</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>kontrolelement til genvejstast</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Vis</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Luk computeren</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>liste</target>
+ <definition>der kun tillader en enkelt markering</definition>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Tilpas størrelse</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>størrelseshåndtag</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>skala</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>rotationsboks</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Opdel</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>delelinje</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>deleboks</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>startknap</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>Startmappe</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>statuslinje</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Stop</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>fane</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>proceslinje</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>opgaveafhængig Hjælp</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>skabelon</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>tekstboks</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>titellinje</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>titeltekst</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>til/fra-tast</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>verktøjslinje</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>verktøjstip</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>træstruktur</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>skrive</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>type</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>ikke tilgængelig</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Fortryd</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Fjern installationen</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>Menuen Vis</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>lokal redigering</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>grafikpalet</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Hvad er det?</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>Menuen Vindue</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>vindue</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Windows Stifinder</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>guide</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>projektmappe</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>arbejdsgruppe</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>arbejdsområde</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Ja</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/dutch.qph b/tools/linguist/phrasebooks/dutch.qph
new file mode 100644
index 0000000..0e9b5d6
--- /dev/null
+++ b/tools/linguist/phrasebooks/dutch.qph
@@ -0,0 +1,1044 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Info</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>toegangstoets</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>toegankelijkheid</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>bewerkingsgreep</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>actief</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>selecie-einde</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>actief object</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>actief venster</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>grafisch hulpmiddel</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Altijd op voorgrond</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>fixeerpunt</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Toepassen</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>automatisch verlaten</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>zich automatisch herhalen</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>automatisch herhalen</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>automatische koppeling</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>automatisch schuiven</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>automatisch schuiven</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Vorige</target>
+ <definition>wanneer het een logisch paar vormt met Volgende</definition>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Bladeren</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Annuleren</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>vervolgmenu</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>selectievakje</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>vinkje</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>subvenster</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>kiezen</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>klikken</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Klembord</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Sluiten</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>knop Sluiten</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>samenvouwen</target>
+ <definition>outline</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>kolomnaam</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>keuzelijst met invoervak</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>opdrachtknop</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>hoofdobject</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>contextafhankelijke Help</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>contextafhankelijk</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>besturingselement</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Kopiëren</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Hierheen kopiëren</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Snelkoppeling maken</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Hier snelkoppeling maken</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Knippen</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>standaard</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>standaardknop</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Verwijderen</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>bureaublad</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>doel</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>dialoogvenster</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>handicap</target>
+ <definition>voorzichtig in context, maar handicap niet verbloemen:VB: persoon met een handicap (beter dan gehandicapte)</definition>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>niet-aaneengesloten selectie</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>in werkbalkdok plaatsen</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>document</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>dubbelklikken</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>slepen</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>slepen en neerzetten</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>vervolgkeuzelijst met invoervak</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>vervolgkeuzelijst</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>menu</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Bewerken</target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>menu Bewerken</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>puntjes</target>
+ <definition>(...)</definition>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>ingesloten object</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Afsluiten</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>uitvouwen</target>
+ <definition>an outline</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Verkennen</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>uitgebreide selectie</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>keuzelijst met uitgebreide selectie</target>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>bestand</target>
+</phrase>
+<phrase>
+ <source>File menu</source>
+ <target>menu Bestand</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Zoeken</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Volgende zoeken</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Zoeken naar</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>map</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>lettertype</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>tekengrootte</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>tekenstijl</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>functietoets</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>groepsvak</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>greep</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Help</target>
+</phrase>
+<phrase>
+ <source>Help menu</source>
+ <target>menu Help</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Verbergen</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>hiërarchische selectie</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>ingedrukt houden</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>selectiepunt</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>selectiegebied</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>pictogram</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>niet-actief</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>niet-actief venster</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>invoerfocus</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>menu Invoegen</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Object Invoegen</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>invoegpositie</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>cursief</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>label</target>
+ <definition>gender, Masc.: de</definition>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>liggend</target>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>koppeling</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>koppelen</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Hier koppeling maken</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>keuzelijst</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>weergaveknoppen</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>handmatige koppeling</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Maximaliseren</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>knop Maximaliseren</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>menu</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>menubalk</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>menuknop</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>opdracht</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>menunaam</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>berichtvak</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Minimaliseren</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>knop Minimaliseren</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>met gemengde waarden</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>modusgebonden</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>modi</target>
+ <definition>plural</definition>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>modus</target>
+ <definition>singular</definition>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>niet-modusgebonden</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>modificatietoets</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>muis</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Verplaatsen</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Hierheen verplaatsen</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>interface voor meerdere documenten</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>keuzelijst met meervoudige selectie</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Deze computer</target>
+ <definition>icon/pictogram</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Netwerkomgeving</target>
+ <definition>icon/pictogram</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Nieuw</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Volgende</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>object</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+ <definition>OLE (objecten koppelen en insluiten): voluit alleen in doc en Help</definition>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>slepen en neerzetten</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>slepen en neerzetten via OLE</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>ingesloten OLE-object</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>gekoppeld OLE-object</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>Aangepast slepen en neerzetten</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>Aangepast slepen en neerzetten via OLE</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Openen</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Openen met</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>keuzerondje</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>opties</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>OLE-pakket</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Pagina-instelling</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>paletvenster</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>deelvenster</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>hoofdvenster</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>wachtwoord</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Plakken</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Koppeling plakken</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Snelkoppeling plakken</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Plakken speciaal</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>pad</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Pauze</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Afspelen</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug en Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>aanwijzen</target>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>aanwijzer</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>pop-up-menu</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>pop-up-venster</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>staand</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>drukken op</target>
+ <definition>a key/een toets</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>ingedrukt houden</target>
+ <definition>and hold a mouse button/een muisknop</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>een muisknop ingedrukt houden</target>
+ <definition>and hold a mouse button</definition>
+</phrase>
+<phrase>
+ <source>press a mouse botton</source>
+ <target>een muisknop indrukken </target>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>primair hoofdobject</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>primair venster</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Afdrukken</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>printer</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>voortgangsindicator</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>project</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Eigenschappen</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>eigenschappenweergave</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>eigenschappenpagina</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>eigenschappenblad</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>besturingselement op een eigenschappenblad</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Snel weergeven</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>alleen-lezen</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Prullenbak</target>
+ <definition>Icon/pictogram</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Opnieuw</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>gebiedsselectie</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>het Register</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Herhalen</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Vervangen</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Vorig formaat</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>knop Vorig formaat</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Doorgaan</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Nogmaals</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>RTF-vak</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Uitvoeren</target>
+ <definition>Maar: macro starten</definition>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Opslaan</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Opslaan als</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>schuiven door</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>schuifpijl</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>schuifbalk</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>schuifblok</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>secundair venster</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>selecteren</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Alles selecteren</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>selectie</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>selectiegreep</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Kopiëren naar</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>scheidingsteken</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Instellingen</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Instellen</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Setup</target>
+ <definition>als het programma Setup wordt bedoeld</definition>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>snelkoppeling</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>snelkoppelingsknop</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>snelkoppelingspictogram</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>sneltoets</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>sneltoetsvak</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Weergeven</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Afsluiten</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>keuzelijst met enkelvoudige selectie</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Formaat wijzigen</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>formaatgreep</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>schuifregelaar</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>kringveld</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Splitsen</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>splitsbalk</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>splitsblokje</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>knop Start</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>map Opstarten</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>statusbalk</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Stoppen</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>tab</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>taakbalk</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>taakgeoriënteerde Help</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>sjabloon</target>
+ <definition>de</definition>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>tekstvak</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>titelbalk</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>venstertitel</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>wisseltoets</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>werkbalk</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>knopinfo</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>besturingselement voor structuurweergave</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>structuurweergave</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>typen</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>type</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>niet beschikbaar</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Ongedaan maken</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Installatie ongedaan maken</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>menu Beeld</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>direct bewerken</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>keuzelijst met grafische opties</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Wat is dit?</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>menu Venster</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>venster</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Windows Verkenner</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>wizard</target>
+ <definition>geen hoofdletter meer in lopende tekst</definition>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>werkmap</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>werkgroep</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>werkruimte</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Ja</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/finnish.qph b/tools/linguist/phrasebooks/finnish.qph
new file mode 100644
index 0000000..0612c82
--- /dev/null
+++ b/tools/linguist/phrasebooks/finnish.qph
@@ -0,0 +1,1033 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Tietoja</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>valintanäppäin</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>helppokäyttötoiminto</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>toimintokahva</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>aktiivinen</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>valinnan aktiivinen päätöskohta</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>aktiivinen objekti</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>aktiivinen ikkuna</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>graafinen lisäke</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Aina päällimmäisenä</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>ankkurikohta</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Käytä</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>automaattinen siirtyminen</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>automaattinen toisto</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>automaattinen linkki</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>automaattinen vieritys</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>automaattinen vieritys</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Takaisin</target>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Selaa</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Peruuta</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>alivalikko</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>valintaruutu</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>valintamerkki</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>ali-ikkuna</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>valita</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>napsautta</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Leikepöytä</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Sulje</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>sulkemispainike</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>tiivistää</target>
+ <definition>outline/jäsennys</definition>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>kutistaa</target>
+ <definition>outline/jäsennys</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>saraketunnus</target>
+ <definition>control/ohjausobjekti</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>sarakeotsikko</target>
+ <definition>control/ohjausobjekti</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>yhdistelmäruutu</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>painike</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>komento painike</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>säilö</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>tilannekohtainen ohje</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>tilannekohtainen</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>ohjausobjekti</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Kopioi</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Kopioi tähän</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Luo pikakuvake</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Luo pikakuvake tähän</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Leikkaa</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>oletus</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>oletuspainike</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Poista</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>työpöytä</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>kohde</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>valintaikkuna</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>invaliditeetti</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>hajavalinta</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>telakoida</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>tiedosto</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>asiakirja</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>kaksoisnapsauttaa</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>vetää</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>vetää ja pudottaa</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>avattava yhdistelmäruutu</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>avattava luetteloruutu</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>avattava valikko</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Muokkaa</target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>Muokkaa-valikko</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>kolme pistettä</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>upotettu objekti</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Lopeta</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>laajentaa</target>
+ <definition>an outline/jäsennys</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Selaa</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>laajennettu valinta</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>laajennettu valinta-luetteloruutu</target>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>tiedosto</target>
+</phrase>
+<phrase>
+ <source>File menu</source>
+ <target>Tiedosto-valikko</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Etsi</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Etsi seuraava</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Etsittävä</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>kansio</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>fontti</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>fonttikoko</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>fonttityyli</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>funktionäppäin</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>ryhmän kehys</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>kahva</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Ohje</target>
+</phrase>
+<phrase>
+ <source>Help menu</source>
+ <target>Ohje-valikko</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Piilota</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>hierarkkinen valinta</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>pitää painettuna</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>kohdepiste</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>kohdealue</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>kuvake</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>passiivinen</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>passiivinen ikkuna</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>syöttöalue</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>Lisää-valikko</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Lisää objekti</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>lisäyskohta</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>kursivoitu</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>otsikko</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>nimi</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>vaaka</target>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>linkki</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>linkittää</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Linkitä tähän</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>luetteloruutu</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>luettelonäyttö</target>
+ <definition>control/ohjausobjekti</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>manuaalinen linkki</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Suurenna</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>suurennuspainike</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>valikko</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>valikkorivi</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>valikkopainike</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>valikon vaihtoehto</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>valikon otsikko</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>sanomaruutu</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Pienennä</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>pienennyspainike</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>monitila</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>modaalinen</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>tila</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>ei-modaalinen</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>yhdistelmänäppäin</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>hiiri</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Siirrä</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Siirrä tähän</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>MDI-liittymä</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>monivalintainen luetteloruutu</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Oma tietokone</target>
+ <definition>icon/kuvake</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Verkkoympäristö</target>
+ <definition>icon/kuvake</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Uusi</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Seuraava</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>objekti</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>vedä ja pudota-OLE-toiminto</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>upotettu OLE-objekti</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>linkitetty OLE-objekti</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>käyttäjän määrittämä vedä ja pudota-OLE-toiminto</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Avaa</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Avaa sovelluksessa</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>valintanappi</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>valitsimen tila</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>pakkaus</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Sivun asetukset</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>valikoimaikkuna</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>ruutu</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>ylemmän tason ikkuna</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>salasana</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Liitä</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Liitä linkki</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Liitä pikakuvake</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Liitä määräten</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>polku</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Tauko</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Soita</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>piste</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>osoittaa</target>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>osoitin</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>pikavalikko</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>ponnahdusikkuna</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>pysty</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>painaa</target>
+ <definition>and hold a mouse button/ja pitää painettuna hiiripainiketta</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>painaa</target>
+ <definition>a key/näppäintä</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>ensisijainen säilö</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>ensisijainen ikkuna</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Tulosta</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>kirjoitin</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>tilanneilmaisin</target>
+ <definition>control/ohjausobjekti</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>projekti</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Ominaisuudet</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>ominaisuuksien tarkastelu</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>ominaisuusryhmä</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>ominaisuusikkuna</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>ominaisuusikkuna-ohjausobjekti</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Pikanäyttö</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>vain luku</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Roskakori</target>
+ <definition>Icon/kuvake</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Tee uudelleen</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>aluevalinta</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>rekisteri</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Toista</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Korvaa</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Palauta</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>palautuspainike</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Jatka</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Yritä uudelleen</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>monimuotoruutu</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Suorita</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Tallenna</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Tallenna nimellä</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>vierittää</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>vieritysnuoli</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>vierityspalkki</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>vieritysruutu</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>toissijainen ikkuna</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>valita</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Valitse kaikki</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>valinta</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>valintakahva</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Lähetä tiedosto</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>erotin</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Asetukset</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Asennus</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>pika-</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>pikapainike</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>pikakuvake</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>pikanäppäin</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>pikanäppäin-ohjausobjekti</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Näytä</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Sammuta</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>yksivalintainen luetteloruutu</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Muuta kokoa</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>koonmuuttokahva</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>liukusäädin</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>askellusruutu</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Jaa</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>jakopalkki</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>jakoruutu</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>Käynnistä-painike</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>Käynnistys-kansio</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>tilarivi</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Pysäytä</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>välilehti</target>
+ <definition>ohjausobjekti</definition>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>tehtäväpalkki</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>tehtäväohje</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>malli</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>muokkausruutu</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>otsikkorivi</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>otsikkoteksti</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>tilanvaihtonäppäin</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>työkalurivi</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>työkaluvihje</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>puunäyttö</target>
+ <definition>ohjausobjekti</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>tyyppi</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>laji</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>kirjoittaa</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>ei käytettävissä</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Kumoa</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Pura asennus</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>Näytä-valikko</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>visuaalinen muokkaus</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>graafisen valinnan ohjausobjekti</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Lisätietoja</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>Ikkuna-valikko</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>ikkuna</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Resurssienhallinta</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>ohjattu toiminto</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>työkirja</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>työryhmä</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>työtila</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Kyllä</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/french.qph b/tools/linguist/phrasebooks/french.qph
new file mode 100644
index 0000000..569f7ba
--- /dev/null
+++ b/tools/linguist/phrasebooks/french.qph
@@ -0,0 +1,1104 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>A propos</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>touche d&apos;accès rapide</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>accessibilité</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>handle d&apos;action</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>actif</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>active</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>point de fin de sélecion</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>objet actif</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>fenêtre activ</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>barre</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Toujours visible</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>point de début de sélection</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Appliquer</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>sortie automatique</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>répétition automatique</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>Liaison automatique</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>défilement automatique</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>défilement automatique</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Précédent</target>
+</phrase>
+<phrase>
+ <source>barrel button</source>
+ <target>Bouton du stylet</target>
+</phrase>
+<phrase>
+ <source>barrel-tap</source>
+ <target>toucher-maintenir enfoncé</target>
+</phrase>
+<phrase>
+ <source>boxed edit</source>
+ <target>édition contrôlée</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Parcourir</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Annuler</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>menu en cascade</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>case à cocher</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>coche</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>fenêtre enfant</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>choisir</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>cliquer sur</target>
+ <definition>verb, à l&apos;écran</definition>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>clic</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>cliquer le</target>
+ <definition>verb, bouton souris</definition>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Presse-papiers</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Fermer</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Fermeture</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>Fermer</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>réduire</target>
+ <definition>outline</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>en-tête de colonne</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>zone de liste modifiable</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>bouton de commande</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>conteneur</target>
+ <definition>d&apos;objets</definition>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>aide contextuelle</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>contextuelle</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>contextuel</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>contrôle</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Copier</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Copier ici</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Copier un raccourci</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Copier un raccourci ice</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Couper</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>par défaut</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>bouton par défaut</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Supprimer</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>bureau</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>destination</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>boîte de dialogue</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>incapacité</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>sélection d&apos;objets disjoints</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>aligner</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>document</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>cliquer deux fois</target>
+</phrase>
+<phrase>
+ <source>double-tap</source>
+ <target>toucher deux fois</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>faire glisser</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>glisser-déplacer</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>zone de liste déroulante modifiable</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>zone de liste déroulante fixe</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>menu déroulant</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Edition</target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>modifier</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>points de suspension</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>objet incorporé</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Quitter</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>développer</target>
+ <definition>an outline</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Explorer</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>sélection étendue</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>zone de liste à sélection étendue</target>
+</phrase>
+<phrase>
+ <source>File</source>
+ <target>Fichier</target>
+ <definition>menu</definition>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>fichier</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Rechercher</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Suivant</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Rechercher</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>dossier</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>police</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>taille de police</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>style de police</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>touche de fonction</target>
+</phrase>
+<phrase>
+ <source>gesture</source>
+ <target>signe</target>
+</phrase>
+<phrase>
+ <source>glyph</source>
+ <target>glyphe</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>zone de groupe</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>handle</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>?</target>
+ <definition>menu</definition>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Aide</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Masquer</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>sélection hiérarchique</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>maintenir</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>point d&apos;impact</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>zone critique</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>icône</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>inactive</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>inactif</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>fenêtre inactive</target>
+</phrase>
+<phrase>
+ <source>ink</source>
+ <target>dessin à main levée</target>
+</phrase>
+<phrase>
+ <source>ink edit</source>
+ <target>éditeur de dissin à main levée</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>zone d&apos;interaction</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>Insertion</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Insérer un objet</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>point d&apos;insertion</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>italique</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>nom de volume</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>étiquette</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>paysage</target>
+</phrase>
+<phrase>
+ <source>lasso-tap</source>
+ <target>toucher lasso</target>
+</phrase>
+<phrase>
+ <source>lens</source>
+ <target>loupe</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>lier</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>liaison</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Lier ici</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>zone de liste</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>presentación de iconos </target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>Liste icônes</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>liaison manuelle</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Agrandissement</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>agrandir</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>menu</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>barre de menus</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>bouton de menus</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>élément de menu</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>titre de menu</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>boîte de message</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Réduction</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>réduire</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>valeurs multiples</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>modal</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>mode</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>non modal</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>touche de modification</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>souris</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Déplacement</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Transférer ici</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>Interface documents multiples</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>zone de liste à sélection multiple</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Poste de travail</target>
+ <definition>icon</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Voisinage réseau</target>
+ <definition>icon</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Nouveau</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Suivant</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>objet</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>glisser-déplacer OLE</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>Objet OLE incorporé</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>Objet OLE lié</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>glisser-déplacer OLE non standard</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Ouvrir</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Ouvrir avec</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>case d&apos;option</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>état des caractéristiques</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>ensemble</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Mise en page</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>palette</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>volet</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>fenêtre parent</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>mot de passe</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Coller</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Coller avec liaison</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Coller le raccourci</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Collage spécial</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>chemin</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Pause</target>
+</phrase>
+<phrase>
+ <source>pen</source>
+ <target>stylet</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Exécuter</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>point</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>amener le pointeur sur</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>pointeur</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>menu autonome</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>fenêtre autonome</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>portrait</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>appuyer</target>
+ <definition>and hold a mouse button/et maintenir enfoncé</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>appuyer</target>
+ <definition>a key/sur une touche</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>contenuer principale</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>fenêtre principale</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Imprimer</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>imprimante</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>indicateur d&apos;état</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>projet</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Propriétés</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>inspecteur de propriétés</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>page de propriétés</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>feuille de propriétés</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>feuille de propriétés</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Aperçu</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>en lecture seule</target>
+</phrase>
+<phrase>
+ <source>recognition</source>
+ <target>reconnaissance</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Corbeille</target>
+ <definition>Icon</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Annuler Annuler</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>sélection par zone</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>base des registres</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Répéter</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Remplacer</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Restauration</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>Restaurer</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Reprendre</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Essayer de nouveau</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>zone de texte RTF</target>
+ <definition>Rich Text Format</definition>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Exécuter</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Enregistrer</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Enregistrer sous</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>faire défiler</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>flèche de défilement</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>barre de défilement</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>curseur de défilement</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>fenêtre secondaire</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>sélectionner</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Tout sélectionner</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>sélection</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>handle de sélection</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Envoyer vers</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>séparateur</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Paramètres</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Installation</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>INSTALL</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>raccourci</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>raccourci</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>raccourci</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>touche de raccourci</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>touche de raccourci</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Afficher</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Arrêter l&apos;ordinateur</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>zone de liste à sélection unique</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Dimension</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>poignée de redimensionnement</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>défileur</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>compteur</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Fractionner</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>barre de fractionnement</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>curseur de fractionnement</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>Démarrer</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>dossier de démarrage</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>barre d&apos;état</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Arrêter</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>onglet</target>
+</phrase>
+<phrase>
+ <source>tap</source>
+ <target>toucher</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>barre des tâches</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>aide spécifique aux tâches</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>modèle</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>zone de texte</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>barre de titre</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>texte de la barre de titre</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>touche bascule</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>barre d&apos;outils</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>info-bulle</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>arborescencel</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>type</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>taper</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>pas disponible</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Annuler</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Désinstaller</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>Affichage</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>activation sur place</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>sélection graphique</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Qu&apos;est-ce que c&apos;est?</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>Fenêtre</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>fenêtre</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Explorateur Windows</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>assistant</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>classeur</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>groupe de travail</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>espace de travail</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Oui</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/german.qph b/tools/linguist/phrasebooks/german.qph
new file mode 100644
index 0000000..9149942
--- /dev/null
+++ b/tools/linguist/phrasebooks/german.qph
@@ -0,0 +1,1075 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Info</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>Zugriffstaste</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>Eingabehilfe</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>Aktionspunkt</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>Aktiv</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>Aktives Ende</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>Aktives Objekt</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>Aktives Fenster</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>Zubehör</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Immer im Vordergrund</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>Ankerpunkt</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Zuweisen</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>Textfeld mit automatischer Freigabe</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>Automatische Wiederholung</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>Automatische OLE-Verknüpfung</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>Automatischer Bildlauf</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>Automatischer Bildlauf</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Zurück</target>
+</phrase>
+<phrase>
+ <source>barrel button</source>
+ <target>Pen-Knopf</target>
+ <definition>pen</definition>
+</phrase>
+<phrase>
+ <source>barrel-tap</source>
+ <target>Tippen mit Pen-Knopf</target>
+</phrase>
+<phrase>
+ <source>boxed edit</source>
+ <target>Texteditor</target>
+ <definition>control/Steuerelement</definition>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Durchsuchen</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Abbrechen</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>Überlappendes Menü</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>Kontrollkästchen</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>Markierung</target>
+ <definition>Kontrollkästchen</definition>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>Untergeordnetes Fenster</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>Wählen</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>Klicken</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Zwischenablage</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Schließen</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>Schließen</target>
+ <definition>Schaltfläche</definition>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>Ausblenden</target>
+ <definition>outline/Gliederung</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>Spaltenüberschrift</target>
+ <definition>control/Steuerelement</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>Kombinationsfeld</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>Schaltfläche</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>Container</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>Kontextbezogene Hilfe</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>Kontextbezogen</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>Steuerelement</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Kopieren</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Hierher kopieren</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Verknüpfung erstellen</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Hiermit verknüpfen</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Ausschneiden</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>Standard</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>Standardschaltfläche</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Löschen</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>Desktop</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>Ziel</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>Dialogfeld</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>Behinderung</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>Nichtzusammenhängende Auswahl</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>Verankern</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>Dokument</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>Doppelklicken</target>
+</phrase>
+<phrase>
+ <source>double-tap</source>
+ <target>Doppeltippen</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>Ziehen</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>Drag &amp; Drop</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>Dropdown-Kombinationsfeld</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>Dropdown-Listenfeld</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>Dropdown-Menü</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Bearbeiten</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Bearbeiten</target>
+ <definition>menu/Menü</definition>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>Auslassungspunkte</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>Eingebettetes</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Beenden</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>Einblenden</target>
+ <definition>an outline/einer Struktur</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Explorer</target>
+ <definition>Befehl</definition>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>Erweiterte Auswahl</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>Listenfeld für erweiterte Auswahl</target>
+</phrase>
+<phrase>
+ <source>File</source>
+ <target>Datei</target>
+ <definition>menu</definition>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>Datei</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Suchen</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Weitersuchen</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Suchen nach</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>Ordner</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>Schriftart</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>Schriftgrad</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>Schriftschnitt</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>Funktionstaste</target>
+</phrase>
+<phrase>
+ <source>gesture</source>
+ <target>Schriftzug</target>
+</phrase>
+<phrase>
+ <source>glyph</source>
+ <target>Zeichen</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>Gruppenfeld</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>Ziehpunkt</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>?</target>
+ <definition>menu</definition>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Hilfe</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Ausblenden</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>Hierarchische Auswahl</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>Halten</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>Hot Spot</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>Hot Zone</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>Symbol</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>Inaktiv</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>Inaktives Fenster</target>
+</phrase>
+<phrase>
+ <source>ink</source>
+ <target>Ink</target>
+</phrase>
+<phrase>
+ <source>ink edit</source>
+ <target>Inkeditor</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>Eingabefokus</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>Einfügen</target>
+ <definition>Menü</definition>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Objekt einfügen</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>Einfügemarke</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>Kursiv</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>Bezeichnung</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>Querformat</target>
+</phrase>
+<phrase>
+ <source>lasso-tap</source>
+ <target>Lasso-tippen</target>
+</phrase>
+<phrase>
+ <source>lens</source>
+ <target>Lupe</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>Verknüpfung</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>Verknüpfen</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Hiermit verknüpfen</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>Listenfeld</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>Listenansicht</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>Manuelle OLE-Verknüpfung</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Maximieren</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>Maximieren</target>
+ <definition>Schaltfläche</definition>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>Menü</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>Menüleiste</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>Menü</target>
+ <definition>Schaltfläche</definition>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>Menüelement</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>Menütitel</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>Meldungsfeld</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Minimieren</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>Minimieren</target>
+ <definition>Schaltfläche</definition>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>Gemischt</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>Modal</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>Modus</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>Interaktiv</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>Zusatztaste</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>Maus</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Verschieben</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Hierher verschieben</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>MDI</target>
+ <definition>Multiple Document Interface</definition>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>Listenfeld für Mehrfachauswahl</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Arbeitsplatz</target>
+ <definition>icon/Symbol</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Netzwerk</target>
+ <definition>icon/Symbol</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Neu</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Weiter</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>Objekt</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>OLE-Drag &amp; Drop</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>Eingebettetes OLE-Objekt</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>Verknüpftes OLE-Objekt</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>Vom Standard abweichendes OLE-Drag &amp; Drop</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>Aangepast slepen en neerzetten via OLE</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Öffnen</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Öffnen mit</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>Optionsfeld</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>Aktivierte Option</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>Paket</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Seite einrichten</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>Palettenfenster</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>Fensterbereich</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>Übergeordnetes Fenster</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>Kennwort</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Einfügen</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Verknüpfung einfügen</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Verknüpfung einfügen</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Inhalte einfügen</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>Pfad</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Anhalten</target>
+</phrase>
+<phrase>
+ <source>pen</source>
+ <target>Pen</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Wiedergeben</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug &amp; Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>Zeigen</target>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>Zeiger</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>Kontextmenü</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>Popup-Fenster</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>Hochformat</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>Drücken</target>
+ <definition>and hold a mouse button/und Halten einer Maustaste</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>Drücken</target>
+ <definition>a key/einer Taste</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>Primär-Container</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>Primärfenster</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Drucken</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>Drucker</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>Statusanzeige</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>Projekt</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Eigenschaften</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>Eigenschaftenanzeige</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>Eigenschaftengruppe</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>Eigenschaftenfenster</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>Eigenschaftenfenster-Steuerelement</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Schnellansicht</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>Schreibgeschützt</target>
+</phrase>
+<phrase>
+ <source>recognition</source>
+ <target>Schrifterkennung</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Papierkorb</target>
+ <definition>Icon/Symbol</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Wiederherstellen</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>Bereichsauswahl</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>Registrierung</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Wiederholen</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Ersetzen</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Wiederherstellen</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>Wiederherstellen </target>
+ <definition>Schaltfläche</definition>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Fortsetzen</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Wiederholen</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>RTF-Textfeld</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Ausführen</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Speichern</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Speichern unter</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>Bildlauf durchführen</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>Bildlaufpfeil</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>Bildlaufleiste</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>Bildlauffeld</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>Sekundärfenster</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>Auswählen</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Alle markieren</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>Auswahl</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>Auswahlpunkt</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Senden an</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>Trennelement</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Einstellungen</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Einrichten</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>Verknüpfung</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>Verknüpfte Schaltfläche</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>Verknüpfungssymbol</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>Tastenkombination</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>Steuerelement für Tastenbelegung</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Anzeigen</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Beenden</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>Listenfeld für Einfachauswahl</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Größe ändern</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>Element für Größenänderung</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>Schieber</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>Drehfeld</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Teilen</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>Fensterteiler</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>Teilungsfeld</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>Start</target>
+ <definition>Schaltfläche</definition>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>Autostart</target>
+ <definition>Ordner</definition>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>Statusleiste</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Beenden</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>Register</target>
+</phrase>
+<phrase>
+ <source>tap</source>
+ <target>Tippen</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>Task-Leiste</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>Vorgangsbezogene Hilfe</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>Vorlage</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>Textfeld</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>Titelleiste</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>Titeltext</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>Ein-/Aus-Taste</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>Symbolleiste</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>QuickInfo</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>Strukturansicht</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>Eingeben</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>Typ</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>Nicht verfügbar</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Rückgängig</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Deinstallieren</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>Ansicht</target>
+ <definition>Menü</definition>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>Direkte Bearbeitung</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>Steuerelement zur Grafikanzeige</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Direkthilfe</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>Fenster</target>
+ <definition>Menü</definition>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>Fenster</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Explorer</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>Assistent</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>Arbeitsmappe</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>Arbeitsgruppe</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>Arbeitsbereich</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Ja</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/italian.qph b/tools/linguist/phrasebooks/italian.qph
new file mode 100644
index 0000000..2aa3d7a
--- /dev/null
+++ b/tools/linguist/phrasebooks/italian.qph
@@ -0,0 +1,1105 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Informazioni su</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>tasto di scelta</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>accesso facilitato</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>identificatore dell&apos;azione</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>attivo</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>punto finale</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>oggetto attivo</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>finestra attiva</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>barra</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Sempre in primo piano</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>punto di ancoraggio</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Applica</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>ad uscita automatica</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>a ripetizione automatica</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>collegamento automatico</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>scorrimento automatico</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>scorrimento automatico</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Indietro</target>
+</phrase>
+<phrase>
+ <source>barrel button</source>
+ <target>pulsante della penna</target>
+ <definition>pen</definition>
+</phrase>
+<phrase>
+ <source>barrel-tap</source>
+ <target>tocco con il pulsante premuto</target>
+</phrase>
+<phrase>
+ <source>boxed edit</source>
+ <target>casella di testo a griglia</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Sfoglia</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Annulla</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>menu sovrapposto</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>casella di controllo</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>segno di spunta</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>finestra secondaria</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>scegliere</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>fare clic</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Appunti</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Chiudi</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>pulsante di chiusura</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>comprimere</target>
+ <definition>outline, verb</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>intestazione di colonna</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>casella combinata</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>pulsante di comando</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>contenitore</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>guida sensibile al contesto</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>contestuale</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>controllo</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Copia</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Copia</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Crea collegamento</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Crea collegamento</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Taglia</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>predefinito</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>pulsante predefinito</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Elimina</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>desktop</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>destinazione</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>finestra di dialogo</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>disabilità</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>selezione multipla</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>posizionare</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>documento</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>doppio clic</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>fare doppio clic</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>double-tap</source>
+ <target>toccare due volte in rapida successione</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>double-tap</source>
+ <target>doppio tocco</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>trascinare</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>trascinare e rilasciare</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>caratteristica Trascina selezione</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>casella combinata a discesa</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>casella di riepilogo a discesa</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>menu a discesa</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Modifica </target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>menu Modifica</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>puntini di sospensione</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>oggetto incorporato</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Esci</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>espandere</target>
+ <definition>an outline/una struttura</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Gestione risorse</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>selezione estesa</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>casella di riepilogo a selezione estesa</target>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>file</target>
+</phrase>
+<phrase>
+ <source>File menu</source>
+ <target>menu File</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Trova</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Trova successivo</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Trova</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>cartella</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>tipo di carattere</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>dimensione carattere</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>stile carattere</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>tasto funzione</target>
+</phrase>
+<phrase>
+ <source>gesture</source>
+ <target>segno</target>
+</phrase>
+<phrase>
+ <source>glyph</source>
+ <target>icona</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>casella di gruppo</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>quadratino di ridimensionamento </target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Guida</target>
+</phrase>
+<phrase>
+ <source>Help menu</source>
+ <target>menu ?</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Nascondi</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>selezione gerarchica</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>tenere premuto</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>area sensibile del puntatore</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>area sensibile dell&apos;oggetto</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>icona</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>inattivo</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>finestra inattiva</target>
+</phrase>
+<phrase>
+ <source>ink</source>
+ <target>tratto</target>
+</phrase>
+<phrase>
+ <source>ink edit</source>
+ <target>modifica tratto</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>elemento attivo</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>menu Inserisci</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Inserisci oggetto</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>punto di inserimento</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>corsivo</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>etichetta</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>orizzontale</target>
+</phrase>
+<phrase>
+ <source>lasso-tap</source>
+ <target>selezione circolare</target>
+</phrase>
+<phrase>
+ <source>lens</source>
+ <target>lente</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>collegamento</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>collegare</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Collega</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>casella di riepilogo</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>visualizzazione elementi</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>collegamento manuale</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Ingrandisci</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>pulsante di ingrandimento</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>menu</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>barra dei menu</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>pulsante menu</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>voce di menu</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>titolo di menu</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>finestra di messaggio</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Riduci a icona</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>pulsante di riduzione ad icona</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>valori misti</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>a scelta obbligatoria</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>modalità</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>non a scelta obbligatoria</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>tasto di modifica delle funzioni di tastiera</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>tasto di modifica dell&apos;output di tastiera</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>mouse</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Sposta</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Sposta</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>interfaccia a documenti multipli</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>casella di riepilogo a selezione multipla</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Risorse del computer</target>
+ <definition>icon/icono</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Risorse di rete</target>
+ <definition>icon</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Nuovo</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Avanti</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>oggetto</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>caratteristica Trascina selezione</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>oggetto incorporato OLE</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>oggetto collegato OLE</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>caratteristica Trascina selezione OLE non predefinita</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Apri</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Apri con</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>pulsante di opzione</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>opzione impostata</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>opzione attivata</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>package</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Imposta pagina</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>casella degli tavolozza di colori</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>casella degli strumenti</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>riquadro</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>finestra principale</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>password</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Incolla </target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Incolla collegamento</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Incolla collegamento</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Incolla speciale</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>percorso</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Interrompi</target>
+</phrase>
+<phrase>
+ <source>pen</source>
+ <target>penna</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Riproduci</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>punto</target>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>puntatore</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>menu di scelta rapida</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>finestra popup</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>verticale</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>premere</target>
+ <definition>a key/un tasto</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>premere</target>
+ <definition>and hold a mouse button/e tenere premuto un pulsante del mouse</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>contenitore principale</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>finestra principale</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Stampa</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>stampante</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>indicatore di avanzamento del processo</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>progetto</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Proprietà</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>visualizzatore proprietà</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>scheda proprietà</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>finestra proprietà</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>controllo finestra proprietà</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Anteprima</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>sola lettura</target>
+</phrase>
+<phrase>
+ <source>recognition</source>
+ <target>riconoscimento</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Cestino</target>
+ <definition>Icon</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Ripeti</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>selezione dell&apos;area</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>registro di configurazione</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Ripeti</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Sostituisci</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Ripristina</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>pulsante di ripristino</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Riprendi</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Riprova</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>casello di testo RTF</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Esegui</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Salva</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Salva con nome</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>scorrere</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>freccia di scorrimento</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>barra di scorrimento</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>casella di scorrimento</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>finestra secondaria</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>selezionare</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Seleziona tutto</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>selezione</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>quadratino di selezione</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Invia a</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>separatore</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Impostazioni</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Imposta</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>collegamento</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>pulsante di collegamento</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>icona di collegamento</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>tasto di scelta rapida</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>controllo tasto di scelta rapida</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Mostra</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Chiudi sessione</target>
+ <definition>comando del menu Avvio</definition>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Arresta il sistema</target>
+ <definition>pulsanti e opzioni</definition>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>casella di riepilogo a selezione singola</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Dimensione</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>punto di ridimensionamento</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>dispositivo di scorrimento</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>casella di selezione</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Dividi</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>barra di divisione</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>casella di divisione</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>pulsante Avvio</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>cartella Esecuzione automatica</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>barra di stato</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Ferma</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>controllo a schede</target>
+</phrase>
+<phrase>
+ <source>tap</source>
+ <target>toccare</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>tap</source>
+ <target>tocco</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>barra delle applicazioni</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>guida orientata alle attività</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>modello</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>casella di testo</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>barra del titolo</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>testo della barra del titolo</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>tasto interruttore</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>barra degli strumenti</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>descrizione comando</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>controllo per la visualizzazione ad albero</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>inserire</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>digitare</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>tipo</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>non disponibile</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Annulla</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Rimozione</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>menu Visualizza</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>modifica diretta</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>controllo di selezione grafica</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Guida rapida</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>menu Finestra</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>finestra</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Gestione risorse</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>installazione guidata</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>cartella di lavoro</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>gruppo di lavoro</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>area di lavoro</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Sì</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/norwegian.qph b/tools/linguist/phrasebooks/norwegian.qph
new file mode 100644
index 0000000..d01187c
--- /dev/null
+++ b/tools/linguist/phrasebooks/norwegian.qph
@@ -0,0 +1,1004 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Om</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>tilgangstast</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>tilgjengelighet</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>handlingshåndtak</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>aktiv</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>markeringsavslutning</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>aktivt objekt</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>aktivt vindu</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>verktøyselement</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Alltid øverst</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>forankringspunkt</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Bruk</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>automatisk avslutning</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>automatisk gjentagelse</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>automatisk kobling</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>automatisk rulling</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>autorulling</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Tilbake</target>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Bla gjennom</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Avbryt</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>undermeny</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>avmerkingsboks</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>merke</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>undervindu</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>velge</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>klikke</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>utklippstavle</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Lukk</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>lukkeknapp</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>skjule</target>
+ <definition>outline/disposisjon</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>kolonneoverskrift</target>
+ <definition>control/kontroll</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>kombinasjonsboks</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>kommandoknapp</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>beholder</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>kontekstavhengig hjelp</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>kontekstavhengig</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>kontroll</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Kopier</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Kopier hit</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Lag snarvei</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Lag snarvei her</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Klipp ut</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>standard</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>standardknapp</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Slett</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>skrivebord</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>mål</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>dialogboks</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>funksjonshemning</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>ikke sammenhengende utvalg</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>forankre</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>dokument</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>dobbeltklikke</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>dra</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>dra och slippe</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>kombinasjonsboks</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>rullegardinliste</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>rullegardinmeny</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Rediger</target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>Rediger-menyen</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>ellipse</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>innebygd objekt</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Avslutt</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>utvide</target>
+ <definition>an outline/en disposisjon</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Utforsk</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>utvidet merking</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>liste med utvidet merking</target>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>fil</target>
+</phrase>
+<phrase>
+ <source>File menu</source>
+ <target>Fil-menyen</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Søk etter</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Søk etter neste</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Søk etter</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>mappe</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>skrift</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>skriftstørrelse</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>skriftstil</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>funksjonstast</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>gruppeboks</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>håndtak</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Hjelp</target>
+</phrase>
+<phrase>
+ <source>Help menu</source>
+ <target>Hjelp-menyen</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Skjul</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>hierarkisk merking</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>holde</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>fokus</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>fokuseringssone</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>ikon</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>inaktiv</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>inaktivt vindu</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>indatafokus</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>Sett inn-menyen</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Sett inn objekt</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>innsettingspunkt</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>kursiv</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>etikett</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>liggende</target>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>koble</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>kobling</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Lag kobling her</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>listeboks</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>listevisning</target>
+ <definition>control/kontroll</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>manuell kobling</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Maksimer</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>maksimeringsknapp</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>meny</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>menylinje</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>menyknapp</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>menyelement</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>menytittel</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>meldingsboks</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Minimer</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>minimeringsknapp</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>blandet verdi</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>modal</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>modus</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>icke-modal</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>modifiseringstast</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>mus</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Flytt</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Flytt hit</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>flerdokumentgrensesnitt</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>flervalgsliste</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Min datamaskin</target>
+ <definition>icon/ikon</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Andre maskiner</target>
+ <definition>icon/ikon</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Ny</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Neste</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>objekt</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>OLE dra og slipp</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>innebyggd OLE-objekt</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>koblet OLE-objekt</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>utvidet OLE dra og slipp</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Åpne</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Åpne i</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>alternativknapp</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>valgt alternativ</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>pakke</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Utskriftsformat</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>palettvindu</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>rute</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>hovedvindu</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>passord</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Lim inn</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Lim inn kobling</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Lim inn snarvei</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Lim inn utvalg</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>bane</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Pause</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Spill</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>punkt</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>peke</target>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>peker</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>hurtigmeny</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>forklaringsvindu</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>stående</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>klikke</target>
+ <definition>and hold a mouse button/og holde nede en musetast</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>trykke</target>
+ <definition>a key/en tast</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>primærbeholder</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>primærvindu</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Skriv ut</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>skriver</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>fremdriftsindikator</target>
+ <definition>control/kontroll</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>prosjekt</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Egenskaper</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>egenskapsvisning</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>egenskapsside</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>egenskapsark</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>egenskapsarkkontroll</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Hurtigvisning</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>skrivebeskyttet</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Papirkurv</target>
+ <definition>Icon/ikon</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Gjør om</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>områdemerking</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>register</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Gjenta</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Erstatt</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Gjenopprett</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>gjenopprettingsknapp</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Fortsett</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Prøv på nytt</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>boks for rik tekst</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Kjør</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Lagre</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Lagre som</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>rulle</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>rullepil</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>rullefelt</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>rulleboks</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>sekundærvindu</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>merke</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Merk alt</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>merket område</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>markeringshåndtak</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Send til</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>skilletegn</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Innstillinger</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Installasjon</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>snarvei</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>snarveisknapp</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>snarveisikon</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>hurtigtast</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>hurtigtastkontroll</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Vis</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Avslutt</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>enkeltvalgsliste</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Størrelse</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>skaleringshåndtak</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>glidebryter</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>verdisettingsboks</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Del</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>delelinje</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>deleboks</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>startknapp</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>Oppstart-mappen</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>statuslinje</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Stopp</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>kategorikontroll</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>oppgavelinje</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>oppgaveorientert hjelp</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>mal</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>tekstboks</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>tittellinje</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>titteltekst</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>veksletast</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>verktøylinje</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>verktøytips</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>trevisningskontroll</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>skrive</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>type</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>ikke tilgjengelig</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Angre</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Avinstaller</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>Vis-meny</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>visuell redigering</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>grafikkontroll</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Hva er dette?</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>Vindu-menyen</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>vindu</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Windows Utforsker</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>veiviser</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>arbeidsbok</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>arbeidsgruppe</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>arbeidsområde</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Ja</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/russian.qph b/tools/linguist/phrasebooks/russian.qph
new file mode 100644
index 0000000..ec64aae
--- /dev/null
+++ b/tools/linguist/phrasebooks/russian.qph
@@ -0,0 +1,982 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>О программе</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>горячая клавиша</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>удобство</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>управление поведением</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>активный</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>окончание выбора</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>активный объект</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>активное окно</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>украшение</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Всегда наверху</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>точка начала выбора</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Применить</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>автоматический выход</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>авто-повтор</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>автоматическое связывание</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>автоматическая прокрутка</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>авто-прокрутка</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Назад</target>
+</phrase>
+<phrase>
+ <source>boxed edit</source>
+ <target>окно редактирования</target>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Обзор</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Отмена</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>ниспадающее меню</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>флажок</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>флажок</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>дочернее окно</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>выбрать</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>щелчок</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Буфер обмена</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Закрыть</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>кнопка закрытия</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>крах</target>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>заголовок колонки</target>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>поле со списком</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>кнопка</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>контейнер</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>контекстная помощь</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>контекстный</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>элемент управления</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Копировать</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Копировать сюда</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Создать ярлык</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Создать ярлык здесь</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Вырезать</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>по умолчанию</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>кнопка по умолчанию</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Удалить</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>рабочий стол</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>цель</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>окно диалога</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>неспособность</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>разделить выбранные элементы</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>док</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>документ</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>двойной щелчок</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>перетащить</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>drag-and-drop</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>раскрыть поле со списком</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>прокрутить список</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>открыть меню</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Правка</target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>меню Правка</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>эллипс</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>встроенный объект</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Выход</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>расширять</target>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Исследовать</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>расширенный выбор</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>список с расширенным выбором</target>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>файл</target>
+</phrase>
+<phrase>
+ <source>File menu</source>
+ <target>меню Файл</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Поиск</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Продолжить поиск</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Поиск</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>каталог</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>шрифт</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>размер шрифта</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>стиль шрифта</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>функциональная клавиша</target>
+</phrase>
+<phrase>
+ <source>glyph</source>
+ <target>глиф</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>контейнер элементов</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>управление</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Справка</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Скрыть</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>иерархический выбор</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>удерживать</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>фокус</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>активная зона</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>пиктограмма</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>неактивный</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>неактивное окно</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>фокус ввода</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>Вставить</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Вставить объект</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>место вставки</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>курсив</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>надпись</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>альбом</target>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>ссылка</target>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>связать</target>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Создать ссылку здесь</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>список</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>древовидный список</target>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>ручное связывание</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Распахнуть</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>кнопка максимизации</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>меню</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>строка меню</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>кнопка меню</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>элемент меню</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>заголовок меню</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>окно сообщений</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Свернуть</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>кнопка минимизации</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>модальный</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>режим</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>немодальный</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>клавиша-модификатор</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>мышь</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Переместить</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Переместить сюда</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>Multiple Document Interface</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>список с множественным выбором</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Мой компьютер</target>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Сетевое окружение</target>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Новый</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Следующий</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>объект</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>OLE-механизм</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>внедренный OLE-объект</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>связанный OLE-объект</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>предопределенный OLE-механизм</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Открыть</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Открыть с помощью</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>переключатель</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>набор параметров</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>пакет</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>шаг установки</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>окно выбора палитры</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>панель</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>родительское окно</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>пароль</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Вставить</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Вставить ссылку</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Вставить ярлык</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Специальная вставка</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>путь</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Пауза</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Воспроизведение</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>пункт</target>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>указатель</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>всплывающее меню</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>всплывающее окно</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>портрет</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>нажимать</target>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>корневой контейнер</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>главное окно</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Печать</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>принтер</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>индикатор хода процесса</target>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>проект</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Свойства</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>инспектор свойств</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>страница свойств</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>группа свойств</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>управление группой свойств</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Быстрый просмотр</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>только чтение</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Корзина</target>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Повторить</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>область выделения</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>реестр</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Повторить</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Заменить</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Восстановить</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>Кнопка восстановления</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Продолжить</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Повторить</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>окно RTF-редактора</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Выполнить</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Сохранить</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Сохранить как</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>прокрутить</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>кнопка прокрутки</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>полоса прокрутки</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>окно с полосами прокрутки</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>подчиненное окно</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>выбрать</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Выделить все</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>выбор</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>осуществление выбора</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Отправить</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>разделитель</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Настройки</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Установить</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>ярлык</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>кнопка</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>пиктограмма</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>комбинация клавиш</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>настройка комбинации клавиш</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Показать</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Выключение</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>список с одиночным выбором</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Размер</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>уголок для изменения размера</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>ползунок</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>поле со счетчиком</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Разделить</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>разделительная черта</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>разделительная рамка</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>кнопка Пуск</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>каталог Автозапуска</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>статусная строка</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Стоп</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>вкладка</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>панель задач</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>контекстная справка</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>шаблон</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>текстовое поле</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>заголовок</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>текст заголовка</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>кнопка-выключатель</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>панель инструментов</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>всплывающая подсказка</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>древовидный список</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>тип</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>набирать</target>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>недоступный</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Отменить</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Удалить</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>Вид</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>визуальное редактирование</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>элемент графического интерфейса</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Что это?</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>Окно</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>окно</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Проводник Windows</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>мастер</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>учебник</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>рабочая группа</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>рабочая область</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Да</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/spanish.qph b/tools/linguist/phrasebooks/spanish.qph
new file mode 100644
index 0000000..5559707
--- /dev/null
+++ b/tools/linguist/phrasebooks/spanish.qph
@@ -0,0 +1,1086 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Acerca de</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>tecla de acceso</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>accesibilidad</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>controlador de acciones</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>activo</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>fin de la selección activa</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>objeto activo</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>ventana activa</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>opción gráfica</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Siempre visible</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>inicio de la selección activa</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Aplicar</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>salida automática</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>repetición automática</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>vínculo automático</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>desplazamiento automático</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>desplazamiento automático</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Atrás</target>
+</phrase>
+<phrase>
+ <source>barrel button</source>
+ <target>botón del lápiz</target>
+ <definition>pen</definition>
+</phrase>
+<phrase>
+ <source>barrel-tap</source>
+ <target>puntenar con el botón presionado</target>
+</phrase>
+<phrase>
+ <source>boxed edit</source>
+ <target>edición en casilla</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Examinar</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Cancelar</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>menú en cascada</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>casilla de verificación</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>marca de verificación</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>ventana secundaria</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>elegir</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>hacer clic</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Portapapeles</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Cerrar</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>botón &amp;quot;Cerrar&amp;quot;</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>contraer</target>
+ <definition>outline/esquerna</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>encabezado de columna</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>cuadro combinado</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>botón de comando</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>contenedor</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>ayuda interactiva</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>contextual</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>control</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Copiar</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Copiar aquí</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Crear acceso directo</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Crear acceso directo aquí</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Cortar</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>predeterminado</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>botón predeterminado</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Eliminar</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>escritorio</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>destino</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>cuadro de diálogo</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>Discapacidades</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>selección disjunta</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>acoplar</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>documento</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>hacer doble clic</target>
+</phrase>
+<phrase>
+ <source>double-tap</source>
+ <target>puntear dos veces</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>arrastrar</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>arrastrar y colocar</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>cuadro combinado desplegable</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>cuadro de lista desplegable</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>menú desplegable</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Edición</target>
+</phrase>
+<phrase>
+ <source>Edit menu</source>
+ <target>menú Edición</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>puntos suspensivos</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>objeto incrustado</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Salir</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>expandir</target>
+ <definition>an outline/un esquema</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Explorar</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>selección extendida</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>cuadro de lista de selección extendida</target>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>archivo</target>
+</phrase>
+<phrase>
+ <source>File menu</source>
+ <target>menú Archivo</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Buscar</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Buscar siguiente</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Buscar</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>carpeta</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>fuente</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>tamaño de fuente</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>estilo de fuente</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>tecla de función</target>
+</phrase>
+<phrase>
+ <source>gesture</source>
+ <target>signo</target>
+</phrase>
+<phrase>
+ <source>glyph</source>
+ <target>símbolo gráfico</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>cuadro de grupo</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>controlar</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>controlador</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Ayuda</target>
+</phrase>
+<phrase>
+ <source>Help menu</source>
+ <target>menú Ayuda</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Ocultar</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>selección jerárquica</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>mantener presionado</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>punto interactivo</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>zona interactiva</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>icono</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>inactivo</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>ventana inactiva</target>
+</phrase>
+<phrase>
+ <source>ink</source>
+ <target>trazo</target>
+</phrase>
+<phrase>
+ <source>ink edit</source>
+ <target>editor de trazos</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>zona de entrada</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>zona de entrada de datos</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>menú Insertar</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Insertar objeto</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>punto de inserción</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>cursiva</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>etiqueta</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>horizontal</target>
+</phrase>
+<phrase>
+ <source>lasso-tap</source>
+ <target>punteo en la selección</target>
+</phrase>
+<phrase>
+ <source>lens</source>
+ <target>lente</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>vincular</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>vínculo</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Vincular aquí</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>cuadro de lista</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>ver lista</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>presentación de iconos </target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>vínculo manual</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Maximizar</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>botón de maximizar</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>menú</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>barra de menús</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>botón de menú</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>elemento de menú</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>título de menú</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>cuadro de mensaje</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Minimizar</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>botón de minimizar</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>valores mezclados</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>modal</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>modo</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>sin modo</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>tecla modificadora</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>mouse</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Mover</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Mover aquí</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>interfaz de documentos múltiples</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>cuadro de lista de selección múltiple</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Mi PC</target>
+ <definition>icon/icono</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Entorno de red</target>
+ <definition>icon/icono</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Nuevo</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Sigulente</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>objeto</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>Aceptar</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>Arrastrar y colocar de OLE</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>Objeto incrustado de OLE</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>Objeto vinculado de OLE</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>Arrastrar y colocar no predeterminado de OLE</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Abrir</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Abrir con</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>botón de opción</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>opción establecida</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>paquete</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Preparar página</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>ventana de paleta</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>panel</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>ventana principal</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>contraseña</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Pegar</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Pegar vínculo</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Pegar acceso directo</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Pegado especial</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>ruta de acceso</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Pausa</target>
+</phrase>
+<phrase>
+ <source>pen</source>
+ <target>lápiz</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Reproducir</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>señalar</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>punto</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>puntero</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>menú emergente</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>ventana emergente</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>vertical</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>presionar</target>
+ <definition>and hold a mouse button/y mantener presionado un botón del mouse</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>presionar</target>
+ <definition>a key/una tecla</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>contenedor primario</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>ventana principal</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Imprimir</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>impresora</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>indicador de progreso</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>proyecto</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Propiedades</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>monitor de propiedades</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>página de propiedades</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>hoja de propiedades</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>control de la hoja de propiedades</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Vista rápida</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>sólo lectura</target>
+</phrase>
+<phrase>
+ <source>recognition</source>
+ <target>reconocimiento</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Papelera de reciclaje</target>
+ <definition>Icon/icono</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Rehacer</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>selección de área</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>Registro de configuraciones</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Repetir</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Reemplazar</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Restaurar</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>botón &amp;quot;Restaurar&amp;quot;</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Reanudar</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Reintentar</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>cuadro de texto enriquecido</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Ejecutar</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Guardar</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Guardar como</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>desplazar</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>flecha de desplazamiento</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>barra de desplazamiento</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>cuadro de desplazamiento</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>ventana secundaria</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>seleccionar</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Seleccionar todo</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>selección</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>controlador de selección</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Enviar a</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>separador</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Configuración</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Configurar</target>
+ <definition>for a device already installed</definition>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Instalar</target>
+ <definition>for an application</definition>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>acceso directo</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>botón de acceso directo</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>icono de acceso directo</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>tecla de método abreviado</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>control de la tecla de método abreviado</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Mostrar</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Apagar el sistema</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>cuadro de lista de selección simple</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Tamaño</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>ajuste de tamaño</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>control deslizante</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>cuadro selector</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Dividir</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>barra de división</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>cuadro de división</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>botón &amp;quot;Inicio&amp;quot;</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>carpeta Inicio</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>barra de estado</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Detener</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>control de fichas</target>
+</phrase>
+<phrase>
+ <source>tap</source>
+ <target>puntear</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>barra de tareas</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>Ayuda relativa a la tarea</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>plantilla</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>cuadro de texto</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>barra de título</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>texto de título</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>tecla para alternar</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>barra de herramientas</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>sugerencias</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>control de visión en árbol</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>escribir</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>tipo</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>no disponible</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Deshacer</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Desinstalar</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>menú Ver</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>edición visual</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>control de opciones gráficas</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>¿Qué es esto?</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>menú Ventana</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>ventana</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Explorador de Windows</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>asistente</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>libro</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>libro de trabajo</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>grupo de trabajo</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>área de trabajo</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Sí</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/phrasebooks/swedish.qph b/tools/linguist/phrasebooks/swedish.qph
new file mode 100644
index 0000000..9c44071
--- /dev/null
+++ b/tools/linguist/phrasebooks/swedish.qph
@@ -0,0 +1,1010 @@
+<!DOCTYPE QPH><QPH>
+<phrase>
+ <source>About</source>
+ <target>Om</target>
+</phrase>
+<phrase>
+ <source>access key</source>
+ <target>snabbtangent</target>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>Hjälpmedel</target>
+ <definition>ikonen Accessibility</definition>
+</phrase>
+<phrase>
+ <source>accessibility</source>
+ <target>tillgänglighet</target>
+</phrase>
+<phrase>
+ <source>action handle</source>
+ <target>funktionshandtag</target>
+</phrase>
+<phrase>
+ <source>active</source>
+ <target>aktiv</target>
+</phrase>
+<phrase>
+ <source>active end</source>
+ <target>aktiv slutpunkt</target>
+</phrase>
+<phrase>
+ <source>active object</source>
+ <target>aktivt objekt</target>
+</phrase>
+<phrase>
+ <source>active window</source>
+ <target>aktivt fönster</target>
+</phrase>
+<phrase>
+ <source>adornment</source>
+ <target>fönsterfält</target>
+</phrase>
+<phrase>
+ <source>Always on Top</source>
+ <target>Alltid överst</target>
+</phrase>
+<phrase>
+ <source>anchor point</source>
+ <target>startpunkt</target>
+</phrase>
+<phrase>
+ <source>Apply</source>
+ <target>Verkställ</target>
+</phrase>
+<phrase>
+ <source>auto-exit</source>
+ <target>flytta automatiskt</target>
+</phrase>
+<phrase>
+ <source>auto-repeat</source>
+ <target>upprepa automatiskt</target>
+</phrase>
+<phrase>
+ <source>automatic link</source>
+ <target>automatisk länk</target>
+</phrase>
+<phrase>
+ <source>automatic scrolling</source>
+ <target>automatisk rullning</target>
+</phrase>
+<phrase>
+ <source>autoscroll</source>
+ <target>automatisk rullning</target>
+</phrase>
+<phrase>
+ <source>Back</source>
+ <target>Föregående</target>
+</phrase>
+<phrase>
+ <source>Browse</source>
+ <target>Bläddra</target>
+</phrase>
+<phrase>
+ <source>Cancel</source>
+ <target>Avbryt</target>
+</phrase>
+<phrase>
+ <source>cascading menu</source>
+ <target>undermeny</target>
+</phrase>
+<phrase>
+ <source>check box</source>
+ <target>kryssruta</target>
+</phrase>
+<phrase>
+ <source>check mark</source>
+ <target>markering</target>
+</phrase>
+<phrase>
+ <source>child window</source>
+ <target>underfönster</target>
+</phrase>
+<phrase>
+ <source>choose</source>
+ <target>välj</target>
+</phrase>
+<phrase>
+ <source>click</source>
+ <target>klicka</target>
+</phrase>
+<phrase>
+ <source>Clipboard</source>
+ <target>Urklipp</target>
+</phrase>
+<phrase>
+ <source>Close</source>
+ <target>Stäng</target>
+</phrase>
+<phrase>
+ <source>Close button</source>
+ <target>stängningsknapp</target>
+</phrase>
+<phrase>
+ <source>collapse</source>
+ <target>komprimera</target>
+ <definition>outline</definition>
+</phrase>
+<phrase>
+ <source>column heading</source>
+ <target>kolumnrubrik</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>combo box</source>
+ <target>kombinationsruta</target>
+</phrase>
+<phrase>
+ <source>command button</source>
+ <target>kommandoknapp</target>
+</phrase>
+<phrase>
+ <source>container</source>
+ <target>behållare</target>
+</phrase>
+<phrase>
+ <source>context-sensitive Help</source>
+ <target>sammanhangsberoende hjälp</target>
+</phrase>
+<phrase>
+ <source>contextual</source>
+ <target>sammanhangsberoende</target>
+</phrase>
+<phrase>
+ <source>control</source>
+ <target>kontroll</target>
+</phrase>
+<phrase>
+ <source>Copy</source>
+ <target>Kopiera</target>
+</phrase>
+<phrase>
+ <source>Copy here</source>
+ <target>Kopiera hit</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut</source>
+ <target>Skapa genväg</target>
+</phrase>
+<phrase>
+ <source>Create Shortcut Here</source>
+ <target>Skapa genväg här</target>
+</phrase>
+<phrase>
+ <source>Cut</source>
+ <target>Klipp ut</target>
+</phrase>
+<phrase>
+ <source>default</source>
+ <target>standard</target>
+</phrase>
+<phrase>
+ <source>default button</source>
+ <target>standardknapp</target>
+</phrase>
+<phrase>
+ <source>Delete</source>
+ <target>Ta bort</target>
+</phrase>
+<phrase>
+ <source>desktop</source>
+ <target>skrivbord</target>
+</phrase>
+<phrase>
+ <source>destination</source>
+ <target>mål</target>
+</phrase>
+<phrase>
+ <source>dialog box</source>
+ <target>dialogruta</target>
+</phrase>
+<phrase>
+ <source>disability</source>
+ <target>oförmåga</target>
+</phrase>
+<phrase>
+ <source>disjoint selection</source>
+ <target>osammanhängande markering</target>
+</phrase>
+<phrase>
+ <source>dock</source>
+ <target>docka</target>
+</phrase>
+<phrase>
+ <source>document</source>
+ <target>dokument</target>
+</phrase>
+<phrase>
+ <source>double-click</source>
+ <target>dubbelklicka på</target>
+</phrase>
+<phrase>
+ <source>drag</source>
+ <target>dra</target>
+</phrase>
+<phrase>
+ <source>drag-and-drop</source>
+ <target>dra och släpp</target>
+</phrase>
+<phrase>
+ <source>drop-down combo box</source>
+ <target>nedrullningsbar kombinationsruta</target>
+</phrase>
+<phrase>
+ <source>drop-down list box</source>
+ <target>nedrullningsbar listruta</target>
+</phrase>
+<phrase>
+ <source>drop-down menu</source>
+ <target>nedrullningsbar meny</target>
+</phrase>
+<phrase>
+ <source>Edit</source>
+ <target>Redigera</target>
+</phrase>
+<phrase>
+ <source>ellipsis</source>
+ <target>punkter</target>
+</phrase>
+<phrase>
+ <source>embedded object</source>
+ <target>inbäddat objekt</target>
+</phrase>
+<phrase>
+ <source>Exit</source>
+ <target>Avsluta</target>
+</phrase>
+<phrase>
+ <source>expand</source>
+ <target>expandera</target>
+ <definition>an outline</definition>
+</phrase>
+<phrase>
+ <source>Explore</source>
+ <target>Utforska</target>
+</phrase>
+<phrase>
+ <source>extended selection</source>
+ <target>utökad markering</target>
+</phrase>
+<phrase>
+ <source>extended selection list box</source>
+ <target>listruta för utökad markering</target>
+</phrase>
+<phrase>
+ <source>File</source>
+ <target>Arkiv</target>
+ <definition>menu/meny</definition>
+</phrase>
+<phrase>
+ <source>file</source>
+ <target>fil</target>
+</phrase>
+<phrase>
+ <source>Find</source>
+ <target>Sök</target>
+</phrase>
+<phrase>
+ <source>Find Next</source>
+ <target>Sök nästa</target>
+</phrase>
+<phrase>
+ <source>Find What</source>
+ <target>Sök efter</target>
+</phrase>
+<phrase>
+ <source>folder</source>
+ <target>mapp</target>
+</phrase>
+<phrase>
+ <source>font</source>
+ <target>teckensnitt</target>
+</phrase>
+<phrase>
+ <source>font size</source>
+ <target>teckenstorlek</target>
+</phrase>
+<phrase>
+ <source>font style</source>
+ <target>teckenstil</target>
+</phrase>
+<phrase>
+ <source>function key</source>
+ <target>funktionstangent</target>
+</phrase>
+<phrase>
+ <source>group box</source>
+ <target>gruppruta</target>
+</phrase>
+<phrase>
+ <source>handle</source>
+ <target>handtag</target>
+</phrase>
+<phrase>
+ <source>Help</source>
+ <target>Hjälp</target>
+</phrase>
+<phrase>
+ <source>Hide</source>
+ <target>Dölj</target>
+</phrase>
+<phrase>
+ <source>hierarchical selection</source>
+ <target>hierarkisk markering</target>
+</phrase>
+<phrase>
+ <source>hold</source>
+ <target>hålla ned</target>
+</phrase>
+<phrase>
+ <source>hot spot</source>
+ <target>aktiv punkt</target>
+</phrase>
+<phrase>
+ <source>hot zone</source>
+ <target>aktiveringszon</target>
+</phrase>
+<phrase>
+ <source>icon</source>
+ <target>ikon</target>
+</phrase>
+<phrase>
+ <source>inactive</source>
+ <target>inaktiv</target>
+</phrase>
+<phrase>
+ <source>inactive window</source>
+ <target>inaktivt fönster</target>
+</phrase>
+<phrase>
+ <source>input focus</source>
+ <target>inmatningsfokus</target>
+</phrase>
+<phrase>
+ <source>Insert</source>
+ <target>Infoga-meny</target>
+</phrase>
+<phrase>
+ <source>Insert Object</source>
+ <target>Infoga objekt</target>
+</phrase>
+<phrase>
+ <source>insertion point</source>
+ <target>insättningspunkt</target>
+</phrase>
+<phrase>
+ <source>italic</source>
+ <target>kursiv</target>
+</phrase>
+<phrase>
+ <source>label</source>
+ <target>titel</target>
+</phrase>
+<phrase>
+ <source>landscape</source>
+ <target>liggande</target>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>länk</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>link</source>
+ <target>länka</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>Link Here</source>
+ <target>Länka hit</target>
+</phrase>
+<phrase>
+ <source>list box</source>
+ <target>listruta</target>
+</phrase>
+<phrase>
+ <source>list view</source>
+ <target>listvy</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>manual link</source>
+ <target>manuell länk</target>
+</phrase>
+<phrase>
+ <source>Maximize</source>
+ <target>Maximera</target>
+</phrase>
+<phrase>
+ <source>maximize button</source>
+ <target>maximeringsknapp</target>
+</phrase>
+<phrase>
+ <source>MDI</source>
+ <target>MDI</target>
+</phrase>
+<phrase>
+ <source>menu</source>
+ <target>meny</target>
+</phrase>
+<phrase>
+ <source>menu bar</source>
+ <target>menyrad</target>
+</phrase>
+<phrase>
+ <source>menu button</source>
+ <target>menyknapp</target>
+</phrase>
+<phrase>
+ <source>menu item</source>
+ <target>menyobjekt</target>
+</phrase>
+<phrase>
+ <source>menu title</source>
+ <target>menytitel</target>
+</phrase>
+<phrase>
+ <source>message box</source>
+ <target>meddelanderuta</target>
+</phrase>
+<phrase>
+ <source>Minimize</source>
+ <target>Minimera</target>
+</phrase>
+<phrase>
+ <source>minimize button</source>
+ <target>minimeringsknapp</target>
+</phrase>
+<phrase>
+ <source>mixed-value</source>
+ <target>blandvärde</target>
+</phrase>
+<phrase>
+ <source>modal</source>
+ <target>modal</target>
+</phrase>
+<phrase>
+ <source>mode</source>
+ <target>läge</target>
+</phrase>
+<phrase>
+ <source>modeless</source>
+ <target>icke-modal</target>
+</phrase>
+<phrase>
+ <source>modifier key</source>
+ <target>ändringstangent</target>
+</phrase>
+<phrase>
+ <source>mouse</source>
+ <target>mus</target>
+</phrase>
+<phrase>
+ <source>Move</source>
+ <target>Flytta</target>
+</phrase>
+<phrase>
+ <source>Move Here</source>
+ <target>Flytta hit</target>
+</phrase>
+<phrase>
+ <source>Multiple Document Interface</source>
+ <target>multiple document interface</target>
+</phrase>
+<phrase>
+ <source>multiple selection list box</source>
+ <target>listruta för multipel markering</target>
+</phrase>
+<phrase>
+ <source>My Computer</source>
+ <target>Den här datorn</target>
+ <definition>icon</definition>
+</phrase>
+<phrase>
+ <source>Network Neighborhood</source>
+ <target>Nätverket</target>
+ <definition>icon</definition>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Ny</target>
+</phrase>
+<phrase>
+ <source>New</source>
+ <target>Nytt</target>
+</phrase>
+<phrase>
+ <source>Next</source>
+ <target>Nästa</target>
+</phrase>
+<phrase>
+ <source>object</source>
+ <target>objekt</target>
+</phrase>
+<phrase>
+ <source>OK</source>
+ <target>OK</target>
+</phrase>
+<phrase>
+ <source>OLE</source>
+ <target>OLE</target>
+</phrase>
+<phrase>
+ <source>OLE drag and drop</source>
+ <target>dra och släpp (OLE)</target>
+</phrase>
+<phrase>
+ <source>OLE embedded object</source>
+ <target>inbäddat objekt (OLE)</target>
+</phrase>
+<phrase>
+ <source>OLE linked object</source>
+ <target>länkat objekt (OLE)</target>
+</phrase>
+<phrase>
+ <source>OLE nondefault drag and drop</source>
+ <target>utökat drag och släpp (OLE)</target>
+</phrase>
+<phrase>
+ <source>Open</source>
+ <target>Öppna</target>
+</phrase>
+<phrase>
+ <source>Open With</source>
+ <target>Öppna med</target>
+</phrase>
+<phrase>
+ <source>option button</source>
+ <target>alternativknapp</target>
+</phrase>
+<phrase>
+ <source>option-set</source>
+ <target>valt alternativ</target>
+</phrase>
+<phrase>
+ <source>package</source>
+ <target>paket</target>
+</phrase>
+<phrase>
+ <source>Page Setup</source>
+ <target>Utskriftsformat</target>
+</phrase>
+<phrase>
+ <source>palette window</source>
+ <target>palettfönster</target>
+</phrase>
+<phrase>
+ <source>pane</source>
+ <target>fönsterruta</target>
+</phrase>
+<phrase>
+ <source>parent window</source>
+ <target>moderfönster</target>
+</phrase>
+<phrase>
+ <source>password</source>
+ <target>lösenord</target>
+</phrase>
+<phrase>
+ <source>Paste</source>
+ <target>Klistra in</target>
+</phrase>
+<phrase>
+ <source>Paste Link</source>
+ <target>Klistra in länk</target>
+</phrase>
+<phrase>
+ <source>Paste Shortcut</source>
+ <target>Klistra in genväg</target>
+</phrase>
+<phrase>
+ <source>Paste Special</source>
+ <target>Klistra in special</target>
+</phrase>
+<phrase>
+ <source>path</source>
+ <target>sökväg</target>
+</phrase>
+<phrase>
+ <source>Pause</source>
+ <target>Paus</target>
+</phrase>
+<phrase>
+ <source>Play</source>
+ <target>Spela upp</target>
+</phrase>
+<phrase>
+ <source>Plug and Play</source>
+ <target>Plug and Play</target>
+</phrase>
+<phrase>
+ <source>point</source>
+ <target>peka</target>
+</phrase>
+<phrase>
+ <source>pointer</source>
+ <target>pekare</target>
+</phrase>
+<phrase>
+ <source>pop-up menu</source>
+ <target>pop up-meny</target>
+</phrase>
+<phrase>
+ <source>pop-up window</source>
+ <target>pop up-fönster</target>
+</phrase>
+<phrase>
+ <source>portrait</source>
+ <target>stående</target>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>håll ned</target>
+ <definition>and hold a mouse button</definition>
+</phrase>
+<phrase>
+ <source>press</source>
+ <target>tryck på</target>
+ <definition>a key</definition>
+</phrase>
+<phrase>
+ <source>primary container</source>
+ <target>primär behållare</target>
+</phrase>
+<phrase>
+ <source>primary window</source>
+ <target>primärt fönster</target>
+</phrase>
+<phrase>
+ <source>Print</source>
+ <target>Skriv ut</target>
+</phrase>
+<phrase>
+ <source>printer</source>
+ <target>skrivare</target>
+</phrase>
+<phrase>
+ <source>progress indicator</source>
+ <target>förloppsindikator</target>
+ <definition>control</definition>
+</phrase>
+<phrase>
+ <source>project</source>
+ <target>projekt</target>
+</phrase>
+<phrase>
+ <source>Properties</source>
+ <target>Egenskaper</target>
+</phrase>
+<phrase>
+ <source>property inspector</source>
+ <target>egenskapsgranskare</target>
+</phrase>
+<phrase>
+ <source>property page</source>
+ <target>egenskapssida</target>
+</phrase>
+<phrase>
+ <source>property sheet</source>
+ <target>egenskapsförteckning</target>
+</phrase>
+<phrase>
+ <source>property sheet control</source>
+ <target>kontroll i egenskapsförteckning</target>
+</phrase>
+<phrase>
+ <source>Quick View</source>
+ <target>Snabbgranskning</target>
+</phrase>
+<phrase>
+ <source>read-only</source>
+ <target>skrivskydd</target>
+</phrase>
+<phrase>
+ <source>Recycle Bin</source>
+ <target>Papperskorgen</target>
+ <definition>Icon</definition>
+</phrase>
+<phrase>
+ <source>Redo</source>
+ <target>Gör om</target>
+</phrase>
+<phrase>
+ <source>region selection</source>
+ <target>områdesmarkering</target>
+</phrase>
+<phrase>
+ <source>registry</source>
+ <target>Registret</target>
+</phrase>
+<phrase>
+ <source>Repeat</source>
+ <target>Upprepa</target>
+</phrase>
+<phrase>
+ <source>Replace</source>
+ <target>Ersätt</target>
+</phrase>
+<phrase>
+ <source>Restore</source>
+ <target>Återställ</target>
+</phrase>
+<phrase>
+ <source>Restore button</source>
+ <target>knappen Återställ</target>
+</phrase>
+<phrase>
+ <source>Resume</source>
+ <target>Fortsätt</target>
+</phrase>
+<phrase>
+ <source>Retry</source>
+ <target>Försök igen</target>
+</phrase>
+<phrase>
+ <source>rich-text box</source>
+ <target>rich text-ruta</target>
+</phrase>
+<phrase>
+ <source>Run</source>
+ <target>Kör</target>
+</phrase>
+<phrase>
+ <source>Save</source>
+ <target>Spara</target>
+</phrase>
+<phrase>
+ <source>Save as</source>
+ <target>Spara som</target>
+</phrase>
+<phrase>
+ <source>scroll</source>
+ <target>rulla</target>
+</phrase>
+<phrase>
+ <source>scroll arrow</source>
+ <target>rullningspil</target>
+</phrase>
+<phrase>
+ <source>scroll bar</source>
+ <target>rullningslist</target>
+</phrase>
+<phrase>
+ <source>scroll box</source>
+ <target>rullningsruta</target>
+</phrase>
+<phrase>
+ <source>secondary window</source>
+ <target>sekundärt fönster</target>
+</phrase>
+<phrase>
+ <source>select</source>
+ <target>markera</target>
+</phrase>
+<phrase>
+ <source>Select All</source>
+ <target>Markera allt</target>
+</phrase>
+<phrase>
+ <source>selection</source>
+ <target>markering</target>
+</phrase>
+<phrase>
+ <source>selection handle</source>
+ <target>markeringshandtag</target>
+</phrase>
+<phrase>
+ <source>Send To</source>
+ <target>Skicka till</target>
+</phrase>
+<phrase>
+ <source>separator</source>
+ <target>avgränsare</target>
+</phrase>
+<phrase>
+ <source>Settings</source>
+ <target>Inställningar</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>installationsprogram</target>
+</phrase>
+<phrase>
+ <source>Setup</source>
+ <target>Inställningar</target>
+</phrase>
+<phrase>
+ <source>shortcut</source>
+ <target>genväg</target>
+</phrase>
+<phrase>
+ <source>shortcut button</source>
+ <target>genvägsknapp</target>
+</phrase>
+<phrase>
+ <source>shortcut icon</source>
+ <target>genvägsikon</target>
+</phrase>
+<phrase>
+ <source>shortcut key</source>
+ <target>kortkommando</target>
+</phrase>
+<phrase>
+ <source>shortcut key control</source>
+ <target>kortkommandokontroll</target>
+</phrase>
+<phrase>
+ <source>Show</source>
+ <target>Visa</target>
+</phrase>
+<phrase>
+ <source>Shutdown</source>
+ <target>Avsluta</target>
+</phrase>
+<phrase>
+ <source>single selection list box</source>
+ <target>listruta för enkel markering</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Ändra storlek</target>
+</phrase>
+<phrase>
+ <source>Size</source>
+ <target>Storlek</target>
+</phrase>
+<phrase>
+ <source>size grip</source>
+ <target>storleksgrepp</target>
+</phrase>
+<phrase>
+ <source>slider</source>
+ <target>skjutreglage</target>
+</phrase>
+<phrase>
+ <source>spin box</source>
+ <target>rotationsruta</target>
+</phrase>
+<phrase>
+ <source>Split</source>
+ <target>Dela</target>
+</phrase>
+<phrase>
+ <source>split bar</source>
+ <target>delningslist</target>
+</phrase>
+<phrase>
+ <source>split box</source>
+ <target>delningsruta</target>
+</phrase>
+<phrase>
+ <source>Start button</source>
+ <target>startknappen</target>
+</phrase>
+<phrase>
+ <source>StartUp folder</source>
+ <target>mappen Autostart</target>
+</phrase>
+<phrase>
+ <source>status bar</source>
+ <target>statusfält</target>
+</phrase>
+<phrase>
+ <source>Stop</source>
+ <target>Stanna</target>
+</phrase>
+<phrase>
+ <source>tab control</source>
+ <target>flik</target>
+</phrase>
+<phrase>
+ <source>task bar</source>
+ <target>Aktivitetsfältet</target>
+</phrase>
+<phrase>
+ <source>task-oriented Help</source>
+ <target>aktivitetsberoende hjälp</target>
+</phrase>
+<phrase>
+ <source>template</source>
+ <target>mall</target>
+</phrase>
+<phrase>
+ <source>text box</source>
+ <target>textruta</target>
+</phrase>
+<phrase>
+ <source>title bar</source>
+ <target>namnlist</target>
+</phrase>
+<phrase>
+ <source>title text</source>
+ <target>text i namnlist</target>
+</phrase>
+<phrase>
+ <source>toggle key</source>
+ <target>växlingstangent</target>
+</phrase>
+<phrase>
+ <source>toolbar</source>
+ <target>verktygsfält</target>
+</phrase>
+<phrase>
+ <source>tooltip</source>
+ <target>funktionsbeskrivning</target>
+</phrase>
+<phrase>
+ <source>tree view control</source>
+ <target>trädkontroll</target>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>typ</target>
+ <definition>noun</definition>
+</phrase>
+<phrase>
+ <source>type</source>
+ <target>skriva</target>
+ <definition>verb</definition>
+</phrase>
+<phrase>
+ <source>unavailable</source>
+ <target>ej tillgänglig</target>
+</phrase>
+<phrase>
+ <source>Undo</source>
+ <target>Ångra</target>
+</phrase>
+<phrase>
+ <source>Uninstall</source>
+ <target>Avinstallera</target>
+</phrase>
+<phrase>
+ <source>View</source>
+ <target>Visa-meny</target>
+</phrase>
+<phrase>
+ <source>visual editing</source>
+ <target>direktredigering</target>
+</phrase>
+<phrase>
+ <source>well control</source>
+ <target>grafikkontroll</target>
+</phrase>
+<phrase>
+ <source>What&apos;s This?</source>
+ <target>Förklaring</target>
+</phrase>
+<phrase>
+ <source>Window</source>
+ <target>Fönster-meny</target>
+</phrase>
+<phrase>
+ <source>window</source>
+ <target>fönster</target>
+</phrase>
+<phrase>
+ <source>Windows Explorer</source>
+ <target>Utforskaren</target>
+</phrase>
+<phrase>
+ <source>wizard</source>
+ <target>guide</target>
+</phrase>
+<phrase>
+ <source>workbook</source>
+ <target>arbetsbok</target>
+</phrase>
+<phrase>
+ <source>workgroup</source>
+ <target>arbetsgrupp</target>
+</phrase>
+<phrase>
+ <source>workspace</source>
+ <target>arbetsyta</target>
+</phrase>
+<phrase>
+ <source>Yes</source>
+ <target>Ja</target>
+</phrase>
+</QPH>
diff --git a/tools/linguist/qdoc.conf b/tools/linguist/qdoc.conf
new file mode 100644
index 0000000..a89fb64
--- /dev/null
+++ b/tools/linguist/qdoc.conf
@@ -0,0 +1,15 @@
+SOURCEDIRS = $QTDIR/tools/linguist/doc
+DOCDIRS = $QTDIR/tools/linguist/doc
+EXAMPLEDIRS = $QTDIR/tools/linguist/tutorial
+OUTPUTDIR = $QTDIR/tools/linguist/doc/html
+BASE = file:$QTDIR/tools/linguist/doc/html/
+COMPANY = Trolltech
+PRODUCT = Qt Linguist
+VERSIONSYM = QT_VERSION_STR
+DEFINE = QT_QDOC QT_.*_SUPPORT _WS_.*_
+FALSE = 0 1
+INTERNAL = no
+STYLE = "h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
+a:link { color: #af4f00; text-decoration: none }
+a:visited { color: #8f2f00; text-decoration: none }
+body { background: #ffffff; color: black; }"
diff --git a/tools/linguist/qm2ts/main.cpp b/tools/linguist/qm2ts/main.cpp
new file mode 100644
index 0000000..e04c99c
--- /dev/null
+++ b/tools/linguist/qm2ts/main.cpp
@@ -0,0 +1,128 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include <metatranslator.h>
+
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtranslator.h>
+
+typedef QValueList<QTranslatorMessage> TML;
+
+static void printUsage()
+{
+ fprintf( stderr, "Usage:\n"
+ " qm2ts [ options ] qm-files\n"
+ "Options:\n"
+ " -help Display this information and exit\n"
+ " -verbose\n"
+ " Explain what is being done\n"
+ " -version\n"
+ " Display the version of qm2ts and exit\n" );
+}
+
+int main( int argc, char **argv )
+{
+ bool verbose = FALSE;
+ int numQmFiles = 0;
+
+ for ( int i = 1; i < argc; i++ ) {
+ if ( qstrcmp(argv[i], "-help") == 0 ) {
+ printUsage();
+ return 0;
+ } else if ( qstrcmp(argv[i], "-verbose") == 0 ) {
+ verbose = TRUE;
+ continue;
+ } else if ( qstrcmp(argv[i], "-version") == 0 ) {
+ fprintf( stderr, "qm2ts version %s\n", QT_VERSION_STR );
+ return 0;
+ }
+
+ numQmFiles++;
+ QTranslator tor( 0 );
+ if ( tor.load(argv[i], ".") ) {
+ QString g = argv[i];
+ g.replace( QRegExp(QString("\\.qm$")), QString::null );
+ g += QString( ".ts" );
+
+ if ( verbose )
+ fprintf( stderr, "Generating '%s'...\n", g.latin1() );
+
+ MetaTranslator metator;
+ int ignored = 0;
+
+ TML all = tor.messages();
+ TML::Iterator it;
+ for ( it = all.begin(); it != all.end(); ++it ) {
+ if ( (*it).sourceText() == 0 ) {
+ ignored++;
+ } else {
+ QCString context = (*it).context();
+ if ( context.isEmpty() )
+ context = "@default";
+ metator.insert( MetaTranslatorMessage(context,
+ (*it).sourceText(), (*it).comment(),
+ (*it).translation(), FALSE,
+ MetaTranslatorMessage::Finished) );
+ }
+ }
+
+ if ( !metator.save(g) ) {
+ fprintf( stderr,
+ "qm2ts warning: For some reason, I cannot save '%s'\n",
+ g.latin1() );
+ } else {
+ if ( verbose ) {
+ int converted = (int) metator.messages().count();
+ fprintf( stderr, " %d message%s converted (%d ignored)\n",
+ converted, converted == 1 ? "" : "s", ignored );
+ }
+ if ( ignored > 0 )
+ fprintf( stderr,
+ "qm2ts warning: File '%s' is not a Qt 2.x .qm"
+ " file (some information is lost)\n",
+ argv[i] );
+ }
+ } else {
+ fprintf( stderr,
+ "qm2ts warning: For some reason, I cannot load '%s'\n",
+ argv[i] );
+ }
+ }
+
+ if ( numQmFiles == 0 ) {
+ printUsage();
+ return 1;
+ }
+ return 0;
+}
diff --git a/tools/linguist/qm2ts/qm2ts.1 b/tools/linguist/qm2ts/qm2ts.1
new file mode 100644
index 0000000..e1eb472
--- /dev/null
+++ b/tools/linguist/qm2ts/qm2ts.1
@@ -0,0 +1,55 @@
+.TH qm2ts 1 "18 October 2001" "Trolltech AS" \" -*- nroff -*-
+.\"
+.\" Copyright (C) 2001-2008 Trolltech ASA. All rights reserved.
+.\"
+.\" This file is part of Qt and may be distributed and used according to
+.\" the terms and conditions described in the LICENSE file.
+.\"
+.SH NAME
+qm2ts \- generate Qt Linguist translation files from Qt 2.x message files
+.SH SYNOPSIS
+.B qm2ts
+.RI "[ " options " ] " qm-files
+.SH DESCRIPTION
+This page documents the
+.B Qt Linguist Qm2ts
+tool for the Qt GUI toolkit.
+.B Qm2ts
+converts Qt 2.x message files (.qm files) into source message files
+(.ts files).
+.PP
+The .ts file format is a simple human-readable XML format that can be
+used with version control systems if required. It is understood by
+.B lupdate,
+.B lrelease
+and
+.B Qt Linguist.
+.PP
+.B qm2ts
+is provided to ease porting from the old internationalization
+tools
+.B (findtr,
+.B mergetr
+and
+.B msg2qm)
+to the new ones. It will not accept Qt message files generated by
+.B lrelease,
+as
+.B lrelease
+compresses .qm files by stripping unnecessary information for lookup.
+.SH OPTIONS
+.TP
+.I "-help"
+Display the usage and exit.
+.TP
+.I "-verbose"
+Explain what is being done.
+.TP
+.I "-version"
+Display the version of
+.B qm2ts
+and exit.
+.SH "SEE ALSO"
+.BR http://doc.trolltech.com/i18n.html
+.SH AUTHOR
+Jasmin Blanchette, Trolltech ASA <jasmin@trolltech.com>
diff --git a/tools/linguist/qm2ts/qm2ts.pro b/tools/linguist/qm2ts/qm2ts.pro
new file mode 100644
index 0000000..3868e30
--- /dev/null
+++ b/tools/linguist/qm2ts/qm2ts.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+CONFIG += qt warn_on console
+HEADERS = ../shared/metatranslator.h
+SOURCES = main.cpp \
+ ../shared/metatranslator.cpp
+
+DEFINES += QT_INTERNAL_XML
+include( ../../../src/qt_professional.pri )
+
+TARGET = qm2ts
+INCLUDEPATH += ../shared
+DESTDIR = ../../../bin
+
+target.path=$$bins.path
+INSTALLS += target
diff --git a/tools/linguist/shared/metatranslator.cpp b/tools/linguist/shared/metatranslator.cpp
new file mode 100644
index 0000000..85f6199
--- /dev/null
+++ b/tools/linguist/shared/metatranslator.cpp
@@ -0,0 +1,601 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "metatranslator.h"
+
+#include <qapplication.h>
+#include <qcstring.h>
+#include <qfile.h>
+#include <qmessagebox.h>
+#include <qtextcodec.h>
+#include <qtextstream.h>
+#include <qxml.h>
+
+static bool encodingIsUtf8( const QXmlAttributes& atts )
+{
+ for ( int i = 0; i < atts.length(); i++ ) {
+ // utf8="true" is a pre-3.0 syntax
+ if ( atts.qName(i) == QString("utf8") ) {
+ return ( atts.value(i) == QString("true") );
+ } else if ( atts.qName(i) == QString("encoding") ) {
+ return ( atts.value(i) == QString("UTF-8") );
+ }
+ }
+ return FALSE;
+}
+
+class TsHandler : public QXmlDefaultHandler
+{
+public:
+ TsHandler( MetaTranslator *translator )
+ : tor( translator ), type( MetaTranslatorMessage::Finished ),
+ inMessage( FALSE ), ferrorCount( 0 ), contextIsUtf8( FALSE ),
+ messageIsUtf8( FALSE ) { }
+
+ virtual bool startElement( const QString& namespaceURI,
+ const QString& localName, const QString& qName,
+ const QXmlAttributes& atts );
+ virtual bool endElement( const QString& namespaceURI,
+ const QString& localName, const QString& qName );
+ virtual bool characters( const QString& ch );
+ virtual bool fatalError( const QXmlParseException& exception );
+
+private:
+ MetaTranslator *tor;
+ MetaTranslatorMessage::Type type;
+ bool inMessage;
+ QString context;
+ QString source;
+ QString comment;
+ QString translation;
+
+ QString accum;
+ int ferrorCount;
+ bool contextIsUtf8;
+ bool messageIsUtf8;
+};
+
+bool TsHandler::startElement( const QString& /* namespaceURI */,
+ const QString& /* localName */,
+ const QString& qName,
+ const QXmlAttributes& atts )
+{
+ if ( qName == QString("byte") ) {
+ for ( int i = 0; i < atts.length(); i++ ) {
+ if ( atts.qName(i) == QString("value") ) {
+ QString value = atts.value( i );
+ int base = 10;
+ if ( value.startsWith("x") ) {
+ base = 16;
+ value = value.mid( 1 );
+ }
+ int n = value.toUInt( 0, base );
+ if ( n != 0 )
+ accum += QChar( n );
+ }
+ }
+ } else {
+ if ( qName == QString("context") ) {
+ context.truncate( 0 );
+ source.truncate( 0 );
+ comment.truncate( 0 );
+ translation.truncate( 0 );
+ contextIsUtf8 = encodingIsUtf8( atts );
+ } else if ( qName == QString("message") ) {
+ inMessage = TRUE;
+ type = MetaTranslatorMessage::Finished;
+ source.truncate( 0 );
+ comment.truncate( 0 );
+ translation.truncate( 0 );
+ messageIsUtf8 = encodingIsUtf8( atts );
+ } else if ( qName == QString("translation") ) {
+ for ( int i = 0; i < atts.length(); i++ ) {
+ if ( atts.qName(i) == QString("type") ) {
+ if ( atts.value(i) == QString("unfinished") )
+ type = MetaTranslatorMessage::Unfinished;
+ else if ( atts.value(i) == QString("obsolete") )
+ type = MetaTranslatorMessage::Obsolete;
+ else
+ type = MetaTranslatorMessage::Finished;
+ }
+ }
+ }
+ accum.truncate( 0 );
+ }
+ return TRUE;
+}
+
+bool TsHandler::endElement( const QString& /* namespaceURI */,
+ const QString& /* localName */,
+ const QString& qName )
+{
+ if ( qName == QString("codec") || qName == QString("defaultcodec") ) {
+ // "codec" is a pre-3.0 syntax
+ tor->setCodec( accum );
+ } else if ( qName == QString("name") ) {
+ context = accum;
+ } else if ( qName == QString("source") ) {
+ source = accum;
+ } else if ( qName == QString("comment") ) {
+ if ( inMessage ) {
+ comment = accum;
+ } else {
+ if ( contextIsUtf8 )
+ tor->insert( MetaTranslatorMessage(context.utf8(),
+ ContextComment,
+ accum.utf8(), QString::null, TRUE,
+ MetaTranslatorMessage::Unfinished) );
+ else
+ tor->insert( MetaTranslatorMessage(context.ascii(),
+ ContextComment,
+ accum.ascii(), QString::null, FALSE,
+ MetaTranslatorMessage::Unfinished) );
+ }
+ } else if ( qName == QString("translation") ) {
+ translation = accum;
+ } else if ( qName == QString("message") ) {
+ if ( messageIsUtf8 )
+ tor->insert( MetaTranslatorMessage(context.utf8(), source.utf8(),
+ comment.utf8(), translation,
+ TRUE, type) );
+ else
+ tor->insert( MetaTranslatorMessage(context.ascii(), source.ascii(),
+ comment.ascii(), translation,
+ FALSE, type) );
+ inMessage = FALSE;
+ }
+ return TRUE;
+}
+
+bool TsHandler::characters( const QString& ch )
+{
+ QString t = ch;
+ t.replace( "\r", "" );
+ accum += t;
+ return TRUE;
+}
+
+bool TsHandler::fatalError( const QXmlParseException& exception )
+{
+ if ( ferrorCount++ == 0 ) {
+ QString msg;
+ msg.sprintf( "Parse error at line %d, column %d (%s).",
+ exception.lineNumber(), exception.columnNumber(),
+ exception.message().latin1() );
+ if ( qApp == 0 )
+ fprintf( stderr, "XML error: %s\n", msg.latin1() );
+ else
+ QMessageBox::information( qApp->mainWidget(),
+ QObject::tr("Qt Linguist"), msg );
+ }
+ return FALSE;
+}
+
+static QString numericEntity( int ch )
+{
+ return QString( ch <= 0x20 ? "<byte value=\"x%1\"/>" : "&#x%1;" )
+ .arg( ch, 0, 16 );
+}
+
+static QString protect( const QCString& str )
+{
+ QString result;
+ int len = (int) str.length();
+ for ( int k = 0; k < len; k++ ) {
+ switch( str[k] ) {
+ case '\"':
+ result += QString( "&quot;" );
+ break;
+ case '&':
+ result += QString( "&amp;" );
+ break;
+ case '>':
+ result += QString( "&gt;" );
+ break;
+ case '<':
+ result += QString( "&lt;" );
+ break;
+ case '\'':
+ result += QString( "&apos;" );
+ break;
+ default:
+ if ( (uchar) str[k] < 0x20 && str[k] != '\n' )
+ result += numericEntity( (uchar) str[k] );
+ else
+ result += str[k];
+ }
+ }
+ return result;
+}
+
+static QString evilBytes( const QCString& str, bool utf8 )
+{
+ if ( utf8 ) {
+ return protect( str );
+ } else {
+ QString result;
+ QCString t = protect( str ).latin1();
+ int len = (int) t.length();
+ for ( int k = 0; k < len; k++ ) {
+ if ( (uchar) t[k] >= 0x7f )
+ result += numericEntity( (uchar) t[k] );
+ else
+ result += QChar( t[k] );
+ }
+ return result;
+ }
+}
+
+MetaTranslatorMessage::MetaTranslatorMessage()
+ : utfeight( FALSE ), ty( Unfinished )
+{
+}
+
+MetaTranslatorMessage::MetaTranslatorMessage( const char *context,
+ const char *sourceText,
+ const char *comment,
+ const QString& translation,
+ bool utf8, Type type )
+ : QTranslatorMessage( context, sourceText, comment, translation ),
+ utfeight( FALSE ), ty( type )
+{
+ /*
+ Don't use UTF-8 if it makes no difference. UTF-8 should be
+ reserved for the real problematic case: non-ASCII (possibly
+ non-Latin-1) characters in .ui files.
+ */
+ if ( utf8 ) {
+ if ( sourceText != 0 ) {
+ int i = 0;
+ while ( sourceText[i] != '\0' ) {
+ if ( (uchar) sourceText[i] >= 0x80 ) {
+ utfeight = TRUE;
+ break;
+ }
+ i++;
+ }
+ }
+ if ( !utfeight && comment != 0 ) {
+ int i = 0;
+ while ( comment[i] != '\0' ) {
+ if ( (uchar) comment[i] >= 0x80 ) {
+ utfeight = TRUE;
+ break;
+ }
+ i++;
+ }
+ }
+ }
+}
+
+MetaTranslatorMessage::MetaTranslatorMessage( const MetaTranslatorMessage& m )
+ : QTranslatorMessage( m ), utfeight( m.utfeight ), ty( m.ty )
+{
+}
+
+MetaTranslatorMessage& MetaTranslatorMessage::operator=(
+ const MetaTranslatorMessage& m )
+{
+ QTranslatorMessage::operator=( m );
+ utfeight = m.utfeight;
+ ty = m.ty;
+ return *this;
+}
+
+bool MetaTranslatorMessage::operator==( const MetaTranslatorMessage& m ) const
+{
+ return qstrcmp( context(), m.context() ) == 0 &&
+ qstrcmp( sourceText(), m.sourceText() ) == 0 &&
+ qstrcmp( comment(), m.comment() ) == 0;
+}
+
+bool MetaTranslatorMessage::operator<( const MetaTranslatorMessage& m ) const
+{
+ int delta = qstrcmp( context(), m.context() );
+ if ( delta == 0 )
+ delta = qstrcmp( sourceText(), m.sourceText() );
+ if ( delta == 0 )
+ delta = qstrcmp( comment(), m.comment() );
+ return delta < 0;
+}
+
+MetaTranslator::MetaTranslator()
+{
+ clear();
+}
+
+MetaTranslator::MetaTranslator( const MetaTranslator& tor )
+ : mm( tor.mm ), codecName( tor.codecName ), codec( tor.codec )
+{
+}
+
+MetaTranslator& MetaTranslator::operator=( const MetaTranslator& tor )
+{
+ mm = tor.mm;
+ codecName = tor.codecName;
+ codec = tor.codec;
+ return *this;
+}
+
+void MetaTranslator::clear()
+{
+ mm.clear();
+ codecName = "ISO-8859-1";
+ codec = 0;
+}
+
+bool MetaTranslator::load( const QString& filename )
+{
+ QFile f( filename );
+ if ( !f.open(IO_ReadOnly) )
+ return FALSE;
+
+ QTextStream t( &f );
+ QXmlInputSource in( t );
+ QXmlSimpleReader reader;
+ reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE );
+ reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", TRUE );
+ QXmlDefaultHandler *hand = new TsHandler( this );
+ reader.setContentHandler( hand );
+ reader.setErrorHandler( hand );
+
+ bool ok = reader.parse( in );
+ reader.setContentHandler( 0 );
+ reader.setErrorHandler( 0 );
+ delete hand;
+ f.close();
+ return ok;
+}
+
+bool MetaTranslator::save( const QString& filename ) const
+{
+ QFile f( filename );
+ if ( !f.open(IO_WriteOnly) )
+ return FALSE;
+
+ QTextStream t( &f );
+ t.setCodec( QTextCodec::codecForName("ISO-8859-1") );
+
+ t << "<!DOCTYPE TS><TS>\n";
+ if ( codecName != "ISO-8859-1" )
+ t << "<defaultcodec>" << codecName << "</defaultcodec>\n";
+ TMM::ConstIterator m = mm.begin();
+ while ( m != mm.end() ) {
+ TMMInv inv;
+ TMMInv::Iterator i;
+ bool contextIsUtf8 = m.key().utf8();
+ QCString context = m.key().context();
+ QCString comment = "";
+
+ do {
+ if ( QCString(m.key().sourceText()) == ContextComment ) {
+ if ( m.key().type() != MetaTranslatorMessage::Obsolete ) {
+ contextIsUtf8 = m.key().utf8();
+ comment = QCString( m.key().comment() );
+ }
+ } else {
+ inv.insert( *m, m.key() );
+ }
+ } while ( ++m != mm.end() && QCString(m.key().context()) == context );
+
+ t << "<context";
+ if ( contextIsUtf8 )
+ t << " encoding=\"UTF-8\"";
+ t << ">\n";
+ t << " <name>" << evilBytes( context, contextIsUtf8 )
+ << "</name>\n";
+ if ( !comment.isEmpty() )
+ t << " <comment>" << evilBytes( comment, contextIsUtf8 )
+ << "</comment>\n";
+
+ for ( i = inv.begin(); i != inv.end(); ++i ) {
+ // no need for such noise
+ if ( (*i).type() == MetaTranslatorMessage::Obsolete &&
+ (*i).translation().isEmpty() )
+ continue;
+
+ t << " <message";
+ if ( (*i).utf8() )
+ t << " encoding=\"UTF-8\"";
+ t << ">\n"
+ << " <source>" << evilBytes( (*i).sourceText(),
+ (*i).utf8() )
+ << "</source>\n";
+ if ( !QCString((*i).comment()).isEmpty() )
+ t << " <comment>" << evilBytes( (*i).comment(),
+ (*i).utf8() )
+ << "</comment>\n";
+ t << " <translation";
+ if ( (*i).type() == MetaTranslatorMessage::Unfinished )
+ t << " type=\"unfinished\"";
+ else if ( (*i).type() == MetaTranslatorMessage::Obsolete )
+ t << " type=\"obsolete\"";
+ t << ">" << protect( (*i).translation().utf8() )
+ << "</translation>\n";
+ t << " </message>\n";
+ }
+ t << "</context>\n";
+ }
+ t << "</TS>\n";
+ f.close();
+ return TRUE;
+}
+
+bool MetaTranslator::release( const QString& filename, bool verbose,
+ QTranslator::SaveMode mode ) const
+{
+ QTranslator tor( 0 );
+ int finished = 0;
+ int unfinished = 0;
+ int untranslated = 0;
+ TMM::ConstIterator m;
+
+ for ( m = mm.begin(); m != mm.end(); ++m ) {
+ if ( m.key().type() != MetaTranslatorMessage::Obsolete ) {
+ if ( m.key().translation().isEmpty() ) {
+ untranslated++;
+ } else {
+ if ( m.key().type() == MetaTranslatorMessage::Unfinished )
+ unfinished++;
+ else
+ finished++;
+
+ QCString context = m.key().context();
+ QCString sourceText = m.key().sourceText();
+ QCString comment = m.key().comment();
+ QString translation = m.key().translation();
+
+ /*
+ Drop the comment in (context, sourceText, comment),
+ unless (context, sourceText, "") already exists, or
+ unless we already dropped the comment of (context,
+ sourceText, comment0).
+ */
+ if ( comment.isEmpty()
+ || contains(context, sourceText, "")
+ || !tor.findMessage(context, sourceText, "").translation()
+ .isNull() ) {
+ tor.insert( m.key() );
+ } else {
+ tor.insert( QTranslatorMessage(context, sourceText, "",
+ translation) );
+ }
+ }
+ }
+ }
+
+ bool saved = tor.save( filename, mode );
+ if ( saved && verbose )
+ fprintf( stderr,
+ " %d finished, %d unfinished and %d untranslated messages\n",
+ finished, unfinished, untranslated );
+
+ return saved;
+}
+
+bool MetaTranslator::contains( const char *context, const char *sourceText,
+ const char *comment ) const
+{
+ return mm.find( MetaTranslatorMessage(context, sourceText, comment) ) !=
+ mm.end();
+}
+
+void MetaTranslator::insert( const MetaTranslatorMessage& m )
+{
+ int pos = (int)mm.count();
+ TMM::Iterator n = mm.find( m );
+ if ( n != mm.end() )
+ pos = *n;
+ mm.replace( m, pos );
+}
+
+void MetaTranslator::stripObsoleteMessages()
+{
+ TMM newmm;
+
+ TMM::Iterator m = mm.begin();
+ while ( m != mm.end() ) {
+ if ( m.key().type() != MetaTranslatorMessage::Obsolete )
+ newmm.insert( m.key(), *m );
+ ++m;
+ }
+ mm = newmm;
+}
+
+void MetaTranslator::stripEmptyContexts()
+{
+ TMM newmm;
+
+ TMM::Iterator m = mm.begin();
+ while ( m != mm.end() ) {
+ if ( QCString(m.key().sourceText()) == ContextComment ) {
+ TMM::Iterator n = m;
+ ++n;
+ // the context comment is followed by other messages
+ if ( n != newmm.end() &&
+ qstrcmp(m.key().context(), n.key().context()) == 0 )
+ newmm.insert( m.key(), *m );
+ } else {
+ newmm.insert( m.key(), *m );
+ }
+ ++m;
+ }
+ mm = newmm;
+}
+
+void MetaTranslator::setCodec( const char *name )
+{
+ const int latin1 = 4;
+
+ codecName = name;
+ codec = QTextCodec::codecForName( name );
+ if ( codec == 0 || codec->mibEnum() == latin1 )
+ codec = 0;
+}
+
+QString MetaTranslator::toUnicode( const char *str, bool utf8 ) const
+{
+ if ( utf8 )
+ return QString::fromUtf8( str );
+ else if ( codec == 0 )
+ return QString( str );
+ else
+ return codec->toUnicode( str );
+}
+
+QValueList<MetaTranslatorMessage> MetaTranslator::messages() const
+{
+ int n = (int)mm.count();
+ TMM::ConstIterator *t = new TMM::ConstIterator[n + 1];
+ TMM::ConstIterator m;
+ for ( m = mm.begin(); m != mm.end(); ++m )
+ t[*m] = m;
+
+ QValueList<MetaTranslatorMessage> val;
+ for ( int i = 0; i < n; i++ )
+ val.append( t[i].key() );
+
+ delete[] t;
+ return val;
+}
+
+QValueList<MetaTranslatorMessage> MetaTranslator::translatedMessages() const
+{
+ QValueList<MetaTranslatorMessage> val;
+ TMM::ConstIterator m;
+ for ( m = mm.begin(); m != mm.end(); ++m ) {
+ if ( m.key().type() == MetaTranslatorMessage::Finished )
+ val.append( m.key() );
+ }
+ return val;
+}
diff --git a/tools/linguist/shared/metatranslator.h b/tools/linguist/shared/metatranslator.h
new file mode 100644
index 0000000..25adfb0
--- /dev/null
+++ b/tools/linguist/shared/metatranslator.h
@@ -0,0 +1,120 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef METATRANSLATOR_H
+#define METATRANSLATOR_H
+
+#include <qmap.h>
+#include <qstring.h>
+#include <qtranslator.h>
+#include <qvaluelist.h>
+
+class QTextCodec;
+
+class MetaTranslatorMessage : public QTranslatorMessage
+{
+public:
+ enum Type { Unfinished, Finished, Obsolete };
+
+ MetaTranslatorMessage();
+ MetaTranslatorMessage( const char *context, const char *sourceText,
+ const char *comment,
+ const QString& translation = QString::null,
+ bool utf8 = FALSE, Type type = Unfinished );
+ MetaTranslatorMessage( const MetaTranslatorMessage& m );
+
+ MetaTranslatorMessage& operator=( const MetaTranslatorMessage& m );
+
+ void setType( Type nt ) { ty = nt; }
+ Type type() const { return ty; }
+ bool utf8() const { return utfeight; }
+
+ bool operator==( const MetaTranslatorMessage& m ) const;
+ bool operator!=( const MetaTranslatorMessage& m ) const
+ { return !operator==( m ); }
+ bool operator<( const MetaTranslatorMessage& m ) const;
+ bool operator<=( const MetaTranslatorMessage& m )
+ { return !operator>( m ); }
+ bool operator>( const MetaTranslatorMessage& m ) const
+ { return this->operator<( m ); }
+ bool operator>=( const MetaTranslatorMessage& m ) const
+ { return !operator<( m ); }
+
+private:
+ bool utfeight;
+ Type ty;
+};
+
+class MetaTranslator
+{
+public:
+ MetaTranslator();
+ MetaTranslator( const MetaTranslator& tor );
+
+ MetaTranslator& operator=( const MetaTranslator& tor );
+
+ void clear();
+ bool load( const QString& filename );
+ bool save( const QString& filename ) const;
+ bool release( const QString& filename, bool verbose = FALSE,
+ QTranslator::SaveMode mode = QTranslator::Stripped ) const;
+
+ bool contains( const char *context, const char *sourceText,
+ const char *comment ) const;
+ void insert( const MetaTranslatorMessage& m );
+
+ void stripObsoleteMessages();
+ void stripEmptyContexts();
+
+ void setCodec( const char *name );
+ QString toUnicode( const char *str, bool utf8 ) const;
+
+ QValueList<MetaTranslatorMessage> messages() const;
+ QValueList<MetaTranslatorMessage> translatedMessages() const;
+
+private:
+ typedef QMap<MetaTranslatorMessage, int> TMM;
+ typedef QMap<int, MetaTranslatorMessage> TMMInv;
+
+ TMM mm;
+ QCString codecName;
+ QTextCodec *codec;
+};
+
+/*
+ This is a quick hack. The proper way to handle this would be
+ to extend MetaTranslator's interface.
+*/
+#define ContextComment "QT_LINGUIST_INTERNAL_CONTEXT_COMMENT"
+
+#endif
diff --git a/tools/linguist/shared/proparser.cpp b/tools/linguist/shared/proparser.cpp
new file mode 100644
index 0000000..7528361
--- /dev/null
+++ b/tools/linguist/shared/proparser.cpp
@@ -0,0 +1,217 @@
+/**********************************************************************
+** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "proparser.h"
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+
+#ifdef Q_OS_UNIX
+#include <unistd.h>
+#endif
+
+#ifdef Q_OS_WIN32
+#define QT_POPEN _popen
+#else
+#define QT_POPEN popen
+#endif
+
+QString loadFile( const QString &fileName )
+{
+ QFile file( fileName );
+ if ( !file.open(IO_ReadOnly) ) {
+ fprintf( stderr, "error: Cannot load '%s': %s\n",
+ file.name().latin1(),
+ file.errorString().latin1() );
+ return QString();
+ }
+
+ QTextStream in( &file );
+ return in.read();
+}
+
+QMap<QString, QString> proFileTagMap( const QString& text )
+{
+ QString t = text;
+ QMap<QString, QString> tagMap;
+ bool stillProcess = true; // If include() has a $$tag then we need to reprocess
+
+ while(stillProcess) {
+
+ /*
+ Strip any commments before we try to include. We
+ still need to do it after we include to make sure the
+ included file does not have comments
+ */
+ t.replace( QRegExp(QString("#[^\n]*\n")), QString(" ") );
+
+ /*
+ Process include() commands.
+ $$PWD is a special case so we have to change it while
+ we know where the included file is.
+ */
+ QRegExp callToInclude("include\\s*\\(\\s*([^()\\s]+)\\s*\\)");
+ int i = 0;
+ while ( (i = callToInclude.search(t, i)) != -1 ) {
+ bool doneWithVar = false;
+ QString fileName = callToInclude.cap(1);
+ QString after = fileName.replace("$$PWD", QDir::currentDirPath());
+ if (!tagMap.isEmpty() && after.contains("$$")) {
+ QRegExp var( "\\$\\$[({]?([a-zA-Z0-9_]+)[)}]?" );
+ int ii = 0;
+ while ((ii = after.find(var, ii)) != -1) {
+ if (tagMap.contains(var.cap(1))) {
+ after.replace(ii, var.cap(0).length(), tagMap[var.cap(1)]);
+ } else { // Couldn't find it
+ doneWithVar = true;
+ break;
+ }
+ }
+
+ }
+ if (doneWithVar || !after.contains("$$")) {
+ after = loadFile(after);
+ QFileInfo fi(callToInclude.cap(1));
+ after.replace("$$PWD", fi.dirPath());
+ t.replace( i, callToInclude.matchedLength(), after );
+ }
+ i += after.length();
+ }
+
+ /*
+ Strip comments, merge lines ending with backslash, add
+ spaces around '=' and '+=', replace '\n' with ';', and
+ simplify white spaces.
+ */
+ t.replace( QRegExp(QString("#[^\n]*\n")), QString(" ") );
+ t.replace( QRegExp(QString("\\\\[^\n\\S]*\n")), QString(" ") );
+ t.replace( "=", QString(" = ") );
+ t.replace( "+ =", QString(" += ") );
+ t.replace( "\n", QString(";") );
+ t = t.simplifyWhiteSpace();
+
+ /*
+ Populate tagMap with 'key = value' entries.
+ */
+ QStringList lines = QStringList::split( QChar(';'), t );
+ QStringList::Iterator line;
+ for ( line = lines.begin(); line != lines.end(); ++line ) {
+ QStringList toks = QStringList::split( QChar(' '), *line );
+
+ if ( toks.count() >= 3 &&
+ (toks[1] == QString("=") || toks[1] == QString("+=")) ) {
+ QString tag = toks.first();
+ int k = tag.findRev( QChar(':') ); // as in 'unix:'
+ if ( k != -1 )
+ tag = tag.mid( k + 1 );
+ toks.remove( toks.begin() );
+
+ QString action = toks.first();
+ toks.remove( toks.begin() );
+
+ if ( tagMap.contains(tag) ) {
+ if ( action == QString("=") )
+ tagMap.replace( tag, toks.join(QChar(' ')) );
+ else
+ tagMap[tag] += QChar( ' ' ) + toks.join( QChar(' ') );
+ } else {
+ tagMap[tag] = toks.join( QChar(' ') );
+ }
+ }
+ }
+
+ /*
+ Expand $$variables within the 'value' part of a 'key = value'
+ pair.
+ */
+ QRegExp var( "\\$\\$[({]?([a-zA-Z0-9_]+)[)}]?" );
+ QMap<QString, QString>::Iterator it;
+ for ( it = tagMap.begin(); it != tagMap.end(); ++it ) {
+ int i = 0;
+ while ( (i = var.search((*it), i)) != -1 ) {
+ int len = var.matchedLength();
+ QString invocation = var.cap(1);
+ QString after;
+
+ if ( invocation == "system" ) {
+ // skip system(); it will be handled in the next pass
+ ++i;
+ } else {
+ if ( tagMap.contains(invocation) )
+ after = tagMap[invocation];
+ else if (invocation.lower() == "pwd")
+ after = QDir::currentDirPath();
+ (*it).replace( i, len, after );
+ i += after.length();
+ }
+ }
+ }
+
+ /*
+ Execute system() calls.
+ */
+ QRegExp callToSystem( "\\$\\$system\\s*\\(([^()]*)\\)" );
+ for ( it = tagMap.begin(); it != tagMap.end(); ++it ) {
+ int i = 0;
+ while ( (i = callToSystem.search((*it), i)) != -1 ) {
+ /*
+ This code is stolen from qmake's project.cpp file.
+ Ideally we would use the same parser, so we wouldn't
+ have this code duplication.
+ */
+ QString after;
+ char buff[256];
+ FILE *proc = QT_POPEN( callToSystem.cap(1).latin1(), "r" );
+ while ( proc && !feof(proc) ) {
+ int read_in = (int)fread( buff, 1, 255, proc );
+ if ( !read_in )
+ break;
+ for ( int i = 0; i < read_in; i++ ) {
+ if ( buff[i] == '\n' || buff[i] == '\t' )
+ buff[i] = ' ';
+ }
+ buff[read_in] = '\0';
+ after += buff;
+ }
+ (*it).replace( i, callToSystem.matchedLength(), after );
+ i += after.length();
+ }
+ }
+ stillProcess = callToInclude.search(t) != -1;
+ }
+ return tagMap;
+}
diff --git a/tools/linguist/shared/proparser.h b/tools/linguist/shared/proparser.h
new file mode 100644
index 0000000..7e05090
--- /dev/null
+++ b/tools/linguist/shared/proparser.h
@@ -0,0 +1,42 @@
+/**********************************************************************
+** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of Qt Linguist.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with
+** the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#ifndef PROPARSER_H
+#define PROPARSER_H
+
+#include <qmap.h>
+#include <qstring.h>
+
+QMap<QString, QString> proFileTagMap( const QString& text );
+
+#endif
diff --git a/tools/linguist/tutorial/tt1/main.cpp b/tools/linguist/tutorial/tt1/main.cpp
new file mode 100644
index 0000000..7d10349
--- /dev/null
+++ b/tools/linguist/tutorial/tt1/main.cpp
@@ -0,0 +1,25 @@
+/****************************************************************
+**
+** Translation tutorial 1
+**
+****************************************************************/
+
+#include <qapplication.h>
+#include <qpushbutton.h>
+#include <qtranslator.h>
+
+
+int main( int argc, char **argv )
+{
+ QApplication app( argc, argv );
+
+ QTranslator translator( 0 );
+ translator.load( "tt1_la", "." );
+ app.installTranslator( &translator );
+
+ QPushButton hello( QPushButton::tr("Hello world!"), 0 );
+
+ app.setMainWidget( &hello );
+ hello.show();
+ return app.exec();
+}
diff --git a/tools/linguist/tutorial/tt1/tt1.pro b/tools/linguist/tutorial/tt1/tt1.pro
new file mode 100644
index 0000000..3b5249c
--- /dev/null
+++ b/tools/linguist/tutorial/tt1/tt1.pro
@@ -0,0 +1,4 @@
+TEMPLATE = app
+CONFIG += qt warn_on
+SOURCES = main.cpp
+TRANSLATIONS = tt1_la.ts
diff --git a/tools/linguist/tutorial/tt2/arrowpad.cpp b/tools/linguist/tutorial/tt2/arrowpad.cpp
new file mode 100644
index 0000000..3c0da64
--- /dev/null
+++ b/tools/linguist/tutorial/tt2/arrowpad.cpp
@@ -0,0 +1,31 @@
+/****************************************************************
+**
+** Implementation of ArrowPad class, translation tutorial 2
+**
+****************************************************************/
+
+#include "arrowpad.h"
+
+#include <qpushbutton.h>
+
+ArrowPad::ArrowPad( QWidget *parent, const char *name )
+ : QGrid( 3, Horizontal, parent, name )
+{
+ setMargin( 10 );
+ setSpacing( 10 );
+
+ skip();
+ (void) new QPushButton( tr("&Up"), this );
+ skip();
+ (void) new QPushButton( tr("&Left"), this );
+ skip();
+ (void) new QPushButton( tr("&Right"), this );
+ skip();
+ (void) new QPushButton( tr("&Down"), this );
+ skip();
+}
+
+void ArrowPad::skip()
+{
+ (void) new QWidget( this );
+}
diff --git a/tools/linguist/tutorial/tt2/arrowpad.h b/tools/linguist/tutorial/tt2/arrowpad.h
new file mode 100644
index 0000000..2fe75c2
--- /dev/null
+++ b/tools/linguist/tutorial/tt2/arrowpad.h
@@ -0,0 +1,22 @@
+/****************************************************************
+**
+** Definition of ArrowPad class, translation tutorial 2
+**
+****************************************************************/
+
+#ifndef ARROWPAD_H
+#define ARROWPAD_H
+
+#include <qgrid.h>
+
+class ArrowPad : public QGrid
+{
+ Q_OBJECT
+public:
+ ArrowPad( QWidget *parent = 0, const char *name = 0 );
+
+private:
+ void skip();
+};
+
+#endif
diff --git a/tools/linguist/tutorial/tt2/main.cpp b/tools/linguist/tutorial/tt2/main.cpp
new file mode 100644
index 0000000..c0e8b01
--- /dev/null
+++ b/tools/linguist/tutorial/tt2/main.cpp
@@ -0,0 +1,26 @@
+/****************************************************************
+**
+** Translation tutorial 2
+**
+****************************************************************/
+
+#include "mainwindow.h"
+
+#include <qapplication.h>
+#include <qstring.h>
+#include <qtextcodec.h>
+#include <qtranslator.h>
+
+int main( int argc, char **argv )
+{
+ QApplication app( argc, argv );
+
+ QTranslator translator( 0 );
+ translator.load( QString("tt2_") + QTextCodec::locale(), "." );
+ app.installTranslator( &translator );
+
+ MainWindow *mw = new MainWindow;
+ app.setMainWidget( mw );
+ mw->show();
+ return app.exec();
+}
diff --git a/tools/linguist/tutorial/tt2/mainwindow.cpp b/tools/linguist/tutorial/tt2/mainwindow.cpp
new file mode 100644
index 0000000..e9a1567
--- /dev/null
+++ b/tools/linguist/tutorial/tt2/mainwindow.cpp
@@ -0,0 +1,26 @@
+/****************************************************************
+**
+** Implementation of MainWindow class, translation tutorial 2
+**
+****************************************************************/
+
+#include "arrowpad.h"
+#include "mainwindow.h"
+
+#include <qaccel.h>
+#include <qapplication.h>
+#include <qmenubar.h>
+#include <qpopupmenu.h>
+
+MainWindow::MainWindow( QWidget *parent, const char *name )
+ : QMainWindow( parent, name )
+{
+ ArrowPad *ap = new ArrowPad( this, "arrow pad" );
+ setCentralWidget( ap );
+
+ QPopupMenu *file = new QPopupMenu( this );
+ file->insertItem( tr("E&xit"), qApp, SLOT(quit()),
+ tr("Ctrl+Q", "Quit") );
+ menuBar()->insertItem( tr("&File"), file );
+ menuBar()->setSeparator( QMenuBar::InWindowsStyle );
+}
diff --git a/tools/linguist/tutorial/tt2/mainwindow.h b/tools/linguist/tutorial/tt2/mainwindow.h
new file mode 100644
index 0000000..f021869
--- /dev/null
+++ b/tools/linguist/tutorial/tt2/mainwindow.h
@@ -0,0 +1,19 @@
+/****************************************************************
+**
+** Definition of MainWindow class, translation tutorial 2
+**
+****************************************************************/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <qmainwindow.h>
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ MainWindow( QWidget *parent = 0, const char *name = 0 );
+};
+
+#endif
diff --git a/tools/linguist/tutorial/tt2/tt2.pro b/tools/linguist/tutorial/tt2/tt2.pro
new file mode 100644
index 0000000..8c1ea6d
--- /dev/null
+++ b/tools/linguist/tutorial/tt2/tt2.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+CONFIG += qt warn_on
+HEADERS = arrowpad.h \
+ mainwindow.h
+SOURCES = arrowpad.cpp \
+ main.cpp \
+ mainwindow.cpp
+TRANSLATIONS = tt2_fr.ts \
+ tt2_nl.ts
diff --git a/tools/linguist/tutorial/tt3/main.cpp b/tools/linguist/tutorial/tt3/main.cpp
new file mode 100644
index 0000000..e5abaf6
--- /dev/null
+++ b/tools/linguist/tutorial/tt3/main.cpp
@@ -0,0 +1,26 @@
+/****************************************************************
+**
+** Translation tutorial 3
+**
+****************************************************************/
+
+#include "mainwindow.h"
+
+#include <qapplication.h>
+#include <qstring.h>
+#include <qtextcodec.h>
+#include <qtranslator.h>
+
+int main( int argc, char **argv )
+{
+ QApplication app( argc, argv );
+
+ QTranslator translator( 0 );
+ translator.load( QString("tt3_") + QTextCodec::locale(), "." );
+ app.installTranslator( &translator );
+
+ MainWindow *mw = new MainWindow;
+ app.setMainWidget( mw );
+ mw->show();
+ return app.exec();
+}
diff --git a/tools/linguist/tutorial/tt3/mainwindow.cpp b/tools/linguist/tutorial/tt3/mainwindow.cpp
new file mode 100644
index 0000000..6b22bc4
--- /dev/null
+++ b/tools/linguist/tutorial/tt3/mainwindow.cpp
@@ -0,0 +1,47 @@
+/****************************************************************
+**
+** Implementation of MainWindow class, translation tutorial 3
+**
+****************************************************************/
+
+#include "mainwindow.h"
+#include "printpanel.h"
+
+#include <qaccel.h>
+#include <qapplication.h>
+#include <qmenubar.h>
+#include <qmessagebox.h>
+#include <qpopupmenu.h>
+
+MainWindow::MainWindow( QWidget *parent, const char *name )
+ : QMainWindow( parent, name )
+{
+ setCaption( tr("Troll Print 1.0") );
+
+ PrintPanel *pp = new PrintPanel( this );
+ setCentralWidget( pp );
+
+ QPopupMenu *file = new QPopupMenu( this );
+ file->insertItem( tr("E&xit"), qApp, SLOT(quit()),
+ tr("Ctrl+Q", "Quit") );
+ QPopupMenu *help = new QPopupMenu( this );
+ help->insertItem( tr("&About"), this, SLOT(about()), Key_F1 );
+ help->insertItem( tr("About &Qt"), this, SLOT(aboutQt()) );
+
+ menuBar()->insertItem( tr("&File"), file );
+ menuBar()->insertSeparator();
+ menuBar()->insertItem( tr("&Help"), help );
+ menuBar()->setSeparator( QMenuBar::InWindowsStyle );
+}
+
+void MainWindow::about()
+{
+ QMessageBox::information( this, tr("About Troll Print 1.0"),
+ tr("Troll Print 1.0.\n\n"
+ "Copyright 1999 Macroshaft, Inc.") );
+}
+
+void MainWindow::aboutQt()
+{
+ QMessageBox::aboutQt( this );
+}
diff --git a/tools/linguist/tutorial/tt3/mainwindow.h b/tools/linguist/tutorial/tt3/mainwindow.h
new file mode 100644
index 0000000..77f23f8
--- /dev/null
+++ b/tools/linguist/tutorial/tt3/mainwindow.h
@@ -0,0 +1,23 @@
+/****************************************************************
+**
+** Definition of MainWindow class, translation tutorial 3
+**
+****************************************************************/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <qmainwindow.h>
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ MainWindow( QWidget *parent = 0, const char *name = 0 );
+
+private slots:
+ void about();
+ void aboutQt();
+};
+
+#endif
diff --git a/tools/linguist/tutorial/tt3/printpanel.cpp b/tools/linguist/tutorial/tt3/printpanel.cpp
new file mode 100644
index 0000000..5cbd468
--- /dev/null
+++ b/tools/linguist/tutorial/tt3/printpanel.cpp
@@ -0,0 +1,37 @@
+/****************************************************************
+**
+** Implementation of PrintPanel class, translation tutorial 3
+**
+****************************************************************/
+
+#include "printpanel.h"
+
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qhbuttongroup.h>
+
+PrintPanel::PrintPanel( QWidget *parent, const char *name )
+ : QVBox( parent, name )
+{
+ setMargin( 10 );
+ setSpacing( 10 );
+
+/*
+ QLabel *lab = new QLabel( tr("<b>TROLL PRINT</b>"), this );
+ lab->setAlignment( AlignCenter );
+*/
+
+ QRadioButton *but;
+
+ QHButtonGroup *twoSided = new QHButtonGroup( this );
+ twoSided->setTitle( tr("2-sided") );
+ but = new QRadioButton( tr("Enabled"), twoSided );
+ but = new QRadioButton( tr("Disabled"), twoSided );
+ but->toggle();
+
+ QHButtonGroup *colors = new QHButtonGroup( this );
+ colors->setTitle( tr("Colors") );
+ but = new QRadioButton( tr("Enabled"), colors );
+ but = new QRadioButton( tr("Disabled"), colors );
+ but->toggle();
+}
diff --git a/tools/linguist/tutorial/tt3/printpanel.h b/tools/linguist/tutorial/tt3/printpanel.h
new file mode 100644
index 0000000..0110c52
--- /dev/null
+++ b/tools/linguist/tutorial/tt3/printpanel.h
@@ -0,0 +1,19 @@
+/****************************************************************
+**
+** Definition of PrintPanel class, translation tutorial 3
+**
+****************************************************************/
+
+#ifndef PRINTPANEL_H
+#define PRINTPANEL_H
+
+#include <qvbox.h>
+
+class PrintPanel : public QVBox
+{
+ Q_OBJECT
+public:
+ PrintPanel( QWidget *parent = 0, const char *name = 0 );
+};
+
+#endif
diff --git a/tools/linguist/tutorial/tt3/tt3.pro b/tools/linguist/tutorial/tt3/tt3.pro
new file mode 100644
index 0000000..c219d1e
--- /dev/null
+++ b/tools/linguist/tutorial/tt3/tt3.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+CONFIG += qt warn_on
+HEADERS = mainwindow.h \
+ printpanel.h
+SOURCES = main.cpp \
+ mainwindow.cpp \
+ printpanel.cpp
+TRANSLATIONS = tt3_pt.ts
diff --git a/tools/linguist/tutorial/tt3/tt3_pt.ts b/tools/linguist/tutorial/tt3/tt3_pt.ts
new file mode 100644
index 0000000..cf8ff4f
--- /dev/null
+++ b/tools/linguist/tutorial/tt3/tt3_pt.ts
@@ -0,0 +1,65 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>MainWindow</name>
+ <message>
+ <source>Troll Print 1.0</source>
+ <translation>Troll Imprimir 1.0</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>&amp;Sair</translation>
+ </message>
+ <message>
+ <source>&amp;About</source>
+ <translation>&amp;Sobre</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>Sobre &amp;Qt</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Arquivo</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>A&amp;juda</translation>
+ </message>
+ <message>
+ <source>About Troll Print 1.0</source>
+ <translation>Sobre Troll Imprimir 1.0</translation>
+ </message>
+ <message>
+ <source>Troll Print 1.0.
+
+Copyright 1999 Macroshaft, Inc.</source>
+ <translation>Troll Imprimir 1.0
+
+Copyright 1999 Macroshaft, Inc.</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <comment>Quit</comment>
+ <translation>Ctrl+Q</translation>
+ </message>
+</context>
+<context>
+ <name>PrintPanel</name>
+ <message>
+ <source>2-sided</source>
+ <translation>2-lados</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <translation>Ativado</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <translation>Desativado</translation>
+ </message>
+ <message>
+ <source>Colors</source>
+ <translation>Cores</translation>
+ </message>
+</context>
+</TS>