pax_global_header00006660000000000000000000000064147253146220014520gustar00rootroot0000000000000052 comment=a56d4f93570c75d98b06fcdb1aacf1dc1e0ac90f qstardict-3.0.0/000077500000000000000000000000001472531462200135165ustar00rootroot00000000000000qstardict-3.0.0/AUTHORS000066400000000000000000000006421472531462200145700ustar00rootroot00000000000000Alexander Rodin The authors of the StarDict plugin: Hu Zheng Opera Wang Rickard E. Faith The author of the SWAC plugin: Nicolas Vion The author of the Multitran plugin and KDE 4 plasmoid: Nick Shaforostoff QStarDict uses the Oxygen icons (http://oxygen-icons.org) qstardict-3.0.0/COPYING000066400000000000000000000431031472531462200145520ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, 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 Lesser 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 How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qstardict-3.0.0/ChangeLog000066400000000000000000000106721472531462200152760ustar00rootroot00000000000000* Version 0.01 - initial release * Version 0.02 - add dictionary directories selection in settings dialog - redesign menus - add Oxygen icons - add "Save translation" action - add pop up window opacity item to settings dialog - rename actions - add .desktop file * Version 0.03 - fix bug when build fails on x86_64 - fix categories in .desktop file - add option "Show pop up only if modifier pressed" in settings dialog - improve selection scanning - fix bug with closing window when it must hide - setting Qt 4.2 compitibility - add russian translation - add traditional chinese translation * Version 0.04 - add ukrainian translation - fix bug when popup window violates from desktop - add translations reformater - add popup window timeout before hide after mouse over to settings dialog - fix bug with "Up" buttons in settings dialog - add popup window default width and height items to settings dialog - change PopupWindow base class from QWidget to QFrame - add D-Bus support - make popup window resizable - add current translation title to main window header * Version 0.05 - fix bug with hard font-family in translation CSS - make popup window border more useful - fix bug with words list - add simplified chinese translation - fix bug with uncorrect displayed hierarchical lists - set to run only one instance of application - set to search for dictionaries recursively * Version 0.06 - add bulgarian translation - add speech support - fix bug with broken main window title when search is empty * Version 0.07 - add "translate" and "translateHtml" methods to D-Bus interface - change license from GPLv3 to GPLv2 * Version 0.08 - add czech translation - fix bug with multiple running from different users - add brazilian portuguese translation - update the traditional chinese translation - add support for configurable instant search - add support for separate translations * Version 0.09 - add polish translation - fix bug with instant search - add italian translation - fix bug with simlinks to dictionaries - add german translation - improve popup window - update the german translation - reorganize project - add basic Windows support - add plugins support - add toolbar to dictionary widget - add for links in translations (by pressing Ctrl and clicking on the word) - improve instant search - improve popup window - add support for closing popup by double click on toolbar * Version 0.10 - change tray icon if scanning disabled - add font editor - some improves and bugfixes * Version 0.11 - fix bug with bad source word - fix bug with removed last letter in translation * Version 0.12 - update italian translation - add support for popup window moving * Version 0.12.1 - fix critical bug with popup window * Version 0.12.2 - fix bug with building on Ubuntu Hardy * Version 0.12.3 - update simplified chinese translation * Version 0.12.4 - update polish translation * Version 0.12.5 - fix bug with main window title * Version 0.12.6 - update german translation * Version 0.12.7 - fix bug with empty speech cmd * Version 0.12.8 - add localization for standard Qt dialogs - add support for Escape key in main window - update ukrainian translation - update chinese translation - fix bug with speaker - remove alphabetical sorting of results - improve saving - add a tooltip for the tray icon * Version 0.12.9 - update german translation - fix typo in the COPYING filename * Version 0.13.0 - add french and turkish translation - improve Windows port - add SWAC and Multitran plugins - add command line support - improve the simplified chinese translation - fix bug with settings saving - improve D-Bus support - fix bug with Qt 4.5 * Version 0.13.1 - fix bugs with installation - add spanish translation - update italian and german translations * Version 0.13.2 - improve system tray support - improve the save dialog - updated the traditional chinese translation - added the lithuanian translation * Version 1.0 - search in dict widget - stabilized release after some months of usage * Version 1.0.1 - compilation fix for newer UNIX/Linux systems - fix for 'unsaved prefs' thanks to Robin 'cheese' Lee from Fedora Project * Version 2.0 - added Hebrew translation - added support for Qt5 * Version 2.0.1 - added the author of the Hebrew translation to THANKS * Version 2.0.2 - fixed building without the "plugins.pri" file * Version 2.0.3 - generated a .qm file for the Hebrew translation - added a Georgian translation qstardict-3.0.0/Doxyfile000066400000000000000000001562511472531462200152360ustar00rootroot00000000000000# Doxyfile 1.5.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = qstardict # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = devel-doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, # and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.h *.cpp # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is enabled by default, which results in a transparent # background. Warning: Depending on the platform used, enabling this option # may lead to badly anti-aliased labels on the edges of a graph (i.e. they # become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO qstardict-3.0.0/INSTALL000066400000000000000000000020241472531462200145450ustar00rootroot00000000000000You need Qt >= 6.0 and glib >= 2.0 in order to install QStarDict. On Debian and Ubuntu these dependencies can be installed by running sudo apt install qt6-base-dev libglib2.0-dev build-essential If you have QtDBus module QStarDict, will be compiled with D-Bus support. To disable D-Bus support add NO_DBUS=1 to qmake arguments. To disable translations add NO_TRANSLATIONS=1 to qmake arguments. If you want to select plugins to compile add ENABLED_PLUGINS="plugin1 plugin2 ..." to qmake arguments. Available plugins: * stardict - supports StarDict dictionaries * web - supports any web search engine * swac - supports SWAC speaking system (http://shtooka.net) * multitran - supports Multitran dictionaries (http://multitran.sourceforge.net) By default the only "stardict" and "web" are plugins enabled. By default the install prefix is /usr. To change it add INSTALL_PREFIX= to qmake arguments. To build and install: 1) qmake [switches] # or qmake6 [switches] 2) make 3) sudo make install qstardict-3.0.0/README.MACOSX000066400000000000000000000017751472531462200154010ustar00rootroot00000000000000QStarDict for Mac OS X is set to be built as a "bundle" application. Distributed packages should contain all required stuff to run out-of-the-box. All following notes are important for developers. BUILDING REQUIREMENTS: * Qt4 libraries/frameworks (tested with macport's qt4-mac+universal) * glib2 devel environment (I'm using macports for it too) * all other libraries are propably part of mac's OS CONFIRURE PHASE: qmake it will build qstardict and install it into /opt (sudo make install will be required) or: qmake INSTALL_PREFIX=/absolute/path/to/selected/dir it will build qstardict and install it into this location. The path *must* be absolute. Relative path will cause install problems. example: qmake INSTALL_PREFIX=/Users/pvanek/oss/qstardict/release MAKE PHASE: just run: make INSTALL PHASE: make install DEPLOY PHASE: macdeployqt path/to/QStarDict.app/ or: macdeployqt path/to/QStarDict.app/ -dmg for dmg build (but I'm using another tool for it) qstardict-3.0.0/README.WINDOWS000066400000000000000000000005111472531462200155240ustar00rootroot00000000000000qmake params for Windows: GLIB2PATH - path to the Glib-2.x development environment (includes, ...) ZLIBPATH - path to the Zlib development environment (includes, ...) sample usage: qmake GLIB2PATH=d:\oss\glib\ ZLIBPATH=d:\oss\zlib\ Requirements: Glib2 development env. Glib2 runtime env. Zlib env. qstardict-3.0.0/README.md000066400000000000000000000007021472531462200147740ustar00rootroot00000000000000**QStarDict** is a free (as [in freedom](https://www.gnu.org/philosophy/free-sw.html)) dictionary application. It is aimed primarily, but not exclusively, at those who learn foreign languages. # Main features * Full support of StarDict dictionaries * Working in the system tray * Scanning mouse selection and showing a popup window with translation of selected words * Translations reformatting * Pronuncation of translated words * Plugins support qstardict-3.0.0/THANKS000066400000000000000000000033431472531462200144340ustar00rootroot00000000000000Thanks to: Petr Vanek who offered some improves and added the Windows support and Mac OS X support Andrew Gaydenko who helped to fix a bug with building on x86_64 Vadim Kalinnikov who gave the hosting Hoopoe who added the Traditional Chinese translation Yurij Goncharuck who fixed bug with popup window violating from desktop and added the Ukrainian translation Truth who added the Simplified Chinese translation Nikola Valentinov Petrov who added the Bulgarian translation Jiri Hlinka who added the Czech translation Klaos Lacerda and Bruno Gonçalves who added the Brazilian Portuguese translation Zhengpeng Hou who updated the Traditional Chinese translation Grzegorz Gibas who added the Polish translation Simone Solinas who added the Italian translation Stefan Kombrink who improved the popup window and added the German translation Matthias Fehring who updated the German translations Albert Tugushev who helped to fix the bug with empty speech cmd Ilya Kotov who helped to improve localization Alex Koudr who helped with with mouse scanning on Windows Nicolas Vion who added the French translation Andriy Rysin who added the command line support Yao Ziyuan who improved the Simplified Chinese translation Serdar Soytetir who added the Turkish translation Sergey Ilinyh who improved the D-Bus support Frank Ren who improved the save dialog Embarembar who added the Lithuanian translation Frank Ren who updated the Traditional Chinese translation Schimon Jehudah Zackary who added the Hebrew translation Temuri Doghonadze who added the Georgian translation Alex Fomin who helped to port QStarDict to Qt6 and fixed usage of deprecated functions qstardict-3.0.0/kdeplasma/000077500000000000000000000000001472531462200154575ustar00rootroot00000000000000qstardict-3.0.0/kdeplasma/CMakeLists.txt000066400000000000000000000004661472531462200202250ustar00rootroot00000000000000project(kdeplasma-qstardict) find_package(KDE4 REQUIRED) include (KDE4Defaults) include(MacroOptionalAddSubdirectory) add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES}) add_subdirectory(applet) add_subdirectory(dataengine)qstardict-3.0.0/kdeplasma/COMPILING000066400000000000000000000000401472531462200167150ustar00rootroot00000000000000mkdir build cd build cmakekde ..qstardict-3.0.0/kdeplasma/applet/000077500000000000000000000000001472531462200167445ustar00rootroot00000000000000qstardict-3.0.0/kdeplasma/applet/CMakeLists.txt000066400000000000000000000005571472531462200215130ustar00rootroot00000000000000project(plasma-qstardict) set(qstardict_SRCS dict.cpp) kde4_add_plugin(plasma_applet_qstardict ${qstardict_SRCS}) target_link_libraries(plasma_applet_qstardict ${KDE4_PLASMA_LIBS} ${KDE4_KDEUI_LIBS} ) install(TARGETS plasma_applet_qstardict DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES plasma-qstardict-default.desktop DESTINATION ${SERVICES_INSTALL_DIR}) qstardict-3.0.0/kdeplasma/applet/Messages.sh000077500000000000000000000001131472531462200210450ustar00rootroot00000000000000#! /usr/bin/env bash $XGETTEXT *.cpp -o $podir/plasma_applet_qstardict.pot qstardict-3.0.0/kdeplasma/applet/dict.cpp000066400000000000000000000302121472531462200203710ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "dict.h" #include #include #include // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define AUTO_DEFINE_TIMEOUT 500 using namespace Plasma; const char* translationCSS = "body {\n" "font-size: 10pt; }\n" "font.dict_name {\n" "color: blue;\n" "font-style: italic; }\n" "font.title {\n" "font-size: 16pt;\n" "font-weight: bold; }\n" "font.explanation {\n" "color: #7f7f7f;\n" "font-style: italic; }\n" "font.abbreviature {\n" "font-style: italic; }\n" "font.example {\n" "font-style: italic; }\n" "font.transcription {\n" "font-weight: bold; }\n"; QStarDictApplet::QStarDictApplet(QObject *parent, const QVariantList &args) : Plasma::Applet(parent, args) , m_dictsModel(0) //m_flash(0) { setHasConfigurationInterface(true); setAspectRatioMode(Plasma::IgnoreAspectRatio); resize(500,200); } QStarDictApplet::~QStarDictApplet() { m_defBrowser->deleteLater(); } void QStarDictApplet::init() { // KConfigGroup cg = config(); m_wordEdit = new LineEdit(this); m_wordEdit->nativeWidget()->setClearButtonShown( true ); m_wordEdit->nativeWidget()->setClickMessage(i18n("Enter word to define here")); m_wordEdit->show(); Plasma::Animator::self()->animateItem(m_wordEdit, Plasma::Animator::AppearAnimation); // m_defBrowser = new QWebView(); m_defBrowser = new QTextBrowser(); m_defBrowser->document()->setDefaultStyleSheet(QLatin1String(translationCSS)); m_defBrowserProxy = new QGraphicsProxyWidget(this); m_defBrowserProxy->setWidget(m_defBrowser); m_defBrowserProxy->hide(); // Icon in upper-left corner QString iconpath = KStandardDirs::locate("icon", "oxygen/scalable/apps/accessories-dictionary.svgz"); m_icon = new Plasma::IconWidget(this); m_icon->setSvg(iconpath); // Position lineedits //const int wordEditOffset = 40; m_icon->setPos(12,3); //m_wordProxyWidget->setPos(15 + wordEditOffset,7); //m_wordProxyWidget->show(); // TODO m_wordEdit->setDefaultTextColor(Plasma::Theme::self()->color(Plasma::Theme::TextColor)); // Timer for auto-define m_timer = new QTimer(this); m_timer->setInterval(AUTO_DEFINE_TIMEOUT); m_timer->setSingleShot(true); connect(m_timer, SIGNAL(timeout()), this, SLOT(define())); m_horLayout = new QGraphicsLinearLayout(Qt::Horizontal); m_horLayout->addItem(m_icon); m_horLayout->addItem(m_wordEdit); m_layout = new QGraphicsLinearLayout(Qt::Vertical); m_layout->addItem(m_horLayout); m_layout->addItem(m_defBrowserProxy); setLayout(m_layout); m_source.clear(); dataEngine("qstardict")->connectSource(m_source, this); connect(m_wordEdit, SIGNAL(editingFinished()), this, SLOT(define())); connect(m_wordEdit->nativeWidget(), SIGNAL(textChanged(const QString&)), this, SLOT(autoDefine(const QString&))); dataEngine("qstardict")->connectSource("list-dictionaries", this); //connect(m_defEdit, SIGNAL(linkActivated(const QString&)), this, SLOT(linkDefine(const QString&))); // This is the fix for links/selecting text //QGraphicsItem::GraphicsItemFlags flags = m_defEdit->flags(); //flags ^= QGraphicsItem::ItemIsMovable; // m_defEdit->setFlags(flags); /*m_flash = new Plasma::Flash(this); m_flash->setColor(Qt::gray); QFont fnt = qApp->font(); fnt.setBold(true); m_flash->setFont(fnt); m_flash->setPos(25,-10); m_flash->resize(QSize(200,20));*/ KConfigGroup cg = config(); m_dicts = cg.readEntry("KnownDictionaries", QStringList()); QStringList activeDictNames = cg.readEntry("ActiveDictionaries", QStringList()); for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i) m_activeDicts[*i]=activeDictNames.contains(*i); } void QStarDictApplet::linkDefine(const QString &text) { kDebug() <<"ACTIVATED"; m_wordEdit->setText(text); define(); } void QStarDictApplet::dataUpdated(const QString& source, const Plasma::DataEngine::Data &data) { if (source=="list-dictionaries") { QStringList newDicts=data["dictionaries"].toStringList(); bool changed=false; for (QStringList::const_iterator i = newDicts.constBegin(); i != newDicts.constEnd(); ++i) { if (!m_dicts.contains(*i)) { m_dicts<<*i; m_activeDicts[*i]=true; changed=true; } } QStringList::iterator it = m_dicts.begin(); while (it != m_dicts.end()) { if (!newDicts.contains(*it)) { it=m_dicts.erase(it); changed=true; } else ++it; } if (changed) configAccepted(); // cg.writeEntry("KnownDictionaries", m_dicts); } // Q_UNUSED(source); /*if (m_flash) { m_flash->kill(); }*/ if (!m_source.isEmpty()) { m_defBrowserProxy->show(); // TODO Phase::self()->animateItem(m_defBrowserProxy, Phase::Appear); } /* if (data.contains("gcide")) { QString defHeader; m_defList = data[QString("gcide")].toString().split(""); // for (int n = 0; n < m_defList.size(); ++n) { if (m_defList[n].contains("") && m_defList[n].contains("")) { defHeader=m_defList[n]; } else if (m_defList[n].contains("")) { defHeader=m_defList.takeAt(n); } if (n < m_defList.size() && !m_defList[n].contains("")) m_defList[n].prepend(defHeader); } if (m_defList.size() > 1) m_defList.removeAt(0); m_i = m_defList.begin(); m_defEdit->setHtml(*m_i); if (m_i != --m_defList.end()) m_rightArrow->show(); else m_rightArrow->hide(); m_leftArrow->hide(); } */ if (data.contains("text")) { m_defBrowser->setHtml(data[QString("text")].toString()); // m_defBrowser->setHtml(wnToHtml(data[QString("wn")].toString())); } updateGeometry(); } void QStarDictApplet::define() { if (m_timer->isActive()) m_timer->stop(); QString newSource=m_wordEdit->text(); QStringList dictsList; for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i) if (m_activeDicts.contains(*i) && m_activeDicts.value(*i)) dictsList<<*i; if (!newSource.isEmpty() && !dictsList.isEmpty()) newSource.prepend(dictsList.join(",")+':'); if (newSource == m_source) return; dataEngine("qstardict")->disconnectSource(m_source, this); qWarning()<<"here"<flash(i18n("Looking up ") + m_word); m_source = newSource; dataEngine("qstardict")->connectSource(m_source, this); qWarning()<<"connectSource"<animateItem(m_defBrowserProxy, Phase::Disappear); m_defBrowserProxy->hide(); } updateConstraints(); } void QStarDictApplet::autoDefine(const QString &word) { Q_UNUSED(word) m_timer->start(); } class CheckableStringListModel: public QStringListModel { public: CheckableStringListModel(QObject* parent, const QStringList& dicts, const QHash& activeDicts_) : QStringListModel(parent) , activeDicts(activeDicts_) { setStringList(dicts); /* setHeaderData (0, Qt::Horizontal, "020", Qt::DisplayRole); setHeaderData (0, Qt::Vertical, "020", Qt::DisplayRole);*/ } QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const { if (role!=Qt::DisplayRole) return QVariant(); return i18n("Dictionary"); } Qt::DropActions supportedDropActions(){return Qt::MoveAction;} Qt::ItemFlags flags(const QModelIndex& index) const { if (!index.isValid()) return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsDragEnabled; } bool setData (const QModelIndex& index, const QVariant& value, int role=Qt::EditRole) { if (role==Qt::CheckStateRole) { activeDicts[stringList().at(index.row())]=value.toInt()==Qt::Checked; return true; } else return QStringListModel::setData(index,value,role); } QVariant data(const QModelIndex& index, int role=Qt::EditRole) const { if (!index.isValid()) return QVariant(); if (role==Qt::CheckStateRole) return ( activeDicts.contains(stringList().at(index.row()))&&activeDicts.value(stringList().at(index.row())) )?Qt::Checked:Qt::Unchecked; return QStringListModel::data(index,role); } public: QHash activeDicts; }; void QStarDictApplet::createConfigurationInterface(KConfigDialog *parent) { // KConfigGroup cg = config(); //QWidget *widget = new QWidget(parent); // QListView* widget=new KEditListBox(i18n("Dictionaries activation and order"), // KEditListBox::CustomEditor::CustomEditor(), // parent, // "dict-order", // false, // KEditListBox::UpDown); // QListView* widget=new QListView(parent); QTreeView* widget=new QTreeView(parent); widget->setDragEnabled(true); widget->setAcceptDrops(true); // widget->viewposrt()->setAcceptDrops(true); widget->setDragDropMode(QAbstractItemView::InternalMove); widget->setDropIndicatorShown(true); widget->setItemsExpandable(false); widget->setAllColumnsShowFocus(true); widget->setRootIsDecorated(false); delete m_dictsModel; m_dictsModel=new CheckableStringListModel(parent,m_dicts,m_activeDicts); widget->setModel(m_dictsModel); // parent->setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Apply ); parent->addPage(widget, parent->windowTitle(), Applet::icon()); connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted())); connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted())); } void QStarDictApplet::configAccepted() { if (m_dictsModel) { m_dicts=m_dictsModel->stringList(); m_activeDicts=m_dictsModel->activeDicts; } KConfigGroup cg = config(); cg.writeEntry("KnownDictionaries", m_dicts); QStringList activeDictNames; for (QStringList::const_iterator i = m_dicts.constBegin(); i != m_dicts.constEnd(); ++i) if (m_activeDicts.contains(*i) && m_activeDicts.value(*i)) activeDictNames<<*i; cg.writeEntry("ActiveDictionaries", activeDictNames); define(); emit configNeedsSaving(); } #include "dict.moc" qstardict-3.0.0/kdeplasma/applet/dict.h000066400000000000000000000045661472531462200200530ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DICT_H #define DICT_H #include #include class QTimer; class CheckableStringListModel; class QTextBrowser; class QGraphicsProxyWidget; class QGraphicsLinearLayout; namespace Plasma { class IconWidget; class LineEdit; } class QStarDictApplet: public Plasma::Applet { Q_OBJECT public: QStarDictApplet(QObject *parent, const QVariantList &args); ~QStarDictApplet(); void init(); void setPath(const QString&); public slots: void dataUpdated(const QString &name, const Plasma::DataEngine::Data &data); void autoDefine(const QString &word); void linkDefine(const QString &word); protected slots: void define(); void configAccepted(); protected: void createConfigurationInterface(KConfigDialog *parent); private: QString m_source; QTimer* m_timer; //QGraphicsPixmapItem *m_graphicsIcon; QGraphicsLinearLayout *m_layout; QGraphicsLinearLayout *m_horLayout; Plasma::LineEdit *m_wordEdit; //Plasma::Flash *m_flash; QStringList m_defList; QStringList::iterator m_i; QTextBrowser* m_defBrowser; QGraphicsProxyWidget *m_defBrowserProxy; Plasma::IconWidget *m_icon; // QList< QPair > m_dicts; QPointer m_dictsModel; QStringList m_dicts; QHash m_activeDicts; }; K_EXPORT_PLASMA_APPLET(qstardict, QStarDictApplet) #endif qstardict-3.0.0/kdeplasma/applet/plasma-qstardict-default.desktop000066400000000000000000000066601472531462200252420ustar00rootroot00000000000000[Desktop Entry] Name=QStarDict Dictionary Name[ca]=QStarDict Diccionari Name[cs]=QStarDict Slovník Name[csb]=QStarDict Slowôrz Name[da]=QStarDict Ordbog Name[de]=QStarDict Wörterbuch Name[el]=QStarDict Λεξικό Name[es]=QStarDict Diccionario Name[et]=QStarDict Sõnaraamat Name[fi]=QStarDict Sanakirja Name[fr]=QStarDict Dictionnaire Name[ga]=QStarDict Foclóir Name[gl]=QStarDict Dicionario Name[hu]=QStarDict Szótár Name[it]=QStarDict Dizionario Name[ja]=QStarDict 辞書 Name[km]=QStarDict វចនានុក្រម Name[ko]=QStarDict 사전 Name[lv]=QStarDict Vārdnīca Name[ms]=QStarDict Kamus Name[nds]=QStarDict Wöörbook Name[nl]=QStarDict Woordenboek Name[nn]=QStarDict Ordbok Name[oc]=QStarDict Diccionari Name[pa]=QStarDict ਡਿਕਸ਼ਨਰੀ Name[pl]=QStarDict Słownik Name[pt]=QStarDict Dicionário Name[pt_BR]=QStarDict Dicionário Name[ro]=QStarDict Dicționar Name[ru]=Словарь QStarDict Name[sl]=QStarDict Slovar Name[sr]=QStarDict речник Name[sr@latin]=QStarDict rečnik Name[sv]=QStarDict Ordlista Name[th]=QStarDict พจนานุกรม Name[tr]=QStarDict Sözlük Name[uk]=Словник QStarDict Name[wa]=QStarDict Motî Name[x-test]=xxQStarDict Dictionaryxx Name[zh_CN]=QStarDict 词典 Name[zh_TW]=QStarDict 字典 Comment=Look up the meaning of words Comment[ca]=Cerca el significat de les paraules Comment[cs]=Vyhledat význam slov Comment[csb]=Szëkôj za znaczeniama słów Comment[da]=Slå ords betydning op Comment[de]=Die Bedeutung von Wörtern nachschlagen Comment[el]=Αναζήτηση σημασίας λέξεων Comment[es]=Busca el significado de las palabras Comment[et]=Sõnade tähenduse otsimine Comment[fi]=Etsi sanojen merkityksiä Comment[fr]=Recherche la signification d'un mot Comment[ga]=Aimsigh sainmhíniú ar fhocal Comment[gl]=Procura o significado de palabras Comment[hu]=Angol nyelvű értelmező szótár Comment[it]=Cerca il significato delle parole Comment[ja]=単語の意味を調べます Comment[km]=រក​មើល​អត្ថន័យ​របស់​ពាក្យ Comment[ko]=단어의 뜻을 찾습니다 Comment[lv]=Uzmeklē vārdu nozīmes Comment[nds]=Kiekt de Bedüden vun Wöör na Comment[nl]=Zoek de betekenis van woorden op Comment[nn]=Slå opp tydinga til ord Comment[pa]=ਸ਼ਬਦਾਂ ਦੇ ਅਰਥ ਵੇਖੋ Comment[pl]=Szukanie znaczeń słów Comment[pt]=Procurar o significado das palavras Comment[pt_BR]=Procurar o significado das palavras Comment[ro]=Caută semnificația cuvintelor Comment[sl]=Poiščite pomen besed Comment[sr]=Потражите значења речи Comment[sr@latin]=Potražite značenja reči Comment[sv]=Slå upp ords betydelse Comment[th]=ค้นหาความหมายของคำ Comment[tr]=Sözcüklerin anlamlarına hızlı ulaşmak için Comment[uk]=Погляньте на значення слів Comment[wa]=Cache après çou k' volèt dire les mots Comment[x-test]=xxLook up the meaning of wordsxx Comment[zh_CN]=查找词义 Comment[zh_TW]=查看單字的意義 Type=Service Icon=accessories-dictionary X-KDE-ServiceTypes=Plasma/Applet X-KDE-Library=plasma_applet_qstardict X-KDE-PluginInfo-Author=Nick Shaforostoff X-KDE-PluginInfo-Email=shaforostoff@kde.ru X-KDE-PluginInfo-Name=qstardict X-KDE-PluginInfo-Version=pre0.1 X-KDE-PluginInfo-Website=http://youonlylivetwice.info/ X-KDE-PluginInfo-Category=Language X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License=GPL X-KDE-PluginInfo-EnabledByDefault=true qstardict-3.0.0/kdeplasma/dataengine/000077500000000000000000000000001472531462200175565ustar00rootroot00000000000000qstardict-3.0.0/kdeplasma/dataengine/CMakeLists.txt000066400000000000000000000010771472531462200223230ustar00rootroot00000000000000project(plasma-qstardictengine) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../../plugins) set(qstardict_engine_SRCS dictengine.cpp ) kde4_add_plugin(plasma_engine_qstardict ${qstardict_engine_SRCS}) target_link_libraries(plasma_engine_qstardict ${KDE4_KDECORE_LIBS} ${KDE4_PLASMA_LIBS} ) set(QSTARDICT_PLUGINS_DIR ${LIB_INSTALL_DIR}/qstardict/plugins) configure_file(config.h.cmake config.h) install(TARGETS plasma_engine_qstardict DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES plasma-dataengine-qstardict.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) qstardict-3.0.0/kdeplasma/dataengine/Messages.sh000077500000000000000000000001061472531462200216610ustar00rootroot00000000000000#! /usr/bin/env bash $XGETTEXT *.cpp -o $podir/plasma_engine_dict.pot qstardict-3.0.0/kdeplasma/dataengine/config.h.cmake000066400000000000000000000001701472531462200222510ustar00rootroot00000000000000 //#define QSTARDICT_PLUGINS_DIR "${QSTARDICT_PLUGINS_DIR}" #define QSTARDICT_PLUGINS_DIR "/usr/lib/qstardict/plugins" qstardict-3.0.0/kdeplasma/dataengine/dictengine.cpp000066400000000000000000000165501472531462200224020ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "dictengine.h" #include "dictplugin.h" #include "config.h" #include #include #include #include #include #include #include // #include #include #define MEMORYFREE_DELAY 60000 /** * This class represents a dictionary provided by a plugin */ class Dictionary { public: Dictionary(const QString &plugin, const QString &name) : m_plugin(plugin) , m_name(name) {} Dictionary() {} const QString &plugin() const {return m_plugin;} const QString &name() const {return m_name;} void setPlugin(const QString &plugin) {m_plugin=plugin;} void setName(const QString &name) {m_name=name;} bool operator == (const Dictionary &dict) {return m_name==dict.m_name && m_plugin==dict.m_plugin;} private: QString m_plugin; QString m_name; }; struct QStarDictEngine::Private { QString currentWord; QTimer timer; QHash > plugins; //name to pointer // QList dicts; // QHash dictToPlugin; //name to metastructure QHash dicts; //name to metastructure }; QStarDictEngine::QStarDictEngine(QObject* parent, const QVariantList& args) : Plasma::DataEngine(parent, args) , d(new Private) { Q_UNUSED(args) // QTime a;a.start(); #ifdef Q_OS_WIN QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("*0.dll"),QDir::Files|QDir::NoDotAndDotDot); for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i) d->plugins[i->fileName().left(i->fileName().length()-5))]=0; #else qWarning()<plugins[i->fileName().mid(3, i->fileName().length()-6)]=0; #endif // use cache to not load redudant plugins? 16->10 ms // QSettings settings("qstardict","qstardict"); // m_dictDirs = settings.value("Multitran/dictDirs", m_dictDirs).toStringList(); d->timer.setInterval(MEMORYFREE_DELAY); d->timer.setSingleShot(true); connect(&d->timer, SIGNAL(timeout()), this, SLOT(unloadPlugins())); QList plugins=d->plugins.keys(); for (QList::const_iterator i = plugins.constBegin(); i != plugins.constEnd(); ++i) { // QStringList dicts = settings.value(*i+"/dicts", QStringList()).toStringList(); // if (!dicts.isEmpty()) // { QStarDict::DictPlugin* plugin = dictPlugin(*i); if (!plugin) continue; QStringList dicts=plugin->availableDicts(); // settings.setValue(*i+"/dicts", QVariant(dicts)); // plugin->setdicts(dicts); // } for (QStringList::const_iterator j = dicts.constBegin(); j != dicts.constEnd(); ++j) d->dicts[*j]=Dictionary(*i, *j); // d->dicts<plugins.contains(name) ) return 0; if (! d->plugins.value(name) ) { #ifdef Q_OS_WIN QString pluginFilename = QSTARDICT_PLUGINS_DIR "/" + name + "0.dll"; #else QString pluginFilename = QSTARDICT_PLUGINS_DIR "/" "lib" + name + ".so"; #endif QPluginLoader* plugin = new QPluginLoader(pluginFilename); if (! plugin->load()) { kWarning() << plugin->errorString(); delete plugin; return 0; } d->plugins[name]=plugin; } return qobject_cast(d->plugins.value(name)->instance()); } void QStarDictEngine::unloadPlugins() { for (QHash >::iterator i = d->plugins.begin(); i != d->plugins.end(); ++i) { if (*i) { (*i)->instance()->deleteLater(); (*i)->deleteLater(); } } } bool QStarDictEngine::sourceRequestEvent(const QString &word) { qWarning()<<"sourceRequestEvent"<timer.start();//delay freeing resources / activate delayed resources freeing if (word=="list-dictionaries") { QStringList result; int i=d->plugins.keys().size(); while (--i>=0) { QStarDict::DictPlugin* plugin = dictPlugin(d->plugins.keys().at(i)); if (!plugin) continue; result << plugin->availableDicts(); } setData("list-dictionaries", "dictionaries", result); qWarning()<::const_iterator i = d->dicts.constBegin(); i != d->dicts.constEnd(); ++i) queriedDicts<name(); d->currentWord = word; QString result; if (simplifiedWord.length() == 0) { setData(d->currentWord, "text", QString()); return true; } for (QStringList::const_iterator i = queriedDicts.constBegin(); i != queriedDicts.constEnd(); ++i) { if (!d->dicts.contains(*i)) continue; QStarDict::DictPlugin* plugin = dictPlugin(d->dicts.value(*i).plugin()); if (!plugin) continue; QStringList ld=plugin->loadedDicts(); if (!ld.contains(*i)) plugin->setLoadedDicts(ld<<*i); if ( !plugin->isTranslatable(*i, simplifiedWord)) continue; QStarDict::DictPlugin::Translation translation = plugin->translate(*i, simplifiedWord); if (translation.translation().isEmpty()) continue; result += "

\n" "" + translation.dictName() + "
\n" "" + translation.title() + "
\n" + translation.translation() + "

\n"; } setData(d->currentWord, "text", result); return true; } #include "dictengine.moc" qstardict-3.0.0/kdeplasma/dataengine/dictengine.h000066400000000000000000000032111472531462200220350ustar00rootroot00000000000000/* * Copyright (C) 2008 Nick Shaforostoff * * based on work by: * Copyright (C) 2007 Thomas Georgiou and Jeff Cooper * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DICTENGINE_H #define DICTENGINE_H #include #include #include namespace QStarDict {class DictPlugin;} /** * This class evaluates the basic expressions given in the interface. */ class QStarDictEngine : public Plasma::DataEngine { Q_OBJECT public: QStarDictEngine(QObject* parent, const QVariantList& args ); ~QStarDictEngine(); protected: bool sourceRequestEvent(const QString &word); private: /** * also loads plugin if it's not loaded */ QStarDict::DictPlugin* dictPlugin(const QString &name); private slots: void unloadPlugins(); private: class Private; Private * const d; }; K_EXPORT_PLASMA_DATAENGINE(qstardict, QStarDictEngine) #endif qstardict-3.0.0/kdeplasma/dataengine/plasma-dataengine-qstardict.desktop000066400000000000000000000073521472531462200265260ustar00rootroot00000000000000[Desktop Entry] Name=QStarDict Dictionary Name[be@latin]=QStarDict Słoŭnik Name[el]=QStarDict Λεξικό Name[gl]=QStarDict Dicionario Name[gu]=QStarDict ડિક્શનરી Name[he]=QStarDict מילון Name[kk]=QStarDict Сөздік Name[km]=QStarDict វចនានុក្រម Name[kn]=QStarDict ಶಬ್ದಕೋಶ Name[nb]=QStarDict Ordbok Name[nds]=QStarDict Wöörbook Name[pa]=QStarDict ਡਿਕਸ਼ਨਰੀ Name[pt]=QStarDict Dicionário Name[pt_BR]=QStarDict Dicionário Name[ro]=QStarDict Dicționar Name[ru]=Словарь QStarDict Name[sv]=QStarDict Ordlista Name[tr]=QStarDict Sözlük Name[uk]=Словник QStarDict Name[x-test]=xxQStarDict Dictionaryxx Name[zh_TW]=QStarDict 字典 Comment=Look up word meanings Comment[af]=Slaan woordbetekenisse na Comment[be@latin]=Pošuk značeńniaŭ słovaŭ Comment[bg]=Търсене на думи Comment[bn_IN]=শব্দের অর্থ অনুসন্ধান করুন Comment[ca]=Cerca els significats de paraules Comment[cs]=Vyhledávání významu slov Comment[da]=Slå ords betydning op Comment[de]=Nachschlagen von Wortbedeutungen Comment[el]=Αναζήτηση σημασίας λέξεων Comment[eo]=Serĉi difinojn de vortoj Comment[es]=Buscar significado de las palabras Comment[et]=Sõna tähenduse otsimine Comment[fi]=Tarkista sanojen merkityksiä Comment[fr]=Connaître la signification des mots Comment[fy]=Sykje de wurdbetekenissen op Comment[ga]=Aimsigh sainmhíniú ar fhocal Comment[gl]=Procura o significado de palabras Comment[gu]=શબ્દનાં અર્થો શોધો Comment[he]=בדיקת משמעות מלה Comment[hu]=Értelmező szótár Comment[is]=Flettu upp merkingu orða Comment[it]=Cerca il significato di una parola Comment[ja]=単語の意味を調べる Comment[kk]=Сөздің мәнін қарастыру Comment[km]=រក​មើល​អត្ថន័យ​របស់​ពាក្យ Comment[kn]=ಪದಗಳ ಅರ್ಥಗಳಿಗನ್ನು ಹುಡುಕು Comment[ko]=단어의 뜻 찾기 Comment[lv]=Atrod vārdu nozīmes Comment[ml]=വാക്കുകളുടെ അര്‍ത്ഥങ്ങള്‍ നിഘണ്ടുവില്‍ തിരയുക Comment[mr]=शब्दांचे अर्थ शोधण्याकरीता लुकअप Comment[nb]=Slå opp betydningen av ord Comment[nds]=Woortbedüden naslaan Comment[ne]=शब्दको अर्थ हेर्नुहोस् Comment[nl]=Zoek de betekenis van woorden op Comment[nn]=Slå opp tydinga til ord Comment[pa]=ਸ਼ਬਦ ਅਰਥ ਖੋਜ Comment[pl]=Wyszukiwanie znaczenia słów Comment[pt]=Procurar os significados das palavras Comment[pt_BR]=Procurar os significados das palavras Comment[ro]=Caută înțelesul cuvintelor Comment[ru]=Выяснение значения слов Comment[se]=Oza maid sátni máksá Comment[sl]=Poiščite pomene besed Comment[sr]=Потражите значења речи Comment[sr@latin]=Potražite značenja reči Comment[sv]=Slå upp ords betydelse Comment[te]=పదము అర్ధాలను చూడుము Comment[th]=ค้นหาความหมายของคำ Comment[tr]=Sözcük anlamlarına bak Comment[uk]=Пошук значень слів Comment[wa]=Cweri çou k' vout dire on mot Comment[x-test]=xxLook up word meaningsxx Comment[zh_CN]=查阅单词含义 Comment[zh_TW]=尋找單字的意義 X-KDE-ServiceTypes=Plasma/DataEngine Type=Service Icon=accessories-dictionary X-KDE-Library=plasma_engine_qstardict X-KDE-PluginInfo-Author=Nick Shaforostoff X-KDE-PluginInfo-Email=shaforostoff@kde.ru X-KDE-PluginInfo-Name=qstardict X-KDE-PluginInfo-Version=0.1 X-KDE-PluginInfo-Website= X-KDE-PluginInfo-Category= X-KDE-PluginInfo-Depends= X-KDE-PluginInfo-License= qstardict-3.0.0/plugins/000077500000000000000000000000001472531462200151775ustar00rootroot00000000000000qstardict-3.0.0/plugins/dictplugin.h000066400000000000000000000226531472531462200175220ustar00rootroot00000000000000/***************************************************************************** * dictplugin.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTPLUGIN_H #define DICTPLUGIN_H #include #include #include #include #include namespace QStarDict { /** * This is a base class for all dictionary plugins classes. */ class DictPlugin { public: /** * This enum describes a features of dictionary plugin. */ enum Feature { /** * No features. */ None = 0x00, /** * Dictionary plugin can search for similar words using * fuzzy algoritms. */ SearchSimilar = 0x01, /** * Dictionary plugin has a settings dialog. */ SettingsDialog = 0x02, }; Q_DECLARE_FLAGS(Features, Feature) /** * This class represents information about dictionary. */ class DictInfo { public: /** * Construct empty DictInfo object. */ DictInfo() : m_wordsCount(-1L) { } /** * Construct DictInfo object from data. * @param plugin A plugin name * @param name A dictionary name * @param author A dictionary author * @param desription A dictionary description * @param wordsCount A count of words that available in dictionary */ DictInfo(const QString &plugin, const QString &name, const QString &author = QString(), const QString &description = QString(), long wordsCount = -1L) : m_plugin(plugin), m_name(name), m_author(author), m_description(description), m_wordsCount(wordsCount) { } const QString &plugin() const { return m_plugin; } const QString &name() const { return m_name; } const QString &author() const { return m_author; } const QString &description() const { return m_description; } long wordsCount() const { return m_wordsCount; } void setPlugin(const QString &plugin) { m_plugin = plugin; } void setName(const QString &name) { m_name = name; } void setAuthor(const QString &author) { m_author = author; } void setDescription(const QString &description) { m_description = description; } void setWordsCount(long wordsCount) { m_wordsCount = wordsCount; } private: QString m_plugin; QString m_name; QString m_author; QString m_description; long m_wordsCount; }; /** * This class represent a translation. */ class Translation { public: /** * Construct an empty translation. */ Translation() { } /** * Construct a translation from data. * @param title A translation title * @param dictName A full dictionary name * @param translation A translation */ Translation(const QString &title, const QString &dictName, const QString &translation) : m_title(title), m_dictName(dictName), m_translation(translation) { } /** * Return the translation title. */ const QString &title() const { return m_title; } /** * Return the dictionary name. */ const QString &dictName() const { return m_dictName; } /** * Return the translation. */ const QString &translation() const { return m_translation; } /** * Set a translation title. */ void setTitle(const QString &title) { m_title = title; } /** * Set a dictionary name. */ void setDictName(const QString &dictName) { m_dictName = dictName; } /** * Set a translation. */ void setTranslation(const QString &translation) { m_translation = translation; } private: QString m_title; QString m_dictName; QString m_translation; }; /** * Destructor. */ virtual ~DictPlugin() { } /** * Return the plugin name. */ virtual QString name() const = 0; /** * Return the plugin version. */ virtual QString version() const = 0; /** * Return the plugin description. */ virtual QString description() const = 0; /** * Return the plugin authors. */ virtual QStringList authors() const = 0; /** * Return a features supported by dictionary plugin. */ virtual Features features() const { return Features(None); } /** * Return a list of available dictionaries. */ virtual QStringList availableDicts() const = 0; /** * Return a list of loaded dictionaries. */ virtual QStringList loadedDicts() const = 0; /** * Set a list of loaded dictionaries. */ virtual void setLoadedDicts(const QStringList &loadedDicts) = 0; /** * Return true if translation exists in dictionary, * otherwise returns false. */ virtual bool isTranslatable(const QString &dict, const QString &word) = 0; /** * Return translation for word from dictionary. If word not found * returns empty string. */ virtual Translation translate(const QString &dict, const QString &word) = 0; /** * Return a list of similar to "word" words from all loaded dictionaries. * Works only if SearchSimilar feature is enabled. */ virtual QStringList findSimilarWords(const QString &dict, const QString &word) { Q_UNUSED(dict); return QStringList(word); } /** * Return a required resource. Scheme of URLs: * plugin://plugin_name/... */ virtual QVariant resource(int type, const QUrl &name) { Q_UNUSED(type) Q_UNUSED(name) return QVariant(); } /** * Return an information about dictionary. The dictionary may be not loaded * but available. */ virtual DictInfo dictInfo(const QString &dict) = 0; /** * Run a settings dialog and return QDialog::DialogCode. */ virtual int execSettingsDialog(QWidget *parent = 0) { Q_UNUSED(parent); return 0; } protected: /** * Return a directory that contains plugin's data. */ QString workPath() const { QString path = QDir::homePath() + "/.config/qstardict/pluginsdata/" + name(); if (! QDir::root().exists(path)) QDir::root().mkpath(path); return path; } }; Q_DECLARE_OPERATORS_FOR_FLAGS(DictPlugin::Features) } Q_DECLARE_INTERFACE(QStarDict::DictPlugin, "org.qstardict.DictPlugin/1.0") #endif // DICTPLUGIN_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/plugins/multitran/000077500000000000000000000000001472531462200172165ustar00rootroot00000000000000qstardict-3.0.0/plugins/multitran/README000066400000000000000000000016701472531462200201020ustar00rootroot00000000000000You need the following external libraries to compile the plugin: libmtsupport libbtree libfacet libmtquery FILE=libmtsupport-0.0.1alpha2 wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install FILE=libbtree-0.0.1alpha2 wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install FILE=libfacet-0.0.1alpha2 wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install FILE=libmtquery-0.0.1alpha3-shaforostoff wget http://youonlylivetwice.info/multitran/$FILE.7z && 7z x $FILE.7z && cd $FILE && make && sudo make install Then put this dir into qstardict/plugins and run qmake && make && sudo make install Download multitran-data.tar.bz2 from multitran.sf.net tar xjf multitran-data.tar.bz2 && cd multitran-data && make && sudo make install See multitran.sf.net and multitran.ru for detailsqstardict-3.0.0/plugins/multitran/multitran.cpp000066400000000000000000000156351472531462200217530ustar00rootroot00000000000000/***************************************************************************** * This file is a part of QStarDict, a StarDict clone written using Qt * * multitran.cpp - Plugin for multitran-data (multitran.sf.net) * * Copyright (C) 2008 Nick Shaforostoff * * Copyright (C) 2004 Stanislav Ievlev * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "multitran.h" //#include "settingsdialog.h" #include // #include #include /* /usr/include/mt/query /usr/include/btree /usr/include/mt/support /usr/include/facet */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef mt::singleton_array txtdb_type; struct compare_names { compare_names(const std::string& from,const std::string& to): from_(from), to_(to) {} bool operator()(const mt::lang_pair& lng1,const mt::lang_pair& lng2) { return distance(lng1) < distance(lng2); } int distance(const mt::lang_pair& lng) { std::string from_name=mt::lang_name(lng.first); std::string to_name=mt::lang_name(lng.second); return (!from_.empty() && !from_name.compare(0,from_.size(),from_)) + (!to_.empty() && !to_name.compare(0,to_.size(),to_)); } std::string from_,to_; }; int compare_articles(const mt::article& a1,const mt::article& a2) { if (a1.lgk() != a2.lgk()) return a2.lgk() > a1.lgk(); else return a2.subject() > a1.subject(); } struct show { show(std::string& r_, bool& found_): r(r_),found(found_) {} void operator()(mt::article_set as) { mt::file_map& subj = txtdb_type::instance(mt::datapath+mt::path_separator()+"subjects.txt"); mt::file_map& spart = txtdb_type::instance(mt::datapath+mt::path_separator()+"speechparts.txt"); if (!as.articles_.empty()) { found=true; std::sort(as.articles_.begin(),as.articles_.end(),compare_articles); int prev_lgk = -1; std::string prev_subject = "x"; for(size_t i=0;i(mt::speech_part(a.lgk())))+""; prev_lgk = a.lgk(); prev_subject = "x";//reset subject } if (prev_subject != a.subject()) { r+=""; r+=subj.any_name(a.subject()); r+=""; r+=a.translated(); prev_subject = a.subject(); } else r+=", "+a.translated(); } r+=""; } } std::string &r; bool& found; }; std::string do_translate(const std::string& text,mt::lang_code from,mt::lang_code to) { bool found=false; std::string r=""; mt::phrase ph; mt::fill_phrase(ph,text,from); mt::translation tr(ph,from,to); std::for_each(tr.asets().begin(), tr.asets().end(), show(r,found)); r+="
"; if (found) return r; return ""; } Multitran::Multitran(QObject *parent) : QObject(parent) { // QSettings settings("qstardict","qstardict"); // m_dictDirs = settings.value("Multitran/dictDirs", m_dictDirs).toStringList(); // m_reformatLists = settings.value("Multitran/reformatLists", true).toBool(); } Multitran::~Multitran() { // QSettings settings("qstardict","qstardict"); // settings.setValue("Multitran/dictDirs", m_dictDirs); // settings.setValue("Multitran/reformatLists", m_reformatLists); } QStringList Multitran::availableDicts() const { return QStringList("Multitran"); } void Multitran::setLoadedDicts(const QStringList &loadedDicts) { } Multitran::DictInfo Multitran::dictInfo(const QString &dict) { // ::DictInfo nativeInfo; // nativeInfo.wordcount = 0; DictInfo result(name(), dict); result.setAuthor("Multitran.ru"); result.setDescription(tr("1 mln words excerpt of multitran.ru")); result.setWordsCount(-1); return result; } bool Multitran::isTranslatable(const QString &dict, const QString &word) { return true; } Multitran::Translation Multitran::translate(const QString &dict, const QString &word) { QTextCodec* c=QTextCodec::codecForMib(2251); std::string text=c->fromUnicode(word).data(); std::string from_lang,to_lang; int i=word.size(); while(--i>=0) if (word.at(i).unicode()>127) break; if (i!=-1) from_lang="russian"; else from_lang="english"; mt::linguas avail_langs; mt::linguas::iterator lang = std::max_element(avail_langs.begin(), avail_langs.end(), compare_names(from_lang,to_lang)); if (lang == avail_langs.end() || (!from_lang.empty() && !to_lang.empty() && (compare_names(from_lang,to_lang).distance(*lang)!=2))) { //std::cerr<<"illegal language names"<
multitran

"; QString queryResult=c->toUnicode(do_translate(lower_str(lang->first,text), lang->first,lang->second).c_str()); if (queryResult.isEmpty()) return Translation(); return Translation(word,"Multitran",queryResult); } QStringList Multitran::findSimilarWords(const QString &dict, const QString &word) { return QStringList(); } int Multitran::execSettingsDialog(QWidget *parent) { //::SettingsDialog dialog(this, parent); //return dialog.exec(); return 0; } #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(multitran, Multitran) #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/plugins/multitran/multitran.h000066400000000000000000000057101472531462200214110ustar00rootroot00000000000000/***************************************************************************** * This file is a part of QStarDict, a StarDict clone written using Qt * * multitran.cpp - Plugin for multitran-data (multitran.sf.net) * * Copyright (C) 2008 Nick Shaforostoff * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef MULTITRAN_H #define MULTITRAN_H #include "../dictplugin.h" #include #include #include class Multitran: public QObject, public QStarDict::DictPlugin { Q_OBJECT Q_INTERFACES(QStarDict::DictPlugin) #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.DictPlugin/1.0" FILE "multitran.json") #endif public: Multitran(QObject *parent = 0); ~Multitran(); QString name() const { return "multitran"; } QString version() const { return "0.1"; } QString description() const { return "The Multitran plugin"; } QStringList authors() const { return QStringList() << tr("Stanislav Ievlev ") << tr("Nick Shaforostoff "); } Features features() const { return Features(/*SearchSimilar | SettingsDialog*/); } QStringList availableDicts() const; QStringList loadedDicts() const {return QStringList("Multitran");}//{ return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &loadedDicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); virtual QStringList findSimilarWords(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); //friend class SettingsDialog; private: QStringList m_dictDirs; QHash m_loadedDicts; }; #endif // MULTITRAN_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/plugins/multitran/multitran.json000066400000000000000000000000551472531462200221300ustar00rootroot00000000000000{ "name": "multitran", "version" : "0.1" } qstardict-3.0.0/plugins/multitran/multitran.pro000066400000000000000000000032061472531462200217600ustar00rootroot00000000000000############################################################################# # multitran.pro - QStarDict, a StarDict clone written using Qt # # Copyright (C) 2008 Nick Shaforostoff # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = multitran include(../plugin.pri) win32:CONFIG += plugin HEADERS += multitran.h SOURCES += multitran.cpp # FORMS += settingsdialog.ui # RESOURCES += pixmaps/pixmaps.qrc LIBS += -lmtquery -lmtsupport -lbtree -lfacet OTHER_FILES += \ multitran.json qstardict-3.0.0/plugins/plugin.pri000066400000000000000000000031151472531462200172110ustar00rootroot00000000000000############################################################################# # plugin.pri - QStarDict, a StarDict clone written using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# isEmpty(TARGET):error(You must set TARGET before including $$_FILE_) TEMPLATE = lib include(../qstardict.pri) CONFIG += plugin INCLUDEPATH += $$dirname(PWD) target.path = $$PLUGINS_DIR INSTALLS += target qstardict-3.0.0/plugins/plugins.pro000066400000000000000000000027431472531462200174100ustar00rootroot00000000000000############################################################################# # plugins.pro - QStarDict, a StarDict clone written using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# isEmpty(ENABLED_PLUGINS):ENABLED_PLUGINS=stardict web TEMPLATE = subdirs SUBDIRS = $$ENABLED_PLUGINS qstardict-3.0.0/plugins/stardict/000077500000000000000000000000001472531462200170145ustar00rootroot00000000000000qstardict-3.0.0/plugins/stardict/dictziplib.cpp000066400000000000000000000417401472531462200216630ustar00rootroot00000000000000/* dictziplib.c -- * http://stardict.sourceforge.net * Copyright (C) 2003-2003 Hu Zheng * This file is a modify version of dictd-1.9.7's data.c * * data.c -- * Created: Tue Jul 16 12:45:41 1996 by faith@dict.org * Revised: Sat Mar 30 10:46:06 2002 by faith@dict.org * Copyright 1996, 1997, 1998, 2000, 2002 Rickard E. Faith (faith@dict.org) * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //#define HAVE_MMAP //it will defined in config.h. this can be done by configure.in with a AC_FUNC_MMAP. #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #ifdef Q_OS_UNIX #include #endif #ifdef Q_OS_WIN32 #include #endif #include #include #include #include "dictziplib.hpp" #define USE_CACHE 1 #define BUFFERSIZE 10240 /* * Output buffer must be greater than or * equal to 110% of input buffer size, plus * 12 bytes. */ #define OUT_BUFFER_SIZE 0xffffL #define IN_BUFFER_SIZE ((unsigned long)((double)(OUT_BUFFER_SIZE - 12) * 0.89)) /* For gzip-compatible header, as defined in RFC 1952 */ /* Magic for GZIP (rfc1952) */ #define GZ_MAGIC1 0x1f /* First magic byte */ #define GZ_MAGIC2 0x8b /* Second magic byte */ /* FLaGs (bitmapped), from rfc1952 */ #define GZ_FTEXT 0x01 /* Set for ASCII text */ #define GZ_FHCRC 0x02 /* Header CRC16 */ #define GZ_FEXTRA 0x04 /* Optional field (random access index) */ #define GZ_FNAME 0x08 /* Original name */ #define GZ_COMMENT 0x10 /* Zero-terminated, human-readable comment */ #define GZ_MAX 2 /* Maximum compression */ #define GZ_FAST 4 /* Fasted compression */ /* These are from rfc1952 */ #define GZ_OS_FAT 0 /* FAT filesystem (MS-DOS, OS/2, NT/Win32) */ #define GZ_OS_AMIGA 1 /* Amiga */ #define GZ_OS_VMS 2 /* VMS (or OpenVMS) */ #define GZ_OS_UNIX 3 /* Unix */ #define GZ_OS_VMCMS 4 /* VM/CMS */ #define GZ_OS_ATARI 5 /* Atari TOS */ #define GZ_OS_HPFS 6 /* HPFS filesystem (OS/2, NT) */ #define GZ_OS_MAC 7 /* Macintosh */ #define GZ_OS_Z 8 /* Z-System */ #define GZ_OS_CPM 9 /* CP/M */ #define GZ_OS_TOPS20 10 /* TOPS-20 */ #define GZ_OS_NTFS 11 /* NTFS filesystem (NT) */ #define GZ_OS_QDOS 12 /* QDOS */ #define GZ_OS_ACORN 13 /* Acorn RISCOS */ #define GZ_OS_UNKNOWN 255 /* unknown */ #define GZ_RND_S1 'R' /* First magic for random access format */ #define GZ_RND_S2 'A' /* Second magic for random access format */ #define GZ_ID1 0 /* GZ_MAGIC1 */ #define GZ_ID2 1 /* GZ_MAGIC2 */ #define GZ_CM 2 /* Compression Method (Z_DEFALTED) */ #define GZ_FLG 3 /* FLaGs (see above) */ #define GZ_MTIME 4 /* Modification TIME */ #define GZ_XFL 8 /* eXtra FLags (GZ_MAX or GZ_FAST) */ #define GZ_OS 9 /* Operating System */ #define GZ_XLEN 10 /* eXtra LENgth (16bit) */ #define GZ_FEXTRA_START 12 /* Start of extra fields */ #define GZ_SI1 12 /* Subfield ID1 */ #define GZ_SI2 13 /* Subfield ID2 */ #define GZ_SUBLEN 14 /* Subfield length (16bit) */ #define GZ_VERSION 16 /* Version for subfield format */ #define GZ_CHUNKLEN 18 /* Chunk length (16bit) */ #define GZ_CHUNKCNT 20 /* Number of chunks (16bit) */ #define GZ_RNDDATA 22 /* Random access data (16bit) */ #define DICT_UNKNOWN 0 #define DICT_TEXT 1 #define DICT_GZIP 2 #define DICT_DZIP 3 int dictData::read_header(const std::string &fname, int computeCRC) { FILE *str; int id1, id2, si1, si2; char buffer[BUFFERSIZE]; int extraLength, subLength; int i; char *pt; int c; struct stat sb; unsigned long crc = crc32( 0L, Z_NULL, 0 ); int count; unsigned long offset; if (!(str = fopen(fname.c_str(), "rb"))) { //err_fatal_errno( __FUNCTION__, // "Cannot open data file \"%s\" for read\n", filename ); } this->headerLength = GZ_XLEN - 1; this->type = DICT_UNKNOWN; id1 = getc( str ); id2 = getc( str ); if (id1 != GZ_MAGIC1 || id2 != GZ_MAGIC2) { this->type = DICT_TEXT; fstat( fileno( str ), &sb ); this->compressedLength = this->length = sb.st_size; this->origFilename = fname; this->mtime = sb.st_mtime; if (computeCRC) { rewind( str ); while (!feof( str )) { if ((count = fread( buffer, 1, BUFFERSIZE, str ))) { crc = crc32(crc, (Bytef *)buffer, count); } } } this->crc = crc; fclose( str ); return 0; } this->type = DICT_GZIP; this->method = getc( str ); this->flags = getc( str ); this->mtime = getc( str ) << 0; this->mtime |= getc( str ) << 8; this->mtime |= getc( str ) << 16; this->mtime |= getc( str ) << 24; this->extraFlags = getc( str ); this->os = getc( str ); if (this->flags & GZ_FEXTRA) { extraLength = getc( str ) << 0; extraLength |= getc( str ) << 8; this->headerLength += extraLength + 2; si1 = getc( str ); si2 = getc( str ); if (si1 == GZ_RND_S1 || si2 == GZ_RND_S2) { subLength = getc( str ) << 0; subLength |= getc( str ) << 8; this->version = getc( str ) << 0; this->version |= getc( str ) << 8; if (this->version != 1) { //err_internal( __FUNCTION__, // "dzip header version %d not supported\n", // this->version ); } this->chunkLength = getc( str ) << 0; this->chunkLength |= getc( str ) << 8; this->chunkCount = getc( str ) << 0; this->chunkCount |= getc( str ) << 8; if (this->chunkCount <= 0) { fclose( str ); return 5; } this->chunks = (int *)malloc(sizeof( this->chunks[0] ) * this->chunkCount ); for (i = 0; i < this->chunkCount; i++) { this->chunks[i] = getc( str ) << 0; this->chunks[i] |= getc( str ) << 8; } this->type = DICT_DZIP; } else { fseek( str, this->headerLength, SEEK_SET ); } } if (this->flags & GZ_FNAME) { /* FIXME! Add checking against header len */ pt = buffer; while ((c = getc( str )) && c != EOF) * pt++ = c; *pt = '\0'; this->origFilename = buffer; this->headerLength += this->origFilename.length() + 1; } else { this->origFilename = ""; } if (this->flags & GZ_COMMENT) { /* FIXME! Add checking for header len */ pt = buffer; while ((c = getc( str )) && c != EOF) * pt++ = c; *pt = '\0'; comment = buffer; headerLength += comment.length() + 1; } else { comment = ""; } if (this->flags & GZ_FHCRC) { getc( str ); getc( str ); this->headerLength += 2; } if (ftell( str ) != this->headerLength + 1) { //err_internal( __FUNCTION__, // "File position (%lu) != header length + 1 (%d)\n", // ftell( str ), this->headerLength + 1 ); } fseek( str, -8, SEEK_END ); this->crc = getc( str ) << 0; this->crc |= getc( str ) << 8; this->crc |= getc( str ) << 16; this->crc |= getc( str ) << 24; this->length = getc( str ) << 0; this->length |= getc( str ) << 8; this->length |= getc( str ) << 16; this->length |= getc( str ) << 24; this->compressedLength = ftell( str ); /* Compute offsets */ this->offsets = (unsigned long *)malloc( sizeof( this->offsets[0] ) * this->chunkCount ); for (offset = this->headerLength + 1, i = 0; i < this->chunkCount; i++) { this->offsets[i] = offset; offset += this->chunks[i]; } fclose( str ); return 0; } bool dictData::open(const std::string& fname, int computeCRC) { struct stat sb; int j; int fd; this->initialized = 0; #ifdef Q_OS_UNIX if (stat(fname.c_str(), &sb) || !S_ISREG(sb.st_mode)) #elif defined(Q_OS_WIN32) if (_stat(fname.c_str(), &sb) || !(sb.stMode & _S_IFREG)) #endif { //err_warning( __FUNCTION__, // "%s is not a regular file -- ignoring\n", fname ); return false; } if (read_header(fname, computeCRC)) { //err_fatal( __FUNCTION__, // "\"%s\" not in text or dzip format\n", fname ); return false; } if ((fd = ::open(fname.c_str(), O_RDONLY )) < 0) { //err_fatal_errno( __FUNCTION__, // "Cannot open data file \"%s\"\n", fname ); return false; } if (fstat(fd, &sb)) { //err_fatal_errno( __FUNCTION__, // "Cannot stat data file \"%s\"\n", fname ); return false; } this->size = sb.st_size; ::close(fd); if (!mapfile.open(fname.c_str(), size)) return false; this->start = mapfile.begin(); this->end = this->start + this->size; for (j = 0; j < DICT_CACHE_SIZE; j++) { cache[j].chunk = -1; cache[j].stamp = -1; cache[j].inBuffer = NULL; cache[j].count = 0; } return true; } void dictData::close() { int i; if (this->chunks) free(this->chunks); if (this->offsets) free(this->offsets); if (this->initialized) { if (inflateEnd( &this->zStream )) { //err_internal( __FUNCTION__, // "Cannot shut down inflation engine: %s\n", // this->zStream.msg ); } } for (i = 0; i < DICT_CACHE_SIZE; ++i) { if (this -> cache [i].inBuffer) free (this -> cache [i].inBuffer); } } void dictData::read(char *buffer, unsigned long start, unsigned long size) { char *pt; unsigned long end; int count; char *inBuffer; char outBuffer[OUT_BUFFER_SIZE]; int firstChunk, lastChunk; int firstOffset, lastOffset; int i, j; int found, target, lastStamp; static int stamp = 0; end = start + size; //buffer = malloc( size + 1 ); //PRINTF(DBG_UNZIP, // ("dict_data_read( %p, %lu, %lu )\n", //h, start, size )); switch (this->type) { case DICT_GZIP: //err_fatal( __FUNCTION__, // "Cannot seek on pure gzip format files.\n" // "Use plain text (for performance)" // " or dzip format (for space savings).\n" ); break; case DICT_TEXT: memcpy( buffer, this->start + start, size ); //buffer[size] = '\0'; break; case DICT_DZIP: if (!this->initialized) { ++this->initialized; this->zStream.zalloc = NULL; this->zStream.zfree = NULL; this->zStream.opaque = NULL; this->zStream.next_in = 0; this->zStream.avail_in = 0; this->zStream.next_out = NULL; this->zStream.avail_out = 0; if (inflateInit2( &this->zStream, -15 ) != Z_OK) { //err_internal( __FUNCTION__, // "Cannot initialize inflation engine: %s\n", //this->zStream.msg ); } } firstChunk = start / this->chunkLength; firstOffset = start - firstChunk * this->chunkLength; lastChunk = end / this->chunkLength; lastOffset = end - lastChunk * this->chunkLength; //PRINTF(DBG_UNZIP, // (" start = %lu, end = %lu\n" //"firstChunk = %d, firstOffset = %d," //" lastChunk = %d, lastOffset = %d\n", //start, end, firstChunk, firstOffset, lastChunk, lastOffset )); for (pt = buffer, i = firstChunk; i <= lastChunk; i++) { /* Access cache */ found = 0; target = 0; lastStamp = INT_MAX; for (j = 0; j < DICT_CACHE_SIZE; j++) { #if USE_CACHE if (this->cache[j].chunk == i) { found = 1; target = j; break; } #endif if (this->cache[j].stamp < lastStamp) { lastStamp = this->cache[j].stamp; target = j; } } this->cache[target].stamp = ++stamp; if (found) { count = this->cache[target].count; inBuffer = this->cache[target].inBuffer; } else { this->cache[target].chunk = i; if (!this->cache[target].inBuffer) this->cache[target].inBuffer = (char *)malloc( IN_BUFFER_SIZE ); inBuffer = this->cache[target].inBuffer; if (this->chunks[i] >= OUT_BUFFER_SIZE ) { //err_internal( __FUNCTION__, // "this->chunks[%d] = %d >= %ld (OUT_BUFFER_SIZE)\n", // i, this->chunks[i], OUT_BUFFER_SIZE ); } memcpy( outBuffer, this->start + this->offsets[i], this->chunks[i] ); this->zStream.next_in = (Bytef *)outBuffer; this->zStream.avail_in = this->chunks[i]; this->zStream.next_out = (Bytef *)inBuffer; this->zStream.avail_out = IN_BUFFER_SIZE; if (inflate( &this->zStream, Z_PARTIAL_FLUSH ) != Z_OK) { //err_fatal( __FUNCTION__, "inflate: %s\n", this->zStream.msg ); } if (this->zStream.avail_in) { //err_internal( __FUNCTION__, // "inflate did not flush (%d pending, %d avail)\n", // this->zStream.avail_in, this->zStream.avail_out ); } count = IN_BUFFER_SIZE - this->zStream.avail_out; this->cache[target].count = count; } if (i == firstChunk) { if (i == lastChunk) { memcpy( pt, inBuffer + firstOffset, lastOffset - firstOffset); pt += lastOffset - firstOffset; } else { if (count != this->chunkLength ) { //err_internal( __FUNCTION__, // "Length = %d instead of %d\n", //count, this->chunkLength ); } memcpy( pt, inBuffer + firstOffset, this->chunkLength - firstOffset ); pt += this->chunkLength - firstOffset; } } else if (i == lastChunk) { memcpy( pt, inBuffer, lastOffset ); pt += lastOffset; } else { assert( count == this->chunkLength ); memcpy( pt, inBuffer, this->chunkLength ); pt += this->chunkLength; } } //*pt = '\0'; break; case DICT_UNKNOWN: //err_fatal( __FUNCTION__, "Cannot read unknown file type\n" ); break; } } qstardict-3.0.0/plugins/stardict/dictziplib.hpp000066400000000000000000000023051472531462200216620ustar00rootroot00000000000000#ifndef __DICT_ZIP_LIB_H__ #define __DICT_ZIP_LIB_H__ #include #include #include #include "mapfile.hpp" #define DICT_CACHE_SIZE 5 struct dictCache { int chunk; char *inBuffer; int stamp; int count; }; struct dictData { dictData() {} bool open(const std::string& filename, int computeCRC); void close(); void read(char *buffer, unsigned long start, unsigned long size); ~dictData() { close(); } private: const char *start; /* start of mmap'd area */ const char *end; /* end of mmap'd area */ unsigned long size; /* size of mmap */ int type; z_stream zStream; int initialized; int headerLength; int method; int flags; time_t mtime; int extraFlags; int os; int version; int chunkLength; int chunkCount; int *chunks; unsigned long *offsets; /* Sum-scan of chunks. */ std::string origFilename; std::string comment; unsigned long crc; unsigned long length; unsigned long compressedLength; dictCache cache[DICT_CACHE_SIZE]; MapFile mapfile; int read_header(const std::string &filename, int computeCRC); }; #endif//!__DICT_ZIP_LIB_H__ qstardict-3.0.0/plugins/stardict/distance.cpp000066400000000000000000000132571472531462200213220ustar00rootroot00000000000000/* writer : Opera Wang E-Mail : wangvisual AT sohu DOT com License: GPL */ /* filename: distance.cc */ /* http://www.merriampark.com/ld.htm What is Levenshtein Distance? Levenshtein distance (LD) is a measure of the similarity between two strings, which we will refer to as the source string (s) and the target string (t). The distance is the number of deletions, insertions, or substitutions required to transform s into t. For example, * If s is "test" and t is "test", then LD(s,t) = 0, because no transformations are needed. The strings are already identical. * If s is "test" and t is "tent", then LD(s,t) = 1, because one substitution (change "s" to "n") is sufficient to transform s into t. The greater the Levenshtein distance, the more different the strings are. Levenshtein distance is named after the Russian scientist Vladimir Levenshtein, who devised the algorithm in 1965. If you can't spell or pronounce Levenshtein, the metric is also sometimes called edit distance. The Levenshtein distance algorithm has been used in: * Spell checking * Speech recognition * DNA analysis * Plagiarism detection */ #include #include //#include #include "distance.h" #define OPTIMIZE_ED /* Cover transposition, in addition to deletion, insertion and substitution. This step is taken from: Berghel, Hal ; Roach, David : "An Extension of Ukkonen's Enhanced Dynamic Programming ASM Algorithm" (http://www.acm.org/~hlb/publications/asm/asm.html) */ #define COVER_TRANSPOSITION /****************************************/ /*Implementation of Levenshtein distance*/ /****************************************/ EditDistance::EditDistance() { currentelements = 2500; // It's enough for most conditions :-) d = (int*)malloc(sizeof(int) * currentelements); } EditDistance::~EditDistance() { // printf("size:%d\n",currentelements); if (d) free(d); } #ifdef OPTIMIZE_ED int EditDistance::CalEditDistance(const gunichar *s, const gunichar *t, const int limit) /*Compute levenshtein distance between s and t, this is using QUICK algorithm*/ { int n = 0, m = 0, iLenDif, k, i, j, cost; // Remove leftmost matching portion of strings while ( *s && (*s == *t) ) { s++; t++; } while (s[n]) { n++; } while (t[m]) { m++; } // Remove rightmost matching portion of strings by decrement n and m. while ( n && m && (*(s + n - 1) == *(t + m - 1)) ) { n--; m--; } if ( m == 0 || n == 0 || d == (int*)0 ) return (m + n); if ( m < n ) { const gunichar * temp = s; int itemp = n; s = t; t = temp; n = m; m = itemp; } iLenDif = m - n; if ( iLenDif >= limit ) return iLenDif; // step 1 n++; m++; // d=(int*)malloc(sizeof(int)*m*n); if ( m*n > currentelements ) { currentelements = m * n * 2; // double the request d = (int*)realloc(d, sizeof(int) * currentelements); if ( (int*)0 == d ) return (m + n); } // step 2, init matrix for (k = 0;k < n;k++) d[k] = k; for (k = 1;k < m;k++) d[k*n] = k; // step 3 for (i = 1;i < n;i++) { // first calculate column, d(i,j) for ( j = 1;j < iLenDif + i;j++ ) { cost = s[i - 1] == t[j - 1] ? 0 : 1; d[j*n + i] = minimum(d[(j - 1) * n + i] + 1, d[j * n + i - 1] + 1, d[(j - 1) * n + i - 1] + cost); #ifdef COVER_TRANSPOSITION if ( i >= 2 && j >= 2 && (d[j*n + i] - d[(j - 2)*n + i - 2] == 2) && (s[i - 2] == t[j - 1]) && (s[i - 1] == t[j - 2]) ) d[j*n + i]--; #endif } // second calculate row, d(k,j) // now j==iLenDif+i; for ( k = 1;k <= i;k++ ) { cost = s[k - 1] == t[j - 1] ? 0 : 1; d[j*n + k] = minimum(d[(j - 1) * n + k] + 1, d[j * n + k - 1] + 1, d[(j - 1) * n + k - 1] + cost); #ifdef COVER_TRANSPOSITION if ( k >= 2 && j >= 2 && (d[j*n + k] - d[(j - 2)*n + k - 2] == 2) && (s[k - 2] == t[j - 1]) && (s[k - 1] == t[j - 2]) ) d[j*n + k]--; #endif } // test if d(i,j) limit gets equal or exceed if ( d[j*n + i] >= limit ) { return d[j*n + i]; } } // d(n-1,m-1) return d[n*m - 1]; } #else int EditDistance::CalEditDistance(const char *s, const char *t, const int limit) { //Step 1 int k, i, j, n, m, cost; n = strlen(s); m = strlen(t); if ( n != 0 && m != 0 && d != (int*)0 ) { m++; n++; if ( m*n > currentelements ) { currentelements = m * n * 2; d = (int*)realloc(d, sizeof(int) * currentelements); if ( (int*)0 == d ) return (m + n); } //Step 2 for (k = 0;k < n;k++) d[k] = k; for (k = 0;k < m;k++) d[k*n] = k; //Step 3 and 4 for (i = 1;i < n;i++) for (j = 1;j < m;j++) { //Step 5 if (s[i - 1] == t[j - 1]) cost = 0; else cost = 1; //Step 6 d[j*n + i] = minimum(d[(j - 1) * n + i] + 1, d[j * n + i - 1] + 1, d[(j - 1) * n + i - 1] + cost); #ifdef COVER_TRANSPOSITION if ( i >= 2 && j >= 2 && (d[j*n + i] - d[(j - 2)*n + i - 2] == 2) && (s[i - 2] == t[j - 1]) && (s[i - 1] == t[j - 2]) ) d[j*n + i]--; #endif } return d[n*m - 1]; } else return (n + m); } #endif qstardict-3.0.0/plugins/stardict/distance.h000066400000000000000000000011111472531462200207510ustar00rootroot00000000000000#ifndef DISTANCE_H #define DISTANCE_H #include class EditDistance { private: int *d; int currentelements; /*Gets the minimum of three values */ inline int minimum( const int a, const int b, const int c ) { int min = a; if ( b < min ) min = b; if ( c < min ) min = c; return min; }; public: EditDistance( ); ~EditDistance( ); int CalEditDistance( const gunichar *s, const gunichar *t, const int limit ); }; #endif qstardict-3.0.0/plugins/stardict/file.hpp000066400000000000000000000035501472531462200204470ustar00rootroot00000000000000#ifndef _FILE_HPP_ #define _FILE_HPP_ #include #include #include #include typedef std::list List; template void __for_each_file(const std::string& dirname, const std::string& suff, const List& order_list, const List& disable_list, Function f) { GDir *dir = g_dir_open(dirname.c_str(), 0, NULL); if (dir) { const gchar *filename; while ((filename = g_dir_read_name(dir)) != NULL) { std::string fullfilename(dirname + G_DIR_SEPARATOR_S + filename); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_IS_DIR)) __for_each_file(fullfilename, suff, order_list, disable_list, f); else if (g_str_has_suffix(filename, suff.c_str()) && std::find(order_list.begin(), order_list.end(), fullfilename) == order_list.end()) { bool disable = std::find(disable_list.begin(), disable_list.end(), fullfilename) != disable_list.end(); f(fullfilename, disable); } } g_dir_close(dir); } } template void for_each_file(const List& dirs_list, const std::string& suff, const List& order_list, const List& disable_list, Function f) { List::const_iterator it; for (it = order_list.begin(); it != order_list.end(); ++it) { bool disable = std::find(disable_list.begin(), disable_list.end(), *it) != disable_list.end(); f(*it, disable); } for (it = dirs_list.begin(); it != dirs_list.end(); ++it) __for_each_file(*it, suff, order_list, disable_list, f); } #endif//!_FILE_HPP_ qstardict-3.0.0/plugins/stardict/lib.cpp000066400000000000000000001600371472531462200202750ustar00rootroot00000000000000#ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include "distance.h" #include "file.hpp" #include "mapfile.hpp" #include "lib.h" // Notice: read src/tools/DICTFILE_FORMAT for the dictionary // file's format information! static inline bool bIsVowel(gchar inputchar) { gchar ch = g_ascii_toupper(inputchar); return ( ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U' ); } static bool bIsPureEnglish(const gchar *str) { // i think this should work even when it is UTF8 string :). for (int i = 0; str[i] != 0; i++) //if(str[i]<0) //if(str[i]<32 || str[i]>126) // tab equal 9,so this is not OK. // Better use isascii() but not str[i]<0 while char is default unsigned in arm if (!isascii(str[i])) return false; return true; } static inline gint stardict_strcmp(const gchar *s1, const gchar *s2) { gint a = g_ascii_strcasecmp(s1, s2); if (a == 0) return strcmp(s1, s2); else return a; } bool DictInfo::load_from_ifo_file(const std::string& ifofilename, bool istreedict) { ifo_file_name = ifofilename; gchar *buffer; if (!g_file_get_contents(ifofilename.c_str(), &buffer, NULL, NULL)) return false; #define TREEDICT_MAGIC_DATA "StarDict's treedict ifo file\nversion=2.4.2\n" #define DICT_MAGIC_DATA "StarDict's dict ifo file\nversion=2.4.2\n" const gchar *magic_data = istreedict ? TREEDICT_MAGIC_DATA : DICT_MAGIC_DATA; if (!g_str_has_prefix(buffer, magic_data)) { g_free(buffer); return false; } gchar *p1, *p2, *p3; p1 = buffer + strlen(magic_data) - 1; p2 = strstr(p1, "\nwordcount="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\nwordcount=") - 1, '\n'); gchar *tmpstr = (gchar *)g_memdup2(p2 + sizeof("\nwordcount=") - 1, p3 - (p2 + sizeof("\nwordcount=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\nwordcount=") - 1)] = '\0'; wordcount = atol(tmpstr); g_free(tmpstr); if (istreedict) { p2 = strstr(p1, "\ntdxfilesize="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\ntdxfilesize=") - 1, '\n'); tmpstr = (gchar *)g_memdup2(p2 + sizeof("\ntdxfilesize=") - 1, p3 - (p2 + sizeof("\ntdxfilesize=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\ntdxfilesize=") - 1)] = '\0'; index_file_size = atol(tmpstr); g_free(tmpstr); } else { p2 = strstr(p1, "\nidxfilesize="); if (!p2) { g_free(buffer); return false; } p3 = strchr(p2 + sizeof("\nidxfilesize=") - 1, '\n'); tmpstr = (gchar *)g_memdup2(p2 + sizeof("\nidxfilesize=") - 1, p3 - (p2 + sizeof("\nidxfilesize=") - 1) + 1); tmpstr[p3 - (p2 + sizeof("\nidxfilesize=") - 1)] = '\0'; index_file_size = atol(tmpstr); g_free(tmpstr); } p2 = strstr(p1, "\nbookname="); if (!p2) { g_free(buffer); return false; } p2 = p2 + sizeof("\nbookname=") - 1; p3 = strchr(p2, '\n'); bookname.assign(p2, p3 - p2); p2 = strstr(p1, "\nauthor="); if (p2) { p2 = p2 + sizeof("\nauthor=") - 1; p3 = strchr(p2, '\n'); author.assign(p2, p3 - p2); } p2 = strstr(p1, "\nemail="); if (p2) { p2 = p2 + sizeof("\nemail=") - 1; p3 = strchr(p2, '\n'); email.assign(p2, p3 - p2); } p2 = strstr(p1, "\nwebsite="); if (p2) { p2 = p2 + sizeof("\nwebsite=") - 1; p3 = strchr(p2, '\n'); website.assign(p2, p3 - p2); } p2 = strstr(p1, "\ndate="); if (p2) { p2 = p2 + sizeof("\ndate=") - 1; p3 = strchr(p2, '\n'); date.assign(p2, p3 - p2); } p2 = strstr(p1, "\ndescription="); if (p2) { p2 = p2 + sizeof("\ndescription=") - 1; p3 = strchr(p2, '\n'); description.assign(p2, p3 - p2); } p2 = strstr(p1, "\nsametypesequence="); if (p2) { p2 += sizeof("\nsametypesequence=") - 1; p3 = strchr(p2, '\n'); sametypesequence.assign(p2, p3 - p2); } g_free(buffer); return true; } //=================================================================== DictBase::DictBase() { dictfile = NULL; cache_cur = 0; } DictBase::~DictBase() { if (dictfile) fclose(dictfile); } gchar* DictBase::GetWordData(guint32 idxitem_offset, guint32 idxitem_size) { for (int i = 0; i < WORDDATA_CACHE_NUM; i++) if (cache[i].data && cache[i].offset == idxitem_offset) return cache[i].data; if (dictfile) fseek(dictfile, idxitem_offset, SEEK_SET); gchar *data; if (!sametypesequence.empty()) { gchar *origin_data = (gchar *)g_malloc(idxitem_size); if (dictfile) fread(origin_data, idxitem_size, 1, dictfile); else dictdzfile->read(origin_data, idxitem_offset, idxitem_size); guint32 data_size; gint sametypesequence_len = sametypesequence.length(); //there have sametypesequence_len char being omitted. data_size = idxitem_size + sizeof(guint32) + sametypesequence_len; //if the last item's size is determined by the end up '\0',then +=sizeof(gchar); //if the last item's size is determined by the head guint32 type data,then +=sizeof(guint32); switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': data_size += sizeof(gchar); break; case 'W': case 'P': data_size += sizeof(guint32); break; default: if (g_ascii_isupper(sametypesequence[sametypesequence_len - 1])) data_size += sizeof(guint32); else data_size += sizeof(gchar); break; } data = (gchar *)g_malloc(data_size); gchar *p1, *p2; p1 = data + sizeof(guint32); p2 = origin_data; guint32 sec_size; //copy the head items. for (int i = 0; i < sametypesequence_len - 1; i++) { *p1 = sametypesequence[i]; p1 += sizeof(gchar); switch (sametypesequence[i]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': sec_size = strlen(p2) + 1; memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; case 'W': case 'P': sec_size = *reinterpret_cast(p2); sec_size += sizeof(guint32); memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; default: if (g_ascii_isupper(sametypesequence[i])) { sec_size = *reinterpret_cast(p2); sec_size += sizeof(guint32); } else { sec_size = strlen(p2) + 1; } memcpy(p1, p2, sec_size); p1 += sec_size; p2 += sec_size; break; } } //calculate the last item 's size. sec_size = idxitem_size - (p2 - origin_data); *p1 = sametypesequence[sametypesequence_len - 1]; p1 += sizeof(gchar); switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': memcpy(p1, p2, sec_size); p1 += sec_size; *p1 = '\0'; //add the end up '\0'; break; case 'W': case 'P': *reinterpret_cast(p1) = sec_size; p1 += sizeof(guint32); memcpy(p1, p2, sec_size); break; default: if (g_ascii_isupper(sametypesequence[sametypesequence_len - 1])) { *reinterpret_cast(p1) = sec_size; p1 += sizeof(guint32); memcpy(p1, p2, sec_size); } else { memcpy(p1, p2, sec_size); p1 += sec_size; *p1 = '\0'; } break; } g_free(origin_data); *reinterpret_cast(data) = data_size; } else { data = (gchar *)g_malloc(idxitem_size + sizeof(guint32)); if (dictfile) fread(data + sizeof(guint32), idxitem_size, 1, dictfile); else dictdzfile->read(data + sizeof(guint32), idxitem_offset, idxitem_size); *reinterpret_cast(data) = idxitem_size + sizeof(guint32); } g_free(cache[cache_cur].data); cache[cache_cur].data = data; cache[cache_cur].offset = idxitem_offset; cache_cur++; if (cache_cur == WORDDATA_CACHE_NUM) cache_cur = 0; return data; } inline bool DictBase::containSearchData() { if (sametypesequence.empty()) return true; return sametypesequence.find_first_of("mlgxty") != std::string::npos; } bool DictBase::SearchData(std::vector &SearchWords, guint32 idxitem_offset, guint32 idxitem_size, gchar *origin_data) { int nWord = SearchWords.size(); std::vector WordFind(nWord, false); int nfound = 0; if (dictfile) fseek(dictfile, idxitem_offset, SEEK_SET); if (dictfile) fread(origin_data, idxitem_size, 1, dictfile); else dictdzfile->read(origin_data, idxitem_offset, idxitem_size); gchar *p = origin_data; guint32 sec_size; int j; if (!sametypesequence.empty()) { gint sametypesequence_len = sametypesequence.length(); for (int i = 0; i < sametypesequence_len - 1; i++) { switch (sametypesequence[i]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': for (j = 0; j < nWord; j++) if (!WordFind[j] && strstr(p, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; sec_size = strlen(p) + 1; p += sec_size; break; default: if (g_ascii_isupper(sametypesequence[i])) { sec_size = *reinterpret_cast(p); sec_size += sizeof(guint32); } else { sec_size = strlen(p) + 1; } p += sec_size; } } switch (sametypesequence[sametypesequence_len - 1]) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': sec_size = idxitem_size - (p - origin_data); for (j = 0; j < nWord; j++) if (!WordFind[j] && g_strstr_len(p, sec_size, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; break; } } else { while (guint32(p - origin_data) < idxitem_size) { switch (*p) { case 'm': case 't': case 'y': case 'l': case 'g': case 'x': for (j = 0; j < nWord; j++) if (!WordFind[j] && strstr(p, SearchWords[j].c_str())) { WordFind[j] = true; ++nfound; } if (nfound == nWord) return true; sec_size = strlen(p) + 1; p += sec_size; break; default: if (g_ascii_isupper(*p)) { sec_size = *reinterpret_cast(p); sec_size += sizeof(guint32); } else { sec_size = strlen(p) + 1; } p += sec_size; } } } return false; } class offset_index : public index_file { public: offset_index() : idxfile(NULL) {} ~offset_index(); bool load(const std::string& url, gulong wc, gulong fsize); const gchar *get_key(glong idx); void get_data(glong idx); const gchar *get_key_and_data(glong idx); bool lookup(const char *str, glong &idx); private: static const gint ENTR_PER_PAGE = 32; static const char *CACHE_MAGIC; std::vector wordoffset; FILE *idxfile; gulong wordcount; gchar wordentry_buf[256 + sizeof(guint32)*2]; // The length of "word_str" should be less than 256. See src/tools/DICTFILE_FORMAT. struct index_entry { glong idx; std::string keystr; void assign(glong i, const std::string& str) { idx = i; keystr.assign(str); } }; index_entry first, last, middle, real_last; struct page_entry { gchar *keystr; guint32 off, size; }; std::vector page_data; struct page_t { glong idx; page_entry entries[ENTR_PER_PAGE]; page_t(): idx( -1) {} void fill(gchar *data, gint nent, glong idx_); } page; gulong load_page(glong page_idx); const gchar *read_first_on_page_key(glong page_idx); const gchar *get_first_on_page_key(glong page_idx); bool load_cache(const std::string& url); bool save_cache(const std::string& url); static strlist_t get_cache_variant(const std::string& url); }; const char *offset_index::CACHE_MAGIC = "StarDict's Cache, Version: 0.1"; class wordlist_index : public index_file { public: wordlist_index() : idxdatabuf(NULL) {} ~wordlist_index(); bool load(const std::string& url, gulong wc, gulong fsize); const gchar *get_key(glong idx); void get_data(glong idx); const gchar *get_key_and_data(glong idx); bool lookup(const char *str, glong &idx); private: gchar *idxdatabuf; std::vector wordlist; }; void offset_index::page_t::fill(gchar *data, gint nent, glong idx_) { idx = idx_; gchar *p = data; glong len; for (gint i = 0; i < nent; ++i) { entries[i].keystr = p; len = strlen(p); p += len + 1; entries[i].off = g_ntohl(*reinterpret_cast(p)); p += sizeof(guint32); entries[i].size = g_ntohl(*reinterpret_cast(p)); p += sizeof(guint32); } } offset_index::~offset_index() { if (idxfile) fclose(idxfile); } inline const gchar *offset_index::read_first_on_page_key(glong page_idx) { fseek(idxfile, wordoffset[page_idx], SEEK_SET); guint page_size = wordoffset[page_idx + 1] - wordoffset[page_idx]; fread(wordentry_buf, std::min(sizeof(wordentry_buf), page_size), 1, idxfile); //TODO: check returned values, deal with word entry that strlen>255. return wordentry_buf; } inline const gchar *offset_index::get_first_on_page_key(glong page_idx) { if (page_idx < middle.idx) { if (page_idx == first.idx) return first.keystr.c_str(); return read_first_on_page_key(page_idx); } else if (page_idx > middle.idx) { if (page_idx == last.idx) return last.keystr.c_str(); return read_first_on_page_key(page_idx); } else return middle.keystr.c_str(); } bool offset_index::load_cache(const std::string& url) { strlist_t vars = get_cache_variant(url); for (strlist_t::const_iterator it = vars.begin(); it != vars.end(); ++it) { struct stat idxstat, cachestat; if (g_stat(url.c_str(), &idxstat) != 0 || g_stat(it->c_str(), &cachestat) != 0) continue; if (cachestat.st_mtime < idxstat.st_mtime) continue; MapFile mf; if (!mf.open(it->c_str(), cachestat.st_size)) continue; if (strncmp(mf.begin(), CACHE_MAGIC, strlen(CACHE_MAGIC)) != 0) continue; memcpy(&wordoffset[0], mf.begin() + strlen(CACHE_MAGIC), wordoffset.size()*sizeof(wordoffset[0])); return true; } return false; } strlist_t offset_index::get_cache_variant(const std::string& url) { strlist_t res; res.push_back(url + ".oft"); if (!g_file_test(g_get_user_cache_dir(), G_FILE_TEST_EXISTS) && g_mkdir(g_get_user_cache_dir(), 0700) == -1) return res; std::string cache_dir = std::string(g_get_user_cache_dir()) + G_DIR_SEPARATOR_S + "sdcv"; if (!g_file_test(cache_dir.c_str(), G_FILE_TEST_EXISTS)) { if (g_mkdir(cache_dir.c_str(), 0700) == -1) return res; } else if (!g_file_test(cache_dir.c_str(), G_FILE_TEST_IS_DIR)) return res; gchar *base = g_path_get_basename(url.c_str()); res.push_back(cache_dir + G_DIR_SEPARATOR_S + base + ".oft"); g_free(base); return res; } bool offset_index::save_cache(const std::string& url) { strlist_t vars = get_cache_variant(url); for (strlist_t::const_iterator it = vars.begin(); it != vars.end(); ++it) { FILE *out = fopen(it->c_str(), "wb"); if (!out) continue; if (fwrite(CACHE_MAGIC, 1, strlen(CACHE_MAGIC), out) != strlen(CACHE_MAGIC)) continue; if (fwrite(&wordoffset[0], sizeof(wordoffset[0]), wordoffset.size(), out) != wordoffset.size()) continue; fclose(out); printf("save to cache %s\n", url.c_str()); return true; } return false; } bool offset_index::load(const std::string& url, gulong wc, gulong fsize) { wordcount = wc; gulong npages = (wc - 1) / ENTR_PER_PAGE + 2; wordoffset.resize(npages); if (!load_cache(url)) { //map file will close after finish of block MapFile map_file; if (!map_file.open(url.c_str(), fsize)) return false; const gchar *idxdatabuffer = map_file.begin(); const gchar *p1 = idxdatabuffer; gulong index_size; guint32 j = 0; for (guint32 i = 0; i < wc; i++) { index_size = strlen(p1) + 1 + 2 * sizeof(guint32); if (i % ENTR_PER_PAGE == 0) { wordoffset[j] = p1 - idxdatabuffer; ++j; } p1 += index_size; } wordoffset[j] = p1 - idxdatabuffer; if (!save_cache(url)) fprintf(stderr, "cache update failed\n"); } if (!(idxfile = fopen(url.c_str(), "rb"))) { wordoffset.resize(0); return false; } first.assign(0, read_first_on_page_key(0)); last.assign(wordoffset.size() - 2, read_first_on_page_key(wordoffset.size() - 2)); middle.assign((wordoffset.size() - 2) / 2, read_first_on_page_key((wordoffset.size() - 2) / 2)); real_last.assign(wc - 1, get_key(wc - 1)); return true; } inline gulong offset_index::load_page(glong page_idx) { gulong nentr = ENTR_PER_PAGE; if (page_idx == glong(wordoffset.size() - 2)) if ((nentr = wordcount % ENTR_PER_PAGE) == 0) nentr = ENTR_PER_PAGE; if (page_idx != page.idx) { page_data.resize(wordoffset[page_idx + 1] - wordoffset[page_idx]); fseek(idxfile, wordoffset[page_idx], SEEK_SET); fread(&page_data[0], 1, page_data.size(), idxfile); page.fill(&page_data[0], nentr, page_idx); } return nentr; } const gchar *offset_index::get_key(glong idx) { load_page(idx / ENTR_PER_PAGE); glong idx_in_page = idx % ENTR_PER_PAGE; wordentry_offset = page.entries[idx_in_page].off; wordentry_size = page.entries[idx_in_page].size; return page.entries[idx_in_page].keystr; } void offset_index::get_data(glong idx) { get_key(idx); } const gchar *offset_index::get_key_and_data(glong idx) { return get_key(idx); } bool offset_index::lookup(const char *str, glong &idx) { bool bFound = false; glong iFrom; glong iTo = wordoffset.size() - 2; gint cmpint; glong iThisIndex; if (stardict_strcmp(str, first.keystr.c_str()) < 0) { idx = 0; return false; } else if (stardict_strcmp(str, real_last.keystr.c_str()) > 0) { idx = INVALID_INDEX; return false; } else { iFrom = 0; iThisIndex = 0; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, get_first_on_page_key(iThisIndex)); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } if (!bFound) idx = iTo; //prev else idx = iThisIndex; } if (!bFound) { gulong netr = load_page(idx); iFrom = 1; // Needn't search the first word anymore. iTo = netr - 1; iThisIndex = 0; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, page.entries[iThisIndex].keystr); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } idx *= ENTR_PER_PAGE; if (!bFound) idx += iFrom; //next else idx += iThisIndex; } else { idx *= ENTR_PER_PAGE; } return bFound; } wordlist_index::~wordlist_index() { g_free(idxdatabuf); } bool wordlist_index::load(const std::string& url, gulong wc, gulong fsize) { gzFile in = gzopen(url.c_str(), "rb"); if (in == NULL) return false; idxdatabuf = (gchar *)g_malloc(fsize); gulong len = gzread(in, idxdatabuf, fsize); gzclose(in); if (len != fsize) return false; wordlist.resize(wc + 1); gchar *p1 = idxdatabuf; guint32 i; for (i = 0; i < wc; i++) { wordlist[i] = p1; p1 += strlen(p1) + 1 + 2 * sizeof(guint32); } wordlist[wc] = p1; return true; } const gchar *wordlist_index::get_key(glong idx) { return wordlist[idx]; } void wordlist_index::get_data(glong idx) { gchar *p1 = wordlist[idx] + strlen(wordlist[idx]) + sizeof(gchar); wordentry_offset = g_ntohl(*reinterpret_cast(p1)); p1 += sizeof(guint32); wordentry_size = g_ntohl(*reinterpret_cast(p1)); } const gchar *wordlist_index::get_key_and_data(glong idx) { get_data(idx); return get_key(idx); } bool wordlist_index::lookup(const char *str, glong &idx) { bool bFound = false; glong iTo = wordlist.size() - 2; if (stardict_strcmp(str, get_key(0)) < 0) { idx = 0; } else if (stardict_strcmp(str, get_key(iTo)) > 0) { idx = INVALID_INDEX; } else { glong iThisIndex = 0; glong iFrom = 0; gint cmpint; while (iFrom <= iTo) { iThisIndex = (iFrom + iTo) / 2; cmpint = stardict_strcmp(str, get_key(iThisIndex)); if (cmpint > 0) iFrom = iThisIndex + 1; else if (cmpint < 0) iTo = iThisIndex - 1; else { bFound = true; break; } } if (!bFound) idx = iFrom; //next else idx = iThisIndex; } return bFound; } //=================================================================== bool Dict::load(const std::string& ifofilename) { gulong idxfilesize; if (!load_ifofile(ifofilename, idxfilesize)) return false; std::string fullfilename(ifofilename); fullfilename.replace(fullfilename.length() - sizeof("ifo") + 1, sizeof("ifo") - 1, "dict.dz"); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_EXISTS)) { dictdzfile.reset(new dictData); if (!dictdzfile->open(fullfilename, 0)) { //g_print("open file %s failed!\n",fullfilename); return false; } } else { fullfilename.erase(fullfilename.length() - sizeof(".dz") + 1, sizeof(".dz") - 1); dictfile = fopen(fullfilename.c_str(), "rb"); if (!dictfile) { //g_print("open file %s failed!\n",fullfilename); return false; } } fullfilename = ifofilename; fullfilename.replace(fullfilename.length() - sizeof("ifo") + 1, sizeof("ifo") - 1, "idx.gz"); if (g_file_test(fullfilename.c_str(), G_FILE_TEST_EXISTS)) { idx_file.reset(new wordlist_index); } else { fullfilename.erase(fullfilename.length() - sizeof(".gz") + 1, sizeof(".gz") - 1); idx_file.reset(new offset_index); } if (!idx_file->load(fullfilename, wordcount, idxfilesize)) return false; //g_print("bookname: %s , wordcount %lu\n", bookname.c_str(), narticles()); return true; } bool Dict::load_ifofile(const std::string& ifofilename, gulong &idxfilesize) { DictInfo dict_info; if (!dict_info.load_from_ifo_file(ifofilename, false)) return false; if (dict_info.wordcount == 0) return false; ifo_file_name = dict_info.ifo_file_name; wordcount = dict_info.wordcount; bookname = dict_info.bookname; idxfilesize = dict_info.index_file_size; sametypesequence = dict_info.sametypesequence; return true; } bool Dict::LookupWithRule(GPatternSpec *pspec, glong *aIndex, int iBuffLen) { int iIndexCount = 0; for (guint32 i = 0; i < narticles() && iIndexCount < iBuffLen - 1; i++) if (g_pattern_spec_match_string(pspec, get_key(i))) aIndex[iIndexCount++] = i; aIndex[iIndexCount] = -1; // -1 is the end. return (iIndexCount > 0); } //=================================================================== Libs::Libs(progress_func_t f) { progress_func = f; iMaxFuzzyDistance = MAX_FUZZY_DISTANCE; //need to read from cfg. } Libs::~Libs() { for (std::vector::iterator p = oLib.begin(); p != oLib.end(); ++p) delete *p; } void Libs::load_dict(const std::string& url) { Dict *lib = new Dict; if (lib->load(url)) oLib.push_back(lib); else delete lib; } class DictLoader { public: DictLoader(Libs& lib_): lib(lib_) {} void operator()(const std::string& url, bool disable) { if (!disable) lib.load_dict(url); } private: Libs& lib; }; void Libs::load(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list) { for_each_file(dicts_dirs, ".ifo", order_list, disable_list, DictLoader(*this)); } class DictReLoader { public: DictReLoader(std::vector &p, std::vector &f, Libs& lib_) : prev(p), future(f), lib(lib_) {} void operator()(const std::string& url, bool disable) { if (!disable) { Dict *dict = find(url); if (dict) future.push_back(dict); else lib.load_dict(url); } } private: std::vector &prev; std::vector &future; Libs& lib; Dict *find(const std::string& url) { std::vector::iterator it; for (it = prev.begin(); it != prev.end(); ++it) if ((*it)->ifofilename() == url) break; if (it != prev.end()) { Dict *res = *it; prev.erase(it); return res; } return NULL; } }; void Libs::reload(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list) { std::vector prev(oLib); oLib.clear(); for_each_file(dicts_dirs, ".ifo", order_list, disable_list, DictReLoader(prev, oLib, *this)); for (std::vector::iterator it = prev.begin(); it != prev.end(); ++it) delete *it; } const gchar *Libs::poGetCurrentWord(glong * iCurrent) { const gchar *poCurrentWord = NULL; const gchar *word; for (std::vector::size_type iLib = 0; iLib= narticles(iLib) || iCurrent[iLib] < 0) continue; if ( poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib], iLib); } else { word = poGetWord(iCurrent[iLib], iLib); if (stardict_strcmp(poCurrentWord, word) > 0 ) poCurrentWord = word; } } return poCurrentWord; } const gchar * Libs::poGetNextWord(const gchar *sWord, glong *iCurrent) { // the input can be: // (word,iCurrent),read word,write iNext to iCurrent,and return next word. used by TopWin::NextCallback(); // (NULL,iCurrent),read iCurrent,write iNext to iCurrent,and return next word. used by AppCore::ListWords(); const gchar *poCurrentWord = NULL; std::vector::size_type iCurrentLib = 0; const gchar *word; for (std::vector::size_type iLib = 0;iLibLookup(sWord, iCurrent[iLib]); if (iCurrent[iLib] == INVALID_INDEX) continue; if (iCurrent[iLib] >= narticles(iLib) || iCurrent[iLib] < 0) continue; if (poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib], iLib); iCurrentLib = iLib; } else { word = poGetWord(iCurrent[iLib], iLib); if (stardict_strcmp(poCurrentWord, word) > 0 ) { poCurrentWord = word; iCurrentLib = iLib; } } } if (poCurrentWord) { iCurrent[iCurrentLib] ++; for (std::vector::size_type iLib = 0;iLib= narticles(iLib) || iCurrent[iLib] < 0) continue; if (strcmp(poCurrentWord, poGetWord(iCurrent[iLib], iLib)) == 0 ) iCurrent[iLib]++; } poCurrentWord = poGetCurrentWord(iCurrent); } return poCurrentWord; } const gchar * Libs::poGetPreWord(glong * iCurrent) { // used by TopWin::PreviousCallback(); the iCurrent is cached by AppCore::TopWinWordChange(); const gchar *poCurrentWord = NULL; std::vector::size_type iCurrentLib = 0; const gchar *word; for (std::vector::size_type iLib = 0;iLib narticles(iLib) || iCurrent[iLib] <= 0) continue; } if ( poCurrentWord == NULL ) { poCurrentWord = poGetWord(iCurrent[iLib] - 1, iLib); iCurrentLib = iLib; } else { word = poGetWord(iCurrent[iLib] - 1, iLib); if (stardict_strcmp(poCurrentWord, word) < 0 ) { poCurrentWord = word; iCurrentLib = iLib; } } } if (poCurrentWord) { iCurrent[iCurrentLib] --; for (std::vector::size_type iLib = 0;iLib narticles(iLib) || iCurrent[iLib] <= 0) continue; if (strcmp(poCurrentWord, poGetWord(iCurrent[iLib] - 1, iLib)) == 0) { iCurrent[iLib]--; } else { if (iCurrent[iLib] == narticles(iLib)) iCurrent[iLib] = INVALID_INDEX; } } } return poCurrentWord; } bool Libs::LookupSimilarWord(const gchar* sWord, glong & iWordIndex, int iLib) { glong iIndex; bool bFound = false; gchar *casestr; if (!bFound) { // to lower case. casestr = g_utf8_strdown(sWord, -1); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); // to upper case. if (!bFound) { casestr = g_utf8_strup(sWord, -1); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } // Upper the first character and lower others. if (!bFound) { gchar *nextchar = (gchar*)g_utf8_next_char(sWord); gchar *firstchar = g_utf8_strup(sWord, nextchar - sWord); nextchar = g_utf8_strdown(nextchar, -1); casestr = g_strdup_printf("%s%s", firstchar, nextchar); g_free(firstchar); g_free(nextchar); if (strcmp(casestr, sWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } if (bIsPureEnglish(sWord)) { // If not Found , try other status of sWord. int iWordLen = strlen(sWord); bool isupcase; gchar *sNewWord = (gchar *)g_malloc(iWordLen + 1); //cut one char "s" or "d" if (!bFound && iWordLen > 1) { isupcase = sWord[iWordLen - 1] == 'S' || !strncmp(&sWord[iWordLen - 2], "ED", 2); if (isupcase || sWord[iWordLen - 1] == 's' || !strncmp(&sWord[iWordLen - 2], "ed", 2)) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 1] = '\0'; // cut "s" or "d" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } //cut "ly" if (!bFound && iWordLen > 2) { isupcase = !strncmp(&sWord[iWordLen - 2], "LY", 2); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "ly", 2))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; // cut "ly" if (iWordLen > 5 && sNewWord[iWordLen - 3] == sNewWord[iWordLen - 4] && !bIsVowel(sNewWord[iWordLen - 4]) && bIsVowel(sNewWord[iWordLen - 5])) { //doubled sNewWord[iWordLen - 3] = '\0'; if ( oLib[iLib]->Lookup(sNewWord, iIndex) ) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 3] = sNewWord[iWordLen - 4]; //restore } } if (!bFound) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } //cut "ing" if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "ING", 3); if (isupcase || !strncmp(&sWord[iWordLen - 3], "ing", 3) ) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if ( iWordLen > 6 && (sNewWord[iWordLen - 4] == sNewWord[iWordLen - 5]) && !bIsVowel(sNewWord[iWordLen - 5]) && bIsVowel(sNewWord[iWordLen - 6])) { //doubled sNewWord[iWordLen - 4] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 4] = sNewWord[iWordLen - 5]; //restore } } if ( !bFound ) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } if (!bFound) { if (isupcase) strcat(sNewWord, "E"); // add a char "E" else strcat(sNewWord, "e"); // add a char "e" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } //cut two char "es" if (!bFound && iWordLen > 3) { isupcase = (!strncmp(&sWord[iWordLen - 2], "ES", 2) && (sWord[iWordLen - 3] == 'S' || sWord[iWordLen - 3] == 'X' || sWord[iWordLen - 3] == 'O' || (iWordLen > 4 && sWord[iWordLen - 3] == 'H' && (sWord[iWordLen - 4] == 'C' || sWord[iWordLen - 4] == 'S')))); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "es", 2) && (sWord[iWordLen - 3] == 's' || sWord[iWordLen - 3] == 'x' || sWord[iWordLen - 3] == 'o' || (iWordLen > 4 && sWord[iWordLen - 3] == 'h' && (sWord[iWordLen - 4] == 'c' || sWord[iWordLen - 4] == 's'))))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } //cut "ed" if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 2], "ED", 2); if (isupcase || !strncmp(&sWord[iWordLen - 2], "ed", 2)) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (iWordLen > 5 && (sNewWord[iWordLen - 3] == sNewWord[iWordLen - 4]) && !bIsVowel(sNewWord[iWordLen - 4]) && bIsVowel(sNewWord[iWordLen - 5])) { //doubled sNewWord[iWordLen - 3] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else { if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } if (!bFound) sNewWord[iWordLen - 3] = sNewWord[iWordLen - 4]; //restore } } if (!bFound) { if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } } // cut "ied" , add "y". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "IED", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "ied", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (isupcase) strcat(sNewWord, "Y"); // add a char "Y" else strcat(sNewWord, "y"); // add a char "y" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "ies" , add "y". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "IES", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "ies", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (isupcase) strcat(sNewWord, "Y"); // add a char "Y" else strcat(sNewWord, "y"); // add a char "y" if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "er". if (!bFound && iWordLen > 2) { isupcase = !strncmp(&sWord[iWordLen - 2], "ER", 2); if (isupcase || (!strncmp(&sWord[iWordLen - 2], "er", 2))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 2] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } // cut "est". if (!bFound && iWordLen > 3) { isupcase = !strncmp(&sWord[iWordLen - 3], "EST", 3); if (isupcase || (!strncmp(&sWord[iWordLen - 3], "est", 3))) { strcpy(sNewWord, sWord); sNewWord[iWordLen - 3] = '\0'; if (oLib[iLib]->Lookup(sNewWord, iIndex)) bFound = true; else if (isupcase || g_ascii_isupper(sWord[0])) { casestr = g_ascii_strdown(sNewWord, -1); if (strcmp(casestr, sNewWord)) { if (oLib[iLib]->Lookup(casestr, iIndex)) bFound = true; } g_free(casestr); } } } g_free(sNewWord); } if (bFound) iWordIndex = iIndex; #if 0 else { //don't change iWordIndex here. //when LookupSimilarWord all failed too, we want to use the old LookupWord index to list words. //iWordIndex = INVALID_INDEX; } #endif return bFound; } bool Libs::SimpleLookupWord(const gchar* sWord, glong & iWordIndex, int iLib) { bool bFound = oLib[iLib]->Lookup(sWord, iWordIndex); if (!bFound) bFound = LookupSimilarWord(sWord, iWordIndex, iLib); return bFound; } struct Fuzzystruct { char * pMatchWord; int iMatchWordDistance; }; inline bool operator<(const Fuzzystruct & lh, const Fuzzystruct & rh) { if (lh.iMatchWordDistance != rh.iMatchWordDistance) return lh.iMatchWordDistance < rh.iMatchWordDistance; if (lh.pMatchWord && rh.pMatchWord) return stardict_strcmp(lh.pMatchWord, rh.pMatchWord) < 0; return false; } static inline void unicode_strdown(gunichar *str) { while (*str) { *str = g_unichar_tolower(*str); ++str; } } bool Libs::LookupWithFuzzy(const gchar *sWord, gchar *reslist[], gint reslist_size, gint iLib) { if (sWord[0] == '\0') return false; Fuzzystruct *oFuzzystruct = new Fuzzystruct[reslist_size]; for (int i = 0; i < reslist_size; i++) { oFuzzystruct[i].pMatchWord = NULL; oFuzzystruct[i].iMatchWordDistance = iMaxFuzzyDistance; } int iMaxDistance = iMaxFuzzyDistance; int iDistance; bool Found = false; EditDistance oEditDistance; glong iCheckWordLen; const char *sCheck; gunichar *ucs4_str1, *ucs4_str2; glong ucs4_str2_len; ucs4_str2 = g_utf8_to_ucs4_fast(sWord, -1, &ucs4_str2_len); unicode_strdown(ucs4_str2); // for (std::vector::size_type iLib = 0; iLib=0 && stardict_strcmp(sWord, poGetWord(narticles(iLib)-1,iLib))<=0) { //there are Chinese dicts and English dicts... if (TRUE) { const int iwords = narticles(iLib); for (int index = 0; index < iwords; index++) { sCheck = poGetWord(index, iLib); // tolower and skip too long or too short words iCheckWordLen = g_utf8_strlen(sCheck, -1); if (iCheckWordLen - ucs4_str2_len >= iMaxDistance || ucs4_str2_len - iCheckWordLen >= iMaxDistance) continue; ucs4_str1 = g_utf8_to_ucs4_fast(sCheck, -1, NULL); if (iCheckWordLen > ucs4_str2_len) ucs4_str1[ucs4_str2_len] = 0; unicode_strdown(ucs4_str1); iDistance = oEditDistance.CalEditDistance(ucs4_str1, ucs4_str2, iMaxDistance); g_free(ucs4_str1); if (iDistance < iMaxDistance && iDistance < ucs4_str2_len) { // when ucs4_str2_len=1,2 we need less fuzzy. Found = true; bool bAlreadyInList = false; int iMaxDistanceAt = 0; for (int j = 0; j < reslist_size; j++) { if (oFuzzystruct[j].pMatchWord && strcmp(oFuzzystruct[j].pMatchWord, sCheck) == 0 ) { //already in list bAlreadyInList = true; break; } //find the position,it will certainly be found (include the first time) as iMaxDistance is set by last time. if (oFuzzystruct[j].iMatchWordDistance == iMaxDistance ) { iMaxDistanceAt = j; } } if (!bAlreadyInList) { if (oFuzzystruct[iMaxDistanceAt].pMatchWord) g_free(oFuzzystruct[iMaxDistanceAt].pMatchWord); oFuzzystruct[iMaxDistanceAt].pMatchWord = g_strdup(sCheck); oFuzzystruct[iMaxDistanceAt].iMatchWordDistance = iDistance; // calc new iMaxDistance iMaxDistance = iDistance; for (int j = 0; j < reslist_size; j++) { if (oFuzzystruct[j].iMatchWordDistance > iMaxDistance) iMaxDistance = oFuzzystruct[j].iMatchWordDistance; } // calc new iMaxDistance } // add to list } // find one } // each word } // ok for search // } // each lib g_free(ucs4_str2); if (Found) // sort with distance std::sort(oFuzzystruct, oFuzzystruct + reslist_size); for (gint i = 0; i < reslist_size; ++i) reslist[i] = oFuzzystruct[i].pMatchWord; delete[] oFuzzystruct; return Found; } inline bool less_for_compare(const char *lh, const char *rh) { return stardict_strcmp(lh, rh) < 0; } gint Libs::LookupWithRule(const gchar *word, gchar **ppMatchWord) { glong aiIndex[MAX_MATCH_ITEM_PER_LIB + 1]; gint iMatchCount = 0; GPatternSpec *pspec = g_pattern_spec_new(word); for (std::vector::size_type iLib = 0; iLib LookupWithRule(pspec, aiIndex, MAX_MATCH_ITEM_PER_LIB + 1)) { if (progress_func) progress_func(); for (int i = 0; aiIndex[i] != -1; i++) { const gchar * sMatchWord = poGetWord(aiIndex[i], iLib); bool bAlreadyInList = false; for (int j = 0; j < iMatchCount; j++) { if (strcmp(ppMatchWord[j], sMatchWord) == 0) { //already in list bAlreadyInList = true; break; } } if (!bAlreadyInList) ppMatchWord[iMatchCount++] = g_strdup(sMatchWord); } } } g_pattern_spec_free(pspec); if (iMatchCount) // sort it. std::sort(ppMatchWord, ppMatchWord + iMatchCount, less_for_compare); return iMatchCount; } bool Libs::LookupData(const gchar *sWord, std::vector *reslist) { std::vector SearchWords; std::string SearchWord; const char *p = sWord; while (*p) { if (*p == '\\') { p++; switch (*p) { case ' ': SearchWord += ' '; break; case '\\': SearchWord += '\\'; break; case 't': SearchWord += '\t'; break; case 'n': SearchWord += '\n'; break; default: SearchWord += *p; } } else if (*p == ' ') { if (!SearchWord.empty()) { SearchWords.push_back(SearchWord); SearchWord.clear(); } } else { SearchWord += *p; } p++; } if (!SearchWord.empty()) { SearchWords.push_back(SearchWord); SearchWord.clear(); } if (SearchWords.empty()) return false; guint32 max_size = 0; gchar *origin_data = NULL; for (std::vector::size_type i = 0; i containSearchData()) continue; if (progress_func) progress_func(); const gulong iwords = narticles(i); const gchar *key; guint32 offset, size; for (gulong j = 0; j < iwords; ++j) { oLib[i] ->get_key_and_data(j, &key, &offset, &size); if (size > max_size) { origin_data = (gchar *)g_realloc(origin_data, size); max_size = size; } if (oLib[i]->SearchData(SearchWords, offset, size, origin_data)) reslist[i].push_back(g_strdup(key)); } } g_free(origin_data); std::vector::size_type i; for (i = 0; i #include #include #include #include #include "dictziplib.hpp" const int MAX_MATCH_ITEM_PER_LIB = 100; const int MAX_FUZZY_DISTANCE = 3; // at most MAX_FUZZY_DISTANCE-1 differences allowed when find similar words struct cacheItem { guint32 offset; gchar *data; //write code here to make it inline cacheItem() { data = NULL; } ~cacheItem() { g_free(data); } }; const int WORDDATA_CACHE_NUM = 10; const int INVALID_INDEX = -100; class DictBase { public: DictBase(); ~DictBase(); gchar * GetWordData(guint32 idxitem_offset, guint32 idxitem_size); bool containSearchData(); bool SearchData(std::vector &SearchWords, guint32 idxitem_offset, guint32 idxitem_size, gchar *origin_data); protected: std::string sametypesequence; FILE *dictfile; std::unique_ptr dictdzfile; private: cacheItem cache[WORDDATA_CACHE_NUM]; gint cache_cur; }; //this structure contain all information about dictionary struct DictInfo { std::string ifo_file_name; guint32 wordcount; std::string bookname; std::string author; std::string email; std::string website; std::string date; std::string description; guint32 index_file_size; std::string sametypesequence; bool load_from_ifo_file(const std::string& ifofilename, bool istreedict); }; class index_file { public: guint32 wordentry_offset; guint32 wordentry_size; virtual ~index_file() {} virtual bool load(const std::string& url, gulong wc, gulong fsize) = 0; virtual const gchar *get_key(glong idx) = 0; virtual void get_data(glong idx) = 0; virtual const gchar *get_key_and_data(glong idx) = 0; virtual bool lookup(const char *str, glong &idx) = 0; }; class Dict : public DictBase { private: std::string ifo_file_name; gulong wordcount; std::string bookname; std::unique_ptr idx_file; bool load_ifofile(const std::string& ifofilename, gulong &idxfilesize); public: Dict() {} bool load(const std::string& ifofilename); gulong narticles() { return wordcount; } const std::string& dict_name() { return bookname; } const std::string& ifofilename() { return ifo_file_name; } const gchar *get_key(glong index) { return idx_file->get_key(index); } gchar *get_data(glong index) { idx_file->get_data(index); return DictBase::GetWordData(idx_file->wordentry_offset, idx_file->wordentry_size); } void get_key_and_data(glong index, const gchar **key, guint32 *offset, guint32 *size) { *key = idx_file->get_key_and_data(index); *offset = idx_file->wordentry_offset; *size = idx_file->wordentry_size; } bool Lookup(const char *str, glong &idx) { return idx_file->lookup(str, idx); } bool LookupWithRule(GPatternSpec *pspec, glong *aIndex, int iBuffLen); }; typedef std::list strlist_t; class Libs { public: typedef void (*progress_func_t)(void); Libs(progress_func_t f = NULL); ~Libs(); void load_dict(const std::string& url); void load(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list); void reload(const strlist_t& dicts_dirs, const strlist_t& order_list, const strlist_t& disable_list); glong narticles(int idict) { return oLib[idict]->narticles(); } const std::string& dict_name(int idict) { return oLib[idict]->dict_name(); } gint ndicts() { return oLib.size(); } const gchar * poGetWord(glong iIndex, int iLib) { return oLib[iLib]->get_key(iIndex); } gchar * poGetWordData(glong iIndex, int iLib) { if (iIndex == INVALID_INDEX) return NULL; return oLib[iLib]->get_data(iIndex); } const gchar *poGetCurrentWord(glong *iCurrent); const gchar *poGetNextWord(const gchar *word, glong *iCurrent); const gchar *poGetPreWord(glong *iCurrent); bool LookupWord(const gchar* sWord, glong& iWordIndex, int iLib) { return oLib[iLib]->Lookup(sWord, iWordIndex); } bool LookupSimilarWord(const gchar* sWord, glong & iWordIndex, int iLib); bool SimpleLookupWord(const gchar* sWord, glong & iWordIndex, int iLib); bool LookupWithFuzzy(const gchar *sWord, gchar *reslist[], gint reslist_size, gint iLib); gint LookupWithRule(const gchar *sWord, gchar *reslist[]); bool LookupData(const gchar *sWord, std::vector *reslist); private: std::vector oLib; // word Libs. int iMaxFuzzyDistance; progress_func_t progress_func; }; typedef enum { qtSIMPLE, qtREGEXP, qtFUZZY, qtDATA } query_t; extern query_t analyze_query(const char *s, std::string& res); #endif//!__SD_LIB_H__ qstardict-3.0.0/plugins/stardict/mapfile.hpp000066400000000000000000000044611472531462200211470ustar00rootroot00000000000000#ifndef _MAPFILE_HPP_ #define _MAPFILE_HPP_ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_MMAP # include # include # include #endif #ifdef _WIN32 # include #endif #include class MapFile { public: MapFile(void) : data(NULL), #ifdef HAVE_MMAP mmap_fd( -1) #elif defined(_WIN32) hFile(0), hFileMap(0) #endif { } ~MapFile(); bool open(const char *file_name, unsigned long file_size); inline gchar *begin(void) { return data; } private: char *data; unsigned long size; #ifdef HAVE_MMAP int mmap_fd; #elif defined(_WIN32) HANDLE hFile; HANDLE hFileMap; #endif }; inline bool MapFile::open(const char *file_name, unsigned long file_size) { size = file_size; #ifdef HAVE_MMAP if ((mmap_fd = ::open(file_name, O_RDONLY)) < 0) { //g_print("Open file %s failed!\n",fullfilename); return false; } data = (gchar *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, mmap_fd, 0); if ((void *)data == (void *)( -1)) { //g_print("mmap file %s failed!\n",idxfilename); data = NULL; return false; } #elif defined( _WIN32) #ifdef UNICODE gunichar2 *fn = g_utf8_to_utf16(file_name, -1, NULL, NULL, NULL); #else // UNICODE gchar *fn = file_name; #endif // UNICODE hFile = CreateFile(fn, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); #ifdef UNICODE g_free(fn); #endif // UNICODE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, file_size, NULL); data = (gchar *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, file_size); #else // defined( _WIN32) gsize read_len; if (!g_file_get_contents(file_name, &data, &read_len, NULL)) return false; if (read_len != file_size) return false; #endif return true; } inline MapFile::~MapFile() { if (!data) return ; #ifdef HAVE_MMAP munmap(data, size); close(mmap_fd); #else # ifdef _WIN32 UnmapViewOfFile(data); CloseHandle(hFileMap); CloseHandle(hFile); # else g_free(data); # endif #endif } #endif//!_MAPFILE_HPP_ qstardict-3.0.0/plugins/stardict/pixmaps/000077500000000000000000000000001472531462200204755ustar00rootroot00000000000000qstardict-3.0.0/plugins/stardict/pixmaps/arrow-down.png000066400000000000000000000231071472531462200233050ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME $ ^6[ IDATx}yxULs20@LHU~Q2O[^[Z>QT$sCFtN_{ 1KH{AX2¾2N&/\Nt1>?7 ஻W_FG=4i"n{J\P|DoW  hO?QZf=@I=;SLQPTME"ĉ(,.c[aӃ;wttɻu\\=*27-\ؘZa|l0b5Y_<`b&^=bcwr{{w:l F9s_aK_R݆[nFDxks}ǘ^Lj7KI3v\5+w;PTT5Ր3ڵkױAӦek Q;{ݔpה%Z{J \\bAPX\:/S/wiTFi^'%"Da񘓛}7ߨLlIeyxR|gzvLt5`ȑhii1 =g"8NbϠA 񌛸~ba4%øT܁QRD6(faߣc@zڝW͛grp\9&{`UC9 ^ q13et5U}5|1`<'YT@U o>Iѣ곃X G:@z7LCiyoVh&Ib"X_`-Jq zB@ 74jAx~|`7BZ4EevMNIVo)IA4BߙH6iiiÇ%PE+?="JsS@0:!cLj$X}}<1?tϘ wͽU];.n`~[s$?BU͆ήN I&YYYɮ h- 4[,zǏ3ͮ11a#{Rơ`aZ 1 {nLIo3wg%E 7zq%K)u&G@Ƽp휞t:NH@*)? ؚ7MHOuLP?Nf^W^Fʑ(`X(1c> e[?P``Lh%vIKbUo7?D. $%ʰN"\VµǻPAt<$evQ8C1=`!ŋc z3g8u2ueoͳmU!VUǃ"$?"(CEe=esqf wn "/]DzmT 7g^uWYʒU ļPw8QWW'fa"Z!n&nK$ p&}rS!n]JaV됰<Ƃ) $0#Ȱb1hhh˥m爖UnK"Ǝ.q11ǯ یѣBxx8SRɽU~xȾpme@[[UE{{;"""3ҊԂbje [o] *ѭ$ǣ!8vő#p@@s }-p.5Z*o3 2AUb[☇c8s4*T#m`(+TyRTd%j$pupK9rdDoIǾN?g dk0TVV%44#&6:yJ*aɈ r5$uYQTX=Ė?r |HgN˗b n!e%ouWNp{vݿ~Oy?w'qx1g̙3SLAaQP]uw{$G+I^BDjzתA|foߎgHLLĄ gϗhlh`@,g3',=D})Di--- LۉI 6 zAB&555xpM7;?8{,Ξ;Ztww#&6Gz}fC4\`5福$$p`y9V) 77;x'O|7GXX"#e=GhIp ҒAaIS Y8ða^0⼸Kp`9cX;o11(..Fss3jkk ԗ/+UOkFo~>D9b4'D܌S O}?BCC!*2 ^Q}Ou|CpTIqޠ0)S687AXH#",eep ݿ +WT221m4,?BmM /^٬IJϦxHZ)AzǏGlHJJŽ;;{b!996 qq |28جV8Ѫ"XKJ L:z#Bdd$hGiI N'N_N5fw~ 6DSSa| ԰^RK3wTDQa/^{gCll&333#MMͨDMu5T^[G#\\TJ p%yd`2$c ى `sρ8v6󘕝 0rH A' MaBqq :0rꗿq$ˍٳq)>} ;YeaYE)ɘ~IaIҽT̈́ U< mmA``sE 趸^twD|~ŋp(/-fc]uo xsgc Ն?[{{;._pш?=`2u"nZ.x"_#%9Gk F#nZcQXX <"P C̽ue$ E ŭ!o466-SO>|PJQQ6lÉ & &6C{ mAJ`iw(t_p8mAtWGTT6;Z{nΜdҤI[ph%.VUfW\)/cLuIcPqioR>ISt:\ӻ2͚}K"&'{,u#<" e8uTP$%MFWWq8A9 Opi 'OlӧOcŪhnjF9IS&B Ϫ<ǹ]~d;&'MF9XzR^&L}K"™3gPVR.ψ PR\3O@ޥxw1~=ٳg|r455!&6)3RX)H=5%qP+s2Tq<)IFcSΟ?A6 XxcĈhmkCqajk`EQA!Z0bXvm߷Q_8GsV8$0_PS8SMEtt4.5`}BdeevaEp88C\+kz!jè<ʵ_h>2,UUUX|93gI>iuU!gƀ3&1RF`-qx_&ٳ . 8&OXh1PTT֖#<<8x ._pl۶ y$8T@]]bb̘6L +w$Dn4ช}{;@#ֵuxZ,뭙A.wqvڅZ(/;Z,9s&>#qAomm-X uuu0͘A|1+Zݓ1XC6E_\O҃2ܫ0-y:"##Q]]uA'F¨?akS[E\CىI&o-CxpV\'NDDD822\ʕUWo}#JJL0iQ +x qv&^̕z3umF8`XQZZ KiiiL&U!bC=2 {VBCB$`*b( 淟/B ٬)Ą4L&ᡇb*_(/CɄY Նjf ˎSu9(yz Ǖ:DD Ezf:L!&GL`XPZZSBq3{l+43O-yYuW}+%%ڬ={6x퍠K͆>|LFv%羅y)$7A*l6=C]&~ͪ)+&,< 0 ߿kXۗ7?ncݺu(χh@vN65yGZdoavF{E|9X!W=jiOJY0aaʄhľ}~aݎM6`00+'8ٺC w|O/((ɞH _?:ϗ,ш8̙8s,,Xd//Ė-޽0\ď'm1(&jtum09`jړY0DȈHdfe@cϞ=زe- `[端70+'QQQfa]K"r3)EEurf#) >3zF9zZ Jn~}2&1!d9'D4|Y5=ìFhhHbbcP[[ǏR}=naf$`a'@!;'11/'^͙߿iW*++Yn^)"3 ٬d1AM;ƦFɛp/tqq16OR.G_~չ+}ٹ3hRгYȂq"lFm]VV ^/ v} GvN||ig=90?:"r;էRƉCVVxLJlw^{5|Cѯ7߲&롌v&HDVicq=!a$ڧ$Bd9rI[:mOz+ޜ T ʋRRk}\DK7^ O>|bSF -ܰa7(vg͟[K}fau6l ay暈<5wMt /nް),HAВޙ0vw}f޲_hkmJ(>FDV xp+[^x0llܸu -]nu{A5Dw@ڲn˱+}&~;v0vY_|\{mժUW}_~9L2<`LR=w﹐{['" g`YM;}~A|U ~'ϜĖu[*3 _Y0aGp7o |[^z[ kT7]= e_^zi{㱒 d? ^߼ns5NNyէcl=V:%a`>Zk~/$JD?X~'?ēUר}ry#ߜD9"3g7CrxO8.QAV :Rrԉ>{LdϹ@L8wh?:dʼnc7-*2z^8ybX$cB):ZYoYk,]5O|Ero}Mw]9Bs*  wPBdHH/~AoAAă)U i8AdQBƘSn5k!MخF|$^k"l c>/σt|vR0ҫ4NjT5D`2dAz?ɨ@xj>=4vvt?Jª󑘜W)|鯜A$+g pbp'+Ps 2d _Cb"_*A-IENDB`qstardict-3.0.0/plugins/stardict/pixmaps/arrow-up.png000066400000000000000000000227371472531462200227720ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME #0{ IDATx}y|Twd YLքl$Aqik}}DZlmVP}hEDdIH l a dg{ds;K h~O̹9s\`@d@d@d@d@d@d@d@*B_vedX.d pm:D:@@N3_|`X4 =DGlve+@^a4FjqxÈtbxZ8ԛPwZצ ߊ"p1TWWCdLz8tǶm%_Iu)xoYXXr#7w<"""ӺCt_ǎUT-a z@֭[_ȟ4ic7y³P 'L@~n.t:|y3W*#GiQ AtmRWIfrwDgyy(χ^j۽jտ&/~vTTEѣmu`l[wi`1DQKdd.IN՚xԐ=wt Պ Om×l @i&ig؏Q Q(VZ'{1^p&PֻCƈ4KJ*Q;lz} %rKq8!"<4ƺȜ~|ǘnH\7S3za^ʳΥ06t(n@gg[# >1M5@/*Mbt:#Zk㪮zLj=x/9{P[[+[y?+iw3?%@'#IPi^]܃: /@M%DQ*@ь)cH!C0up>|\mog=p\Z Pq̜Νq.^āa`pEDEF"2*S9/su(խֻܜd8III0]LdBN8(3h 3za>m*t:gz9]z ti1z%oK[Z 1<"7'|S "#{uכr+ lRH8X*EDHHkp8<#Фc:u[3f02(]S :ӦLAhhP p(\zFVMM JKJ "ͅfѣGqtM7wI5|q< Z8;qq-U!G,H !..΍FtT{<0ZwWdn>{챞tq\t wE'dW` OڗIR!΃=BCCQWW"s` ,񪭷L͜MD%6AWP}T3Y!Rp^[?aa!QUU˗.aРAQ,ITaZhkkaq6UUUHKOKod2 /ǩqh\ `,@]]J 5ksU8qK |Y!tIfbcp:ApgYǥU;w'R'rsrq{]4e*%)%wC|'T]EEhǩSp%#44Lp摇Q=2=G 2R@fVcǪo 7"JAr:D]w˗{tYUk4ܸ=p|‚UwUɓ'z]N>˗d vp/F6 nQ@ 92GvIvS{:-\b}"BHHW2wo!mI7447h.s1;F)Sڵk8r2d |+q/3&3>tzzBE"(A+U;}S`xF?JѰC:&kfWaF3Jnǽ܃wUSҕ/pe$ NhxEe:$cq-- "*}m*%=uF#GfTKTfٜ6(-)n3y/]xz1.^gHHHhmky!@x ?Gef>K@Tӆ CxXs/Ǖ+5HLL`PLF)HA.5$K{aZ1iDXq]wSx 1)z}'mKgʱg#,}а0E@k/~!nJg (/+CgG'rssn*J?99ىҒR1MEQ`2"$$' =TpQ:Qxn~11ѽI^7/ͣ+ X,+/CGGg˫^vhot:̜9+V{ II/@ ,z~,VR >|#( `Z%t~S]KKE:%zN++GG{ƍWBXh(nbK/a1hhGYi),Nxr \0bIp_{hxx&]J狂g8n`0d ^|Wm:;-_^6= k֬陫W^~GB[[JKJi]6wV߁ Lp7Nr.Q^ops( Qbj21:%d vKtzAwmjކ#3 222چҽ]J^QG}* &}95?1 ^ 3J6L,tjhkmCƈ }u-_%22kVFFb_Y9,N {;`4zhXU5k8G- 7V vsv 8I%fChimEzz:֭[hwƚk0|p`_~جVG\2,.uM!$]l؟?̀'^J1MMMhjnf@垣ul8| ZZZ6l^[111]$&&k_]Æ`<kaVHpbăp ysyL%!!6vYM0mv4Ͱڬ ;Kh%z<%8Q8dzurTVTIذ~=իW׬ ׬~c\z5KHH됔&s8!@d %6449V]CA ({PC N4aZ=:oΑp8PYQ&3ƍHJJ :lތFEe F'`B>*+*0{l޼9MLLkk!!! 8{u}='͆fX,LivĹyUYcPfq\{: Gl6#!!ol|)))AK~6fCBBrrɄdttvl6㳝;Q}:b|3ܸqMf$&&v$Kz!NJ@ Ǿ}bhTTv-hkoCNDA@ձhl4cp`acʁض<1c"+;'_NCl7:'۶aCqKJJ ֭]874DkFN!8.@3EDd$M 錈3c8\Lʘǫ؀Ac͆+Wbٳڊh"etMBDd܂zlh :::iSO-HJL jjz,tgI(/+>@^r(\׫|!@E>u _Gzzz?w/O 1cF+.c$qhl4he%ك"1el߾ hinAl\,l6{Rf-߫MFNHx$] UU~"#"a1"(?|!>} &yy6'_N mx ` 5̙3.۲Kt]Z{rKU2I( ЏG#ganh@tT70j䨠th}}=Ν$degh2 u5 `0 dجVfD AaҤIv466 UQ̹O kYiY` :h]]=gЀH=jtP߹s'()-.$caQ.v}M1,:ycbk׮n:zNTT~ ̍fX, "N֕MGޒ*ѺP{>w7n@XX֯{ AzAw@D>YхY}*z99οfD ƍիګ8u,{fbn,qfaƩlgϡzLF֯_:JlذGcc#Ð5> qq|P^gttԌ:|8{=0Ɛzƌ|NO%/^g4k("f3؏FHRRrrr07a1x`}/3#>+S5  ]%՚ɈWWAaaa@o޲wpa ddcD<3HmTpY792yy0 8ٳg{QhAAV&/]Fjmܼ;9^yV´iV,Y}6 qBxxJgx/P$ߑNfl.\EOHIIAFF>x::ڑ6D.9ya4zĩ.陥WP0rԁzQQQwUU'`0i$ת{ l!-mF }^ݎֵY3^ٌ E^^W^y<&"::J.%8ڷ{瞿E 3@Ta4 8r0‘|~kjj2!{|6UG'<4plРACcC#jkk(=F z-U\ǩG4P0ߵs(@aA@GU<|g9,4F (+/Cjj*Fft;CC>5o&3?> PY5m& ))ٜ %8u$ jrO裏s"vJʚ6 ]>7GO'Gx;"<!!z444bΝ5jw#>ӧO#$$cƍŰaCŎkMI{ǯ4搓y$$& 2" 8>CaС~س-c cǍСC* g7,~^?$9mcb@ˋ zΠ|<.^h]ΦMc1OHZvorw :oN Ƚ*\/=zfzӧOǼy`X1#GgOOz{~%K҂fx䗏\_g@2kk6Z'h^ph^i]v}eӥXqZ1i"ޅpmvW;~h_mF>Һ2O to: ҫ5^n3Zf.)wCo4}Q? uD~JZWuobx )2_MA㪴?}{0 _W;j2~CgroȡƯՌϭbwv&z_.CZiK\Aʰdi7MD=NAܗ,-w]z¦M'=d̞Ua^fd1[N`IDAT!0OT#$b ^'[f=³F\0o] <_Ҭ'1<+_r._xwT9ei3!ki]sʴޗSr߫j. `ؗ=zi]vڗzKfՀ ~TiJfi~"[mO|KE J[6@>UGϟ?~d钻_4k{޼EyR>wgמ3*%Uݎyk7+<]0o>/7{מ3=/''.x$vAkvG!\ڬW-Wkj|uJ˕uwMTvu4r @s^RwSRZdȌr_6чEEo "NT-J42VQd gNmt{X :Qc7ՎS)||Q#y0Cr/N*Ntu֑Ar>֑̂@x cԫ}W@> abKGD pHYs B(xtIME # fpIDATx]{ř}y?5#AQ4Y%p=Q1l6FyqbA$&ٳwr4nr5FTD bQ 30v}}uWW;3SVw}Q@JTD%*QJTD%:kΜiDt:CdM A\c:pa"@@f̌_[QJM&6<0;s ^}.b3v3/ђq-a2"`1Ԣ>e6R ;詘)|o>aƵ ,96Q OԟeDo2a14K/QI"3g 7X QFb9g~O wl߾$8kNDa9~ @e@;v>ܓ%Ag~ 7zMM5ЀƆF!H XD0883Dqtvv 8T@;/>̳%Ymm3%}\x&Nf477eR3<:J#bŁwBww0$󭔌_ߍ={@2{@ /~,5.c; /<¬>Y>9fHcؽ ߡ|[ 2U۶m@k{ fO³ =lΚX,™wVSh_4ص{7^}5{c~Nx޾XPa٘ڊj:DGx ~uzu  % l +s#B+ 3ui8yK `>&Ǟ^ع{q=R_$ X'r {zUkjjp…8yʔw&];^x=xeU[Ǐpt}ヒ;wرcVBy'cb_`Fu}㿑<}4|ҥf3ҟSzp/~crh3RbH;,̨ŌiۋN ?u1|睧͟X5kra``_L9P[ƳGtuuzꩂ:KiJֳ֧j[X -Xi:2W?*_zR柷׹jkqх1RJx\U'8Ւd0TyȬp1c/hwb2{ e$ 7)XK y'553.EC}X2XJ0RJHcl]Ē!%Cr\?wH)쬳KfcE)Ri]{X,>E-XuU;9ZZZK.A"Qfa”Gt2>}Hi0=dm'H`cĉ1XsW\w\@&R9z*.XZ2˸HLEkYzkKK=g/S/a)Sl2N\vjh[B>JD1JϒY=)'c޼6)j+ygM@Waz0-YGHe˖pQ"qh~IhfX;chE& #:1mҷ̘ڊ 'MA|Ĩ#vN:i,iY.ѦV]^x18nN}27Hg"9R֤Up Wr*vZJ;3քK:jPG1qa9zP:sP1K"ΞJXQ!-*'Pl7>ox;Z꣏.. \ЃY:{6b&{ UW]U; )btu6f$jjjɶD9}K%&OAGQA-Pmd$2Q2 4Vuu58t~ Sl# /> պL?As wj>>j 쨷hWk"̊,NI'iCjҕW^9c@m(cqj" V3gV&Hv* i<%k+k{d7AJq! aGKg0<4(3ҖvdQ2s+vܡ.Zd0fL}r KꋆHޠƪ"7648`&3&uL H3A@% wB-#u0~|zsQ@ /_n ?ŠsTc8S1)ӥL ՓvX'L9bf[aͺE,6gn8;Jɓ'ÿR3|fYUe~6,@BܙQ;' %(3:]v/;S9̈vSp1@f]w"MaMcX ͓&|#M\2,'N.<5ͪ-pUmwęPu{~3~ðǏCYYYEGT$prKs .`Ʋ:\5XEXh]c ĞB%HwlDZ8a"ρ&_(,YQyD"1cxjt.kOjy^K]2F$6 * s1`)Ѐx<@A+WN(Hø@7D[4(ѲjU; dzV! a5:q)?`:ZRPcСC0̡kl* f U!dcc7' aCfxA EHp 0+%ЈÇgCL ZF/l764 /l_͚DPz!w&-f{%-]n(q (-)ls qa, n19S0UdA p:AN@t8o^ͣ;Q^iW5!dT;5 vnCY\=T8V`+W6E&e(N֦Wttv[Z&zrW .#ڈj:yo"!3uXϥt;C!lc)MՕp>r n "i'^ փqrCRT }lv^U5ftoW"Q%x2 Ov"-q-7Vi °}zVC.r+9̋ `+*+-$tqkLM g&Ҫ "!`xadYy9l!@s4tٲSPLXth|@XðA,AK6b1@ ðX, 8~7pM z'|<`BhA2!db+ j׾<| $,sҙ+wuuufxo߾T2)94tx8vӞӉ1m4-R;֓!_{g(L0ָG-۵>Rd=};9+ޜ0$iԎC"@==i3uF,%zzz"c 6gV>Q#ؾ"[ea^nE4mQɡ$; i9ӱc)D3KHDgg'*+*PUU DQF!&Av;c)BIA]eŋ' ,< Q]d8z֩v?L(X46 wfu) Y rs( z\8[$O;(D)^$Jt2E">aߛ)/2#2ǔos y}3a`` [ ;R><|aYhry ӝʊɡ|Ëav(uWD'rr!_]k +?aT }BfWvv^x~{ah"@VϗZ "zC;;64H= 8~* f\a^!z-2{ ¯b?u֝b a`2޻*": AVvopr?DE`݃Jxgd/A&(HxXXG5  KX/&ýODCXB '=  4ސ9v"YvBUwFu2WEk{$:J,Faǽ#XQ+eºBlɠ] , J</ÕݎX/}衇 :8ueY<u>3!Ǿ)'ni- ߯[V-㦓`( h`=P[(#IN~ D0v<:X &=GEGB7œe˖DUփ2r rin "z;>*Ef 1][(ZZ@~ Io /% B9Krќy"WMZW֬}G~ayQxiֈbqkY-/ؿo4Oi~3[լӬZ ]s.sͭ3[5VuºfUc\*58B.|`=ؽIܞo~~M=Гz& /n&U؎Sv<z? {s[iIxfϊ 4dn*vp"{= fZ\#oX/&1cӪUw@ez"S>v|xREA큾 6RttX߽㻩 憺߸FF|7mڸ@`lj 3@D5/#=<=F "{*2%ϭ073w2X|"rOBܲuo{tw-f;8`<~'!V]Qxo|R0 8/@or {0 $!Fi7 ѧ 11<;xsQٟ}AyYEag !$B]JeJjr(J@+{+[Cإo+Pge)Ie|~%-Orz]mix|l0a5H4Act 2ӔCɃɤ}8m۞d7jT~ڑ U r5 LF22O@AL "naFD.Μv18e:ޏ^wh8om?lVS!_dFOsnpQ|"0NN^k00!pO{\BP !|"|l{>6=z(c'B2SDA"LB/-g #(50y!Bl ??~r/, *pa.0D h=nboG$JIENDB`qstardict-3.0.0/plugins/stardict/pixmaps/list-remove.png000066400000000000000000000203031472531462200234470ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME #E< IDATx}yx}$@RD|R_qj׶Vnnw[{u44i64&Ol8%Qmqb[-ڭ[)IM@̷ `%{*CiG:`:5k@$v[pPY(3>Bg>v#&[l`[`xM8f7S*$v; @`EqAHBN/#Y'b7 2򲹒Rt ?s 8=K3 !t䄙iO@.>0ˉ@?v|C%&<T^5/ϡ@&Sޓ)0'7f:L@089t9"Ț̫&K o [o&m*/JÂA>c`s; o](1=GLɒ)5P~4;'28bK2g/="z~`髊 WIJYw?L+;%e.zϓ\Y"!fSnUAK 'Kk~6B UG#]`?' 07b׉G )Gk@$8  Hlgc(Εhj|6f^sBY @bfNx y?ʕV@JP@юfb!ee:X'Eƀk1 Y̾tȈ']w+6DҊ&mpu.)&7khʠ_֙ `1L|%w|d0h#e} Ÿ֝'fQk`n4xW_ 5*7n@uG 5ÿy>2u@yaM!=G,, dԶ{7EoNC :1{ٕ>kB(vf8>g0R]=ug1^ov:a@d*^JZca:ƦfS.DUSѧg?\^4mUtXtPtϽ A~|c<׏?0( {b(qMߟ>dL@e-`-Y)D4JJ`ٲdhL>&*byy~؊O]ukӈu;&0>Q5;hۉZq؁d*nj@]wCi47_ `w4xfWr#TyF#˵oR~-]nmT_ukJ}&0y޾fVǝ2p<~x>K)?e5OJND[T P[)Ɍ~(Cwjuu(ٰCB=8X*Ӑh1#Gs |0l&>Tlg.!81Skܐ k@m la#J+M\Uu.R~Pxgކ-E*UJ([:Rd%F< "DM\ D%H pY,4_7;\:>8qT-̀O`;~l `:АV@ɍ7b/8vӘCbLwc~-qKԤ |0UV}^Xd]._=!Ѽvk@EEPY|(`ʗPS ?Z;_=VנluTq>Sf_cw&Qx?1O]̸><ڢ*#|3БpUU``2Oc,[[3?\qqLcn0^~|U7&y|.H/`n |0U+A+'1Q@`-CEMMQJ8==3.#jtT5*R{g +{4c<>/Ĕb{1rA: V*ޏ/j0ajY.IsT[;7e`lnI8aF?嬁/#sCI݇twyo5(wNtd |) |1M7Cc#bf>tͪksN InyT ja2`^ԩl/FdCT $EIЛ#'NOѱ@Vwb/<ܣT#"a` Y8d)\ema! յI*{k\ߏvAL ><uU(9"Ѓ}x@Y{[R2TV*L0껾6 P0< U2;:V^vL9 O9mWjnnFǁ(u|0WVI3z!Pp@g*h֑1O +dлkgnI0gQo**aknPl6g#ۖbk= bJ ^vl/.z>EfRQW9/ePc*WlRQAR]xye5C v*AәC;|c%l-j_`-|hKV>n[ 8L1Cu5g$JzLZ>]gJ6l:NwNAl|!+f~Jږ+R^wyq(jy Q&._4͞VlM(["ܙC%P9Բ.|xhNR+4 B!6dH<d;"r;g[$j v@r::رޮ\`HO`v:s.l)>& "|f3H@ 7fz*.C٥0idk{htb67iAM11VƑ.lmIZR獛ZL}i <e"(٘}/ ~zwiokq&^g( SߩHLaJ_"2i-AOi aoi}~؞%XT𛛢v\c|F BHt37X qJj'' :Uax ;`onT\ [[`u6 aTOFW$x LMBky8ÚT}6&s89  PQ/Z{qS}2߇Ѿ7G`!wuzct_OM_P-y*E5; =67I@CkAYS>zo[RJNX'4V$Ԅ[ Px/q5Z"X?6 azi,\Y*ID~,xгk">/X' rT.R13EEMe RoV? atB Ie('ugTMU(kSޮ.!&y( ֆ:'%MZ\81^ g:`L}&W3Le ^H^ݷTÔ+^|ٶ/O_;aTv߳PŒacDq1k`E1o&J:(vOB8_~o` |^fGSȼ9[kvu/x0A2&HZx_r kuϐT |;3%H~YS=Zܩr$D OXqVl`v|>~e9ddWVe@ {KXƛ RwM$c َD^tJo>ŠIJ/_!DpDq&c0av,8R*Ap#ގ={s~ƍh߷_̠[#+yQCA,X(J2:X:@oRC8$:>/D9!}!q+^~2Lw-& \CqDNqPt泂M5"YrgybP/" a F!䟕 kCǡ_TQ(QH}0Ax\Ct?@p8 8K|߉3Vw" aݲ Lq3>ȅg2dFt6ۢJ6~ZTbBM13<<ɠgAxd! dv\{K"Y,D" !<Υ܊/PZzY2%?js0=4$Tqb+h0>Ppypc}Cq۝w\Q.gKLa 2)ǝ̆ley0F\Ò{"݄gk@r_" jǵyWFYD 'gpcnʼn+> CsG$&oVGIK$8C2Y5=8O$v\pJp\£C]v\/8~D6Ԋ;ӟ.9S.7fJ=Mk udyRܟf@Y)X!rsvxV':I#}Ki0]++ Dj`dlc}.5>g:ޮv\% `5$izJ;}i=}7D]SDY. w_u=۶gܒ`Yl2L {X P6 ΂z  "|~]P-=$?s 'ѳ}x,z妲dFwjD ɖq'F)PHmx+~ _櫹۷5" IpRf…Y#&l.Ui/&\bAd94=ms6z "4;u>=`*;.\ Hnx+>}XT/ z]ִA/UD,F`j@62?@#,:ؔƳ~l1 ɓE KivFL7rݷl8H;NY>;>aF#Ǩضmo˸q`z`PqCq1;夼,VZ؛`mKȣ8S5YW1).JL,c/(@ۿlqo66lu7֫F{;>~deOKZ(,@ҽ}~xsf3V9mޜ[%jikVf;`oZ$ЏL ! az6g<0ӍA$.J/l`=uW$VX[ 4D4\Hnf`0moĤNm/~z8;RPQW~v=9z4dF,egd_J8?NiћK6Ȏs}[|CM SY u7K~a^ r@\O}KI6DunU9'@z&YeS{}Y#.HZq%, <6?sϋkpЅͤ%}N5kIU֜ ) Ӭd @i#%vv ,g྘n5kE[ , كֆYwe/(GUi1L5V 6%fP baxfdZVĪ+" onNNSRh%➹B,b(.Fi%_nu7j#S >_Jʕms}f_r~{s~UzҬ֦ؗ7 0qB \C~n5+qjoE#A ~Le: `P]6@g*ҭf%Pվ"IvgGO?Ao XobBJ;n#4)@`a9<ӲsZV>ABɓT=Do9W`q9v;PRe e q:VRf}8?_L kc}VR?X(K9~ ,||{d, r[@!9#~UTWG89Mj5 ħf8_} ''Ã?況[VKmݛj'Pd?QxM-N,zMh01 f Z| OlcA`ғ|Ūb &߫@K?' 3)? >|c͡6g# EzZ3 OB~?Lf Vv(=U䢿9!Ȗ{FUc\ƌŏ G!4O&r> /l~_ 'q{F01uvW4b>OYW>TsEߑ<?ٻ. or{T@֚/Eu21uDԕ?6 MhbYCK-U֊\&]޵@+?a =U+Jͱ{߱Yu=@|u%6uL؞7`/vvv/>-I/ld׶ρ pUǞzot/l@10Uk׿.,d鷱[n9zm@B-b{=|+ rk2'< j uxo4+q` A\v61^n/A8Pi$ arrow-down.png arrow-up.png list-add.png list-remove.png qstardict-3.0.0/plugins/stardict/settingsdialog.cpp000066400000000000000000000062551472531462200225500ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include "stardict.h" SettingsDialog::SettingsDialog(StarDict *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin) { setupUi(this); reformatListsBox->setChecked(m_plugin->m_reformatLists); expandAbbreviationsBox->setChecked(m_plugin->m_expandAbbreviations); dictDirsList->addItems(m_plugin->m_dictDirs); connect(this, SIGNAL(accepted()), SLOT(apply())); } void SettingsDialog::on_addDictDirButton_clicked() { QString dirName = QFileDialog::getExistingDirectory(this, tr("Select dictionaries directory")); if (! dirName.isEmpty()) { dictDirsList->addItem(dirName); } } void SettingsDialog::on_removeDictDirButton_clicked() { delete dictDirsList->takeItem(dictDirsList->currentRow()); } void SettingsDialog::on_moveUpDictDirButton_clicked() { if (dictDirsList->currentRow() > 0) { dictDirsList->insertItem(dictDirsList->currentRow(), dictDirsList->takeItem(dictDirsList->currentRow())); dictDirsList->setCurrentRow(dictDirsList->currentRow() - 1); } } void SettingsDialog::on_moveDownDictDirButton_clicked() { if (dictDirsList->currentRow() < dictDirsList->count() - 1) dictDirsList->insertItem(dictDirsList->currentRow(), dictDirsList->takeItem(dictDirsList->currentRow() + 1)); } void SettingsDialog::apply() { m_plugin->m_reformatLists = reformatListsBox->isChecked(); m_plugin->m_expandAbbreviations = expandAbbreviationsBox->isChecked(); m_plugin->m_dictDirs.clear(); for (int i = 0; i < dictDirsList->count(); ++i) m_plugin->m_dictDirs << dictDirsList->item(i)->text(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/plugins/stardict/settingsdialog.h000066400000000000000000000040231472531462200222040ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" class StarDict; class SettingsDialog: public QDialog, private Ui::SettingsDialog { Q_OBJECT public: SettingsDialog(StarDict *plugin, QWidget *parent = 0); private slots: void on_addDictDirButton_clicked(); void on_removeDictDirButton_clicked(); void on_moveUpDictDirButton_clicked(); void on_moveDownDictDirButton_clicked(); void apply(); private: StarDict *m_plugin; }; #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/plugins/stardict/settingsdialog.ui000066400000000000000000000202601472531462200223730ustar00rootroot00000000000000 SettingsDialog 0 0 466 332 StarDict plugin settings Translations If enabled all lists in translation wil be formated using HTML <li> tag (may be slow) Reformat lists Expand abbreviations if dictionary contains it (may be slow) Expand abbreviations false <b><font color="red">Warning!</font></b> Reformatted translations may display incorrectly. Data directories 9 9 9 9 6 6 6 0 0 0 0 <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Add directory</p></body></html> Add :/icons/list-add.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Remove directory</p></body></html> Remove :/icons/list-remove.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move up</p></body></html> Up :/icons/arrow-up.png <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Move down</p></body></html> Down :/icons/arrow-down.png Qt::Horizontal 342 26 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok buttonBox accepted() SettingsDialog accept() 227 311 157 274 buttonBox rejected() SettingsDialog reject() 295 317 286 274 reformatListsBox toggled(bool) reformatTranslationsWarningLabel setVisible(bool) 55 43 48 86 qstardict-3.0.0/plugins/stardict/stardict.cpp000066400000000000000000000266411472531462200213460ustar00rootroot00000000000000/***************************************************************************** * stardict.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "stardict.h" #include #include #include #include #include #include #include #include #include #include #include #include "lib.h" #include "file.hpp" #include "settingsdialog.h" #include namespace { void xdxf2html(QString &str); QString whereDict(const QString &name, const QStringList &dictDirs); const int MaxFuzzy = 24; class StdList: public std::list { public: StdList() : std::list() { } StdList(const QList &list) : std::list() { for (QList::const_iterator i = list.begin(); i != list.end(); ++i) push_back(i->toUtf8().data()); } StdList(const std::list &list) : std::list(list) { } QStringList toStringList() const { QStringList list; for (const_iterator i = begin(); i != end(); ++i) list << QString::fromUtf8(i->c_str()); return list; } }; class IfoListSetter { public: IfoListSetter(QStringList *list) : m_list(list) { } void operator ()(const std::string &filename, bool) { DictInfo info; if (info.load_from_ifo_file(filename, false)) m_list->push_back(QString::fromUtf8(info.bookname.c_str())); } private: QStringList *m_list; }; class IfoFileFinder { public: IfoFileFinder(const QString &name, QString *filename) : m_name(name.toUtf8().data()), m_filename(filename) { } void operator()(const std::string &filename, bool) { DictInfo info; if (info.load_from_ifo_file(filename, false) && info.bookname == m_name) { *m_filename = QString::fromUtf8(filename.c_str()); } } private: std::string m_name; QString *m_filename; }; } StarDict::StarDict(QObject *parent) : QObject(parent) { m_sdLibs = new Libs; QSettings settings("qstardict","qstardict"); m_dictDirs = settings.value("StarDict/dictDirs", m_dictDirs).toStringList(); m_reformatLists = settings.value("StarDict/reformatLists", true).toBool(); m_expandAbbreviations = settings.value("StarDict/expandAbbreviations", true).toBool(); if (m_dictDirs.isEmpty()) { #ifdef Q_OS_UNIX m_dictDirs << "/usr/share/stardict/dic"; #else m_dictDirs << QCoreApplication::applicationDirPath() + "/dic"; #endif // Q_OS_UNIX m_dictDirs << QDir::homePath() + "/.stardict/dic"; } } StarDict::~StarDict() { QSettings settings("qstardict","qstardict"); settings.setValue("StarDict/dictDirs", m_dictDirs); settings.setValue("StarDict/reformatLists", m_reformatLists); settings.setValue("StarDict/expandAbbreviations", m_expandAbbreviations); delete m_sdLibs; } QStringList StarDict::availableDicts() const { QStringList result; IfoListSetter setter(&result); for_each_file(StdList(m_dictDirs), ".ifo", StdList(), StdList(), setter); return result; } void StarDict::setLoadedDicts(const QStringList &loadedDicts) { QStringList available = availableDicts(); StdList disabled; for (QStringList::const_iterator i = available.begin(); i != available.end(); ++i) { if (! loadedDicts.contains(*i)) disabled.push_back(i->toUtf8().data()); } m_sdLibs->reload(StdList(m_dictDirs), StdList(loadedDicts), disabled); m_loadedDicts.clear(); for (int i = 0; i < m_sdLibs->ndicts(); ++i) m_loadedDicts[QString::fromUtf8(m_sdLibs->dict_name(i).c_str())] = i; } StarDict::DictInfo StarDict::dictInfo(const QString &dict) { ::DictInfo nativeInfo; nativeInfo.wordcount = 0; if (! nativeInfo.load_from_ifo_file(whereDict(dict, m_dictDirs).toUtf8().data(), false)) { return DictInfo(); } DictInfo result(name(), dict); result.setAuthor(QString::fromUtf8(nativeInfo.author.c_str())); result.setDescription(QString::fromUtf8(nativeInfo.description.c_str())); result.setWordsCount(nativeInfo.wordcount ? static_cast(nativeInfo.wordcount) : -1); return result; } bool StarDict::isTranslatable(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return false; long ind; return m_sdLibs->SimpleLookupWord(word.toUtf8().data(), ind, m_loadedDicts[dict]); } StarDict::Translation StarDict::translate(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return Translation(); if (word.isEmpty()) return Translation(); int dictIndex = m_loadedDicts[dict]; long ind; if (! m_sdLibs->SimpleLookupWord(word.toUtf8().data(), ind, m_loadedDicts[dict])) return Translation(); return Translation(QString::fromUtf8(m_sdLibs->poGetWord(ind, dictIndex)), QString::fromUtf8(m_sdLibs->dict_name(dictIndex).c_str()), parseData(m_sdLibs->poGetWordData(ind, dictIndex), dictIndex, true, m_reformatLists, m_expandAbbreviations)); } QStringList StarDict::findSimilarWords(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return QStringList(); gchar *fuzzy_res[MaxFuzzy]; if (! m_sdLibs->LookupWithFuzzy(word.toUtf8().data(), fuzzy_res, MaxFuzzy, m_loadedDicts[dict])) return QStringList(); QStringList result; for (gchar **p = fuzzy_res, **end = fuzzy_res + MaxFuzzy; p != end && *p; ++p) { result << QString::fromUtf8(*p); g_free(*p); } return result; } int StarDict::execSettingsDialog(QWidget *parent) { ::SettingsDialog dialog(this, parent); return dialog.exec(); } QString StarDict::parseData(const char *data, int dictIndex, bool htmlSpaces, bool reformatLists, bool expandAbbreviations) { QString result; quint32 dataSize = *reinterpret_cast(data); const char *dataEnd = data + dataSize; const char *ptr = data + sizeof(quint32); while (ptr < dataEnd) { switch (*ptr++) { case 'm': case 'l': case 'g': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; result += str; break; } case 'x': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; xdxf2html(str); result += str; break; } case 't': { QString str = QString::fromUtf8(ptr); ptr += str.toUtf8().length() + 1; result += ""; result += str; result += ""; break; } case 'y': { ptr += strlen(ptr) + 1; break; } case 'W': case 'P': { ptr += *reinterpret_cast(ptr) + sizeof(quint32); break; } default: ; // nothing } } if (expandAbbreviations) { QRegularExpression regExp("_\\S+[\\.:]"); int pos = 0; QRegularExpressionMatch match; while ((pos = (match = regExp.match(result, pos)).capturedStart()) != -1) { long ind; if (m_sdLibs->SimpleLookupWord(result.mid(pos, match.capturedLength()).toUtf8().data(), ind, dictIndex)) { QString expanded = ""; expanded += parseData(m_sdLibs->poGetWordData(ind, dictIndex)); if (result[pos + match.capturedLength() - 1] == ':') expanded += ':'; expanded += ""; result.replace(pos, match.capturedLength(), expanded); pos += expanded.length(); } else pos += match.capturedLength(); } } if (reformatLists) { int pos = 0; QStack openedLists; while (pos < result.length()) { if (result[pos].isDigit()) { int n = 0; while (result[pos + n].isDigit()) ++n; pos += n; if (result[pos] == '&' && result.mid(pos + 1, 3) == "gt;") result.replace(pos, 4, ">"); QChar marker = result[pos]; QString replacement; if (marker == '>' || marker == '.' || marker == ')') { if (n == 1 && result[pos - 1] == '1') // open new list { if (openedLists.contains(marker)) { replacement = ""; while (openedLists.size() && openedLists.top() != marker) { replacement += ""; openedLists.pop(); } } openedLists.push(marker); replacement += "
    "; } else { while (openedLists.size() && openedLists.top() != marker) { replacement += "
"; openedLists.pop(); } replacement += ""; } replacement += "
  • "; pos -= n; n += pos; while (result[pos - 1].isSpace()) --pos; while (result[n + 1].isSpace()) ++n; result.replace(pos, n - pos + 1, replacement); pos += replacement.length(); } else ++pos; } else ++pos; } while (openedLists.size()) { result += "
  • "; openedLists.pop(); } } if (htmlSpaces) { int n = 0; while (result[n].isSpace()) ++n; result.remove(0, n); n = 0; while (result[result.length() - 1 - n].isSpace()) ++n; result.remove(result.length() - n, n); for (int pos = 0; pos < result.length();) { switch (result[pos].toLatin1()) { case '[': result.insert(pos, ""); pos += 28 + 1; // sizeof "" + 1 break; case ']': result.insert(pos + 1, ""); pos += 7 + 1; // sizeof "" + 1 break; case '\t': result.insert(pos, "    "); pos += 24 + 1; // sizeof "    " + 1 break; case '\n': { int count = 1; n = 1; while (result[pos + n].isSpace()) { if (result[pos + n] == '\n') ++count; ++n; } if (count > 1) result.replace(pos, n, "

    "); else result.replace(pos, n, "
    "); break; } default: ++pos; } } } return result; } namespace { QString whereDict(const QString &name, const QStringList &dictDirs) { QString filename; IfoFileFinder finder(name, &filename); for_each_file(StdList(dictDirs), ".ifo", StdList(), StdList(), finder); return filename; } void xdxf2html(QString &str) { str.replace("", ""); str.replace("", "["); str.replace("", "]"); str.replace("", ""); str.replace(QRegularExpression(".*<\\/k>"), ""); str.replace(QRegularExpression("(<\\/abr>)|(<\\ex>)"), " #include #include class StarDict: public QObject, public QStarDict::DictPlugin { Q_OBJECT #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.DictPlugin/1.0" FILE "stardict.json") #endif Q_INTERFACES(QStarDict::DictPlugin) public: StarDict(QObject *parent = 0); ~StarDict(); QString name() const { return "stardict"; } QString version() const { return "0.1"; } QString description() const { return "The StarDict plugin"; } QStringList authors() const { return QStringList() << "Hu Zheng " << "Opera Wang " << "Alexander Rodin "; } Features features() const { return Features(SearchSimilar | SettingsDialog); } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &loadedDicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); virtual QStringList findSimilarWords(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); friend class SettingsDialog; private: QString parseData(const char *data, int dictIndex = -1, bool htmlSpaces = false, bool reformatLists = false, bool expandAbbreviations = false); Libs *m_sdLibs; QStringList m_dictDirs; QHash m_loadedDicts; bool m_reformatLists; bool m_expandAbbreviations; }; #endif // STARDICT_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/plugins/stardict/stardict.json000066400000000000000000000000541472531462200215230ustar00rootroot00000000000000{ "name": "stardict", "version" : "0.1" } qstardict-3.0.0/plugins/stardict/stardict.pro000066400000000000000000000034361472531462200213610ustar00rootroot00000000000000############################################################################# # stardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = stardict include(../plugin.pri) win32:CONFIG += plugin HEADERS += \ stardict.h \ dictziplib.hpp \ distance.h \ file.hpp \ lib.h \ mapfile.hpp \ settingsdialog.h SOURCES += \ stardict.cpp \ dictziplib.cpp \ distance.cpp \ lib.cpp \ settingsdialog.cpp FORMS += \ settingsdialog.ui RESOURCES += \ pixmaps/pixmaps.qrc OTHER_FILES += \ stardict.json qstardict-3.0.0/plugins/swac/000077500000000000000000000000001472531462200161345ustar00rootroot00000000000000qstardict-3.0.0/plugins/swac/pixmaps/000077500000000000000000000000001472531462200176155ustar00rootroot00000000000000qstardict-3.0.0/plugins/swac/pixmaps/pixmaps.qrc000066400000000000000000000001361472531462200220050ustar00rootroot00000000000000 sound.png qstardict-3.0.0/plugins/swac/pixmaps/sound.png000077500000000000000000000014571472531462200214650ustar00rootroot00000000000000PNG  IHDRabKGDC pHYsHHFk>IDAT8ˍ_Hw?iiVt.,ZaTmP]lm`jk?@"ZJ/S9y<} <|в d gȚ,=d%͛fK/ç jY2S+7gcF/1)G*6}{6Hi="0v]fϿ?HEǖCM u;J9֮/AjL_ FF {C lXs~iN̹T;Ţ22ۃ! v)%{XGmgTx~P 燉Dh0 |q[F♉]bR*+\.|P 8Vs$1i4hE.r~DLaY̰ C65,3~V lX~z> * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "swac.h" #include #include #include #include #include #include Swac::Swac(QObject *parent) : QObject(parent) { db = new QSqlDatabase(); *db = QSqlDatabase::addDatabase("QSQLITE", QLatin1String("swac")); db->setDatabaseName(QDir::homePath() + "/.swac/swac.db"); db->open(); } Swac::~Swac() { db->close(); delete db; QSqlDatabase::removeDatabase("swac"); } QStringList Swac::availableDicts() const { QStringList result; QSqlQuery query = db->exec("SELECT packid FROM packages;"); while (query.next()) { result << query.value(0).toString(); } return result; } void Swac::setLoadedDicts(const QStringList &dicts) { QStringList available = Swac::availableDicts(); m_loadedDicts.clear(); for (QStringList::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { if (available.contains(*i)) m_loadedDicts << *i; } } Swac::DictInfo Swac::dictInfo(const QString &dict) { QSqlQuery query = db->exec("SELECT name, format, version, organization, readme FROM packages WHERE packid = \'" + dict + "\' LIMIT 1;"); if (query.first()) return DictInfo(query.value(0).toString(), dict, query.value(3).toString(), "

    " + query.value(4).toString() + "
    "); else return DictInfo("", dict, "", ""); } QSqlQuery Swac::search(const QString &dict, const QString &word, const QString &fields, const int limit) { QSqlQuery query(*db); query.prepare( "SELECT " + fields + " " + "FROM alphaidx" + " " + "INNER JOIN sounds ON alphaidx.sounds_idx = sounds.idx " + "INNER JOIN packages ON sounds.packages_idx = packages.idx " + "WHERE packages.packid = ?1 AND alphaidx.str = ?2 " + "LIMIT " + QString::number(limit) +";" ); query.addBindValue(dict); query.addBindValue(word); query.exec(); return query; } bool Swac::isTranslatable(const QString &dict, const QString &word) { QSqlQuery query = search(dict, word, "SWAC_TEXT", 1); return query.first(); } Swac::Translation Swac::translate(const QString &dict, const QString &word) { QSqlQuery query = search(dict, word, "SWAC_TEXT, packages.path, filename, SWAC_SPEAK_NAME", 128); QString article(""); int i = 0; while (query.next()) { if (i > 0) article += "
    \n"; article += "   " + query.value(0).toString() + ""; i++; } return Translation(word, dict, article); } QStringList Swac::findSimilarWords(const QString &dict, const QString &word) { return QStringList(); } int Swac::execSettingsDialog(QWidget *parent) { return QMessageBox::information(parent, "SWAC Plugin for QStarDict", "To install new packages, please, use the swac-get command line program.\n" "More information about swac-get is available on Shtooka Project Homepage." ); } #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(swac, Swac) #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/plugins/swac/swac.h000066400000000000000000000060101472531462200172370ustar00rootroot00000000000000/***************************************************************************** * This file is a part of QStarDict, a StarDict clone written using Qt * * swac.cpp - Plugin for words audio collections SWAC * * Copyright (C) 2008 Nicolas Vion * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SWAC_H #define SWAC_H #include "../dictplugin.h" #include #include class Swac: public QObject, public QStarDict::DictPlugin { Q_OBJECT Q_INTERFACES(QStarDict::DictPlugin) #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.DictPlugin/1.0" FILE "swac.json") #endif public: Swac(QObject *parent = 0); ~Swac(); QString name() const { return "swac"; } QString version() const { return "0.1"; } QString description() const { return tr("An experimental plugin for words audio collections (SWAC).
    For more information about SWAC, please, visit the Shtooka Project Homepage."); } QStringList authors() const { return QStringList("Nicolas Vion "); } Features features() const { return Features(SearchSimilar | SettingsDialog); } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts; } void setLoadedDicts(const QStringList &dicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); QStringList findSimilarWords(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); // friend class SettingsDialog; private: QSqlQuery search(const QString &dict, const QString &word, const QString &fields, const int limit); QSqlDatabase *db; QStringList m_loadedDicts; }; #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/plugins/swac/swac.json000066400000000000000000000000501472531462200177570ustar00rootroot00000000000000{ "name": "swac", "version" : "0.1" } qstardict-3.0.0/plugins/swac/swac.pro000066400000000000000000000033061472531462200176150ustar00rootroot00000000000000############################################################################# # swac.pro # # This file is a part of QStarDict, a StarDict clone written with using Qt # # swac.cpp - Plugin for words audio collections SWAC # # Copyright (C) 2008 Nicolas Vion # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = swac include(../plugin.pri) QT += sql HEADERS += \ swac.h SOURCES += \ swac.cpp RESOURCES += \ pixmaps/pixmaps.qrc OTHER_FILES += \ swac.json qstardict-3.0.0/plugins/web/000077500000000000000000000000001472531462200157545ustar00rootroot00000000000000qstardict-3.0.0/plugins/web/adddictionarydialog.ui000066400000000000000000000062521472531462200223160ustar00rootroot00000000000000 AddDictionaryDialog 0 0 377 250 Add dictionary Author: Name: <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The '%s' template will be replace to word.</p></body></html> HTTP query: Description: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() AddDictionaryDialog accept() 227 217 157 237 buttonBox rejected() AddDictionaryDialog reject() 295 223 286 237 qstardict-3.0.0/plugins/web/pixmaps/000077500000000000000000000000001472531462200174355ustar00rootroot00000000000000qstardict-3.0.0/plugins/web/pixmaps/edit.png000066400000000000000000000172161472531462200210770ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs B(xtIME ,3$[IDATxy|SeYrN{ @Ȱ::aTd2. :#E@:#˕]qapŅBWIv9! i'iK~>/I7)F}oA"\OI}|]>dnm*Ѽz@6}Vel\ QVKhM$}b;㎩ϯw/}cFL,@0fT2KBt?BHs8?V.LH93,&Bi t/x~f(=R}[m\(trsL>ja'A-n R$|- \i}4# nK]@@@"t dA8Gkz ajz&?L=. jwQ7D>'V tG.H-B,\vGZ!}?1 x jj bhGÂkD@hU"e.3n R'Qj{$~D1 5nD =ǿN[|. C`\o@Duse?. JQB&l ցр4t#B #QA|~?Z=C: ?b G[#N '$2#!;pִ J_Xh,bXP`$YOAV`7C$|h=h7 x={v㾻oGTv?CX Go:%xxlXbDIȠiz 0aZxSn ?RLկbضҰ@Cy$kh ^x?c|͌׬o;p t4Slc}0܀/<6[DZZZ~`*~[֡ (;|λ׍=gn O͂$IP4K"~~d *$P<+~wOQvFO e4F[X c n+ޚkĂ* d9R\0rHHa42^)H5܂ 1P`D)Xq2qȲNQo^Hc[1HK6 WLـ$)r0i4MaY4&=&A`pXw_l݂i0Y Up)0YYҰR3 À5`2hC ~0cL~kk+dp`ͩ,>;k&5<8g "}Iv(܀iƮ0)r*P 9%]8pIQ,f3x~= #A`԰Ä,w$Unp p ,d1b, ,~/*^:j |8}=@z26^:rllڲ fVg6"p4ݠ/ =Au~C7W c.Nw`dYjz#_H`c|5 J3X[wkA:^}|҄ Ȳݸ+`ZaXq\!h{jz03Vķ e||9)qH@U,<3`X`>=A`~?RUQ%MAZGa H›  &MxNsH["Xp@z LҭHn^1҃Տ"1%V5@iz{z*hxߏ4T|O~i6WOIck!yXEi'=ޚF=m_jC:*  6O"HaQR7s G4TY|R4 ք x?|#:yhM}{>y[ md830㵖fYŌԦg Y nC_ٷU %+ N p7!o]P) Rb4[ n2X'ѯeXxյX{6ll6v$$$nj{K x О{Z  im([C4$*oʵ Ok?!! W:,iO@)$&X YV<@Yq+ gQ[SNm!AP{g_S힇D/ }YjAg2Ip3 A ;U(8|]l6[; P쳀("G&*wWP(<7RX類̗AX`}v/ 0Jӯ*n _"aE"i 9)Κs*@SY|8Ƭ16E$ >;m xՁ;~jX_*_E `f;_/:@9E_=g}1xlIq0;?Cad7|?!^(YK ؑ@$ f\gni s)m5fȣ ͿfY_BmVd$@8<~}xRp5A$)8pTOb>/ݳl. =S >/~0Me(~22/]c+6~k.nWd&ʰxo;W/=x7r;h , WE׳܌DS*`gKl=\+PM?-'k _(݋B bsBH;_wSԜ،"9%%֌^xA9(*85Y Q]ahCv\ Gb‚g 3 @[p>8`9Gz7y +z&Ptsʷ炫~ 0{@|Ht/ `o xh>G6 B ۑW3X&==k?f!Xa8J`ޟR/O_:,j݆"x" gGi8<02#))WK0ن|/)ǵx]tM@S8DX* ʴZT4tl6sB]xL|ݽH6xbȡjy?.`]58q"X  mO({lU"ѵ\B*MML JcDo`G]!ĐPL,iđOn,!<bʌjY A1cDPp&/w ~p^魛,9dƨbLy,[νQޒyȶ~ ^BsշXiXE-]v30zo6TEıM0 lFu}< `GKxgC\`Ʒ+(F:ߞ%m?Tt@Ue=8[$ y"NUK{lN>K7\ ayAfuk~[@p?Q!( jO|0;%l>5^r Ik>/0 8k'N^#~&>ضGPu|5 aq E<7yhYVJm(LM0Er}La{[EQڄ7(|{')jJ/˜V{&fr~gߟ"a"h/.'wusPߞtNh(+]w>F`ud๵uލ.ǟf{vlӓ@1ltή0('E2D]֘{o7G eascѿb͝+ǏwWCqx?d¤{Vtut-,ɲb72 br Dq;zZ\5j(=w6;z(/,qUxlʼtZP ,AS[jkC \I@( Ҁ$CTUߊn_B#WW>4 o(xi?TEAIP O~;|)I6 v7)la ҢMP@J̑HŊ- ו8d HDz7Up2?4 ao ~$CÅxQ d) (2E 8O#k EY`vVw=nmm % .#;RnkutԔDywlnB,w9 eCQ`a|-,CEIYI4 8@2]>@4xRC kZ^}8qDeg-Q`'b[eTÆ˞C B[u&Aeee^-oTcߖݫ2DI +jD* i*)p8hmCm}v?|#%^PEg2'S9_4/A&T?`2 H~w _#Q:'hdgTUE04̬̂,hjj@m]S/^( /`Q9A@ItjAMD(lhUEQy HLL yZ?pmx}[Y 2$Qx?OKMŠA Vu8x<3߮|Ri8 fO҉[ْ|ߞ=`Y u#C( (k2b69樎iW5;7--p\"Y|*d EQa4x fel6?hm G>2\nkWd Qɥ?,*\/QAcTԝ%TКf|>?!.(_z]=hiiFsSZ].HZ K(-Vdfd`/{9'?XR֮7\5gi'$dAfU^pSX>sW)xVD}F|{(`_G۷pDS8~JxxDZ[]p\p67CаZ$$8#9)I{Moa(Ғ][~Oaa'Mszq8q3lʿL ˲[|߿/xwϨ8bpm_i7S? #BQ͔=eeGb۷oo|}tZٕ %p88iȐ!Cp!n,  HrތXu8la*hZ,Zv.{]Qo}+2$\eWէG,{@Gb]G̛xj}\-]s]y\Bii)fϞ#G -- )))iUz LT@;zt*,˂Ak/I",K MM8EEjJr$Ţ;Ι%^:u{7&\D{_k*rع#4MC=OVMV!,{jH:Y G۷&}#^Wd 333,rqQٳN-_Y+p:֐?e\(5 ^^jMmKR8|AeLŎ6W7{d$z7zfW 5k~Tzz;C=hllD}]~梦z| t:޳)k .!>?#t 5zxM *|͙=׻QgΜi0a999u/ɓAAT,g~w.kS֛;4/XLwW +^ve,k[@j~QqY3o~6ԩSܼ|PE45BQTj6lj$`,D(.. PU5@kTHN)k(pp\p]p].n_'L 2+z据VUVm-,,;mڴz'--6MN޶#Y|mJ0m(B!;{p{¢{R[;@1c9xwpomJEQ`Uɣ7vz" *Tdgg]Pt9OWw*[9x6DM$]˶E ` NTOUT(]"ϯh/țabKGD pHYs B(xtIME # fpIDATx]{ř}y?5#AQ4Y%p=Q1l6FyqbA$&ٳwr4nr5FTD bQ 30v}}uWW;3SVw}Q@JTD%*QJTD%:kΜiDt:CdM A\c:pa"@@f̌_[QJM&6<0;s ^}.b3v3/ђq-a2"`1Ԣ>e6R ;詘)|o>aƵ ,96Q OԟeDo2a14K/QI"3g 7X QFb9g~O wl߾$8kNDa9~ @e@;v>ܓ%Ag~ 7zMM5ЀƆF!H XD0883Dqtvv 8T@;/>̳%Ymm3%}\x&Nf477eR3<:J#bŁwBww0$󭔌_ߍ={@2{@ /~,5.c; /<¬>Y>9fHcؽ ߡ|[ 2U۶m@k{ fO³ =lΚX,™wVSh_4ص{7^}5{c~Nx޾XPa٘ڊj:DGx ~uzu  % l +s#B+ 3ui8yK `>&Ǟ^ع{q=R_$ X'r {zUkjjp…8yʔw&];^x=xeU[Ǐpt}ヒ;wرcVBy'cb_`Fu}㿑<}4|ҥf3ҟSzp/~crh3RbH;,̨ŌiۋN ?u1|睧͟X5kra``_L9P[ƳGtuuzꩂ:KiJֳ֧j[X -Xi:2W?*_zR柷׹jkqх1RJx\U'8Ւd0TyȬp1c/hwb2{ e$ 7)XK y'553.EC}X2XJ0RJHcl]Ē!%Cr\?wH)쬳KfcE)Ri]{X,>E-XuU;9ZZZK.A"Qfa”Gt2>}Hi0=dm'H`cĉ1XsW\w\@&R9z*.XZ2˸HLEkYzkKK=g/S/a)Sl2N\vjh[B>JD1JϒY=)'c޼6)j+ygM@Waz0-YGHe˖pQ"qh~IhfX;chE& #:1mҷ̘ڊ 'MA|Ĩ#vN:i,iY.ѦV]^x18nN}27Hg"9R֤Up Wr*vZJ;3քK:jPG1qa9zP:sP1K"ΞJXQ!-*'Pl7>ox;Z꣏.. \ЃY:{6b&{ UW]U; )btu6f$jjjɶD9}K%&OAGQA-Pmd$2Q2 4Vuu58t~ Sl# /> պL?As wj>>j 쨷hWk"̊,NI'iCjҕW^9c@m(cqj" V3gV&Hv* i<%k+k{d7AJq! aGKg0<4(3ҖvdQ2s+vܡ.Zd0fL}r KꋆHޠƪ"7648`&3&uL H3A@% wB-#u0~|zsQ@ /_n ?ŠsTc8S1)ӥL ՓvX'L9bf[aͺE,6gn8;Jɓ'ÿR3|fYUe~6,@BܙQ;' %(3:]v/;S9̈vSp1@f]w"MaMcX ͓&|#M\2,'N.<5ͪ-pUmwęPu{~3~ðǏCYYYEGT$prKs .`Ʋ:\5XEXh]c ĞB%HwlDZ8a"ρ&_(,YQyD"1cxjt.kOjy^K]2F$6 * s1`)Ѐx<@A+WN(Hø@7D[4(ѲjU; dzV! a5:q)?`:ZRPcСC0̡kl* f U!dcc7' aCfxA EHp 0+%ЈÇgCL ZF/l764 /l_͚DPz!w&-f{%-]n(q (-)ls qa, n19S0UdA p:AN@t8o^ͣ;Q^iW5!dT;5 vnCY\=T8V`+W6E&e(N֦Wttv[Z&zrW .#ڈj:yo"!3uXϥt;C!lc)MՕp>r n "i'^ փqrCRT }lv^U5ftoW"Q%x2 Ov"-q-7Vi °}zVC.r+9̋ `+*+-$tqkLM g&Ҫ "!`xadYy9l!@s4tٲSPLXth|@XðA,AK6b1@ ðX, 8~7pM z'|<`BhA2!db+ j׾<| $,sҙ+wuuufxo߾T2)94tx8vӞӉ1m4-R;֓!_{g(L0ָG-۵>Rd=};9+ޜ0$iԎC"@==i3uF,%zzz"c 6gV>Q#ؾ"[ea^nE4mQɡ$; i9ӱc)D3KHDgg'*+*PUU DQF!&Av;c)BIA]eŋ' ,< Q]d8z֩v?L(X46 wfu) Y rs( z\8[$O;(D)^$Jt2E">aߛ)/2#2ǔos y}3a`` [ ;R><|aYhry ӝʊɡ|Ëav(uWD'rr!_]k +?aT }BfWvv^x~{ah"@VϗZ "zC;;64H= 8~* f\a^!z-2{ ¯b?u֝b a`2޻*": AVvopr?DE`݃Jxgd/A&(HxXXG5  KX/&ýODCXB '=  4ސ9v"YvBUwFu2WEk{$:J,Faǽ#XQ+eºBlɠ] , J</ÕݎX/}衇 :8ueY<u>3!Ǿ)'ni- ߯[V-㦓`( h`=P[(#IN~ D0v<:X &=GEGB7œe˖DUփ2r rin "z;>*Ef 1][(ZZ@~ Io /% B9Krќy"WMZW֬}G~ayQxiֈbqkY-/ؿo4Oi~3[լӬZ ]s.sͭ3[5VuºfUc\*58B.|`=ؽIܞo~~M=Гz& /n&U؎Sv<z? {s[iIxfϊ 4dn*vp"{= fZ\#oX/&1cӪUw@ez"S>v|xREA큾 6RttX߽㻩 憺߸FF|7mڸ@`lj 3@D5/#=<=F "{*2%ϭ073w2X|"rOBܲuo{tw-f;8`<~'!V]Qxo|R0 8/@or {0 $!Fi7 ѧ 11<;xsQٟ}AyYEag !$B]JeJjr(J@+{+[Cإo+Pge)Ie|~%-Orz]mix|l0a5H4Act 2ӔCɃɤ}8m۞d7jT~ڑ U r5 LF22O@AL "naFD.Μv18e:ޏ^wh8om?lVS!_dFOsnpQ|"0NN^k00!pO{\BP !|"|l{>6=z(c'B2SDA"LB/-g #(50y!Bl ??~r/, *pa.0D h=nboG$JIENDB`qstardict-3.0.0/plugins/web/pixmaps/list-remove.png000066400000000000000000000203031472531462200224070ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME #E< IDATx}yx}$@RD|R_qj׶Vnnw[{u44i64&Ol8%Qmqb[-ڭ[)IM@̷ `%{*CiG:`:5k@$v[pPY(3>Bg>v#&[l`[`xM8f7S*$v; @`EqAHBN/#Y'b7 2򲹒Rt ?s 8=K3 !t䄙iO@.>0ˉ@?v|C%&<T^5/ϡ@&Sޓ)0'7f:L@089t9"Ț̫&K o [o&m*/JÂA>c`s; o](1=GLɒ)5P~4;'28bK2g/="z~`髊 WIJYw?L+;%e.zϓ\Y"!fSnUAK 'Kk~6B UG#]`?' 07b׉G )Gk@$8  Hlgc(Εhj|6f^sBY @bfNx y?ʕV@JP@юfb!ee:X'Eƀk1 Y̾tȈ']w+6DҊ&mpu.)&7khʠ_֙ `1L|%w|d0h#e} Ÿ֝'fQk`n4xW_ 5*7n@uG 5ÿy>2u@yaM!=G,, dԶ{7EoNC :1{ٕ>kB(vf8>g0R]=ug1^ov:a@d*^JZca:ƦfS.DUSѧg?\^4mUtXtPtϽ A~|c<׏?0( {b(qMߟ>dL@e-`-Y)D4JJ`ٲdhL>&*byy~؊O]ukӈu;&0>Q5;hۉZq؁d*nj@]wCi47_ `w4xfWr#TyF#˵oR~-]nmT_ukJ}&0y޾fVǝ2p<~x>K)?e5OJND[T P[)Ɍ~(Cwjuu(ٰCB=8X*Ӑh1#Gs |0l&>Tlg.!81Skܐ k@m la#J+M\Uu.R~Pxgކ-E*UJ([:Rd%F< "DM\ D%H pY,4_7;\:>8qT-̀O`;~l `:АV@ɍ7b/8vӘCbLwc~-qKԤ |0UV}^Xd]._=!Ѽvk@EEPY|(`ʗPS ?Z;_=VנluTq>Sf_cw&Qx?1O]̸><ڢ*#|3БpUU``2Oc,[[3?\qqLcn0^~|U7&y|.H/`n |0U+A+'1Q@`-CEMMQJ8==3.#jtT5*R{g +{4c<>/Ĕb{1rA: V*ޏ/j0ajY.IsT[;7e`lnI8aF?嬁/#sCI݇twyo5(wNtd |) |1M7Cc#bf>tͪksN InyT ja2`^ԩl/FdCT $EIЛ#'NOѱ@Vwb/<ܣT#"a` Y8d)\ema! յI*{k\ߏvAL ><uU(9"Ѓ}x@Y{[R2TV*L0껾6 P0< U2;:V^vL9 O9mWjnnFǁ(u|0WVI3z!Pp@g*h֑1O +dлkgnI0gQo**aknPl6g#ۖbk= bJ ^vl/.z>EfRQW9/ePc*WlRQAR]xye5C v*AәC;|c%l-j_`-|hKV>n[ 8L1Cu5g$JzLZ>]gJ6l:NwNAl|!+f~Jږ+R^wyq(jy Q&._4͞VlM(["ܙC%P9Բ.|xhNR+4 B!6dH<d;"r;g[$j v@r::رޮ\`HO`v:s.l)>& "|f3H@ 7fz*.C٥0idk{htb67iAM11VƑ.lmIZR獛ZL}i <e"(٘}/ ~zwiokq&^g( SߩHLaJ_"2i-AOi aoi}~؞%XT𛛢v\c|F BHt37X qJj'' :Uax ;`onT\ [[`u6 aTOFW$x LMBky8ÚT}6&s89  PQ/Z{qS}2߇Ѿ7G`!wuzct_OM_P-y*E5; =67I@CkAYS>zo[RJNX'4V$Ԅ[ Px/q5Z"X?6 azi,\Y*ID~,xгk">/X' rT.R13EEMe RoV? atB Ie('ugTMU(kSޮ.!&y( ֆ:'%MZ\81^ g:`L}&W3Le ^H^ݷTÔ+^|ٶ/O_;aTv߳PŒacDq1k`E1o&J:(vOB8_~o` |^fGSȼ9[kvu/x0A2&HZx_r kuϐT |;3%H~YS=Zܩr$D OXqVl`v|>~e9ddWVe@ {KXƛ RwM$c َD^tJo>ŠIJ/_!DpDq&c0av,8R*Ap#ގ={s~ƍh߷_̠[#+yQCA,X(J2:X:@oRC8$:>/D9!}!q+^~2Lw-& \CqDNqPt泂M5"YrgybP/" a F!䟕 kCǡ_TQ(QH}0Ax\Ct?@p8 8K|߉3Vw" aݲ Lq3>ȅg2dFt6ۢJ6~ZTbBM13<<ɠgAxd! dv\{K"Y,D" !<Υ܊/PZzY2%?js0=4$Tqb+h0>Ppypc}Cq۝w\Q.gKLa 2)ǝ̆ley0F\Ò{"݄gk@r_" jǵyWFYD 'gpcnʼn+> CsG$&oVGIK$8C2Y5=8O$v\pJp\£C]v\/8~D6Ԋ;ӟ.9S.7fJ=Mk udyRܟf@Y)X!rsvxV':I#}Ki0]++ Dj`dlc}.5>g:ޮv\% `5$izJ;}i=}7D]SDY. w_u=۶gܒ`Yl2L {X P6 ΂z  "|~]P-=$?s 'ѳ}x,z妲dFwjD ɖq'F)PHmx+~ _櫹۷5" IpRf…Y#&l.Ui/&\bAd94=ms6z "4;u>=`*;.\ Hnx+>}XT/ z]ִA/UD,F`j@62?@#,:ؔƳ~l1 ɓE KivFL7rݷl8H;NY>;>aF#Ǩضmo˸q`z`PqCq1;夼,VZ؛`mKȣ8S5YW1).JL,c/(@ۿlqo66lu7֫F{;>~deOKZ(,@ҽ}~xsf3V9mޜ[%jikVf;`oZ$ЏL ! az6g<0ӍA$.J/l`=uW$VX[ 4D4\Hnf`0moĤNm/~z8;RPQW~v=9z4dF,egd_J8?NiћK6Ȏs}[|CM SY u7K~a^ r@\O}KI6DunU9'@z&YeS{}Y#.HZq%, <6?sϋkpЅͤ%}N5kIU֜ ) Ӭd @i#%vv ,g྘n5kE[ , كֆYwe/(GUi1L5V 6%fP baxfdZVĪ+" onNNSRh%➹B,b(.Fi%_nu7j#S >_Jʕms}f_r~{s~UzҬ֦ؗ7 0qB \C~n5+qjoE#A ~Le: `P]6@g*ҭf%Pվ"IvgGO?Ao XobBJ;n#4)@`a9<ӲsZV>ABɓT=Do9W`q9v;PRe e q:VRf}8?_L kc}VR?X(K9~ ,||{d, r[@!9#~UTWG89Mj5 ħf8_} ''Ã?況[VKmݛj'Pd?QxM-N,zMh01 f Z| OlcA`ғ|Ūb &߫@K?' 3)? >|c͡6g# EzZ3 OB~?Lf Vv(=U䢿9!Ȗ{FUc\ƌŏ G!4O&r> /l~_ 'q{F01uvW4b>OYW>TsEߑ<?ٻ. or{T@֚/Eu21uDԕ?6 MhbYCK-U֊\&]޵@+?a =U+Jͱ{߱Yu=@|u%6uL؞7`/vvv/>-I/ld׶ρ pUǞzot/l@10Uk׿.,d鷱[n9zm@B-b{=|+ rk2'< j uxo4+q` A\v61^n/A8Pi$ edit.png list-add.png list-remove.png qstardict-3.0.0/plugins/web/settingsdialog.cpp000066400000000000000000000101031472531462200214730ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include #include #include #include "ui_adddictionarydialog.h" SettingsDialog::SettingsDialog(Web *plugin, QWidget *parent) : QDialog(parent), m_plugin(plugin) { setupUi(this); QStringList filenames = QDir(plugin->workPath()).entryList(QStringList("*.webdict"), QDir::Files, QDir::Name); for (QStringList::iterator i = filenames.begin(); i != filenames.end(); ++i) { QSettings dict(plugin->workPath() + "/" + *i, QSettings::IniFormat); m_oldDicts[i->remove(".webdict")] = Dict(dict.value("author").toString(), dict.value("description").toString(), dict.value("query").toString(), dict.value("charset").toByteArray()); } m_dicts = m_oldDicts; refresh(); } void SettingsDialog::on_editDictButton_clicked() { if (dictsList->currentRow() == -1) return; QString dict = dictsList->currentItem()->text(); Ui::AddDictionaryDialog ui; QDialog dialog(this); ui.setupUi(&dialog); dialog.setWindowTitle(tr("Edit dictionary")); ui.nameEdit->setText(dict); ui.authorEdit->setText(m_dicts[dict].author); ui.descEdit->setText(m_dicts[dict].description); ui.queryEdit->setText(m_dicts[dict].query); if (dialog.exec() != QDialog::Accepted) return; if (ui.nameEdit->text() != dict) { m_dicts.remove(dict); dict = ui.nameEdit->text(); } m_dicts[dict].author = ui.authorEdit->text(); m_dicts[dict].description = ui.descEdit->toPlainText(); m_dicts[dict].query = ui.queryEdit->text(); refresh(); } void SettingsDialog::on_addDictButton_clicked() { Ui::AddDictionaryDialog ui; QDialog dialog(this); ui.setupUi(&dialog); if (dialog.exec() != QDialog::Accepted) return; m_dicts[ui.nameEdit->text()] = Dict(ui.authorEdit->text(), ui.descEdit->toPlainText(), ui.queryEdit->text()); refresh(); } void SettingsDialog::on_removeDictButton_clicked() { QListWidgetItem *item = dictsList->takeItem(dictsList->currentRow()); m_dicts.remove(item->text()); delete item; } void SettingsDialog::refresh() { dictsList->clear(); dictsList->insertItems(0, m_dicts.keys()); } void SettingsDialog::accept() { for (QHash::const_iterator i = m_dicts.begin(); i != m_dicts.end(); ++i) { QSettings dict(m_plugin->workPath() + "/" + i.key() + ".webdict", QSettings::IniFormat); dict.setValue("author", i->author); dict.setValue("description", i->description); dict.setValue("query", i->query); m_oldDicts.remove(i.key()); } for (QHash::const_iterator i = m_oldDicts.begin(); i != m_oldDicts.end(); ++i) QFile::remove(m_plugin->workPath() + "/" + i.key() + ".webdict"); QDialog::accept(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/plugins/web/settingsdialog.h000066400000000000000000000047371472531462200211600ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" #include "web.h" class SettingsDialog: public QDialog, public Ui::SettingsDialog { Q_OBJECT public: SettingsDialog(Web *plugin, QWidget *parent = 0); void accept(); private slots: void on_editDictButton_clicked(); void on_addDictButton_clicked(); void on_removeDictButton_clicked(); private: void refresh(); struct Dict { Dict(const QString &a = QString(), const QString &d = QString(), const QString &q = QString(), const QByteArray &c = QByteArray()) : author(a), description(d), query(q) { } QString author; QString description; QString query; }; QHash m_oldDicts; QHash m_dicts; Web *m_plugin; }; #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/plugins/web/settingsdialog.ui000066400000000000000000000106531472531462200213400ustar00rootroot00000000000000 SettingsDialog 0 0 354 295 Web plugin settings Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok Dictionaries 9 9 9 9 6 6 6 0 0 0 0 Edit dictionary Edit :/icons/edit.png Add dictionary Add :/icons/list-add.png Remove dictionary Remove :/icons/list-remove.png Qt::Horizontal 342 26 buttonBox accepted() SettingsDialog accept() 227 311 157 274 buttonBox rejected() SettingsDialog reject() 295 317 286 274 qstardict-3.0.0/plugins/web/web.cpp000066400000000000000000000070561472531462200172450ustar00rootroot00000000000000/***************************************************************************** * web.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "web.h" #include #include #include #include #include #include #include #include #include "settingsdialog.h" Web::Web(QObject *parent) : QObject(parent) { } QStringList Web::availableDicts() const { QStringList result = QDir(workPath()).entryList(QStringList("*.webdict"), QDir::Files, QDir::Name); result.replaceInStrings(".webdict", ""); return result; } void Web::setLoadedDicts(const QStringList &dicts) { for (QStringList::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { QString filename = workPath() + "/" + *i + ".webdict"; if (! QFile::exists(filename)) continue; QSettings dict(filename, QSettings::IniFormat); QString query = dict.value("query").toString(); if (! query.isEmpty()) { m_loadedDicts[*i].query = query; m_loadedDicts[*i].codec = dict.value("charset").toByteArray(); } } } Web::DictInfo Web::dictInfo(const QString &dict) { QString filename = workPath() + "/" + dict + ".webdict"; if (! QFile::exists(filename)) return DictInfo(); QSettings dictFile(filename, QSettings::IniFormat); DictInfo info(name(), dict, dictFile.value("author").toString(), dictFile.value("description").toString()); return info; } bool Web::isTranslatable(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return false; // TODO Q_UNUSED(word); return true; } Web::Translation Web::translate(const QString &dict, const QString &word) { if (! m_loadedDicts.contains(dict)) return Translation(); QUrl url(m_loadedDicts[dict].query.replace("%s", word)); QEventLoop loop; QNetworkAccessManager qnam; QNetworkReply *reply = qnam.get(QNetworkRequest(url)); connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); QString translation = QString::fromUtf8(reply->readAll()); return Translation(dict, word, translation); } int Web::execSettingsDialog(QWidget *parent) { ::SettingsDialog dialog(this, parent); return dialog.exec(); } #if QT_VERSION < 0x050000 Q_EXPORT_PLUGIN2(web, Web) #endif // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/plugins/web/web.h000066400000000000000000000053461472531462200167120ustar00rootroot00000000000000/***************************************************************************** * web.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef WEB_H #define WEB_H #include "../dictplugin.h" #include class Web: public QObject, public QStarDict::DictPlugin { Q_OBJECT Q_INTERFACES(QStarDict::DictPlugin) #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "org.qstardict.DictPlugin/1.0" FILE "web.json") #endif public: Web(QObject *parent = 0); QString name() const { return "web"; } QString version() const { return "0.01"; } QString description() const { return tr("An experimental plugin for WEB dictionaries.
    Warning: now this plugin is unstable"); } QStringList authors() const { return QStringList("Alexander Rodin "); } Features features() const { return Features(SettingsDialog); } QStringList availableDicts() const; QStringList loadedDicts() const { return m_loadedDicts.keys(); } void setLoadedDicts(const QStringList &dicts); DictInfo dictInfo(const QString &dict); bool isTranslatable(const QString &dict, const QString &word); Translation translate(const QString &dict, const QString &word); int execSettingsDialog(QWidget *parent); friend class SettingsDialog; private: struct QueryStruct { QString query; QByteArray codec; }; QHash m_loadedDicts; }; #endif // WEB_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/plugins/web/web.json000066400000000000000000000000501472531462200174170ustar00rootroot00000000000000{ "name": "web", "version" : "0.01" } qstardict-3.0.0/plugins/web/web.pro000066400000000000000000000032071472531462200172550ustar00rootroot00000000000000############################################################################# # web.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TARGET = web include(../plugin.pri) HEADERS += \ settingsdialog.h \ web.h SOURCES += \ settingsdialog.cpp \ web.cpp FORMS += \ adddictionarydialog.ui \ settingsdialog.ui RESOURCES += \ pixmaps/pixmaps.qrc OTHER_FILES += \ web.json qstardict-3.0.0/qstardict.pri000066400000000000000000000126771472531462200162450ustar00rootroot00000000000000############################################################################# # qstardict.pri - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# VERSION = 3.0.0 QT = \ core \ gui \ network \ xml greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets printsupport } CONFIG += \ qt \ warn_on \ release unix { CONFIG += link_pkgconfig PKGCONFIG += glib-2.0 LIBS += -lz -lX11 } macx { # universal binaries CONFIG += x86 x86_64 # not available on Snow Leopard ppc ppc64 # QMAKE_MAC_SDK = /Developer/SDKs/MacOSX10.5.sdk/ } win32 { CONFIG += console LIBS += -lzdll -lglib-2.0 -luser32 INCLUDEPATH += $$GLIB2PATH/include/glib-2.0 \ $$GLIB2PATH/lib/glib-2.0/include \ $$ZLIBPATH/include QMAKE_LIBDIR += $$GLIB2PATH/lib \ $$ZLIBPATH/lib } unix:DEFINES += HAVE_MMAP unix:isEmpty(NO_DBUS):!contains(QT_CONFIG, dbus): NO_DBUS = 1 unix:isEmpty(NO_DBUS):QT += dbus unix:isEmpty(NO_DBUS):DEFINES += QSTARDICT_WITH_DBUS isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_WITH_TRANSLATIONS include(plugins/plugins.pri) unix { macx { isEmpty(INSTALL_PREFIX) { INSTALL_PREFIX=/opt } # helper var to save text duplicity. # NOTE: it cannot use $$TARGET because the target is # different in every directory. Obviously. MAC_BUNDLE_PATH=$$INSTALL_PREFIX/QStarDict.app/Contents # bin dir is used for qstardict dir/main application # qmake created bundle for it itself. So it *has* to be # the same as install location BIN_DIR=$$INSTALL_PREFIX DATA_DIR=$$MAC_BUNDLE_PATH/share TRANSLATIONS_DIR=$$MAC_BUNDLE_PATH/i18n PLUGINS_DIR=$$MAC_BUNDLE_PATH/lib DOCS_DIR=$$MAC_BUNDLE_PATH/share/doc DEFINES += QSTARDICT_VERSION=\\\"$$VERSION\\\" } else { isEmpty(INSTALL_PREFIX):INSTALL_PREFIX=/usr isEmpty(BIN_DIR):BIN_DIR=$$INSTALL_PREFIX/bin isEmpty(DATA_DIR):DATA_DIR=$$INSTALL_PREFIX/share/qstardict isEmpty(NO_TRANSLATIONS):isEmpty(TRANSLATIONS_DIR):TRANSLATIONS_DIR=$$DATA_DIR/translations isEmpty(LIB_DIR):LIB_DIR=$$INSTALL_PREFIX/lib/qstardict isEmpty(PLUGINS_DIR):PLUGINS_DIR=$$LIB_DIR/plugins isEmpty(DOCS_DIR):DOCS_DIR=$$INSTALL_PREFIX/share/doc/qstardict DEFINES += QSTARDICT_VERSION=\\\"$$VERSION\\\" DEFINES += QSTARDICT_INSTALL_PREFIX=\\\"$$INSTALL_PREFIX\\\" DEFINES += QSTARDICT_BIN_DIR=\\\"$$BIN_DIR\\\" DEFINES += QSTARDICT_DATA_DIR=\\\"$$DATA_DIR\\\" isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\\\"$$TRANSLATIONS_DIR\\\" DEFINES += QSTARDICT_PLUGINS_DIR=\\\"$$PLUGINS_DIR\\\" } } else:win32 { isEmpty(INSTALL_PREFIX) { INSTALL_PREFIX= } else { # handle path backslashes in defines correctly INSTALL_PREFIX = $$re_escape($$INSTALL_PREFIX) } isEmpty(BIN_DIR):BIN_DIR=$$INSTALL_PREFIX/ isEmpty(DATA_DIR):DATA_DIR=$$INSTALL_PREFIX/data isEmpty(NO_TRANSLATIONS):isEmpty(TRANSLATIONS_DIR):TRANSLATIONS_DIR=$$INSTALL_PREFIX/translations isEmpty(PLUGINS_DIR):PLUGINS_DIR=$$INSTALL_PREFIX/plugins isEmpty(DOCS_DIR):DOCS_DIR=$$INSTALL_PREFIX/docs DEFINES += QSTARDICT_VERSION=\\\"$$VERSION\\\" # DEFINES += QSTARDICT_INSTALL_PREFIX=\(QApplication::applicationDirPath\(\)+\\\"$$INSTALL_PREFIX\\\"\) # DEFINES += QSTARDICT_BIN_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$BIN_DIR\\\"\) # DEFINES += QSTARDICT_DATA_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$DATA_DIR\\\"\) # isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$TRANSLATIONS_DIR\\\"\) # DEFINES += QSTARDICT_PLUGINS_DIR=\(QApplication::applicationDirPath\(\)+\\\"$$PLUGINS_DIR\\\"\) DEFINES += QSTARDICT_INSTALL_PREFIX=\\\"$$INSTALL_PREFIX\\\" DEFINES += QSTARDICT_BIN_DIR=\\\"$$BIN_DIR\\\" DEFINES += QSTARDICT_DATA_DIR=\\\"$$DATA_DIR\\\" isEmpty(NO_TRANSLATIONS):DEFINES += QSTARDICT_TRANSLATIONS_DIR=\\\"$$TRANSLATIONS_DIR\\\" DEFINES += QSTARDICT_PLUGINS_DIR=\\\"$$PLUGINS_DIR\\\" } qstardict-3.0.0/qstardict.pro000066400000000000000000000050011472531462200162320ustar00rootroot00000000000000############################################################################# # qstardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TEMPLATE = subdirs include(qstardict.pri) SUBDIRS = qstardict plugins DOCS += \ AUTHORS \ COPYING \ ChangeLog \ THANKS DISTFILES += $$DOCS \ INSTALL \ README message("Enabled plugins: "$$ENABLED_PLUGINS) unix { isEmpty(NO_DBUS) { message("D-Bus support: enabled") } else { message("D-Bus support: disabled") } } isEmpty(NO_TRANSLATIONS) { message("Translations: enabled") } else { message("Translations: disabled") } message("Install prefix: "$$INSTALL_PREFIX) message("Binary directory: "$$BIN_DIR) message("Data directory: "$$DATA_DIR) isEmpty(NO_TRANSLATIONS):message("Translations directory: "$$TRANSLATIONS_DIR) message("Plugins directory: "$$PLUGINS_DIR) message("Documentation directory: "$$DOCS_DIR) win32 { isEmpty(GLIB2PATH) { error("No Glib2 library path (GLIB2PATH) is set.") } else { message("Glib2 location is set to $$GLIB2PATH") } isEmpty(ZLIBPATH) { error("No zlib library path (ZLIBPATH) is set.") } else { message("Zlib location is set to $$ZLIBPATH") } } docs.files = $$DOCS docs.path = $$DOCS_DIR INSTALLS += docs qstardict-3.0.0/qstardict/000077500000000000000000000000001472531462200155145ustar00rootroot00000000000000qstardict-3.0.0/qstardict/application.cpp000066400000000000000000000077601472531462200205350ustar00rootroot00000000000000/***************************************************************************** * application.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "application.h" #ifdef QSTARDICT_WITH_TRANSLATIONS #include #include #include #include #endif // QSTARDICT_WITH_TRANSLATIONS #include "dictcore.h" #include "mainwindow.h" #include "popupwindow.h" #include "speaker.h" #include "trayicon.h" #ifdef QSTARDICT_WITH_DBUS #include "dbusadaptor.h" #endif // QSTARDICT_WITH_DBUS namespace QStarDict { Application::Application(int &argc, char **argv) : QApplication(argc, argv) { setOrganizationName("qstardict"); setApplicationName("qstardict"); setQuitOnLastWindowClosed(false); #ifdef QSTARDICT_WITH_TRANSLATIONS m_translator = new QTranslator; #ifdef Q_WS_MAC QString binPath = QCoreApplication::applicationDirPath(); // navigate through mac's bundle tree structore m_translator->load("qstardict-" + QLocale::system().name(), binPath + "/../i18n/"); #else m_translator->load("qstardict-" + QLocale::system().name(), QSTARDICT_TRANSLATIONS_DIR); #endif installTranslator(m_translator); m_qtTranslator = new QTranslator; m_qtTranslator->load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); installTranslator(m_qtTranslator); #endif // QSTARDICT_WITH_TRANSLATIONS m_dictCore = new DictCore; m_popupWindow = new PopupWindow; m_popupWindow->setDict(m_dictCore); m_speaker = new Speaker; m_trayIcon = new TrayIcon; m_mainWindow = new MainWindow; m_mainWindow->setDict(m_dictCore); #ifdef QSTARDICT_WITH_DBUS m_dbusAdaptor = new DBusAdaptor(m_mainWindow); #endif // QSTARDICT_WITH_DBUS } Application::~Application() { delete m_trayIcon; delete m_mainWindow; delete m_popupWindow; delete m_speaker; delete m_dictCore; #ifdef QSTARDICT_WITH_TRANSLATIONS removeTranslator(m_translator); delete m_translator; removeTranslator(m_qtTranslator); delete m_qtTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS } int Application::exec() { QString text = commandLineText(); if (text.isEmpty()) m_mainWindow->showTranslation(text); return QApplication::exec(); } QString Application::commandLineText() { QStringList args(arguments()); for(int i = 1; i < args.count(); ++i) { if(! args.at(i).startsWith('-')) return args.at(i); } return QString(); } void Application::saveSettingsAndQuit() { m_dictCore->saveSettings(); m_mainWindow->saveSettings(); m_trayIcon->saveSettings(); m_popupWindow->saveSettings(); quit(); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/application.h000066400000000000000000000100661472531462200201730ustar00rootroot00000000000000/***************************************************************************** * application.h - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef APPLICATION_H #define APPLICATION_H #include #ifdef QSTARDICT_WITH_TRANSLATIONS class QTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS namespace QStarDict { class DictCore; class MainWindow; class PopupWindow; class Speaker; class TrayIcon; #ifdef QSTARDICT_WITH_DBUS class DBusAdaptor; #endif // QSTARDICT_WITH_DBUS /** * Main application class. */ class Application: public QApplication { Q_OBJECT public: /** * Construct new QStarDict application. */ Application(int &argc, char **argv); /** * Destructor. */ ~Application(); /** * Enter the main event loop and wait until exit(). */ int exec(); /** * Returns a pointer to the application's QStarDict::Application instance. */ static Application *instance() { return qobject_cast(QCoreApplication::instance()); } /** * Returns a pointer to the DictCore instance. */ DictCore *dictCore() { return m_dictCore; } /** * Returns a pointer to the application's main window. */ MainWindow *mainWindow() { return m_mainWindow; } /** * Returns a pointer to the application's popup window. */ PopupWindow *popupWindow() { return m_popupWindow; } /** * Returns a pointer to the application's speacker. */ Speaker *speaker() { return m_speaker; } /** * Returns a pointer to the tray icon. */ TrayIcon *trayIcon() { return m_trayIcon; } #ifdef QSTARDICT_WITH_DBUS /** * Returns a pointer to the DBusAdaptor instance. */ DBusAdaptor *dbusAdaptor() { return m_dbusAdaptor; } #endif // QSTARDICT_WITH_DBUS public slots: /** * The settings are saved before calling destructors because with Qt6 * the main window is closed before the destructors are called, * which leads to incorrect settings being saved. */ void saveSettingsAndQuit(); private: #ifdef QSTARDICT_WITH_TRANSLATIONS QTranslator *m_translator; QTranslator *m_qtTranslator; #endif // QSTARDICT_WITH_TRANSLATIONS DictCore *m_dictCore; MainWindow *m_mainWindow; PopupWindow *m_popupWindow; Speaker *m_speaker; TrayIcon *m_trayIcon; #ifdef QSTARDICT_WITH_DBUS DBusAdaptor *m_dbusAdaptor; #endif // QSTARDICT_WITH_DBUS QString commandLineText(); }; } #endif // APPLICATION_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/qstardict/cssedit.cpp000066400000000000000000000317431472531462200176660ustar00rootroot00000000000000/***************************************************************************** * cssedit.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "cssedit.h" #include #include namespace QStarDict { CSSEdit::CSSEdit(QWidget *parent) : QWidget(parent) { setupUi(this); connect(m_elementCombo, SIGNAL(currentIndexChanged(int)), SLOT(setCurrentElement(int))); connect(m_fontCombo, SIGNAL(currentFontChanged(const QFont&)), SLOT(propertyChanged())); connect(m_sizeSpin, SIGNAL(valueChanged(int)), SLOT(propertyChanged())); connect(m_boldButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_italicButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_underlineButton, SIGNAL(toggled(bool)), SLOT(propertyChanged())); connect(m_colorButton, SIGNAL(clicked()), SLOT(colorSelectClicked())); connect(m_backgroundButton, SIGNAL(clicked()), SLOT(colorSelectClicked())); } void CSSEdit::setCSS(const QString &css) { m_elements.clear(); bool inBlock = false; QString element; QString currentProperty; QString currentValue; for (int i = 0; i < css.length(); ++i) { if (! inBlock) { element.clear(); for (; i < css.length() && css[i] != '{'; ++i) if (! css[i].isSpace()) element += css[i]; if (i < css.length() && css[i] == '{') { inBlock = true; ++i; } } else { currentProperty.clear(); for (; i < css.length() && css[i] != ':'; ++i) if (! css[i].isSpace()) currentProperty += css[i]; if (! inBlock) continue; currentValue.clear(); char quote = '\0'; for (++i; i < css.length() && css[i] != ';'; ++i) { if (quote) { if (css[i] == quote) { while (i < css.length() && css[i] != ';') ++i; break; } else currentValue += css[i]; } else if (! css[i].isSpace()) { if (css[i] == '\'' || css[i] == '\"') quote = css[i].toLatin1(); else currentValue += css[i]; } } m_elements[element][currentProperty] = currentValue; while (css[i + 1].isSpace()) ++i; if (css[i + 1] == '}') { ++i; inBlock = false; } } } updateElementCombo(); updatePreview(); } void CSSEdit::setElementsAliases(const QHash &aliases) { m_elementsAliases = aliases; updateElementCombo(); updatePreview(); } QString CSSEdit::css() const { QString result; for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { result += i.key() + "\n{\n"; for (Element::const_iterator j = i->begin(); j != i->end(); ++j) { result += j.key() + ": "; if (j->contains(' ')) result += "\"" + *j + "\";\n"; else result += *j + ";\n"; } result += "}\n"; } return result; } void CSSEdit::setCurrentElement(int index) { if (! m_elements.contains(m_elementCombo->itemData(index).toString())) return; m_currentElement = m_elementCombo->itemData(index).toString(); Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); QColor color(element->contains("color") ? element->value("color") : parentElement["color"]); m_colorButton->setText(color.name()); QPalette palette = m_colorButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); m_colorButton->setPalette(palette); color = QColor(element->contains("background-color") ? element->value("background-color") : parentElement["background-color"]); m_backgroundButton->setText(color.name()); palette = m_backgroundButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); m_backgroundButton->setPalette(palette); m_fontCombo->setCurrentFont(element->contains("font-family") ? element->value("font-family") : parentElement["font-family"]); QString value = element->contains("font-size") ? element->value("font-size") : parentElement["font-size"]; if (! value.endsWith("pt")) value = parentElement["font-size"]; m_sizeSpin->setValue(value.left(value.length() - 2).toInt()); value = element->contains("font-weight") ? element->value("font-weight") : parentElement["font-weight"]; m_boldButton->setChecked(value == "bold"); value = element->contains("font-style") ? element->value("font-style") : parentElement["font-style"]; m_italicButton->setChecked(value == "italic"); value = element->contains("text-decoration") ? element->value("text-decoration") : parentElement["text-decoration"]; m_underlineButton->setChecked(value == "underline"); updatePreview(); } void CSSEdit::propertyChanged() { if (! sender()) return; if (! m_elements.contains(m_currentElement)) return; Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); if (sender() == m_fontCombo) { QString font = m_fontCombo->currentText(); if (parentElement["font-family"] == font) element->remove("font-family"); else element->insert("font-family", font); } else if (sender() == m_sizeSpin) { QString size = QString::number(m_sizeSpin->value()) + "pt"; if (parentElement["font-size"] == size) element->remove("font-size"); else element->insert("font-size", size); } else if (sender() == m_boldButton) { QString weight = (m_boldButton->isChecked() ? "bold" : "normal"); if (parentElement["font-weight"] == weight) element->remove("font-weight"); else element->insert("font-weight", weight); } else if(sender() == m_italicButton) { QString style = (m_italicButton->isChecked() ? "italic" : "normal"); if (parentElement["font-style"] == style) element->remove("font-style"); else element->insert("font-style", style); } else if(sender() == m_underlineButton) { QString decoration = (m_underlineButton->isChecked() ? "underline" : "none"); if (parentElement["text-decoration"] == decoration) element->remove("text-decoration"); else element->insert("text-decoration", decoration); } updatePreview(); } void CSSEdit::colorSelectClicked() { QToolButton *colorButton; QString propertyName; if (sender() == m_colorButton) { colorButton = m_colorButton; propertyName = "color"; } else if (sender() == m_backgroundButton) { colorButton = m_backgroundButton; propertyName = "background-color"; } else return; if (! m_elements.contains(m_currentElement)) return; Element *element = &m_elements[m_currentElement]; Element parentElement = getParentElement(m_currentElement); QColor color = QColorDialog::getColor(QColor(colorButton->text()), this); if (color.isValid()) { colorButton->setText(color.name()); QPalette palette = colorButton->palette(); palette.setColor(QPalette::Normal, QPalette::ButtonText, color); colorButton->setPalette(palette); if (parentElement[propertyName] == color.name()) element->remove(propertyName); else element->insert(propertyName, color.name()); updatePreview(); } } void CSSEdit::updatePreview() { QString html = ""; html += ""; for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { QString alias; if (m_elementsAliases.contains(i.key())) alias = m_elementsAliases.value(i.key()); else alias = i.key(); int pos = i.key().indexOf('.'); if (pos == -1) html += "<" + i.key() + ">" + alias + "
    "; else { QString parent = i.key().left(pos); QString class_ = i.key().mid(pos + 1); html += "<" + parent + " class=\'" + class_ + "\'>" + alias + "
    "; } } html += ""; m_preview->setHtml(html); } void CSSEdit::updateElementCombo() { m_elementCombo->clear(); for (QHash::const_iterator i = m_elements.begin(); i != m_elements.end(); ++i) { QString alias; if (m_elementsAliases.contains(i.key())) alias = m_elementsAliases.value(i.key()); else alias = i.key(); m_elementCombo->addItem(alias, i.key()); } if (m_elements.begin() != m_elements.end()) m_currentElement = m_elements.begin().key(); else m_currentElement.clear(); } CSSEdit::Element CSSEdit::getParentElement(const QString &elementName) { Element body = m_elements.value("body"); if (elementName == "body") { body["color"] = QApplication::palette().color(QPalette::Normal, QPalette::Text).name(); body["background-color"] = QApplication::palette().color(QPalette::Normal, QPalette::Base).name(); body["font-family"] = QApplication::font().family(); body["font-size"] = QString::number(QApplication::font().pointSize()) + "pt"; body["font-weight"] = (QApplication::font().weight() == QFont::Bold) ? "bold" : "normal"; body["font-style"] = (QApplication::font().style() == QFont::StyleItalic) ? "italic" : "normal"; body["text-decoration"] = QApplication::font().underline() ? "underline" : "none"; return body; } else { if (! body.contains("color")) body["color"] = QApplication::palette().color(QPalette::Normal, QPalette::Text).name(); if (! body.contains("background-color")) body["background-color"] = QApplication::palette().color(QPalette::Normal, QPalette::Base).name(); if (! body.contains("font-family")) body["font-family"] = QApplication::font().family(); if (! body.contains("font-size")) body["font-size"] = QString::number(QApplication::font().pointSize()) + "pt"; if (! body.contains("font-weight")) body["font-weight"] = (QApplication::font().weight() == QFont::Bold) ? "bold" : "normal"; if (! body.contains("font-style")) body["font-style"] = (QApplication::font().style() == QFont::StyleItalic) ? "italic" : "normal"; if (! body.contains("text-decoration")) body["text-decoration"] = QApplication::font().underline() ? "underline" : "none"; } QString parentName; int pos = elementName.indexOf('.'); if (pos != -1) { parentName = elementName.left(pos); if (m_elements.contains(parentName)) { Element parent = m_elements[parentName]; for (Element::const_iterator i = body.begin(); i != body.end(); ++i) if (! parent.contains(i.key())) parent[i.key()] = *i; return parent; } else return body; } return body; } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/cssedit.h000066400000000000000000000053011472531462200173220ustar00rootroot00000000000000/***************************************************************************** * cssedit.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef CSSEDIT_H #define CSSEDIT_H #include "ui_cssedit.h" #include namespace QStarDict { /** * CSS styles editor. */ class CSSEdit: public QWidget, private Ui::CSSEdit { Q_OBJECT public: /** * Constructor. */ CSSEdit(QWidget *parent = 0); /** * Set CSS style for editing. */ void setCSS(const QString &css); /** * Returns edited CSS style. */ QString css() const; /** * Set aliases for elements. */ void setElementsAliases(const QHash &aliases); /** * Returns elements aliases. */ const QHash &elementsAliases() const { return m_elementsAliases; } private slots: void colorSelectClicked(); void setCurrentElement(int index); void propertyChanged(); private: typedef QHash Element; void updateElementCombo(); void updatePreview(); Element getParentElement(const QString &elementName); QHash m_elements; QHash m_elementsAliases; QString m_currentElement; }; } #endif // CSSEDIT_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/qstardict/cssedit.ui000066400000000000000000000113661472531462200175200ustar00rootroot00000000000000 QStarDict::CSSEdit 0 0 100 30 Preview true Element Foreground Background Select element Click to select color #000000 Click to select color #000000 Font Size Select font Select font size pt 4 150 2 10 75 true Bold B true 50 true false Italic I true 50 false true Underline U true m_elementCombo m_colorButton m_fontCombo m_sizeSpin m_boldButton m_italicButton m_underlineButton qstardict-3.0.0/qstardict/dbusadaptor.cpp000066400000000000000000000050751472531462200205370ustar00rootroot00000000000000/***************************************************************************** * dbusadaptor.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dbusadaptor.h" #include #include "application.h" #include "mainwindow.h" #include "popupwindow.h" namespace QStarDict { DBusAdaptor::DBusAdaptor(MainWindow *mainWindow) : QDBusAbstractAdaptor(mainWindow), m_mainWindow(mainWindow) { QDBusConnection connection = QDBusConnection::sessionBus(); connection.registerService("org.qstardict.dbus"); connection.registerObject("/qstardict", mainWindow); } bool DBusAdaptor::mainWindowVisible() const { return m_mainWindow->isVisible(); } void DBusAdaptor::setMainWindowVisible(bool visible) { m_mainWindow->setVisible(visible); } void DBusAdaptor::showTranslation(const QString &text) { m_mainWindow->showTranslation(text); } void DBusAdaptor::showPopup(const QString &text) { Application::instance()->popupWindow()->showTranslation(text); } QString DBusAdaptor::translate(const QString &text) { return Application::instance()->dictCore()->translate(text); } QString DBusAdaptor::translateHtml(const QString &text) { return Application::instance()->dictCore()->translate(text); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/dbusadaptor.h000066400000000000000000000056461472531462200202100ustar00rootroot00000000000000/***************************************************************************** * dbusadaptor.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DBUSADAPTOR_H #define DBUSADAPTOR_H #include namespace QStarDict { class MainWindow; /** * The DBusAdaptor class represents and QStarDict D-Bus interface. */ class DBusAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.qstardict.dbus") /** * The main window visible property. */ Q_PROPERTY(int mainWindowVisible READ mainWindowVisible WRITE setMainWindowVisible) public: /** * Construct a DBusAdaptor. */ DBusAdaptor(MainWindow *mainWindow); /** * Return true if main window is visible, otherwise return * false. */ bool mainWindowVisible() const; /** * Set visible state of main window. */ void setMainWindowVisible(bool visible); public slots: /** * Show main window with translation of text. */ void showTranslation(const QString &text); /** * Show popup window with translation of text. */ void showPopup(const QString &text); /** * Return a translation of text in plain text format. */ QString translate(const QString &text); /** * Return a translation of text in HTML format. */ QString translateHtml(const QString &text); private: MainWindow *m_mainWindow; }; } #endif // DBUSADAPTOR_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/dictbrowser.cpp000066400000000000000000000130761472531462200205560ustar00rootroot00000000000000/***************************************************************************** * dictbrowser.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include #include "dictbrowser.h" #include #include #include #include #include #include #include "../plugins/dictplugin.h" namespace { const QString translationCSS = "body {\n" "font-size: 10pt; }\n" "font.dict_name {\n" "color: blue;\n" "font-style: italic; }\n" "font.title {\n" "font-size: 16pt;\n" "font-weight: bold; }\n" "font.explanation {\n" "color: #7f7f7f;\n" "font-style: italic; }\n" "font.abbreviature {\n" "font-style: italic; }\n" "font.example {\n" "font-style: italic; }\n" "font.transcription {\n" "font-weight: bold; }\n"; } namespace QStarDict { DictBrowser::DictBrowser(QWidget *parent) : QTextBrowser(parent), m_dict(0), m_highlighted(false), m_searchUndo(false) { document()->setDefaultStyleSheet(translationCSS); setOpenLinks(false); setOpenExternalLinks(false); connect(this, SIGNAL(anchorClicked(const QUrl &)), SLOT(on_anchorClicked(const QUrl &))); } QVariant DictBrowser::loadResource(int type, const QUrl &name) { if (type == QTextDocument::HtmlResource && name.scheme() == "qstardict") { QString str = name.toString(QUrl::RemoveScheme); QString result = m_dict->translate(str); if (result.isEmpty()) result = "
    " + tr("The word %1 is not found.").arg(str) + "
    "; return "Translation for \"" + str + "\"\n" + "" + result + ""; } else if (name.scheme() == "plugin") { DictPlugin *plugin = m_dict->plugin(name.host()); if (! plugin) return QVariant(); return plugin->resource(type, name); } return QTextBrowser::loadResource(type, name); } void DictBrowser::search(const QString & exp, QTextDocument::FindFlags options) { bool found = false; QList extraSelections; moveCursor(QTextCursor::Start); QColor color = QColor(Qt::gray).lighter(130); while (find(exp, options)) { found = true; QTextEdit::ExtraSelection extra; extra.format.setBackground(color); extra.cursor = textCursor(); extraSelections.append(extra); } setExtraSelections(extraSelections); emit searchResult(found); } void DictBrowser::mouseMoveEvent(QMouseEvent *event) { if (m_highlighted) { m_oldCursor.setCharFormat(m_oldFormat); m_highlighted = false; } if (event->modifiers().testFlag(Qt::ControlModifier)) { QTextCursor cursor = cursorForPosition(event->pos()); cursor.select(QTextCursor::WordUnderCursor); QString selection = cursor.selection().toPlainText().simplified(); if (m_dict->isTranslatable(selection)) { m_oldCursor = cursor; m_oldFormat = cursor.charFormat(); QTextCharFormat format = m_oldFormat; format.setForeground(Qt::blue); format.setFontUnderline(true); cursor.setCharFormat(format); m_highlighted = true; } } QTextBrowser::mouseMoveEvent(event); } void DictBrowser::mousePressEvent(QMouseEvent *event) { if (event->modifiers().testFlag(Qt::ControlModifier)) { QTextCursor cursor = cursorForPosition(event->pos()); cursor.select(QTextCursor::WordUnderCursor); QString selection = cursor.selection().toPlainText().simplified(); if (m_dict->isTranslatable(selection)) { setSource(selection); if (m_highlighted) m_highlighted = false; } } QTextBrowser::mousePressEvent(event); } void DictBrowser::on_anchorClicked(const QUrl &link) { QString scheme = link.scheme(); if (scheme == "plugin" || scheme == "qrc") setSource(link); else QDesktopServices::openUrl(link); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/dictbrowser.h000066400000000000000000000055771472531462200202320ustar00rootroot00000000000000/***************************************************************************** * dictbrowser.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTBROWSER_H #define DICTBROWSER_H #include #include #include #include "dictcore.h" namespace QStarDict { /** * The DictBrowser widget provides view of translations from given dictionary. */ class DictBrowser: public QTextBrowser { Q_OBJECT public: /** * Construct empty DictWidget. */ DictBrowser(QWidget *parent = 0); /** * Set source dictionary. * Warning: DictBrowser will copy only a pointer to dict. So set dictionaries * allocated from heap and don't destroy it befor DictWidget. */ void setDict(DictCore *dict) { m_dict = dict; } /** * Return pointer to dictionary. */ const DictCore* dict() const { return m_dict; } QVariant loadResource(int type, const QUrl &name); signals: void searchResult(bool success); public slots: void search(const QString & exp, QTextDocument::FindFlags options); protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); private slots: void on_anchorClicked(const QUrl &link); private: DictCore *m_dict; QTextCursor m_oldCursor; QTextCharFormat m_oldFormat; bool m_highlighted; bool m_searchUndo; }; } #endif // DICTBROWSER_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/dictbrowsersearch.cpp000066400000000000000000000050441472531462200217400ustar00rootroot00000000000000/***************************************************************************** * keyboard.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Petr Vanek * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictbrowsersearch.h" namespace QStarDict { DictBrowserSearch::DictBrowserSearch(QWidget *parent) : QWidget(parent) { setupUi(this); connect(searchEdit, SIGNAL(textEdited(QString)), this, SLOT(searchAll())); connect(caseSensitiveCheckBox, SIGNAL(clicked()), this, SLOT(searchAll())); connect(wholeWordsCheckBox, SIGNAL(clicked()), this, SLOT(searchAll())); } void DictBrowserSearch::searchAll() { QTextDocument::FindFlags f = { }; if (caseSensitiveCheckBox->isChecked()) f |= QTextDocument::FindCaseSensitively; if (wholeWordsCheckBox->isChecked()) f |= QTextDocument::FindWholeWords; emit search(searchEdit->text(), f); } void DictBrowserSearch::searchResult(bool success) { QPalette p; if (!success) { p.setColor(QPalette::Base, Qt::red); } searchEdit->setPalette(p); } void DictBrowserSearch::showEvent(QShowEvent * event) { QWidget::showEvent(event); searchEdit->setFocus(Qt::OtherFocusReason); if (searchEdit->text().length()) searchAll(); } void DictBrowserSearch::closeEvent(QCloseEvent * event) { QWidget::closeEvent(event); } } // namespace qstardict-3.0.0/qstardict/dictbrowsersearch.h000066400000000000000000000037541472531462200214130ustar00rootroot00000000000000/***************************************************************************** * keyboard.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Petr Vanek * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTBROWSERSEARCH_H #define DICTBROWSERSEARCH_H #include #include "ui_dictbrowsersearch.h" namespace QStarDict { class DictBrowserSearch : public QWidget, private Ui::DictBrowserSearch { Q_OBJECT public: explicit DictBrowserSearch(QWidget *parent = 0); signals: void search(const QString & exp, QTextDocument::FindFlags options); public slots: void searchResult(bool success); private slots: void searchAll(); private: void showEvent(QShowEvent * event); void closeEvent(QCloseEvent * event); }; } // namespace #endif // DICTBROWSERSEARCH_H qstardict-3.0.0/qstardict/dictbrowsersearch.ui000066400000000000000000000021241472531462200215670ustar00rootroot00000000000000 DictBrowserSearch 0 0 413 50 Form Search: Case sensitive Whole words qstardict-3.0.0/qstardict/dictcore.cpp000066400000000000000000000224701472531462200200210ustar00rootroot00000000000000/***************************************************************************** * dictcore.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictcore.h" #include #include #include #include #include #include #include #include #include "../plugins/dictplugin.h" namespace QStarDict { DictCore::DictCore(QObject *parent) : QObject(parent) { loadSettings(); } DictCore::~DictCore() { saveSettings(); foreach (QPluginLoader *loader, m_plugins) { delete loader->instance(); delete loader; } } bool DictCore::isTranslatable(const QString &word) { for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { if (! m_plugins.contains(i->plugin())) continue; if (qobject_cast(m_plugins[i->plugin()]->instance())->isTranslatable(i->name(), word)) return true; } return false; } QString DictCore::translate(const QString &word) { QString simplifiedWord = word.simplified(); QString result; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { if (! m_plugins.contains(i->plugin())) continue; DictPlugin *plugin = qobject_cast(m_plugins[i->plugin()]->instance()); if (! plugin->isTranslatable(i->name(), simplifiedWord)) continue; DictPlugin::Translation translation = plugin->translate(i->name(), simplifiedWord); result += "

    \n" "" + translation.dictName() + "
    \n" "" + translation.title() + "
    \n" + translation.translation() + "

    \n"; } return result; } QStringList DictCore::findSimilarWords(const QString &word) { QString simplifiedWord = word.simplified(); QStringList result; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) { if (! m_plugins.contains(i->plugin())) continue; DictPlugin *plugin = qobject_cast(m_plugins[i->plugin()]->instance()); if (! plugin->features().testFlag(DictPlugin::SearchSimilar)) continue; QStringList similar = plugin->findSimilarWords(i->name(), simplifiedWord); for (QStringList::const_iterator j = similar.begin(); j != similar.end(); ++j) if (! result.contains(*j, Qt::CaseSensitive)) result << *j; } return result; } QStringList DictCore::availablePlugins() const { QStringList result; #ifdef Q_OS_WIN QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("*0.dll"), QDir::Files | QDir::NoDotAndDotDot); for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i) result << i->fileName().left(i->fileName().length() - 5); #elif defined Q_OS_MAC QStringList macFilters; // various Qt versions... macFilters << "*.dylib" << "*.bundle" << "*.so"; QString binPath = QCoreApplication::applicationDirPath(); // navigate through mac's bundle tree structore QDir d(binPath + "/../lib/"); QFileInfoList files = d.entryInfoList(macFilters, QDir::Files | QDir::NoDotAndDotDot); for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i) { result << i->fileName(); } #elif defined Q_OS_UNIX QFileInfoList files = QDir(QSTARDICT_PLUGINS_DIR).entryInfoList(QStringList("lib*.so"), QDir::Files | QDir::NoDotAndDotDot); for (QFileInfoList::const_iterator i = files.begin(); i != files.end(); ++i) result << i->fileName().mid(3, i->fileName().length() - 6); #else #error "Function DictCore::availablePlugins() is not implemented on this platform" #endif return result; } void DictCore::setLoadedPlugins(const QStringList &loadedPlugins) { for (QHash ::iterator i = m_plugins.begin(); i != m_plugins.end(); ++i) { delete (*i)->instance(); delete *i; } m_plugins.clear(); for (QStringList::const_iterator i = loadedPlugins.begin(); i != loadedPlugins.end(); ++i) { #ifdef Q_OS_WIN QString pluginFilename = static_cast(QSTARDICT_PLUGINS_DIR) + "/" + *i + "0.dll"; #elif defined Q_OS_MAC // here we need to follow mac's bundle tree... QString pluginFilename = QDir(QCoreApplication::applicationDirPath()+"/../lib/"+*i).absolutePath(); #elif defined Q_OS_UNIX QString pluginFilename = static_cast(QSTARDICT_PLUGINS_DIR) + "/" "lib" + *i + ".so"; #else #error "Function DictCore::setLoadedPlugins(const QStringList &loadedPlugins) is not available on this platform" #endif QPluginLoader *plugin = new QPluginLoader(pluginFilename); if (! plugin->load()) { qWarning() << plugin->errorString(); delete plugin; continue; } m_plugins[*i] = plugin; } } QList DictCore::availableDicts() const { QList result; for (QHash::const_iterator i = m_plugins.begin(); i != m_plugins.end(); ++i) { DictPlugin *plugin = qobject_cast((*i)->instance()); QStringList dicts = plugin->availableDicts(); for (QStringList::const_iterator j = dicts.begin(); j != dicts.end(); ++j) result << Dictionary(i.key(), *j); } return result; } void DictCore::setLoadedDicts(const QList &loadedDicts) { QHash dicts; for (QList::const_iterator i = loadedDicts.begin(); i != loadedDicts.end(); ++i) dicts[i->plugin()] << i->name(); for (QHash::const_iterator i = dicts.begin(); i != dicts.end(); ++i) { if (! m_plugins.contains(i.key())) continue; DictPlugin *plugin = qobject_cast(m_plugins[i.key()]->instance()); plugin->setLoadedDicts(*i); dicts[i.key()] = plugin->loadedDicts(); } m_loadedDicts.clear(); for (QList::const_iterator i = loadedDicts.begin(); i != loadedDicts.end(); ++i) if (dicts.contains(i->plugin()) && dicts[i->plugin()].contains(i->name())) m_loadedDicts << *i; } void DictCore::saveSettings() { QSettings config; config.setValue("DictCore/loadedPlugins", loadedPlugins()); QStringList rawDictsList; for (QList::const_iterator i = m_loadedDicts.begin(); i != m_loadedDicts.end(); ++i) rawDictsList << i->plugin() << i->name(); config.setValue("DictCore/loadedDicts", rawDictsList); } void DictCore::loadSettings() { QSettings config; setLoadedPlugins(config.value("DictCore/loadedPlugins", availablePlugins()).toStringList()); QStringList rawDictsList = config.value("DictCore/loadedDicts").toStringList(); if (rawDictsList.isEmpty()) setLoadedDicts(availableDicts()); else { QList dicts; for (QStringList::const_iterator i = rawDictsList.begin(); i != rawDictsList.end(); i += 2) dicts << Dictionary(*i, *(i + 1)); setLoadedDicts(dicts); } } void DictCore::reloadDicts() { QList loaded; for (QHash::const_iterator i = m_plugins.begin(); i != m_plugins.end(); ++i) { DictPlugin *plugin = qobject_cast((*i)->instance()); plugin->setLoadedDicts(plugin->loadedDicts()); QStringList loadedNames = plugin->loadedDicts(); for (QStringList::const_iterator j = loadedNames.begin(); j != loadedNames.end(); ++j) loaded << Dictionary(i.key(), *j); } QList oldLoaded = m_loadedDicts; m_loadedDicts.clear(); for (QList::iterator i = oldLoaded.begin(); i != oldLoaded.end(); ++i) if (loaded.contains(*i)) m_loadedDicts << *i; } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/dictcore.h000066400000000000000000000124501472531462200174630ustar00rootroot00000000000000/***************************************************************************** * dictcore.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTCORE_H #define DICTCORE_H #include #include #include #include #include #include "../plugins/dictplugin.h" namespace QStarDict { /** * The DictCore is a base dictionary class. */ class DictCore: public QObject { Q_OBJECT public: /** * This class represents a dictionary. */ class Dictionary { public: Dictionary(const QString &plugin, const QString &name) : m_plugin(plugin), m_name(name) { } Dictionary() { } const QString &plugin() const { return m_plugin; } const QString &name() const { return m_name; } void setPlugin(const QString &plugin) { m_plugin = plugin; } void setName(const QString &name) { m_name = name; } bool operator == (const Dictionary &dict) const { return m_name == dict.m_name && m_plugin == dict.m_plugin; } private: QString m_plugin; QString m_name; }; /** * Construct dictionary. */ DictCore(QObject *parent = 0); /** * Destructor. */ ~DictCore(); /** * Returns true if word is exists in dictionaries, * otherwise false. */ bool isTranslatable(const QString &word); /** * Returns translation for word. If word not found, returns * "Not found!" */ QString translate(const QString &word); /** * Returns a list of similar words contained in dictionaries. */ QStringList findSimilarWords(const QString &word); /** * Returns a list of available dictionary plugins. */ QStringList availablePlugins() const; /** * Returns a list of loaded dictionary plugins. */ QStringList loadedPlugins() const { return QStringList(m_plugins.keys()); } /** * Sets a loaded plugins. * If plugin cannot be loaded it will not be added to * loadedPlugins list. */ void setLoadedPlugins(const QStringList &loadedPlugins); /** * Returns a list of available dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. */ QList availableDicts() const; /** * Returns a list of loaded dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. */ const QList &loadedDicts() const { return m_loadedDicts; } /** * Sets a loaded dictionaries. * The first item in pair is a plugin name, the second item * in pair is a dictionary name. * If dictionary cannot be loaded it will not be added to * availableDicts list. */ void setLoadedDicts(const QList &loadedDicts); /** * Reload loaded dicts. */ void reloadDicts(); /** * Returns pointer to plugin instance or 0 if not loaded. */ DictPlugin *plugin(const QString &plugin) { return m_plugins.contains(plugin) ? qobject_cast(m_plugins[plugin]->instance()) : 0; } /** * Save settings. */ void saveSettings(); private: /** * Load settings. */ void loadSettings(); QHash m_plugins; QList m_loadedDicts; }; } #endif // DICTCORE_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/dictwidget.cpp000066400000000000000000000151141472531462200203510ustar00rootroot00000000000000/***************************************************************************** * dictwidget.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "dictwidget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "application.h" #include "dictbrowser.h" #include "dictbrowsersearch.h" #include "speaker.h" namespace { class DictWidgetToolbar: public QToolBar { public: DictWidgetToolbar(QWidget *parent = 0) : QToolBar(parent) { } protected: virtual void mouseDoubleClickEvent(QMouseEvent *event) { if (! actionAt(event->pos())) QToolBar::mouseDoubleClickEvent(event); } }; } namespace QStarDict { DictWidget::DictWidget(QWidget *parent, Qt::WindowFlags f) : QFrame(parent, f) { m_translationView = new DictBrowser(this); setFrameStyle(m_translationView->frameStyle()); m_translationView->setFrameStyle(QFrame::NoFrame); m_translationView->verticalScrollBar()->setCursor(Qt::ArrowCursor); m_translationView->horizontalScrollBar()->setCursor(Qt::ArrowCursor); m_translationView->setOpenExternalLinks(true); connect(m_translationView, SIGNAL(sourceChanged(const QUrl&)), SLOT(on_translationView_sourceChanged(const QUrl&))); m_search = new DictBrowserSearch(this); connect(m_search, SIGNAL(search(const QString &,QTextDocument::FindFlags)), m_translationView, SLOT(search(const QString &,QTextDocument::FindFlags))); connect(m_translationView, SIGNAL(searchResult(bool)), m_search, SLOT(searchResult(bool))); m_search->hide(); m_toolBar = new DictWidgetToolbar(this); m_toolBar->setMouseTracking(true); QAction *actionBackward = m_toolBar->addAction(QIcon(":/icons/go-previous.png"), tr("Go to &previous translation"), m_translationView, SLOT(backward())); actionBackward->setDisabled(true); connect(m_translationView, SIGNAL(backwardAvailable(bool)), actionBackward, SLOT(setEnabled(bool))); QAction *actionForward = m_toolBar->addAction(QIcon(":/icons/go-next.png"), tr("Go to &next translation"), m_translationView, SLOT(forward())); actionForward->setDisabled(true); connect(m_translationView, SIGNAL(forwardAvailable(bool)), actionForward, SLOT(setEnabled(bool))); m_toolBar->addAction(QIcon(":/icons/document-save-as.png"), tr("&Save to file"), this, SLOT(saveToFile())); m_toolBar->addAction(QIcon(":/icons/document-print.png"), tr("Prin&t translation"), this, SLOT(print())); m_toolBar->addAction(QIcon(":/icons/speaker.png"), tr("Speak &word"), this, SLOT(speak())); QAction *actionSearch = m_toolBar->addAction(QIcon(":/icons/system-search.png"), tr("Search"), this, SLOT(handleSearch())); actionSearch->setCheckable(true); actionSearch->setShortcut(QKeySequence::Find); QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->addWidget(m_toolBar); layout->addWidget(m_translationView); layout->addWidget(m_search); setLayout(layout); } void DictWidget::translate(const QString &str) { m_translationView->setSource(QUrl("qstardict:" + str)); } void DictWidget::on_translationView_sourceChanged(const QUrl &name) { emit wordTranslated(name.toString(QUrl::RemoveScheme)); } void DictWidget::saveToFile() { static QDir dir( QDir::homePath() ); //added by Frank static QString filter(tr("Text files (*.txt)")); //added by Frank QFileDialog dialog(this, tr("Save translation"), dir.path(), filter); //updated by Frank dialog.selectFile(translatedWord());//added by Frank dialog.setNameFilters(QStringList() << tr("HTML files (*.html *.htm)") << tr("Text files (*.txt)"));//updated by Frank dialog.selectNameFilter(filter); //added by Frank if (dialog.exec() && dialog.selectedFiles().size()) { QString fileName = dialog.selectedFiles().first(); /*QString*/ filter = dialog.selectedNameFilter();//updated by Frank dir = dialog.directory(); //added by Frank if (filter == tr("HTML files (*.html, *.htm)") && ! (fileName.endsWith(".html", Qt::CaseInsensitive) || fileName.endsWith(".htm", Qt::CaseInsensitive))) fileName += ".html"; else if (filter == tr("Text files (*.txt)") && ! fileName.endsWith(".txt", Qt::CaseInsensitive)) fileName += ".txt"; QFile outputFile(fileName); if (! outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, tr("Error"), tr("Cannot save translation as %1").arg(fileName)); return; } QTextStream outputStream(&outputFile); if (filter == tr("HTML files (*.html, *.htm)")) outputStream << m_translationView->document()->toHtml(); else outputStream << m_translationView->toPlainText(); } } void DictWidget::speak() { Application::instance()->speaker()->speak(translatedWord()); } void DictWidget::print() { QPrinter printer(QPrinter::HighResolution); QPrintDialog dialog(&printer, this); if (dialog.exec() == QDialog::Accepted) m_translationView->print(&printer); } void DictWidget::handleSearch() { m_search->setVisible(!m_search->isVisible()); } void DictWidget::setDefaultStyleSheet(const QString &css) { m_translationView->document()->setDefaultStyleSheet(css); m_translationView->reload(); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/dictwidget.h000066400000000000000000000073311472531462200200200ustar00rootroot00000000000000/***************************************************************************** * dictwidget.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef DICTWIDGET_H #define DICTWIDGET_H #include #include "dictcore.h" #include "dictbrowser.h" class QToolBar; class QAction; namespace QStarDict { class DictBrowserSearch; /** * The DictBrowser widget provides view of translations from given dictionary. */ class DictWidget: public QFrame { Q_OBJECT public: /** * Construct empty DictWidget. */ DictWidget(QWidget *parent = 0, Qt::WindowFlags f = Qt::Widget); /** * Set source dictionary. * Warning: DictWidget will copy only a pointer to dict. So set dictionaries * allocated from heap and don't destroy it befor DictWidget. */ void setDict(DictCore *dict) { m_translationView->setDict(dict); } /** * Return pointer to dictionary. */ const DictCore* dict() const { return m_translationView->dict(); } /** * Clear translation text. */ void clear() { m_translationView->clear(); } /** * Clear history. */ void clearHistory() { m_translationView->clearHistory(); } /** * Show translation of str. */ void translate(const QString &str); /** * Return last translated word. */ QString translatedWord() const { return m_translationView->source().toString(QUrl::RemoveScheme); } /** * Return toolbar. */ QToolBar *toolBar() { return m_toolBar; } void setDefaultStyleSheet(const QString &css); QString defaultStyleSheet() const { return m_translationView->document()->defaultStyleSheet(); } void reload() { m_translationView->reload(); } signals: /** * Emits when translated word is shown. */ void wordTranslated(const QString &word); private slots: void on_translationView_sourceChanged(const QUrl &name); void saveToFile(); void speak(); void print(); void handleSearch(); private: DictBrowser *m_translationView; QToolBar *m_toolBar; DictBrowserSearch *m_search; }; } #endif // DICTWIDGET_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/keyboard.cpp000066400000000000000000000060661472531462200200300ustar00rootroot00000000000000/***************************************************************************** * keyboard.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include #include "keyboard.h" #ifdef Q_OS_WIN #include #include namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { Qt::KeyboardModifiers result; if (GetAsyncKeyState(VK_MENU) & 0x8000) result |= Qt::AltModifier; if (GetAsyncKeyState(VK_CONTROL) & 0x8000) result |= Qt::ControlModifier; if (GetAsyncKeyState(VK_SHIFT) & 0x8000) result |= Qt::ShiftModifier; if ((GetAsyncKeyState(VK_LWIN) & 0x8000) || (GetAsyncKeyState(VK_RWIN) & 0x8000)) result |= Qt::MetaModifier; return result; } } // namespace #elif defined(Q_OS_MAC) #include namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { return QApplication::keyboardModifiers(); } } // namespace #elif defined(Q_OS_UNIX) #if QT_VERSION < 0x040800 #include #endif #include #include namespace { const unsigned mAlt = 0010; const unsigned mCtrl = 0004; const unsigned mShift = 0001; const unsigned mWin = 0100; } namespace QStarDict { Qt::KeyboardModifiers Keyboard::activeModifiers() { #if QT_VERSION < 0x040800 Qt::KeyboardModifiers result; XkbStateRec state; XkbGetState(QX11Info::display(), XkbUseCoreKbd, &state); if (state.base_mods & mAlt) result |= Qt::AltModifier; if (state.base_mods & mCtrl) result |= Qt::ControlModifier; if (state.base_mods & mShift) result |= Qt::ShiftModifier; if (state.base_mods & mWin) result |= Qt::MetaModifier; return result; #else return QApplication::queryKeyboardModifiers(); #endif } } // namespace #endif // Q_WS_MAC // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/keyboard.h000066400000000000000000000034461472531462200174740ustar00rootroot00000000000000/***************************************************************************** * keyboard.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef KEYBOARD_H #define KEYBOARD_H #include namespace QStarDict { /** * The Keyboard class is a representation. */ class Keyboard { public: /** * Return active keyboard modifiers. */ static Qt::KeyboardModifiers activeModifiers(); }; } #endif // KEYBOARD_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/main.cpp000066400000000000000000000056731472531462200171570ustar00rootroot00000000000000/***************************************************************************** * main.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "application.h" #ifdef Q_OS_UNIX #include #include #include #include #include #elif defined(Q_OS_WIN) // Q_OS_UNIX #include #include #endif // Q_OS_WIN #ifdef QSTARDICT_WITH_TRANSLATIONS #include #include #endif // QSTARDICT_WITH_TRANSLATIONS int main(int argc, char *argv[]) { QStarDict::Application app(argc, argv); #ifdef Q_OS_UNIX QSettings lockFile(QDir::homePath() + "/.qstardict/qstardict.pid", QSettings::IniFormat); QString lastPid = lockFile.value("LastStart/pid").toString(); if (lastPid.length() && QDir("/proc/" + lastPid).exists() && lockFile.value("LastStart/time").toDateTime() == QFileInfo("/proc/" + lastPid).lastModified()) { qDebug("qstardict: already running"); return 0; } lockFile.setValue("LastStart/pid", getpid()); lockFile.setValue("LastStart/time", QFileInfo("/proc/" + QString::number(getpid())).lastModified()); lockFile.sync(); #elif defined(Q_OS_WIN) // Q_OS_UNIX HANDLE hMutex = CreateMutex(NULL, true, (LPCTSTR)"qstardict"); if (GetLastError() == ERROR_ALREADY_EXISTS) { QMessageBox::information(0, "Warning", "QStarDict is already running"); // Strange encoding issue... // MessageBox(0, (LPCWSTR)"Warning", (LPCWSTR)"QStarDict is already running", MB_ICONWARNING); return 0; } #endif // Q_OS_WIN return app.exec(); } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/mainwindow.cpp000066400000000000000000000175711472531462200204070ustar00rootroot00000000000000/***************************************************************************** * mainwindow.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007-2009 Alexander * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dictcore.h" #include "application.h" #include "popupwindow.h" #include "settingsdialog.h" #include "trayicon.h" namespace QStarDict { MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setupUi(this); m_dict = 0; translationView->setDict(m_dict); menu_File->insertActions(actionQuit, translationView->toolBar()->actions()); menu_Options->insertAction(menu_Options->actions().first(), wordsListDock->toggleViewAction()); createConnections(); loadSettings(); } MainWindow::~MainWindow() { } void MainWindow::showTranslation(const QString &text) { searchBox->setText(text); on_queryButton_clicked(); } void MainWindow::createConnections() { connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); connect(actionQuit, SIGNAL(triggered()), Application::instance(), SLOT(saveSettingsAndQuit())); actionScan->setChecked(Application::instance()->popupWindow()->isScan()); connect(actionScan, SIGNAL(toggled(bool)), Application::instance()->popupWindow(), SLOT(setScan(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), actionScan, SLOT(setChecked(bool))); connect(wordsList, SIGNAL(itemActivated(QListWidgetItem*)), SLOT(wordsListItemActivated(QListWidgetItem*))); connect(wordsList, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(wordsListItemActivated(QListWidgetItem*))); connect(translationView, SIGNAL(wordTranslated(const QString&)), SLOT(wordTranslated(const QString&))); } void MainWindow::loadSettings() { QSettings config; restoreGeometry(config.value("MainWindow/geometry", QByteArray()).toByteArray()); restoreState(config.value("MainWindow/state", QByteArray()).toByteArray()); setVisible(config.value("MainWindow/visible", true).toBool()); if (isHidden() && ! Application::instance()->trayIcon()->isVisible()) show(); wordsListDock->setFloating(config.value("MainWindow/wordsListDock/floating", wordsListDock->isFloating()).toBool()); wordsListDock->setGeometry(config.value("MainWindow/wordsListDock/geometry", wordsListDock->geometry()).toRect()); setInstantSearch(config.value("MainWindow/instantSearch", true).toBool()); setDefaultStyleSheet(config.value("MainWindow/defaultStyleSheet", defaultStyleSheet()).toString()); } void MainWindow::saveSettings() { QSettings config; config.setValue("MainWindow/geometry", saveGeometry()); config.setValue("MainWindow/state", saveState()); config.setValue("MainWindow/visible", isVisible()); config.setValue("MainWindow/wordsListDock/floating", wordsListDock->isFloating()); config.setValue("MainWindow/wordsListDock/geometry", wordsListDock->geometry()); config.setValue("MainWindow/instantSearch", m_instantSearch); config.setValue("MainWindow/defaultStyleSheet", defaultStyleSheet()); } void MainWindow::on_actionAbout_triggered() { QMessageBox::about(this, tr("About QStarDict"), tr("QStarDict %1 - Qt version of StarDict
    ").arg(QSTARDICT_VERSION) + tr("Copyright (C) 2007-2009 Alexander Rodin " "http://qstardict.ylsoftware.com")); } void MainWindow::on_actionSettings_triggered() { SettingsDialog dialog(this); dialog.exec(); } void MainWindow::on_actionHelp_triggered() { QDesktopServices::openUrl(QUrl("http://wiki.qstardict.ylsoftware.com")); } void MainWindow::on_queryButton_clicked() { if (searchBox->text().simplified().isEmpty()) { setWindowTitle(tr("QStarDict")); translationView->clear(); wordsList->clear(); return; } wordsList->clear(); wordsList->addItems(m_dict->findSimilarWords(searchBox->text())); translationView->translate(searchBox->text()); } void MainWindow::reload() { wordsList->clear(); wordsList->addItems(m_dict->findSimilarWords(translationView->translatedWord())); translationView->reload(); } void MainWindow::queryEdited(const QString &) { if (m_queryTimer) killTimer(m_queryTimer); m_queryTimer = startTimer(200); } void MainWindow::timerEvent(QTimerEvent *event) { if (event->timerId() == m_queryTimer) { killTimer(m_queryTimer); m_queryTimer = 0; on_queryButton_clicked(); } else QMainWindow::timerEvent(event); } void MainWindow::wordTranslated(const QString &word) { if (word.simplified().isEmpty()) setWindowTitle(tr("QStarDict")); else setWindowTitle(tr("%1 - QStarDict").arg(word)); if (m_queryTimer) { killTimer(m_queryTimer); m_queryTimer = 0; } } void MainWindow::wordsListItemActivated(QListWidgetItem *item) { searchBox->setText(item->text()); translationView->translate(item->text()); setWindowTitle(tr("%1 - QStarDict").arg(translationView->translatedWord())); } void MainWindow::setInstantSearch(bool instantSearch) { if (instantSearch == m_instantSearch) return; m_instantSearch = instantSearch; if (m_instantSearch) connect(searchBox, SIGNAL(textEdited(const QString&)), SLOT(queryEdited(const QString&))); else disconnect(searchBox, SIGNAL(textEdited(const QString&)), this, SLOT(queryEdited(const QString&))); } void MainWindow::setDict(DictCore *dict) { m_dict = dict; translationView->setDict(dict); } void MainWindow::keyPressEvent(QKeyEvent *event) { if (event->text().size() || event->key() == Qt::Key_Escape) { if (! searchBox->hasFocus()) { searchBox->setText(event->text()); searchBox->setFocus(Qt::OtherFocusReason); } if (event->key() == Qt::Key_Escape) { if (searchBox->text().isEmpty()) close(); else searchBox->clear(); } } QMainWindow::keyPressEvent(event); } void MainWindow::closeEvent(QCloseEvent *event) { if (! Application::instance()->trayIcon()->isVisible()) Application::instance()->saveSettingsAndQuit(); QMainWindow::closeEvent(event); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/mainwindow.h000066400000000000000000000073511472531462200200470ustar00rootroot00000000000000/***************************************************************************** * mainwindow.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "ui_mainwindow.h" class QMenu; class QCloseEvent; namespace QStarDict { class DictCore; class SettingsDialog; /** * The main window of QStarDict. */ class MainWindow: public QMainWindow, private Ui::MainWindow { Q_OBJECT public: /** * Create new MainWindow. */ MainWindow(QWidget *parent = 0); /** * Destructor. */ ~MainWindow(); /** * Return true if instant search is on, otherwise false. */ bool isInstantSearch() const { return m_instantSearch; } /** * Set instant search mode. If instantSearch is true * translation will be shown when typing, otherwise only when * "Search" button clicked. */ void setInstantSearch(bool instantSearch); /** * Set the dictionary. */ void setDict(DictCore *dict); /** * Return the dictionary. */ DictCore *dict() const { return m_dict; } /** * Set default style sheet for translations. */ void setDefaultStyleSheet(const QString &css) { translationView->setDefaultStyleSheet(css); } /** * Return default style sheet. */ QString defaultStyleSheet() const { return translationView->defaultStyleSheet(); } void reload(); void saveSettings(); public slots: /** * Show translation of word. */ void showTranslation(const QString &word); protected: void timerEvent(QTimerEvent *event); void keyPressEvent(QKeyEvent *event); void closeEvent(QCloseEvent *event); private slots: void on_actionAbout_triggered(); void on_actionSettings_triggered(); void on_actionHelp_triggered(); void on_queryButton_clicked(); void wordsListItemActivated(QListWidgetItem *item); void wordTranslated(const QString &word); void queryEdited(const QString &); private: void createConnections(); void loadSettings(); DictCore *m_dict; bool m_instantSearch; int m_queryTimer; }; } #endif // MAINWINDOW_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/mainwindow.ui000066400000000000000000000155171472531462200202400ustar00rootroot00000000000000 QStarDict::MainWindow 0 0 742 511 QStarDict :/icons/qstardict.png:/icons/qstardict.png 9 6 6 0 Clear the search box Clear :/icons/clear-right.png:/icons/clear-right.png Qt::ToolButtonIconOnly Fuzzy query Search :/icons/search-filter.png:/icons/search-filter.png Qt::ToolButtonTextBesideIcon QDockWidget::AllDockWidgetFeatures Qt::NoDockWidgetArea Words list 1 9 6 0 0 742 22 &File &Help &Settings :/icons/application-exit.png:/icons/application-exit.png &Quit Ctrl+Q &About About &Qt :/icons/configure.png:/icons/configure.png &Configure QStarDict true &Scan :/icons/help-contents.png:/icons/help-contents.png QStarDict &Help F1 DictWidget QWidget
    dictwidget.h
    searchBox queryButton wordsList searchClearButton searchClearButton clicked() searchBox clear() 315 59 647 61 searchClearButton clicked() searchBox setFocus() 315 59 647 61 searchBox returnPressed() queryButton click() 438 50 661 51
    qstardict-3.0.0/qstardict/pixmaps/000077500000000000000000000000001472531462200171755ustar00rootroot00000000000000qstardict-3.0.0/qstardict/pixmaps/application-exit.png000066400000000000000000000261721472531462200231650ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATxyŝ?UU}Uٺ9dn30 7002=x?k d;ݝ70 82f0nuS-YGGEfe]-̌wDdd6ȌȌȌȌw"&{^떱e HrH N)ll5@k=Ddj0#eK/P2fB&`2P2Q !"jhE3V8JX9R1A2 !HוA i$47HݕH.eQDr/o[fP&D~X~澾h0OA%FTUC_cVE#3<̱]jPPLErISR8tJ >:}~JnRH=!G/pSSaA&`yҥr>_" m22S^PdNUU,T]{]?)wd"EB$U×]ӹ7޸L& {.d 62/|4Kp j^U^Y^YizA[:_( %/$6U@Ue#D!TUaNL Q,!bF 2x{cSSuzx#Q¦IdBȞ=3B2w/U1Sbh##D̩=\_SMW?X^, `= fSJ1N# ]7dpFʱ4à~jR""iH\ћ`lR p/ E(2:2B*&?c]]: m *.{1q(ad,$ l6[@lsF7v_ J;Xo#6ƍt#bnKKe!^3H6D8DL32%I Ѱv-٤;;I%SFpXגI<% xΙ0G ҝH`dxKXZ@H4DOzD<#~qҔjb|0П纼-@&v 8VYӤ C+':{i،䊔 Xʚ1MR\W s\+0C?J־ALk T๎ݿ##,nnϖ/g^P113|@ۡCVUnR>3gNDZeT\X@{: ~{v8nog_g'_YLӝ>Yhl_y? 7ߤcB>r%!QtYFqsO7ATXk<NRRGqnSO=͛_[>E4퓓=<_j*Z-Zvb˖-w͒%KJ)%RJ ogʕ< tVY7ߌnK˗sw;2‹6x|.`~c$da(8~;/.3\fw|ͬX8;CK]]^n ^Timm[ootQ_QLu0r-_Muneo/'~w(ī}}Z믿W,[o2"p݀: (t@'.rfjf.9|? c۶m?gԏu77G| *4MWgtQҥKJ^ yP.*$p5\%Kab]{Qv +~m />K  GC/L("$A4J/Y› VU}lbLdR.L9$bB!_~zA¨.`JAPnogΝhLPi\r%,ZwM#*~,^/؍Ko)$bgatA.E=@1_fs,:]t ZZ09nàeB.P/ζPqK/]?N3@$9sْHJtb .x|'ya$‚>A93eYJB睪JTiY$⋉F曌Uu;W_}=,|K!˓c쭪bܹ_>'/%+tMees34_di-"ʊ =%;wiKbCR5P_^{6`ho錄\%q3 ȗo쳴9ɚB v\ZT жs',R*++ʟsqgӡ̗XoԶ64Y8S' ~RJBݹRi? Ȁ(rvuv0.sd嗗DRρ5:8x뭷8d=difevc#֭+ ~HPSSC0Ӵ=tIu+$n q]*駑R+bxx8ogNf`ݺu;B rZg͡wf74vڒ/;_]]킿J"hZ ./&@A.iiPHp1w&B֮]Oa %݅I06{} XWϪUr[C!<m]1hmY{/e9SH)iJ9zh$(:V>`P7>X9 .nVR#5Z ;h۱K>VuK07fKtȲ2HP9MXbwfXMB$HΙP* .]dz)گi 'vAQJ,,T pn6HӤꫩahhC MXlꓨvpl $q-ZS# |m^z#8Xh^`f幬` "(f ômkȑ#@@@E8p'|*L$N!^S r t}d[mj޹ ڤcgQeJ a)Rh`z͵q,B0|jTH8 lHB0w\>Yf |. =-DHi 4$N{EP(` M4t7:oC Yzu$ jysyzwb}}=޶Y rH< JduYDPAS"`5 sb :| ~D"oEi ޺ lL۲muT7[V5oJ٧i p<{2S![Uw;?RrH0.!8E&ZW-Ն=!DN䓉/^Lo~)^x Ka/FC;iJ< ܱ!$K>{#uuuOy(8(Z[W-W Q*֮[#Gؿs'/6erbBE%rGb5BhXvJNLzr BJ_{Mj~YF}܂$Ot,@9sHRbKI ۿ; tqVCaZ̀ I-1=t![O:9c3 Y|@oo'#[[<&^9y=ihj.~b=pΗ_7O]~ xPhW@@EV˕$` GB&Fzz݀i̞=X,ƾ?PM *,rLO Iu°%QGXa(\?8wu45g %&zzz<úɀ_dܹsbm}s08DmMc#}H/ O&Al̠ @`LH^vxdb#{`h*•F,Fa?FIth>K o#)Yxm455qᒵx@4͛G,c{[>ۨAVbTN4iE(^GftNF:x-Оݤ1mM:o;A%3"e%Lf2Iz|H 3 Yh(u hPJHl ={as|d]BhF(OaO7$a0{?d`#~jJ[)lp5?|}) h,N](_0 QYid&&LLd3 A(&`D„*"$!N"f膆khfhhn C"mMC؍q݃|@64 !Aб#T9Cbw#)\hӴ̸+xe 53 &G]hw8ſ% R 2Ð@PMaDz$QQ$@a+Z6tAV+t<^馛 FS%WLҼMk#ِ$َfMw,K%|)@gA&<A.QYi&G:=9jsNS)B24 =l 4^(XHKs_I<͛|M?V5ZvÉ{$@( B:l%&rkhxN\^y&/$Q _555e?٩BOU<\f+$Pc @a d/ q|]0@WWc$h噼PD"Q)W\O>aN }wH0ivhȢ7?%U"gJJۨ*%K$퇕+Wi;?ɟ^F7p| ŁY#Ő2@x|}ۗA kг,~ٴ:n ܺn2U"XMxjv>x;!nVɗ[e .$\9Wg%Hx jf5#!+B)_\ i@Ms4 4c; PklKq'sO.|^yQSJ3 ,!WPsw9.y]?}Z@Ii[$XhQ-[i\7X +I%B> @ +8 ) \uUTVVեAAcc#h6y>SFddWl6} R 7^/Xktб-}^HX,|<9h>#+D#+yL o. :::ܺJ,4߼?+z܅~\ZD.:|:Sq.rZt)ϲ8g|h#G6f(;O"MN{M ̭ߢ_@6ɶ8ECg7/ })>ִ< ~a>P¤8gq.2/ !sO>5.Hv:қmKM477s:,%KBC ^{1GKg,|/4=zsKs%PدiDH$>&J=]؟GN-+&̝;nZuߑŋ#ą1_?akc硁v]n1939x/X,bؾx +Sg+\tE#Me %IDATO7,`jn{'&️&6d…痚FѣLfmx@3|=W2 $ wOC*ږ炀{x=@HIJI/$---pyM[(1*EJt-gǹ[|GT(_[[K8's'X/?DϏA$]׭dwӮlIyU)I έ&R]CM1);\o`>5_ 2/fݹD"Аۆ|֠T1 Fwv$P_i`)7Si󫮮& 99T4Zf ׵afZ7Gm s,dF V=1'#~&ye;jUsxwsC(>pPK#rJߎ r>RXJ`j~65|N?X28& ϽTQ޴Lx}O3Oʽ>~aP]]ZɂVG=}*z rþB3'G^(6o'jOzwIPJm6bXlR'왭$_‚edl<`?ϟU> }6yl'}g\<Zn d?wģ|9~7 ~Yp~~"A4-JlwA$P"DY5._)s֭^i$P~ ~~niM 2qd |]`si vZ('F|0 T~N+M#DPNE|ǞJ ¹ bH pn6q;_zϱ8GUSsA2SaHX,Frh_ciǪ-?C.  Oz* $Ljk3/D$aw Uھ|zJ':8l-tϵ;γ]q+F %۩/~>C4[?A:iXș 82 .'5!:9 F_$)WµJgڨ`?/7^#@J@;iWk>Ir-Z?9Ġ:)u CJI&9A9K\89>WdNKNWYK GxgirClWZa[vj.Z<7Ji? _5CD[\B@eQɦ{_L(@&ޗ~w_ISMJ"[5:9&?N!:95p뫷,v?/OB@D"w@S+&tA>tLC > `wX^(pVE-Gz~ɮ(ne aU4tLk]ڲ7r*W縅k1^g74ART ̮ c*-ƵTzLDZw Ӽ*TBT9~MV5=c<2}g@X6|m/?U:+"kHFgd2%`d/##!dG:DÌ*5 &X<}^@!' ^(X,GQrަ+gED:  6EAC@l\08dT9kZ( 6Κk3xe7ύ<˪mE6`w_3Av:4)ɚX:=-UHnB#ޭ#?KblH$Vy ɯ4L@|CE!ɻB1Bat@4'9kx_CHԫa՝c ΢ς%{}KIxWL{%UA|AjZ‰G/}}T]%o¡a2!4xƝ=;u6z8B&$3OoѸHT5VI+-hDR *HSrmmC.,%&?8rH> Mah}k9ϙsɘ dL*E&FI hV ;7<-kQKɋ'es&*R8N2`LtAnH~J[@m=[OԤ:v|d!ڌȌȌȌȌ|\I\G=LjIENDB`qstardict-3.0.0/qstardict/pixmaps/arrow-down.png000066400000000000000000000110061472531462200220000ustar00rootroot00000000000000PNG  IHDR>asBIT|dIDATx$y?3;;{o܁S̋Aq(M,L$Ug"BAc21b!b^bHa0/۹ٙ'?LLuu.YzS3x<x<x<x<x<x<x<x<gf\cC$KV90j+ T{6Wm2Qg]TR.KRbIQ6bLv1.7詂w,dxNz_]{{2F}v".Zumf5 m+ve;\ |.zǻ7Oۘ^]fe1`;ֶA^_6*'yp,)fЛkwk{E7lyXqYN,?ԳNe1֚8t5u-N^X6XLjJC#"5>d"tJFGFyp߃]Q^t^" N`nYҶ$$lLe>ɓw=I]i ("Qezu$Q,11uvYeED61rTGnu_kQ-JA`oBv{C@[i1C57z Rblio +:/2iN{c/+EccauOQ{Z/1$;OxЛ|k/ ,1s 2ez08Ǝ:Y.錁26sm 4.NZ7Xȥ^vn\NXߩzW{/m8+^ =Gwf'u!il7}E%s^O/Ɣy;P@OaL@!ET׭O]K\о(4h(4d /z6F*SPdn%uM!z9]['{'lLR 1KL؆% p8z`ӝ^HإlËOA)66o0q3ؽy<:D%X-6)_~[=6휻\>uݻ݅c0t8KzEd.W7*kX9#w(hr2;h~ln\$A ?Sju@e@ԫ['$ɞK@p[u("csF/_@̽Hq»3QBhXOٵ##w@.~]ݿݶ@zFKjgc@ DMwĺ:8PE*)8:?{טmBBi%9L5}n賙OpHGw7sv "_Xo*ȾWj!|amvH'էSCr\E:8Eϙkpgz}ݛz{Rh8o}uW̏q} νz,Y/y׳}*SuD ,vv坮KU:t=UV`57 ! Ldld,sen)ַjt!w=iܢ}t Pɑ 0 p}Yu{Pxow1`;DǹDъ[=]#~Dbn*8YʞYqJ}6 p?ng.o[z {T`'xc)fA8o=*nw"[s5g0|X) rߣyl; h it+o 2ΐ[ ZpnNJ+D:n}6 #mos:FfϞf6sCcۺ:jtV[{$}8?sYxy/U/}TT%!MQ4H"L'u7ggڥ9K7n'5~ ?Ž8cX) L]a$z 2(mh; qT7ٓ;[Xg;T$v?'OI>fٕ񳝢!n7\ρY*Gx//"q4I.2Q덵S4hiz3 \}wJ>~ UMsg@kGֲ̭4f7~kfَCL5k8HH^[#L]sS~}>n,S+Q 7ȓܣHŞYjrthvP$:_3A{0?Xfq5@({T\>bf2Sú]-ӼoYANU[;[LgP( }^ )an̔pŔ(e Y?Wk` zv&\M+l.8Da}NH\q(HZÁX:4LNOv5ǪWQgJ9NQx!*gtm8Jz2t&dMAU(k7IF YZusey8ErNTv<ŹQKI])(EG~Q8t(1~r=J,Ȓɍ|Q U{g}C1e)Ne:z@S(SgtqތVEGkÁ΄d(9H$lE ID֚ǟy4ރΌ Debk{ w+JDvBIDcx~U9bpU"Е/=@9N$ BE~q)Xp-TW$%6oiVjqq( H:3||[o_1 xKP]QxN_:cձ΋C{@^sbD}\Ov`m -WgC@alɝOҜibe€ꃜEF?uOiy>((ܱs*Vٌ,E`RФ\ɭ\؛0,x=`BD~2Wr4F7Bbq?xX`Dy P~no]^V\%ɓlx!QF={l)UkRZ)f兀.(סeV>yzg(s10?kT5>@o$g- #c8}8J$= lNK4pe| #+O٬lx|SL7y፝n38E=1ީ4ӧǙ+WfIz¦MDP$af~U{ȗqGy p<Pplq&F'ܟ dmGkTR_>D|J}6+?tJr-ۨaweS, Ve4oSY٢f59@" ectuh7Qe @4on3C\wygѯkY]F 53ûc}% /_--,G\FM0f膌8x`')6uY+YpV_# +89yiz˦^NN?n[?rj}6aNlD&ӿ5^'Rѷ5$bX_߬.g r) [t|lK{_3^TVy׸PC( UDU5J= wwۗT޿P|N=L._Xqd.B]>+-&wmQXO[Omw0y( e˥>=x<x<x<x<x<x<x<^?Řt ;!IENDB`qstardict-3.0.0/qstardict/pixmaps/arrow-left.png000066400000000000000000000133001472531462200217620ustar00rootroot00000000000000PNG  IHDR>asBIT|dwIDATxy}?{fv++Błd!1p,aYӎmBUlC(GU&!qlⲝĊ.'Q26NjB ]X첗v%5;g?==+,4RzuS{"D!B"D!B"DpCTg 6,砈0S.*݁h.^tǯ^}%Kv >5Ňc+=_~c#}MV/Ymoodr˺-JvѨ䗟L'#֦V,6QK*"M'P&TN6bomK[sL8#(UF8XGK<,s-iPŋ9:~c8>q]BdO6|@B?u5Gdht3( w}Cu#~swe(!؊AwaD!Ǿȕkdnhl34:Tކ""ۅ_^E?U_SϷ6 g7olJ)2 I#ɮû*pDx;( :xGbt|x>R.'tӱҍlPt9!O!+U8H;1J k7 L>"-J>8P'֯ CHTi\l#ރ7%r-UT_o+*.W)U1a&`+;0tah8eD@ܬ !|Wi,|GW߯[ٍO뺖P>Sj]T'LQV$9H;qF-7;TkS+W^x%KF [&vDq]_d5SBQw13NLA'qQEȁRx[ҵn L4b0zM;I1q(.圶- -hv5\)uj/5(45! 0,Pيz ^!Ľ%b'M4nŤ'tRh lG-#lJ!=*ISר74ښڸN$l>3TuRhfLe !m4^'[L~NĹ ݬV/''s.#P@p'{qSn upɣg'%y!Q=pVl%RaYYHg5)(赏RK$G(NnZ cXIa{Q5 AP-XGyfGﵛS_[%:I 2hH;:)T[42 ŁR{ٺ^ -hF繷TE@ v:5z~ g"˓S9$pPpZ$|N*^PDl( <N1. s˻f-%3z MC7@.)–mu=6]R'Rh'=yWXPXB"1 \T*UqӵF/]#_%>8>@Ֆ@)%g~fTM0 ,ILdU"RTk3q;UGC [#_n68 yM:yk!2P)%7>{F6PiN :VhXH/ '9|0 GXsX|08Sf"E]VI8eeK~e1TVKYd2RfΣn&&'7Di2LuTK2Fs‘!yB dos8K3Eˑd:!B oCH_D $+€369ƞ\U4n,|:#ܵa fXJGiK@TE]T"1u3i;[4g],\ N=)#H ݞ|r\4%\T\l^O/𞡽q.XJ> ds~tªǿ /Uw1A8Any%$b|Nӑr 0 U!: /8Wn3rk0a]bg5OOI{,"c˛ɰCiY+o{^dqR,X~3Kcp1y2UT7\lʟ9);{_gyTR#|@9?`RL cfl_𦺋#(Ƽvo d7Wkya=#Q| 4"3`/8lO^ǒmϋ]>Ξ_/^tS$G~z g8wQgw0wW0 oĈ|{`#/"&uo~eRe|`l_=Ckv0B4IUNpfl_X~X-'y \*͚W3NS]['Az0f> ްnbRJl ͊WN*\3 bUN2~yǭQx+ƕˮ*ƅTЃ/EsaN|_qzl_p@ARxO^^;Qs|AXGX%^G~+PDv,uY x7|p|}_v-mƒJHtFy0>TD$ؾyfRr,\'^~ ZVm_j]bnJ@%mtGndz_̞_ 21>t JR}2oK9%3NO" @x ci==̗_J;pb ν)~.'yzi, R#= G2)Ƴ(^c'm4IL@aO^Xtfџz0hc GFFFԓa|!P~ &c|dFR. G)*zfeQ=AMboa׿{+S%8$:+qbµQ d|=;Ǐ_|†3@}W߆37xūd5sK0|7K5މƭԴV>KC >'Umt3FSl1nZQ#>/d`?@$(8iN%䖕7ou@Ey5``89evٛ vᇿwn5, <2RAD ϢNΒb\)ܹ㥞vzϡgxCqkm+"i2*|WbG~cit_ ?&- g@yӠ', <_ x$w=G_I¶6DHH 0$x5@9:n?a鬥%+({o5V$综 xL_W]UWKn#@D6qh@J~H?Ɛ? ᗉ #"Sú*š_܁F¨ !.dC]7O,FXuf*QY29Z泼piM5 di=:@rvv[Q0㱍.~s_䟻bܶEx955U94"Su G1_᥾ܾVcqjb1jL"LJv~Ze(1 bkL&9 ͑=?Ju9'[_J`r9&9P9zof$$3NUFn6P6+L >uŽ)*!g6E; A~B!B"D!B"D!B?XIENDB`qstardict-3.0.0/qstardict/pixmaps/arrow-right.png000066400000000000000000000130511472531462200221500ustar00rootroot00000000000000PNG  IHDR>asBIT|dIDATx{t\}?zXeK~K~H66~I i )$&mBhӜsNsҞ& Ą4&PH)->%PL'~acYl KsW{gܽsgʲkt{ܹsw~ bĈ#F1bĈ#F1bĈ#ic.8/i.EG;>8.ΕM+gz? $NN͞73g+&"4[6k/q5Gcn <ѮLs fuGr#-M2g-YDk/'NeyFRR]DG3%@Aot;9{k/Sܫυ4xtr;5zz?*dV}d3H)ݽ!UUvX&֚'9s)%RJzj=~`X&& $RI{gOÂ7FI2T~9tR6݆X'VycϗsMxFk/!<G`oxo ׼2.( *2vXaa~>'ល)X MZax Oyxb2|}Xp e**JEfɒo7;s).= $H䦁 `6ϚUkOu.0>\(Q$ioᦵ7q w8 $*YdZOeyVG$$rm؏FiOzt5/4h?y\`kJt$a xgd8OsOw=@q 0ۇHcTʕ;:h{?z/vOƅ.p 4@Eup{dz5ΟqU1 #@ M atm A{Q*geD7\tE! kV{)_ҹwKesJcr͋c݅OFaZwü߶ǣ.J|)5Oai,v 4B)MݫB%5: RK<]"<BQKi3ʹTG=X@DVG?*I4r\{ ˚$('-F.p/Ԅ5˯0\u\aɪ,sT10F4a@`  -Au!@ -^:\7hvh^7gzt f }412m_^0\H_@%/ 3Rz%/Crn6fg,Q}T>]9xy{xEW؏ K/ %-BdY:5.ZN9P1t{67 "e/-r ߎ|ߘ2x NjɼQ]QMKGK.hjWA.Sy-]hP;]BhKhCz_x~#j&2)2u{!*[N7|O p` 5 XO rʪJnx ̘2#A|e]7w1e!눸/.Zo yZN ʩf&𘫺`D~ }S7*F].r h) ….NV,XA]T^ZTHcuok)';J8}0: ,uTMqjmGgj9dyf0š!BFk{h {Ure=#AAoT[^'&[Kwt{!X!Hd޽o^B .r8RfXQ,APB K{toҔ3ALFn/Z I8!SOvT{I&s0(?O) 4 pQuZA*n'AT*XQ'`_SF#7OK].[ 3GțXFKE "m`6lH؞j700F&7LfKK'|Pg@5RHa젝iD[cxRT]0!  ,R@z .#[ RcŬA~M.$ QlX3ƨ'LHmPJ(QzV#"vvX1SLa[Vjp! Itx"cCȽ>a,";lÚv]9 XTuS*jӱ\ UIFOp䭺 վ8+g\IY 5 S"IiB^LA9H f]+`kU 5Z<ᒉdai~9(K)Vi3$Y1m9;N,oKV7x#@@:݃݅FU\2PB+ViE9 !r _D_Fy 4L/k =d' xY-5rPFe~_D9L G`AH~45.} ҤzTOeiۨ:sk<YӨjfo>A64@b>#@`0e&בD? nvܹYx3ܾH6_PϡB6ix5GSH[mۆW H`]qjc3$`HR)/n7tѥ1n]4I2G[`m wt:N\=~6_d5h0G~˷aiQE1Dy3nݾHh/ҡ?φᛟ$l~')Qox(vÉQeNAfz׹/LhҭS? $D=6ܹ=rj4e2.\ttI::yp$GF詟!,Lg&uXe5jhZdqѮ27R B#M$ Tm)ܩ! OGNq6iܟ  `N$},"!Xp)ݩ^v kTԹQp5 horQɝѯQW*mKWs]''97pLH{0E~HE)m1Ai#G 傅xu `!Ld!/G;_ qԳ#?drg(AiVΚ˔ub>KUcla݅sp]0GBr*d7[Z_ s> n SރFu(@EY,Gwr-T97pDw%G]p6[̴l_B{(gB‚ͨ e(C Ђw7F?ƣS=B4JluHc~e^/5== }> F:0X)2; 'sشY)ޠn值ED#vףKݮ;pv~>{q3' LLNPg䧘V0WyY=4V7Y >8OKo_Ev^>G3f (N!W7j._C( jSE{ .ȭ= Hw,NãG>fO <ڃo`R$^ $|=|nBqX>8^b&>oѓ 'T;;3)Åu|4O}UV}: zj@}.l>.d5waM ϰY62{p+Њ)&4Hs&{O.%8FʓtbĈ#F1bĈ#F1bĈ#FQW)%ÂկIENDB`qstardict-3.0.0/qstardict/pixmaps/arrow-up.png000066400000000000000000000104111472531462200214540ustar00rootroot00000000000000PNG  IHDR>asBIT|dIDATx[uܥVKR()Ki.EEQdD#;v zDH*M:a% E;`?`(q [H)^;3ݕLuuuŠkzuN̂bMq#F'xKfx !;L"{y_MGXc="Մ)*-|5EF7x^^B%#i*K-xO8buՏpS|\|//{،/Ʀ*X"zq]=>ciV"H28tE?!4IҐ^.XJu`CjT3\T@y*=.$ >'!Wwk2>< %"'}.(@#P@_4DGd qG Uμ&%ȊB%nf8K_.~u7Tb%(_(dE6CAND{o>>k{~d 2Ohz4ԏzLx^kaM  H~S&d8 6m`UYן<'"! !”!-,S~ .BkFpڍ*  L7^ @HV2[%>zw ).g-/P0C <\0q9zboqԿw,l`O Wk]M%,ih$$@3F0FnBE/ 2&=HF7_TRRW|g#IfP]p`_,4>:r"&`kf HbVד>|}X.kM0D"| V3ĕ 87u)l^X$O--/۽α<>6"b#WsNja-#ts6%SHO6 mZ#u7;EƢ/؊_a'RLJ}!uoV_d\[&BC*߱ =5,$yJ? a%4I*`ZR?(fHyH' E' r`媕!P!Umn6Ad#PDK5Ly?8M6eA=1g m_b+$HkB#@"4ܿ~FV0!Me=4R\P( O1KV$Oö1e"ZYbRF!H_Dz(l>B@a:hlBr<༡5ks./V= }-#'={ѧ,VѫCA\'rFnti'-tc:tt+y_ ,k,csO?3-4JEi^8wv^ +bOm6&듑抛s+ڀm*Œ肶v3q qOzj߷Lef7afZ~oĢ)cLڗǢPj5 N4_^N=m ct'umm`B JZX+6x;(hH4f`/w՝;&ncbeħPd\Y dAN&Ў'Hyܗ~N_cow'E]xS?k(6[zB0Az[(4Q,r[eow%@;ţ>i}Kh5L0MaVi!bjMC…ooxz* Vw8'5?od"0:SJ(jAM`E)"Z鋤-: 1ƥg|av?XDߗ}W`1q9T*,0A%l+D8-s(7G}+1!CNs1ѷ{nv}|gZGG/U` ̢>m۲0P1&r!lNԉ> >״2^C.cro#9\ _ٴ~ r(S1^kw[Fv>abKGD pHYs B(xtIME # IDATxyp}ǿo7E@<%Ee[$DEG;8wi'm:dĶN.;]g<:cG1xI")<,H cH$$ ̎hX~vp8p8p8p8p8p8x3#o0 Û̻HWW3_7!I!#{(سgOM]B]iop֓Rc'>aR/Hhڽo_ ^L&CMuDQ@$fxPT7W^}Dٌ=囦D~R**҃?ݻ囹 }~2}x7hي ~cKMy|@|/7hm ?[SoCE員5 vՂ14<4.8Nh)-+R+;& AAT%Bnuv;gmJ9ZVQm57j5jkw2t\,,f3N'~!Y$J.c K.FGGQf4BT&<ر};fۛ_2TT LM2jHu] 6۔?K0:2Z~S,8 JemV,:1<ࡲʪ1t5/+ߞD__/d2x <ݵ /^fâs1+[[0:SOА?c(3P(^>l:7TVLMmyVT(׺1׿,Om0/ v N ކ1®]FFG`CiYYR!` D119$9i6Wnu5?'×Aŋp-.,3?e0C4}i!(/!Xgb3WIOyJ;vks7W A]m-.65anǢkeieyf!&Rȓ PL:(Eի0Lđ`l6A/\.OjJzU*X{XQ4'TcC~? đ;CSSfrAקuub6A:䇆0&ftzE-x!k/gKχk0a@V3$-?o~FwM2|{㌨b_۷Os`KMM2b6ann͗.h4IW:4651; KJb0eF#GP[[z뭷pgöm_DN: PJ}/c zo&''9B*0֜DQ33lhnnơ4@(**oȐϥ@_Vh4;z4-O< l+*~d&JNX!Qv[Ή PUUN1 CP_w1pYb0OMK~[XkJzVkV5fj|ܵ@ʊ Vz46ۍEEba٠hpر_x-8c͖  8"(Y$atxlohhX_j0B#W$ }p:cl`B$oۙё=sfCBЀcǏR (n܈Y&ݭJ;Rb<> ϒ ACCז$wo琉bhx f[`=v1P.QI8"HރmRLY\TWܹ̆ /jQXT|1/72[ԤQ !8?~Y~Q6oFäՊ![]-( TU!RLOYzPSSѣglx@"=i@јtSi/jjjs ϟǑ#~6AiMXW`5fNP J/EfjM98}4(_Wy|ֳWƛ%PJa!4 jd,-_jq~NJx ZԩS pL۱h=/|p\p\Z~ɴBP@RBT$acp9>}Ӻz{{q177\B!v{8U&!?jk9,/r( (u1>gNݻ31Ç133Q&zӦ$ƺ*hw[K9 LL251\^h4=9Ac߃f(Alx%Bz}h=loy%c'Q!"dB%0&ccx{(BTY  >k(0J8'ZB^HF!?sg&?b>2*#!^ FF +]mmOanD*(hpspNMỏ>B( 0 [N2g;z!˓}ݎG{ 7nĸ Tl$Gct]ns>ok_;Xc?3&:/"v޺` @mr tg{SdBOz xM)x R막Ԓ|=Bg#:cc{3<"JZ|JHF<9ݻ Z%Er畖g,Y$}!PT8sR%%١--iuϦ1J>{wuWP %+WIA~&B q1}"f_=C'o;¾_I\onh?-)sga(3&?!x@OOOdpd(- ʲOO;y$*?!_ d_(֟H'0K~:B*_"B J.C.d&tO%YOm5_~Y$' A' έ[ke}rV.tZ-^zEl۶-Ea-5xPVV \g{!g4`= U FZV ށѮGV7|3><`:(`a7o‚(qY7 QiD01m. [bȟ4QW{ %0^D2"Lpd"'r \ۅ9Q xE!ue pw{ ]0%dETH HoB@Ж"8'X"OTBivz>W" joOdZ\&[-D_2_{Z= LbTD6,$lVV-2 J~cvWG˫1 ,"Y-[ ²PAލz"+YX5|$7 N\<"]#In a҃skAD%Z.$,8}^UAXN#^'üc>ޭ.$Q> D.]E!\v.%? ]X!JXie|Eph(]ڿ!l8l7|w$|$A! ůBP!Côf!Uf#p+e[4a?( uj*^w\W8IU!Շl$Ɇ{zQ~oձb^7iF}W/w H<@?f%CLRJv+_VXƝ tϵ7L`;K`c/Am0W>~gxW"ygGuttp8p8p8p8p8p83< mDIENDB`qstardict-3.0.0/qstardict/pixmaps/configure.png000066400000000000000000000270001472531462200216630ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATxw\yܙ3viZ^@C Ɖ)S7&ۀmlD zAZIWu=̝HBrgv.wi/pB2^" )޿S__&O=W\qaYfvՑpLG:z=oy}^χo+i۾f$\޾??-'q &8eڤ[:{J@0HiI1%khM4C9q8qģ-lڸ?p=JcF  B9̾GZ&OII1hpB) hTy4U]]oY_}5"0[1i_X GZ[J}^/ΘghRvP 㠵Q gZ98Zk~CX~4<@/\yGgg9njK^!CD 'SֱNɏ!Z@@08yʴɗ8qۻ08*M&?_sAK/s=ɗI?A@]h[&`Yޒ-pT6hN㰰kﵵx3****Z(h)PHP$q)LH]HR pLׯ^lU+W@'=_'F1LܛJ<Bi;<@ys Z )0FqS / J*(a>g8pYaX ,N>YuƬN /}ǒbIB7O ͓R -@jP@"hK8J1y_|i4ҿڻ1Bbz7A&A6EIiR !$B-`$$@j@phhH$֋Q0hŬv7ԁB `  b89/D tJ] hK8 /}{ McѣGhܷ_Ɵa6ÃFhB) KH( cnOIa~o߆t/]H%%RZBJ)%<+ 4"MᖔyⱘQB - KHZ$&zn |&%A,|!MxGNn6}}alݒX)B˲4Ҳ DD1Q#_ pB%@/병R~}=qj^&.{ ))(+/c̘ѹ>SH^ wܸSUV~.7/9twwCQa_2@B3hHA4[aЃ>Q51hPaNjAXY ЯD&Lh!’BJƎ+++9### CO\>i\0_?&xx>xV\eԽI^EJ@N8***e]<Sq۴|ӧO/ھrs_Lٶ Cضgc|x^<^/u6j&rn(R/WP4(T6QcF7wttttc쁏R/5J2h{7@6&ؤ&AcG9JYB|>> z{{Y|9Æ 3>)b@)7ƣZRR1ed+/ˢ;lܰxp ;s*gM%WAR ljӰqA@>I4~4}^/]vsNE"◠5ZZD5Bk> ChFt_}Ν )nʨSϸ`0RJּ۽@!)"Jȑ BœK, ض볱m>N-]JM͐d)80 4ib)QJ%=I'/2hPnؾk M oF{wyY`0( %R!I[{^:fۤ~i9$ƀά)..AZ(g{}<^6m̞ݻ<2H H) !heBXGQq1hhǪڙgN}m2i]R"-At0awFcfu82H?~|ҟ%%Xmχ륷Kt{gÆ oG `Iil܇嵰, K_'fȘ`0(<^ۛHޤ[!1:1YƤAG>bx<^olcz<_m۶h xm1 iZĶX&3+x^`"lb ǐDHh(U!hhh;w;0E=5!.--$Dpǒ@ Ƕ؀~c-mDXaƍ444$W{"7؀&ظ׋xd~A&IV 4wiJN ;'' #YUZZey,</m/mttimmeW#qPH`,ˢ,Kz$aLIq(47m˖-b*aKJ!M#g5cF0Yyeyx, m;vAFf6p85]LSȪիٱ}GHR@Jacqcٽs>cIH.rQJ1@$m|4 /,/K)Moo/mmlݾw*.<"mtuw~=W"F6m̛7[npTԎ!¸B(TM6 !LWZ݅zQ` fG`24 ؁@ drYYi⧵V+yWyEyY9cF&/'zXI45SGi,^={m@Ǝ;<|>ZRg1$Z.LCNL_AEhX@K.پAJ@ wؼmAJI,a~QZ& ]Q|v^7H@`Y ,qrՁQbKZ9Dx d ASpyy 6ښ|~5=}}lߵ{iش&RW;rssIF<^,xMO0-%"QV斖d̘Ql߾L4ljb1sw<ē^ہ7!HW}8<@樱M8'LJ^)-^hfL;,*+=z M6*[)lۦÄ cZC+!m۶GiIIsbe?8~-@CZ|@ٳf};TX$BPϐFFF8P!奥ƍY7OW_ >|`QXR3ljEb1.^Yb`l f, Ȝ:uI'=sE04ƚ%Z#4g^TUUQ\T V Gi~6lcbf+T0)e^ww#r޹<DG"Npw!رcG^xO\|vqQ1Rk2flccqvۇEH8XR R]M$"him5'P9x&O6ƝNl)[N<Ů]y駟юbVj` 3?CG AH;v쐋.p\3td &m2i ٻή.x^2Aʨ6,]}Zkt _ҵ'8\k]?5vޭ]65~C 0UWWW~s-8s FqS^|>RtyV:Z<^lۦ;wjZX4g&Lh :'1K+Hl*Uڤ5V\tttt߄182t$kjj*꯮xcY'$fh\İGG8 a]p_O[G'Z尿iok&//G9 RH okװq?x\wDV_a&tqb0][[[u1YSLM__&*_>] #tYf 6˖/H!Ɋ4o޼m1*=G^ĉk=gΘU0ee 7HWg (MO.fϞgqpkkogɒڽ"B8ʡfZZhooN{zLJJ ~O0#Ȇ w3sƌdzx}^*& 8HX4F,%ʼn;qډTWWW|ҤIᮮE۱hѢmmm0Ɣ،0 ڴicg>ӧg77_ 4wEňEc#a‘oxh(' tCkK+Minj~56FV^ݵcWmwcnw%Ľ#0Ϟ={ڴiS>}FƨѣO<7>?SkWyD>` 3;׽6w{MX,Uة#hug9Whxw^ЀcH =ܙ&O|3Fc=NIq)L 1k 5&cQk ]ͩKWؽ , Æ>03U(˖.#??w4hΝN⠇}]w}g7a}D`:1uOTt!\}Ō32y\6nHnny2Xk'>Z!1r/RYUeڰxⵘ,v ?1uL~0Nx|ڛ8cLY D;ٳgYYYBj˓p$ˆù袋7pcŋW0n.w'|8 HrWqQwϚ9SD7o&222iCS/[oE9o~…n2ۄqB =*Gp? @oRbe˖/|0]c2d"˲XYU+**2k Xr}x%¡s5_(v=_^zLrSHpo^o<hyYt)[@B8!K.f믿?y!Fnr';Nx7}zKX?rJ1綾yuЅ~PJay̘1 .<G)WvlRj&гC9Up" νoZ}fhFiͼyBf,ZpS)ヌFpUWm۶=?]bSqRtwωEU[7Ldff|s 8ms՜+1NL?;/^~_tUTT^k=nx^駟ÒĞC|G6gY\xB)/+;0ۧw8=|𒿾4zta(Gy|.`98XWЙ>m*CT']Ï.|Y@ꊿ~ZE!b=n}su/?@姈%4Gg̸p}?Ŏ6Y@YgU}. f <ԳB H5psubWq)(eNܳ{w޷<Ew8|V.qE習C,<%$sP#I~0pwCn~34hW]tNywp,`k3a&+S&d %t+U?;8ԣollt}֭;>mXk_Y3fDAaa +; '?TW2uc`Ne&5B @pg,Da_аm8%SǂOh IDATS=XTTB8M-:d(XZ餥 Ǚ>}~vǧgy~ҥKݼzl;>-xn Ouqqmܻ{G '333YMSW*h,ƔILǦY[|}2{:>t§Acm_5r=EVvv ص{'{?G2wWLhdO-鞴e^wGz1b8yV,]3-Z];)k? |Hsk7j ~(`m`رddd$b)ZR%9R?s4tP]YAiI(YiGy|Y<_GrrOtw{?VTT* 6l?0хR DO|̖ D E8!TT@ î.N#Oܻa D0`ҹk׭ǟdlB?ЍiQB*_ġJJFTØ6qmg{i=8Ho>C֬]><ƍ#$W-MՀ<4EHaCͩBGԣ< {iǓ\_ ҊUV3f m')Sug;8u|S3|q!2jdFǞܑݽ#"@2? W#Gm2_[={0`*q1 WN/JUݢ6w8H?WW<>}ض5Va{9r̐'@$XBkmn7Z'>.?~|錙g>>~X]->۔[:/]ȑ#,k@t/!'mxUnο!C,ku{~ފpv|4iR3<1nXn YaÒ3v{h+T%8a5lh a׮ݑG*qI{DŽc%|SN_۶o>O{GCϮlHdf֮`O1XJ`3HNB$$RZˍׯ!;.8RH΅TZ-RYz-*H^O,@Nn8%\L$5b{͛;7 $?ƕ?_*..J ˖@YY)J)/NER,I+WҐDjAR8|͜9WF%-6{}[ٽㄏ#?vPeų!7w(DQ( Bt5KBKo~s}yyynQ]+qku+|U/R P]:f2y}P`s@>B``AΆ?3#@ԇawq(d5øe˨?_4*x y,y@B [P{ZJKڕ+n2L&du/(=gΣ2f@qzv:>A95G+/A P%18pQ~=.P^/~U8(ؖŹݻ唼8x$gk`ŀ)+VP1`i,3kfqű ,! dPiȊ,+ qJ| VYIŜ;`ݤ.SvחHuMw F0#d2N|&.]J)[&<'k(G,ZV;d׾#X5|>T7_51izzЦNgS?_ZJŜ;xqxK1 0\$ 4(|p4Uk)֘fڻ"l8NT䗨A H&}}DǎexlApdBK)PRW_ AEdB5j+yÏ?B2mT sp Ny PAl lV6H`!Rrq;+"&M%Z3D75t {ZX3E%f[;F" X8FY8C3h9o"VR{\M2XՆpQC"tAyjAV"̙#~c9NbC E.ІMIx)@))WPTpaSYsg=;8k;ז5TLr9\BUd- Pl0Y8^fЖe,\[`'-!,%,#⦡W$0DȤC|6* ~9r ` i~8656{Aq6A_ :L7AKr${+A \ކʕ. zzݜ Ft }X?hIj%wCH|{_I115n 5IENDB`qstardict-3.0.0/qstardict/pixmaps/dialog-information.png000066400000000000000000000225511472531462200234720ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATxy]Guun%^dI$cK``l!1"d@HȄu8d`0I !d`|0`]%[ZuUGᄃVk&" L,̰W> B׶@kUJi Uh|~Z"Hhl"4$#hKj9ڑ\bIEGR9FShh"4"}|TP\+d'r,v9?!&`bU?skTiF#AƸmw#,l!}^:V*p %,%TR>P4Lk`I:ybͪ[^u,wsh!"xZ C @I R,jcFrv4m 2q,21 iaLC+PJTRP* 2K7[oz?ՂϕyIQ&9HPJE-_W^<|z쾽wp)ek[1ױ 2ql Ǯ߶L,'i CW_ B 5) $_ ( ~3 Җ[o-A ?J<!j@*!\},jbCԗ_9wR\996c6]"@Dma[8, E=G r\e|ŀ|'_ Bqmg9&¢B[z /{ޝ+sm➣_"[:B`8nTܥ9Ҕp;&e`:Y@)B^JBHBSHR( ] @6_$I{_i7eA K5]Dth]‚ "/ c@};y} ژ1&-߲L7Ҷ&St1 !$W ) ZRQC6 e , 0.!/~'_b1v?~b-#.K^zisuou'@T:4My>\<{66[;\`AFsAPhNl^BK;3/ Erb}o13ӕJl|yy `Ke /= >pqw6]=LJbd4zUWyP/*Cl-ڱ-nZgw<R\kg2 o|mfEԛƶmG&G3>qwFODKZoDzx|/Bc-R,|~B`՜B2ݛ.7eݚ̭^ZRb۶mћM{XOmxZtXfЛ-<ۉ9}|A4flru烞#q[onŻ^ܛ~sl;j_.F|=4M?]XiNX|Lo?,cM\ݹaц#]w=ʕnzG:V<_Ҕ3vϿ2޼Tb&.[$d}0#8 1I&o387(XG*k.f=.[M3Քqb`iۖe$1>)]\J) ܹi9zCWlbYGs¡9ᰬc]gֵ9&G{F  8aPteYٞ׮:d-TX㡳@qìkoH$$ZN>/,4plOv\a~BPK: ︒6N0 AkVyB,XgX-._$%l:~$#*`\Ӛs{|2MLSwy hp|P)|?4嵬lKLJIv8 iRql/\Bf4_ Cs?S5GgКk1[*|4e"oo޼q# "aWqKf\H%1MsAHwv'}fP O*I\15ˉEG"O#|#P MWm`6v{0Ļ !0>{τtf/b!X زvVYA(0."Û_wy0HPJ-0z1x3`笜*4vX9K܀纼|:-0dMgz+cMga >pt} 7͏b+YCl7KluV<(A ;oX#e.J049>T<kiom@`[uXuVV'ׂrRoQrԢP;0ɠTIŭSp#=|oGE%U,:YiY`C,S'uѵ| fEMJ P102wgY_&O*"IJqڸyj:@l :لkR-=>,BJɋGzg\Zt)%e-zP`a-Յ܂06bv5ϴ~3$ViǶ=B9Zd;&< 9&T۵^˧GH'=nj9Z}2:pyKǻ w|GzFR5DBؖH=ʌw8hr*j%&l*MfRǙ wgƵW8.D-˜|)v'gTM'mtŮO4ueI%bxՑ S#># V5XƧx6zGO @)E_tlZ5=ȟvrX<繋^4i*~s xUg``Vw`ږM髃=plP)9mO"+/i4'V|bw?MD|a =M gܰK6_zC!aٱ\ǚRLug4kg(l.A"4,r Mut MQ]qe%KL"USuF)0^H%UK0tXBƆN s6T 4|K^}f ֭4JYi%ir"̈4Q4- C49~v.4$KCS? l ĸ1zCf(J* %P鳅WeiWii(@&bn3/\T"ظӸn100HX06%cm&P?pSO'-vɟ0tjd ӕL%zapc5hV{[~rP|[z=^)E5J*aO>{a`}b^M!<=6PE0?T``F]o( ͨ^RQ"@cdq*ᄓz{''g(VZ n/OI=RP j:O֤˚K҄ó'e$i;jXX*~YTܜpXshO>}Nx}p)Ώ >z٠1`27g9)ú]khJ8\"ʶ$'G# TMw/0uAy2ύR$]{@YkcbAD]kb6ɘEsܡ%$X&=CYN^ swt~ulaiS:tSV\ 9=8F_&GP3C9҂v #yJ괩 UI $!$[})pۻֱaz'Q4teپ\xx!B`iRd@ e-Y8Τ z, ]6a$>u h;T֝yu|A*3X>`B2_k^4 # ~!OD4{l ɌMu8>v(z! 3Nz;pvoU" jYj`5ATuG9)4'U93&UKmt 3?<4 ?&T}k9돈2qX.c,ʇsk> (!z/.m\$a6j5C>ӧG瑼X7 K&p4zqal㵿ȉ.JOIU)-|gz/-I l)]ő1Ӭoz!%4cmT v: a?m>|7R8Gw"^p%_v&8cB̤ *g9H8dD; &g|yë2IXL/7sȚ7L=OD/C ֚y昽lHݪS0 &mU@$daTbz4"+OTFml&!9Ӿ;hzb[_jNV߬Gal* sY7aBƄD+vAn?V/MWF?+f'7-wNu '{WhK}Is>#nz(T #:niX'nNr0-g:Y7%N}aw; S{Y^H:ߜo4#ZhBĉV=& ;]GD~zLCwbe>nd*ejR:Ű9VzH k:0 ]2H谮S/P >͎4Ń5lSX+)2|R`c,FW#,Gt/酓/|iIDAT52/~3w<`䪟ҙQZ`1՞פիG>6tP 8~Q($J;Nާi6ث8qȝB;{8&tPk-Z'ZA=twXˎW,`Zpގ7jG0!Kxn-}ag7l:b#0fszD,☞#gp1l,k4@'ao+?((Xai-Kix$J})dCAzd`{oTc)M쐞 WR5uP<} KSۻYu7QjWU!ۯC()rpl'MVnXvt[t?2g7t[_aǗ_^,~C|ŹDq@Zksڏ05݄Q<259.eC\A=S5GGlO [װJ7uW|n]A*-j5+D ymLJ69ΰ%ws'J!t-}vPR >؀nc ygf^a C.}ĻN$dRU A)j+J,BŵvD٩SvY>ZЦ]I hVپspP !g;8o4C4xWB9L)2,-DifKWcEڠma)(M*>Ek4ڡ9[?6HE) 6gX`ɦcYCq)C[,-j8L\=FNtqƉ!R.'7 °CBkqPGyv H2عw3鈥m=&af衬L*-/qJ P&CPPΓv5h`0ڳ&LEnibY-0( BCmgbH6J}4˸01oE &>rD ?"#sBB"@[M^ALރ7 [qPa3'J*:?求 oGF%V]N؃2sNχWjp~r5@&IIJ(MJ,Jd!8 P18ğ"Fū>0XǠ!Ft=س^E\E\E\E\E\E\E\D z EIENDB`qstardict-3.0.0/qstardict/pixmaps/dialog-warning.png000066400000000000000000000223351472531462200226120ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATxYu> fٰ $HXR%[9NUJJU*C'CU<%~̃+r\h)"[,%j(R$v`uwsg`f9S_ݞvݷ9|::::::::::zIv7"|B»s(C8~'5>N{#zi<Q hI&䇄r˗XU/qD *—1HQXɮu=DKm8do0jK5W Bh( B&N~hڎ' > Sً2* ZnP  |Oďy,1FS O)0};NobhPBC9тASmAnUP%!.ؗ8"ѠěOz@A"G$1W7)(48 v䓄s-}56%ɻ)2G?5OD K5~c91cF,߃pl /c`E `a*%DaahT42 0ZUba/ T,p<,'(_2@!`ᒙeԿ"(t!7B22pO <$2a1QտH$6fs3"f&LO[*_ U%01 (4ɫ>(DT!ɩpA_,?R(֠0=xՋq"y8d8^*EXPFus)ρ?fxO`| 9p,׫i<E! f-`!bK1]kF̿8MT 0C8e>}}-z)FK<}G; );a6[jybDNaxNQeˌrFf?y _ ww5̠6`s4j4XkC;(4"Ew>0,ͳ4D%$@!4F PM= OκNG_Ecm9 (D0ΡQ[Шk FM5ѨxQh_A0///QLQRK3xB&Kþ8\HQ. (鏷~-6NjH! POc{^TI_:o g;ښ3Q]H%O@06$P]phF!bG> /sfĵAd~(^BiaIU!+c#XZZrC6h>.kR$ne0?ϯ9Y`X|a;{3((a\l]U1#c;H(bgԣW~lk#\udBzowѦ !i ұ=+zCc6l251ytZ_;(l\Dq3!+ )1򱶿HY#_:g/x(g44)Jq SM$N6$Ę N_XE/H:vږG5H qCv؞VGa8f4J^_xc+350Ў5=G Bģ;5N˥c{򢸀G80E9PSm݌ʄX/lQA?I>eSȭ~oW@ D r\"Gy9PgJ`&Rk[i3{G _;#u];+HE$ymS 59 wKe|T79/ΤYp7ӳ`$Ah%ztKv $(h a/ұ=%&Cbf\pIesX#}N|KOD `$S:AYH5DKOu>WX9Y ұ=s1beѸ#l Q$%MVe9Lar vHmH ?5}dJ-5=P2n^Leh{xì:f% Jgl2ԚNg&5+!$Ą0H]D!˳G2=W:'^IƠa,fxw69ƨYoho U,!ḏ*OǓ-f,ztmO uqM}תHC1!v]`Y:w0n; AMN9L;E#.G#5.ELn"YuG. sqI'1 UMF=C4jݺòcuw"@z'9}ֹq$F){w@Ԑxz,vi1]AVkz4rQ]r+`F/ cgɺ~+)JɠL"H]DGڷKӾ,*H7*$a M˱|2*%90 rtP`w4qtؔ -Oa,СZD @Ԏt%kDIR _j33E޿UNKwoG XT70ܡh (@bȷV3sz-f'. '/I N>W̆~]蒵Dl= 2GW:`|a:٨p =) #r?y= ҵO.Τ[&(5)D`"|} ڪI44M }jc8)xmVFc`#:ɗ~6 $֬`{?m~1L8GEȹX< X 2đǏ.OtXsAD<)/@ $~DDJ!ik=$ߵG#yd:^~DB8Z€`Y/Ens<hcU N!)DL㡞mؔF/bNdon햳eUBPۂ~E!y(/'9f.t01힕4E&11fY@!;IW8`Y/he8G.a5ikez2%_{"%9Z-%`=5:. aF7v q$j@=X ב H" JnA4xL(X@r"I9ڜwi'\o}L?0}g$fqE_Om&]bF CA!XDȏ6)͔Z!<%v ~bf@\x30C4V_*Xwe}q zSq"f z}37uxrL ?kgiA%Lk7 |'2yDbcҩTı.& iA$O}Gs.$X\1 } E#b( =k.gF CHyϿa>@»cۂ){y(-z2.h .h.K A3cA5[]߷COIk>qXbp,&(IG~rL L7ek]cĸL^F,./K4Qc=xsFnjZ^m̾$D1rkZa0>ұGsq2BTsAOsxSogZO!]Rnȶo'!8xEB08J"K^f0ȽB4f'^J th0Jڜb >37V?$wB+"l>12zt:7Z7{x6@t܀"]!ݸFoFWjX];P(FѢ#KJ qGCwY#LC9<=^ܪ)ÌAyh ӻ_GJ["q0L㘠A?TŏQ025t!Ӛߘ?o"B>7V5ga#>zި""xP}tc;"9"8w9]1xSo-ύngەglA.9Cd;>wzїr;Chm.^rR-`%jD;·h$z%}9Db<^+7]vJiX`cD@6 ]}[DŽ}/PWZ 7܀GS:&+)ы-?}!#&`6zۿ^^N`ʇ:~G/0Aiƥ^Cy1\`4-7+  6m([-gt?E 7G)RUvLZp !f|`x3/jk߬s6i'|Ͳ X[a| o38oELR@ ɢC 8*񊞍r>Zd03<~-<}+ іBK[a|)FE;@T~K`c]ulG@0y|qLbԗZf,#2v׍ v6VƟ';Pv[qh{V8--k%:w /~f?SX:TЦt-O99tHߥ]ߦ+ba5_@o"^cնd} lxohvFWE.=]-}u:uIK (Sv87qEBտm+gVվ`KP|hdT7Ow=UǶ$Rfaz=^ՠG/#_ WĭloRX{nZѫQH#ݮ) @l%`ހ}ya [%LF oQ|@.ǂEs$yV_XZ^KF4]<++`҇)kjphQ<*Rkh,}aqQ`Ru,E(dhNﴋ=a ߋ_jDo$"7dV|1]W>Ӊj7gf@0ݫDOPkWIhq Yqg/\u5;f]tl/)/bJCO뤫oq!5<۫z5 {N/8w1?l#?~}🩷hߑ;MXW{"ltQ, Ɍ \om8#,n|]PE'dbҋ\ҫ@s,ԯ_k0y#BaX&qrOw/Tσ>{d}:Ka8\gEʩRY`swev/hF0싐/1 F˔  Qw}SǙسxc^٘_O°QYvDb 18}2H?" kӚN.%8F%2t35ffHYQ\o;^}^oJw}DWkUÈ1Pd6(aQ**h)o*eLIDATv`+q BkCOcRa*%ԫ3]X; <k|rb9L`e,ƥ 6ڽob~`C߭FWN"k1EAY|",wesE ,TLAkwсSHco^fk3&`}7l?*an!x)D5 tVfô "q T6laѝo@ !{}9r`~'+n,evLd~wbS  Bez P "AB~z䛘boÑ㏇۵1r``pk|Sh\@ _`jM zAD<Ĺ#(4:6OtZ>n\GpƘ ҫ.s"U029T-V@݈n2=׵i!xiѽD!2C,h0GQfVtu,K)Gapm܌Oo{NG@PDE|Hon~a-GrţaXF&o7kng95o>J>QnLq#o VvFS d??6Ah}]::::::_PpOIENDB`qstardict-3.0.0/qstardict/pixmaps/document-print.png000066400000000000000000000150711472531462200226570ustar00rootroot00000000000000PNG  IHDR>asBIT|dIDATx]Ky{^;;\-C. I&!rAd%B {A! G6 [ (rrC V@ Gc, %d̥V}̣+ݝw]]W_U#0#pAqy=ð`:>X83 }v?q8F38AI'o3 ^{00p <<{i04 \GpS7~Ç8Nؠa`w`w  CACCa(~ay(S xO΃ A!B`˂AuQrG #fA?V]|?}],a'3PZ,sAyhMNaM7"|&I I#z ua!A}@vT/llMB `/Ac@)|n6 \\ L |njA!,UcRa|V-&#:'`̂,tȊWBAcH d(0FB>Vy޽0µŋymkk "@ >B$-!@MuDx<3p^.{ϲxƮx+2Wt=TUd2v-`R rʵF`mYBx!,x r??d? ع\(_ZZZ*7R;A_ @)KXZZ@1rTl @B$R~_*o"A x.X!He!J!Nc~~ұ.wG`Y  l˹ЅBL= }"~}q@ӠvZ"@M?WXqBQl>  j0MIA,Xt@{z^M}P%; lۆ8D`j3.b񾀸FmQ5c B؁G¤H'$"Mly^ f'GD5_w'o'6 ]Nڵ=p4@>.Ak (1c  k^Q=lEJ 6`5:}Ba `,ˊDVV{R^`pB<z_5~/ c ԛ<c4RUP%\M_N| evl2 '8 ;I@&1a~*|5+oags`>뺒Wb$T %? :#旻Uy\=8>]L /LSP@ dP  7e)@ DürK h9蜿n8qΠCf  QAʉa'*ATo9erM?,xWgq,jy(xqE-k0?a-C5&gPF柩Pʿ, W^oCYCFSϋTї_~yނ\BM*!j!fh$>h' G-IAVKt։'(cW,!gZVqr9f~ }^)A9BmIf/o}~,hUز}q wMQ;;r}W\ښ/@:-@QD{5曰m;4z9O ,8{ 7n`{{;b/Ƞ >@R0uMWN~XaB󰽽[nP(Ě3/_6GEe_wuW&aa.lSo`<7׋rqh.C=z wDfyRj넿 #(eh kU@ Bt]&vyv< ڎ@)=AiQR)>}2^{WA,`ppo֋s:BcO@ABhQFwRcgSBt: BA8xu/X>I-B&wFP( ɠP(ve ^;%[(8zD݀cWM PzMd@)E*K&ڣvjt9N/l]/0Ad-B6}Aֶ3\tiR:щwBL&uA) Ar92ƐfwDCWK.ͽKm꽪d2h4?`l٬:!dU2ɛmgtFB] N/k#!(R$@v8/@0}(,2Yq5^hCZԢwŢM)e[o#PJ5F1PJY.C&(O&/|k<ضXZ< !'kk/~j ^7X8pcӺs?lF^s^Vu Z z\M_nK>!@`}Ba;Nu@f q3Z6ap.zyvҢ>zhʕ+} >ld28tPݱx B ʲt6&ml6qMlok{&<"/vEQ2rN͠*1zB\} \E@H)rN 6)Fzb@` %-1ʃ~f݄hPZch )tQ@#!  G{qWT*;wg?ֺrOsrmO!Ho|l6{Ft:SN᭷bW===㷿mz4{%#hJ qo{t>W1Gyfڵk({nW- .V tjbjj'm^^ZvrH$ L0XvM@ZE^ y?yx{rfY2 j70^,xhW{QjX__zPL~w_w!F,~O?O: 9J8C ¿W#}?G(ſǰG|?2+Bؔ0(p?B2( G}D(,+ p0X^^͛7a6Μ9B!eۑNt`i+++ glO~{cc᥇Zr(Y0ы #t||Y|x׈HD 0"ò,x67QV1>>WT/Mw- ЋG.q8~8G'*^XeGh4\f1>w¶mLMMavv6q!۶OƍrמkM^)y1| `o QVqiEqWSS^/7 :;u#tyħ~|>)pZezy|>@ցN<sssX\\ķm;4^ߍ<r-IO>dz>_|'Nܾ}B=XDk.& h6 ӷ~:{o_o6}Qllגwݻ3xS?SO=w]5ЄEȉ^olYc{3xQVG .7ވ]Pݻx/crr R ' qt> r֭[~H{g7n'0tmayy ++kjHR!?&E>;`R`sswލ|7A2;M꫘D>/)UK^d!`>]߳i69LPk'@`B21jěUx3 «3xkw rJI g \iOg": E'Йh#@t! 3IT~ȘPj57U Ri~l cgO^@/| V Tf=:`cc#[8gd tukՈj.QǏIaשK),0--Hpqb➛&^{#ZnlTIV\׍}rQlG9{Kp+ QÑ#GffVu } ַ^8?SOby!Jxվ&J^@jRSP G81;w>A*B:KT pʿ'竇L2 >k>?MK RA">E.C6EVk[0ٮC!1ϟlksDM@螃-@Ps "au&<066&^lnsN"Ʊcǰ fggaۖI .E+T5Kgafj<* fggN0>>l6E0>vE LMMamm ^R9˲W’Ϳd/`2恬a_0 (*f8&&&P.)^uVT*R`bbh8T- `j?F:k-0>' J "cbbsNzիb9R)4 TUELNկ>`rC5DRc(xN`lgb5 r:fQ*T!_]w'H"JTxww 'N@VC>8Vؘ4_f}}tJ-VWko|,1?Xks* >䓶#8==bN9JvOR8zXdOK:ϡa"=z oR XY{9DON>n 2H(hZpf){YrR, "N:)^x'd8N{4a^Dl"aB`YA&3gNճ~ byy7U[PJA}]\~(}ƞ@SP*ͽ.a(Jfsq~%/wy*~C#wTf ʥ+Hk 8Re[[*fffB6rCqff:"(4x:eMdͩ%o 9?3֛ ܵ|;>p:xZly;2&Q qysyi-$ B0;;[0p0 VM$NҝF LdヂֻB&ⅮK}yD:VF!AFm.w:UTmjK"IwM5ۭt# Ψ3Ƞ5P ^P9o|%mu'6tNLrwjKV*_/3@u':rU7,j)?N3b' q}URl&OQ~4 :q5]>6@Wy_/faOm7S0OF ^&]9:urN $8@}zhNKIENDB`qstardict-3.0.0/qstardict/pixmaps/document-save-as.png000066400000000000000000000304371472531462200230650ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATx}yEٜ"* O}/ʡ `@A OAC ("AI$$"{Gkzfgw'!7cUߪvNI;i'vNI;i' FrQG_yYqae2FSϧ9j"ˁR 0"WSu<!lF}r* ϋܪX(B7$ |@ip`vgB5ㄒ;:niFs̹{yPB@T\y7mے@C<~XTo$ cKۯ|8u@_ ޶s|ػ&~~C47GXT,|v!3@)!sJE7S )T6 RvNc;o C܉W^w]vCۧNZH`mJRʫסfd" 4 By @X@z}إ@:^BjoG)` m!-{i`M!a$t3}Dc lMM,1![/ @2R"+u%~NZYjE{&R]t(Zާ²e`MMM? x(-@B̥ oCI[8}[~矏6 / CNEh=0+c1/V~W{. =$㛖f)-l*ԜycCOpx'_Y+眃>6wn֬Aq W@ߏ'_q91Tvܦ$B@ ɁBp);}}OS[@r>GuO]f^pL  /)SзXyQ ,^sAkP><Ф#A/m@Q[Ab[BxT*!pt6ZHY3lX|=ޑVBaKs}Buݴ ]tQ콼^*оX^QɶQ]$Qu= 84/Tk/*];ieaL{|y?8=t={b9{!KbWY6TET#  )n$CiZht?OᓘѺ2hie%SB_)nȣ{".v]81A_~9 L!^~+/("X.;H{!J 1(:f6?+W[vS8E~ߺaST.c@ ZᩧnׂX?n s@# ;|ǒy>¥.q|-sy^,R @n06N X_pu?)hB@#`ǐ^R E>M+=q޲?Ä+a x>=Ey0gy.(qB :s)śEwމ=~{ 7O5]IKDh{"_-k^=2o Ӓƞeg`Y!B=G^[mp]7`y.ĪD†O6\DÜ9qm oTHoАFyb Y)sӚg03hn2?߲ -:xqî6" Df bGD |GՌ ޮY{Y,8%5cwq YUXTJB dt喏Ōa0LiübA8 <0*Ide֡„|IY2G)C<)§cQӾt7^r=zxyYX̕V| 3@i01Fi  FD;F-b#DgsWM; fX+6pxǍQ_{o]Es&Q >3=jQ+oflbÌ c'ajnr$)}}ٻ6߼1$Qf,&iei 1bk,C!0x4#l%CHh(HUFZB \j>K粬l"_>>!gg\kÛW7A2"+mFv(#GXk\H߾ߚvf|ף/7 [/Eh$^,"Tmv 6#(]1;g.^sk ߾N> 2Rg:$@.i!} 񏤓b6D m~Q9{s8N S1x흎ݘZPC"3o() nHCP̠~bu4՟F 3(M5Wadh,@ЭKǠuN=j: }gWcRoO>` j ޷滊Cc#A;jGDf)˕c!4Mcg^~:y&7]h68_6J[ ErlH^DCu*qaH`q+b˓crvmO LXӾsZYz9 Zr&(ى!h&Chpo3|z@}l1-8t LӒ=|Ҋƕ?YZN2]L9L_Xf\ 4TBB'W3=DbڡB[y]_؏ Pf__u2҂=z!, R!,SSӥGX 0 |0Ó^惙>5)UњhoTxH 3w#0\u lOFr;֔PVŞ+ nERH 47-žͪ8ǝO#&[|T7JAi־DJ\$2LSj"!1m=h#9;Է7++d-G2kL>|8~*X0 _&s.=x;-Y !:3 0fL `0 ̔=#i^>K;Ch0X-01ف7wEš%|3еe VVl,[ ||0T`SATϠLhRJ,OT;or#/NY\pJ|4WKUNq</*C]ځgfTHXW~A1j>HhHiL3Rc_|KRp8N9-݆k9py6fM &5,_&<!X@%P"[2cT 8cXXݻ2$i7C~_޻o_]j| ?G@ O~}|TMn, fhU*R"*n 0+@׷orL5ruJAFOݷᙧ7/[P{p1 |3پ/`7xc"PJAee!"VžD$fj0&·b~~w%otsZ|- 3GD\ʖ s~0F ;tޗ!_PS53)Z v,^@4mr.`kftυmZ8t:%pSϩYՂ=/L4J?=8&֨ >ʘt #4iUH ihH$9(gp=&n88gA?Npq`OX}Dݫ06[?'[3-@~f`)E?@ԛ|Vg5]*4鵓2u|3pa݆eVYncLW~o  A-PF 4 MIhI֡ByUo@6@#]y)(8{@}\shEV&qy``T>c@wnckm*NDztG~m؆Gt؇FZ'}hkߘ񣫾b2W㝻Η?RQ~}$ ^Q:;;/W ݄{} n뉚U~o_gLyMCĉ |M$4@X|`Eleee~q[?_eUGM Fp'ᩗe֖*Sw^>'R=|D9iNִ#-m~y XeUp WOoV)d eRkZ3) fAc2} ܽ_æ^'yEŐ$T?<|? ߗ*'RBtW÷ߎ$ʩb3Fii6*p( '@v bvB\\@sf\qDc C%vh{Zۊ`Pg4&ZmG g|bv~sō_V Ip=ݝȘ="#zOT`%q*@>=Vݐ|2zOle@(@K:iL\pd `4"*Ou@J޾?Q : k6s_DT<)U^oW/xsx}Ӵ%x>Afy޷lҌG8`Q|sj[?~A7-_v5w}Ȗ6)ž5<ȳ-Y^ޟs3 aP\{X< Qc/6+rL`ݷї8e3ïp9l,]|dg;I UN_{Ge>6,ʤOT孠2[x= >Y;> p`&!ɇN$W~öp&ɗpկ3H?U-_!kppQ : ObSǙS_3$oϻ~GSeW_^c⟏dO cߏ&t;6ʨ/,&w5n|3h Yf|pq.:!|V 8%Fc1( c@Z3jN`mG݋u[s3<\}=#n1 f l{#ےEXCܠ Ԑ3mCsٖl.l6˴zbr@(}iܹM?֜}|8ckˇ~AsJ(3<}BP|V Tomc*> NJLI.m3:\S]q{ 3toP7|6^Rnyp8 ƆnZyd2mg!Dp;N@)0cnYm\kݤ2z2 [}7.KXTWQ__p`)\s_,#) Vr9y455_5jv?9*d-|jY=/aӸo] KVU"~Ko46! ?AlkZ~-ol m9m_@2d:H.QN\IDATx̝2޼(ڭ3rk&5Y7~@~a{OMn(_ŋCD4hB@f5(d>mFpj޶=:\M<\/?QE;fq]F|Ow@`*eG>zk'C=iH#F~sb=F7{఍RDog[fw<W>dwbXFB~лGfHl8 DN#Lހd/T_#р=&?>NUӏ1A |n`3߮D1j;ycеo ptep/[c_4n}o%X݂?>g`L ^IIO0\~0ApQ1]JP* %sC2ѧM嚰.Elwg[;Q5s 1|=/݃Y\!({03?L"]V^zE3N4ՀVNYh넙2 }_ a|@}=\z ەcz>~c= <ߕє.5xR9k'ʊJ\9 ;/2L 珄 2n-[?౸O+}?|]"WfpA0o-+_֍ZȬ%YMF:}"/ʊH^ gٖO2; -K^ W<|3K6U3IO?|bg__762SJ˖OՔr^mH ?-s5UGȾq '~~VHF2ۺ汻wZ{%!(@9GLBǺbyUƵs066|r  G\=crj[Wx-`^B- |@Q0>srm"}K8fL`KNǬNKIZҧpQsiі++5?DuHt I` "卄B<0?s^~ H &s=5zp;EeLޥS)0 ތV\Bl$}9D.>o dy`$4 p ';?nmOSaY|v gLs`5&݂ٶ ˲`&,B.C&m۰-+H:t[W<C "}ؾ.2" x@HX(Q1`_9[,+3,fd[ 4O\SƏl6l6 ˲5ShPc 'JY׍5k9W]q@Kt=Z7&0k25Z2@_ˀ2`FZ=8tuq?`LavGGfΜ ˲`v ZІT:"O?j h#DتL$b B8g$x W)._AK~w"kB-PfI0l%[ן{F MYxYI֖tttG+sRLD.ܖ x|"qOFFDL7` Q81|^G]p߅B &(Ԑ @HI6jz=%~bgD=\BpiP@3[1@euKk(盱dE'L#}e*V+=? =<pl+У7TN=/ `&x}LŤxBBJe&(բ_-FOkxO,zKW#4߮Zԝ2"qF>2BY4`!2{ ܼ`)>?g:&cS P3@@PXF9Wh%iǴ2E#lT~CX$T@NP̑RUx(=t2~L 2Z d>Z(e e&X( l=[ԅo:BpGGX_ tp7/ _19@ &=)t(z| 4p~tIw_,zp֧`d5GYIOMn<›x|qZkO9guV^L랞lٲe^m?XsP{*@Rtm-]8nlBշ/w1Fsg/=mT,i]]]mz{(CD*>nۮw#^8(7u qg_`2cUakO|G놻hc&!i@e{ UV.8ӟzij y%< >rM~z ˯eoض,B&GI~khI(zN $򻯽/Yq@@*u]|Κ>l&3yO[egF:c[h 'ߴj oO`LajV>9sڴr\hTIHwC>sضr2'9%oNҠM[&^ۿ>㥯xt`@+W^2sڴr\Oy8NpM& n5ծi4e3DF j(zR,}XrTxcUZ_[?,0!%f @Wo1u!?Ċ+**M1:>mVv(:pɲ,!8@Z?߳r3'6/e{h!$%x  @31:cFɝY9M Jɘ1cXS@} "U"Q-1AJiY"橏I* J_D#A+` n6>Tp}y RJI)S`ww^/Ur |y$hfȨcV$Ț3ƸmdҤIԩSL29Zi1Rj*b1J1FB(B)%4e#Te ->!|ι pB9O='# Bxs_=]֭[֬Yꫯv/]/ $OŦi"~ ڵ0Y ێPG[~$EfBݸ8$>BBmF1V0L8201ƈf uFBf@„*cBoxyjP9TB<.|>'0>W]r3\nڛf{85~(exjvZ @ k. z ?ay3NT=xYB2L* ,&#a0!A Ie:0& 1 CDµd p$\o+頏B91s.8u]p=˔ҢLjQ^pri]:.$M iUQ%''D֍8w8秵h"U-mVN$_,%zj-⇻=xj]ەF]2j-HN޻sT6zi'ͷZDKIENDB`qstardict-3.0.0/qstardict/pixmaps/download.png000066400000000000000000000257771472531462200215340ustar00rootroot00000000000000PNG  IHDR>asBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<+|IDATx} ]Uw;[J2Q  cn~m+B { mӶvZnD& $1 *{ߩުZ>=g.- >}'n*+_HDcah({iMW~vn?0Gdg|?V6A3th\<ֱc]&qxڣ"Yq 0`Ƣi<9K'9Oyկj6ig8x+7ԠD4 h$ҁ=}8]k0pC0#tMaZJ$n43ŰE4S4sK^7Ԃ x4ze@/'tvwZDCN m0h9QN uӗHנ۵?W?&9zιvl;GA#04>kƝ:zl_ tKsS¤4=1jM@g0: ``ќ33U˲l Wc #ȇRk:c!6M]$OYSGΰ@ )4hy)!gĦC| ۡ 4Lp5+%zfSZA(@>-`[ QNa0aq*r%SDڡNuAƨ6OKR-QVH"D9S^! = !:U$@@GBw; A:L݀j0%FK,zA_ɳ7o숤MI1 Khx_~!Q b RDtw%69 }/*©" <_T%@D{UāSؑ?a ȥ >"pƒ?<B0mN(PD6er`0+6G M^J,_J`Y]3Cy^D g)JߜMy)} 83BYS}IvX`[paGKlbMwF,5pIDT 4<``жxB@?`l),1}I$P2bJ Q4 @~Q"Ii K|A] ;%?" j$I^Wݏ;vSOgwh^ Hb*J3/T6^s5bFvg_}UٳF|KK =\$ Y%-d<Æ͈XWRf /_&}.@@*HHR$x{ŦMpATVVbXp!(]ɫTޮҧ F`xy__n:\r upX.H%HDcg7 ::8wjxJ?,7NG#φP\EaΜ9ؿ?I)ՙ$e<6@SJ@J]]])wqvލcժU$|ߋ:z(UnZzjꚓ#e]tM=Ff"OD SfϞ{߂ lF8v옌 pTB!/A[wttp$'$@UUϕBe{mԌ6 \X!8NA&S(^{5U~Pb9rDC!Y!SQhjՕaC s" KhȶԳZY9H kNi'(0=X 4d޳mK B k  6; @{(USOSD4;68tK{"J%PUQyԅ#OK19~l˥ؠg {uj_O%bhuK/]:yUK5W 3fH*0e\ ЂD tJډ -3cU9:\|L`\#ߓTe*QNME/wE2r* jbFFa7tI)/XD ~|~aVO u(ǎs,=tW,X(3K~Ձp%. ѐXUzP?l#kMr-QYVl߾ʕNzK $toC/V OހGbh #0 ,d (_kYEqx$p @F$I&`gמ!b ];>?Fu&puHmT_PT Nj.]U^^y8z5D;"Y %ݹE&zŀE6V%Zu߯ǚtsA`Jϣ2s1lڿ rlъ!g4JӇcYQ(&tFԅ$j>71LU ⑧(_֮92@8R2U?E)GqMuZ:86nًBzRs)k]wǝȍÿ'߉FĒQ"ʪጊe Jx*$)/-K8b6:o9*]ZO Lw1x<"D9aC 8ݏf+M@8.k8LCZlXF}9ֳʛq_Gu:{ZqpGEs ,ZN kށz9.a{pR(e)eh AN4 n{[v겉ׯF5mnGt{JH`?aTC"|Ds7 t^By,HgHSV6-tuo`} R(zq^9-"G"*RS]}I%z$5D}:Ǻp׏֣hK,ίj@4ѡtn*Ǿaq>Rx~Ex}l-]gpz,[Hx7GYL:o8i%ƌ(n^2|2Q5HU"h?{̅J p<*lBWEs~_"1HG^UvA$*uӸqr$vJ%D3gcgtSp߿ݭmiY9sұdP@{ 7 B0hynG[ [ouͭpϼXIL p6LA tu.`E5"s@W0Z[4Obvu *Sɑ7y8qODNDJl9aӖQ|yqiWо L,Fl`X_|[nǂ wwwSMFPzv~x xiaA&/  B,rMVͫGaB_.Ͽ[ƭ|מG\#HiBB(tzCL'߲e UpTZH8tg(_y^u {؃gVeEJ£OlAg{)R[d4Ǩ'g0E} ^Eہm[Wa2H#\D8Y &x愌T#Nǜ%~a"^6a8X\1K@oiucY~{QmO־a]5ekFJ!zwm",yyI0p0^@Y)8]Ǟ6E,a^+hI)p, =.'CwLVO7𷏬?~̚Qf}q^b \6D{1mpH/.,yZT?q<8"-nVl۶ ]t-x襞s/r\xD}R,bXQN(kJ]~o=hw=lF{Np6,L"nSON}=N|obI|"9\NowAa/^W_}5% >xvxRƧw9 HZ`{[}quAh,&"p*DYjd= ត݂L9}cm! 9oh71dHCDZ#0ˠ!,P\xV7TiV/`Û"ӈPҶ+2n^xѤ(GK@ džq ŝ5jbDB>F_kkk xa`m͓ Nl8w΁~")G@[9 |[ɠpC 7idv _3%VO+_r6"0?B@OU:Dl{Bo13ވXr%M4tQk|j@ j? Bb$ bS +beOG7'9~!)@/zZ?aY^/@#9˘¼D>9s [?^ <-B&x"kh(i X[;qbA='QyPAmsƟ, p_DHd RJbtJw1H`i§Z.įֽ{4t )窵H+hћL?[vd~eɹX^LE$U0K@C2W 4i_M- * DHAg2eBYh44[2/-CnH1 Ca,49xC8zȻY|v~zTA6lc2VjHDˠc;uH 2-F7X5ep܋E_ .ncI<}~u˱j.CN{)Qk]=/a"Vr쿨_-L)@м8|r(2Jr?ϚYƲZ\ 7}Xuxm𑦕8a1 eK!r$ T PdT{}U(\whZS /ĜDwN#D%b a[({)E"b& 4\vr*eĺ7| qQK_4["93g_n{[e^-mqMk@/R{ kK丐 TJm޼٘JB9`^Q&$8$@!C]N!.e#B^ 8w2%)QNNq1/2pS\sp['@d &kOwT+DK 1!|K~KnAjmy XD.N"G|M Z 2,rmZ.--QGJ!*Ļ̈RpT@Ρڤ),"9`Dfdr `1iC)Ps`IǙ4-Hq#qxζ>y>/~B`6*vo @ɘ  G @1 REŵ jfb#U]D|ێ0@L V P=)f)Vˆ/n_HP3$ lA7D WhSHFO g#Cv/#KYBq䋈I1g@gsR+NKAIg-K߼{XJ8x$S>WdԹ$Kp$poR3 ޗ@ mJ"Ip?$S%>0EE 9RG 2KH8I>YBB X 񢶄cwbDa`FSl;$:Qj)6@%A2¢rO-( X8[or'%;䍥ZN+|q\9~;'u0 G1]t<TanSGI@k+n.ZbX/5Ht(0/vh&p$!HPGm&AxB׊ "(t]lz ASBsu$@028V{'P0aȳ%rAcĈ$ /b#1*gऩ,Q #ҩꀫs&‘=6?+\Ow|GWEMI0m[LޭmGCsT[nFRb]s5OI4"%hL0 8;N.?>Ed2G䇻gő_4~k.LZJ%[X+ٿlh' 3b\r$lEk)b橦+c$=Tl/Ʈß ;"Phu@26i aȺIBK[0 F3!ѷ/] 'ڟJ #5Z'F.tץ~b@ohj`,H')0∔gJ%0O{*Rya\(KW܆_N$`.Sɯ}kKɒr ek LÄ0N C=~\\Bn(bӞ|I%l4?0?QS?vZٔInCOS2͗`,1ʠ-s dƯ ,СNG1K _hL(4h)K$Rtq債= Vߔd:`fȕA#yxrK>onۆ 1{l,7?C A<܄Iֽk()9}K w"8!RFr >C7[a-)}W8/u^1M c& Pz5b@X@# , 23ARA +kH%3ša,N?9I(f5.C0A`V,&ؓW! a_ AMi(,kй;;pS'^}͸23q<3K C2_G_̵4D7O].u[֢R>H$ )^8L&7u*dyq ,KF3yEK7fI( Z_ H|k q[C\x轓HdRoTyg.!bϲrr;w=ↅ$ S,:"VbxB< *< %}b.|E`Apd5Y_9lK:i 4Jrߴ#r-"1b~xFΏ:8 !iݫF#_&MmؿkSK2>U1Ve1iAޜYY z21$Z8:)))AC&\g~}!h$$S#/|Ǯܑb8D<0LA;@"V|n(~X[Bm *f9c #ju!…'IC`}v2"ɗ(MEtn/Ls;ʙ?IENDB`qstardict-3.0.0/qstardict/pixmaps/edit-select.png000066400000000000000000000023051472531462200221050ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYspMBtIME /EIDATxKHcg#Jn(RwfQJ).ڍPT|\t1Vf.Je|TPZ5Z9plp ́?߽W=|@)JQatwwޅGFOO\& }.,,,@QEKK^__pC2QTܬ)m(.9֖d۳Y!`ssS ĄXw"1sDPJcP!`wwYgg+t{{ ;;;066 _|>OA,";PSS ! @ R4Dc؈/`+ CH$2?L0K8==%{֗fDsPSSS"5rHFVaBgfEN)3)Vc 4̀ (jttTԛ@O|MjBKrK9UVV!f ^f&55TWWSn7 DS,3SED^Ej_${ [ ,..y yr/ߡ=B__/3 Y7,򌮩aii +++7<IІY>akkKollVWWd}\2+f=O$k6\@)= i)k;h,Ɋ|{{vnb~)5022Bm9!2 WPGer )+ cA,9x:88h֤7nnn(;,*cZɄ!>Qdmm<'ƕ޸Ϟ4g O@no%4SEX X#ȟ n;PQDɋpCgC[H^s [^(61`%8:yؘWARI 2{w Cgͫ]x4Xθv =ؐr&306kV)JQ,gIENDB`qstardict-3.0.0/qstardict/pixmaps/go-next.png000066400000000000000000000233021472531462200212640ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATx}y]UosȐ%|b7 Ptsc  @wVU[(I}RXQ 6J 2"$ $$/op^Ϲw#I^9L{5 4A jPԠ5A jPԠ5A jP̉&/w-Yx̧;cxӎ>ްc`lчM;ް'_epO&G3nҩ5-Iho͗0O/&hk9BK(/jvTw0?|鸑"Fɣh M-1cxJ e鿷S'.5N"?l?<<1 "1s@SL7%LD>d٭ t{nҜ׼ :rhk#n욆3:0{fbg6E)If 0L],}KU{G'/G՝ɣg`C7|,F JMm8m!T l8IޭTfur4Pݙck~c"+ ^?PL$X|ՃL^&hMNM9D" .c%%,Z4Yk, +vLܸx5YTXI0DBeP{ o 8)V?8} ;Kӵo$PRAV)Åqo_cv@ %X*U^sI $P̐JAuAQ)^c$j_.>Tsv Pb8cy@) @ QX<6/s^לXTr|"KW% N$(VLHUW,J$ظomL}o}%J21qgidwpR P%(%(6P,`ˁ<>w⫟x7b(3'ExdpQ $J)SuAPX|`AhR|,(@qh1]w%,M4 HR^jT//{>~|o2QVZZ&{ %՝%` ,TUJ%('X=ի^93ڡ4!z S'se= NPNu Kl?aXyX_I$Zc/sR @ҹ`*%0e y0GXs |3f+'drNAq#(J) aA\y೗ĸ,e W/ =~ʅ=>K'&k-&R.J%ίZD D>w\yyX`Bzs3ϻ}=FC)6oAV[em%hw`1r᥶lޟǵ.y Pow֊Z@͚./6 T*mQS1 E~oz"\qLG0_>y/D;&24s B6+ fCJ` Qw_`SR ORJ>x;'چUaw|{~-XGtݥ͑4cNtg@ tok6&+&6f`Tr8zwZ<`qT;km WSu!\Y$r,9RYWpqCH!uUSq2O|,ׅ7<fB` 1ϭ|X&8O8 `  M3Dzp81T'a&V$W Ako޷0/tZ0np.:vGtC%V1  W]^0IN)b=mZI@1 + Lׂ X!`D"y~pb[b!g_{$ ~ h ‘{A\|s{gl:|4!2a;Lބ 5vCe`(&A= 3/u,s@mS_.= ScؠHݶW.5фP2wj[s馸:sJ}0eglR'46᣷-v)%S2 ҵ/6e,N(P>/^~j X/fzy~\&OǯQJ4}sX"U9F(I}R i4&1uR]:t/8f{͟@Ӆ!!+ ܿ<Uһ'D!\z$2K`|vI[=;4 AD 泼noHѝgZE`(~Jvr_;\x`'Sۚ1+~//߿s _'&vkU*T՚0CTmZY9 Ϭ\LDPJH4%5Pnɷn4ՅK1Eh)#*7 `?Y5yX{(2adfhw)ّC f2^|K ybɭ*\sThhd;ͰmjTEa0#]2zMR<}xd5P31?ƢՓ'Z ( JӥWX_CI/`bΩh怡~:U #؂`͵C>xbx/{e͹+`-I:($ֿ= {EŖ0%箼屺2ՀY󬄫`@n)/.2T 9?@9^>k`=*Pf =O lT^RnĄ;oxX~N>#m :w;?ih<` JҺ6Zm*p2~sYSriEpa^ _{_;cDz0x '8-B_?x+!i3r!jM 0e)1_St׆`O6 Jj0CVP쾫+B4u^pLk,Kp/| Q* $bmH+ hJ3 0qS3 uA w+s=>|zc-ʸ(NLY~@6r~ʍk(U*wŌiK:S[SHVFAf ױ?$zlTcZTΰ 0wV\vaQ^u Ł v gR:B.Ny Uzc>\8mI:E?e!jm`-%)3] V!>4)of=h C~ #*bKHg}&QV#}/D!)hc,Y8 gw4g1U#m-M/#@1$` P^b3'`"}b 3Gf!X=cͳ]s^M2 `- L!5?X-wAa̓8Sh#; ;108־܄bA3?jAX\~C<輛>GW4Xaҝ/c0FADla?Pv@ ?N_c03+lv=n۲c+LMXe]R(N»He9S[14D Uf6j*31{6 2)jfI_?a-o%|D Q' v7IJNB@mN t8n Pʮ&v 8l0pb 'Xz^ |50 /0`$t9T~F5b̙>mMFJ}?xl=zz[xK;nJZrFջe\K~U"1$:^BR@2ӺB(BS3@gwծ :0'w_ xpx+,🡦[tMA  EoK{.6!kۂ)v&3e%cڹ3C֥pl;I6@% zVXbH6A*#0ȎuD3%d&[h0@sAA~ZBh9`9UyMx f07 RBQERQE: gP^OtXJJP4(!cDq(1Ԅk!#QZq !Gzѽ1Y{P p0;i'f`^#%#I #M43X=&4iQF@mTzVƪy!8:8B~Hf>Y< nǨ%D !"YB (($ (!"(B$B!@NUƂ6\&#k.s P z2#y۽ K|3~{+5=nniW.Gkbƌym:$a`ǩ[Iw$"4Cݶ00?< ~lx4R1`gp NmTPq J[v> :m5>_89-@{V/v'u5 0M (javʭ@FK,x~T9OOWUeG ;pn4+tRܿSޅTj^Xp6tGRdq_K~y`xV"+~sDK$1=diA(:dY&wQMk"}> d|><' T]:1wg~]hL|ZzQ&+^+$F #`[A€ ǓJ_H_)W}4Tc? p,HmgLH~߶w!dnLv8,'dO(:_ܫw s6o6Y l`S3(g ,09$g0 .kʓTJB[,$5K5w6:wŭ{000j>R%ݿC5.1/kÕe`μT*Y1P %x(S2ҳjZZAxd9GKdA_XJUZZ0gnV5~}5ݨ`4fPdZ* Be~ bsʅ@?6QL/|FًE*-@$=wB2lV]1[¾Zy Zz1 mޜ":aҼtq;`8ͺqVvZ?1+3fA}~쁴,3v1g  ( "|ᄐR. t LV(iq&* DYB(|f `3NT yצ!,O`(e#-EYFVf0GYܽs/c A@`W@{J cNسO=I1|^DY*-?4t@ XFᲪ`Dq RǂiP*5病 D`'c\Ze":fc{b-vm֏v?b:0Pw0ւŧ\. Br9Q8#Lsq!1جb)(ZaYZFdIW>V.KU)Vq[n!>:rXΈ#t͛~<#?j.z ??jɡZ`7ct`O^DM1O@n*}FTkAt ^tEk`"biXO]emI_,Gك.ʀ0kںZ9=[׿4P<(@T &|>RX}Zh)UON}?Yd0{)@:uOS4u;w};0&miRd*Xs~J2K 3DzVT#@ *;~$1`p)Da_8^  B=Տj  ^QI9I$~\zC"?p܋ocڂ:lxb^hZMM>/A3`e` ֞ow/\tCQ $!yln<ҡfoxNL?LE$0e^+ZgO~u4UBQa)&@ 80&jCfh iɚnk%Bd.Z"+Z ۹Qa6toڂ`H;h|1 8(oGig̩Bp?vmIDAT|ZMW)'7j-3suFxgM۝E#"/YrǡGu(6O{4@U#!i,cv{(jhׄxDa$o HD9_#-R} -  Ӏ 6G9ʓ=7fܷOZb-@/(…CA'34"=WdE~vij$ad6 C\1Qqe=n:?T?RsuXA)c}o]+]՟@%Y;}N% |IW9ZQ,3Jn 't^ڻ_<4=T^Z-~ Hbse 3۟Xw;d"a"6ԫF7՟^Lbgͧ5kx"Bi77cڍ:I".N?pTb(/Tx,S̈́Vټ ] @ ~䒾 TQO'.a4u4'A` []`Vly8n<,]U`{EF">whۃh&N>V! L?*E[4 O^5l{ne@~t?cos I 潦?ߪX#l{E+zW`t^a"]<Zqx*g?Ze~sG*+g}'³+?+Pr(^4I$R ^|tHRJ"×\_YFO|CuQ |2Bhn^so;a.lX{ ( u(wGjF?G?psX0}~?=8JhZ`_6u̥K? T t䇆vzQ @7sgv=n{+ VYgT᷃." q`2.e5_Ntfp !$J@Fa<ɿh?ߟ?ҔZ*Aiy Qѽݏ݆ݻjdPaCԲMIXMa4,mԠ5A jPԠ5A jPԠ5Op2IENDB`qstardict-3.0.0/qstardict/pixmaps/go-previous.png000066400000000000000000000241701472531462200221660ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATx}yUw{l ! OApaX| ˠ>y83oy EAv! ٺӝz{q֪{; pܪS˭:[Ωj.uK]Rԥ.uK]Rԥ.uK] rnl:m?ym ΛB-ʦ]Onҧ޳Ɨ+D_.K{˻Jnܴ,[rҒyS2!"@wk֞}*b/PkomXzMW1i И Д ј1RP0P+@ YzV4Pq\0P("2! G0T,cTFT^[._>~RW0-YK(r+8t "r 0 E J("edC\4wpR,Z{tƵgA2X}77Kp G)hz0T(aPm}*ux5oeH9 Yӗ󗜆e= ڶ{O>B}]+n—8K # 8ßcJؾmA POu mx3x Tt o|)g{ NCffB|w>sԢO;r, D(VcY,c0!++Xz-`RV ` 3[u磡^:-DȮP]Y|'͐r!s C8w%.sOqsp _Aē^ ^}YWeX2oi}'-zY"0G H"ԃCL?١&Tg1XJv¥g<54IXqIČXW{*sN\"-!>VexaO#Xfϩ}HA!,`љwdö8$ct~gxjg8GDG`Iz8Ѳhue- >s14PPcqI 8.aYlP~>Kiy\wgbaxjgbY >ܼSqB2X`D!pX~y,%#MCel56O*gbUADu8dpt<)o߂c#gd?~GcIXu8H`~N9Yx+O?^r:xv^4jjBưK3/ ׮7pXQAW-C(# ӫz`*ի%f,wq,@G1fO>V^ԔOVBOm$u5JH@:T/*203zp4 ;n|u>1VTՏeiHv,`?CNyXz+$[ y9Nc~ĖM5{ح›GXBf$^AaZ|MJ_p2XZ 6ث0z .<6ZtF9$D2z ȢM'q㵐|`^㏝(G:+5t ԩ*_3+Vd?> Ȓx:3x3r6lk{PjWm;|P5gs@lY}ՙ/2`agq3H$?zx?a o1}g p,^0zI A,`_\N5i {|ڽqF*,=ʒa c T6Bu A`?V ~\mB`7ϑY~.|bT>st`Gڧ3R;Wקi5û:_;MU(zױ푀 SY2 ̲JfHUO VS ~xXu:fpo[='*J݈{L6VOY޽e )鱂cN:گ}thtZ [D? wyCz y=[&g,@cS[z5 ƅEൿ7|3ܹ|mo`0xئuc!TFlmҞdH}')?-=( 7UzO3cբ~.aO_Y+9662+.iJ.V f 2!*`z'&@@IgX[|"='2&9)a̰V `D<os!m>{La>[70CuAAvK֮?YM̘gx![:Je/UP=;H&e dȮo^df߹dS@ Rp-)@ecҷxYU2 *KSE< `QP')s`L/,oBG{}EDIB)`I8@ܲ$kњ]Җfb) vҿ[˅c8vnrd@͂*+µA&8Y=0#emC% / ]<;"^ܐ ~/ɧ.L#ktG;6p 8ͫ :#/X`nf6~9{JX(4feLA@ W[O^,z·kXr>1VpfJ#'`[?['4A uQ;S3.@ *^`p~d+ h`/^6ٰ}ЁV;>fS } &PaՖ |W.KȆ7*1snllo\C6+P(x]E6WћTNBh_IPz\ _hqA (r , %8* 9?.θi@8+HERjW~}N LU.jl9 X /A1N`FH\14K=|f&H aP4ծѻ0h;;i $ΜԤ rt~rz;(>_lFR22#L.Rr@Lg dQTjIBbB MD !)Bmf-\IoHޯq RDb]SW`0#[.5A3 =Og0bgݘf ͯ7h^}/jaM8rN đ~8"q$R IDBa>K\!$³f`Qyb`LG;EHԎ:Qf&=6q;n1Rxҝ=w26 nA" `~X?0,^{[%B8bJS33g=WABÿ6=^Jt T`™f]/tFIV3; d+݉d4h>uJ$Fm&PJ|S!YͤI/V_ru7'FZe? Ȅ*6G El Z!qR n Bݼi+[BMdbYZ(C0A]T&QIaB7ҹLD\Zm CeTLd֥Qz_JeCJ/RknP\XĴǵOf~`KbC:I1k%Y~J[_bH$<@ 3>姻Ƥz}D3(/Ѽakʗ.lr@@Y29œ5=P>`U1>,ܠ0L^{]&hb!d ƭ2\h_6PZkظ?؄y ɂF fMkSU9.{xu6ASPB>Dc}rT-ҔRzԏKHa^!$,4F9C!9(Ej E=XБ23{ƀk4{zAOpHNظ(&3n/]2A0vpqO> >- j^FuX \7>2tYT$5X 7(lkEu>8*`Ĩ SiR/iG5= b̘ڂ흽xO;q=2Ƒ fic3@ (76" -ӴAz 4+aN AʺGHԥߕZo·J3?#1 bH޺wMXBTbp VIvf34bfh@n/0d#c*3@ƓjI|={ yLoAdXJ:Q#4fs ]&`6Rpuu['יfTo0E^P>q!f֍HN=OYW}6 3! ёÔ5`jkå2^܆7wt=nBb)& k^l//*^N!%Gh߹QTF[kZZܔRS8B!=ע4DQ|'1 ld"}ųX|ɀN[zA"k~.7 6\_TXK4A+QC.Ds>,ڛh! B!tܦnlՋ[N҅)n%>BF _~}C+P #%Œ9KP–͛Q" 464m-hikBsS0T/,)Uع72|ޖ PEg0Gt? e>Pq+vlps| МҐAKCe^BOH@zHFNdɔf??}32Z@U;>oX݁-z}.X,{@rESc-͍hin@cSs90SzZP1 0.@d./`>$@B@BdBB BA!l ЙHHcVbFct04\på2Xz@KTڊ گK7cJ)-3̷0!(6obӆ(J@U!gTb F0\9 @d3h7 O\\@& Ȇ/Bՙ $H xJ_ùiX2D$2FIV$JrPZOj$! w‚A|cʍV豖W|ve?u݉QW@K%vuEss<];s[&/ѵ=AcFirB"\@XKv P,a,mS#H L\.!j:M0-S6s?Lf-=ՏڠmC޷nd=>X,swyL{hnj4:1@m5hVfk:~ l݉޲ "8B@)R8@NsPkk߯j߭ɮf=T_ "vܻ(݀DNt.ހ9G̲ )g`n 7Nnha;_/{ %X p>ڵXf1'r-%HP Uq^ u%>2aHSOmAi8eUlxeU,`;YRXuAZy|v+4\ݯϒm޹\;_WtK_r|,Q-'7aw Y}=mߚ[Ho_`,Rvp.! wMh7@},GM*2RJSK}v;v'siW3b3vmߍgMDzcD&zk17쭚%_9`9Xo j@.Ax@WVu_ `*O(<שw@3l=b@Af_΄n*};1R*=A"x Sǰnw!Is{\?EV`'>yl )QUvJAS =kWʹ:QO`5Wc$7z#=pHiGpÐ ꂃȞG~X gn7a1np4>}7f3#1OQjjOЖm߹[x*)_̾؀CCIIry=)1N| ("GϘoBys9١!Gwc٪Xw cfkWG\3}i T@T(]`צM|ac &Q5G%j7\~W(ēVaԩ2g0|Y4y/B0fH b<Ӹ;1Y.ip}d4a]3Xo3د.}+'޺ [_CާBfF\AC6W,>gÆ ^q2Dܮ,1c\,p)@KhJӂu>k~o=|NMR"XІǰ=!էɄ_ e;i&{Rݹ_r]qc>"`YK%wGmYZu(q/{Ӷ\=sqTGQ9PN>y4&l5Zg|ݘzLxuqy5Vo@1 6#K{({r "wp_?~k=?GhvIjg[\IF2e1Cƚ bIgFܿ =s년࿁1X2_hZ֗K?-& Tqr]J t"5 &ͮ(0}p.3܏5ڜbg}%ٷX)e`]-`R*Qx-VD+8ȿ?k/zR$s5(]7J |+Aur`O?# ` /?>Yl4kB4i_bOt'~?NOA O hv1UUWGw \ؑU-ߥ~z^V %Vo/^P0%]I.v!f.xJT0.`jV#5"O>쳟q3p\9s~'c+ߝlP|/ta\ T7p?2ʹLP [7BQ?M4.@?8^C xx? !:Ig۶]~Kȓku?Ʃ0?;䵥Z_/¸ PS\vALV$#6cf`fL> xM* g !>@Ѵ<,~|y3rJcuo㥇F.~"׬) (x+/+棲l6$@Pը_uh0tŸ :Ԥ6 ;:пi ;==cuCS&U243:srӎ/}]xmj.uK]Rԥ.uK]Rԥ.uK]jD͉?WBjIENDB`qstardict-3.0.0/qstardict/pixmaps/help-contents.png000066400000000000000000000237111472531462200224720ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs B(xtIME & IDATx}[%yW̜޹K.]iѲHʢVQYH AHބ<$O $p @ "$҃e9V;bI)JdRDr^׹9?}9U՗33ssNwuwuxo{o{o{o{o{o{oqg kPMnq{!"f~(9AဥH~3X1QBX1PLJaVP ë3)2x.i]3XP< @k]=2m$R fV>AJ4%k2IbNtVoW_ OĄ6dXo%cB4j1KrJB9s${mbi= 9BRZcJ1TH>  ګW};'pj3 Dab8B);?!(i <FlGDTء*~Udy['/ao'6 !?SNND)tu]ӾN/}o!BcOn}oQ{3;OB1b:<|?!w Gx]2B(vɽ6uO5IL̰q) .tHP0 p(ޯ}k8zsv'ҤP]tUkK~h&lG쁨"GjOw`fggꫯ_">Ohj2Iun tukV$eۚ"O ,̵92bb"LN<_|O=Jա=ha8R;8?/2R է8?R*4~{ F0PJݟp炀Z} *Y``0, -p# ]! uTJ$#X1|`HU*ڱ~}מ3-dhUf3/?7\_{g{< fast'+#hLw [^qaE#5웍TC~MF2+\xt2N3a x:C8FU9ϖ34K/zŻ'awbl{8V (nFI)jDK)}ajn0T^c(N6jD]gbIyxLJF"y$B?]|ܵˈg鏸/ڝ b$nvh]PEj~cWxt5bK{P|gU:27#?8+v;ylIU~. N8oqi%ć7w&+=#pm,'' VBHwn 3Q{4VRF;̹V{ N41]'(^88qS \ݐf=4. 8wVq?qCLgP* |U+;TSoC! 4# /be nzy 0>;LSCǣ|F{'=tŌwעhd,n:~ ] eJe{KGjX(u='nW'x} wS ncnGo"㷆xH /aܹCNCە(؊PB6L[*8@[7$^:5L ] !wȿ!Y?R T v!sf`-HmgIW/x:wfcK>n_A-pd԰aOGFhd2V;!:V\X pu=H|7S{NVM =MRdP'|Y=]Nx +{x:^p":ۧ+Ǧq(Tmk:ӗx|/j",M \1 nT]1p_/۶k (p(7|D fV{|"9{`w&5wk5>p|8>ސ78nR]쬜 'MHbmd\W b8(U/#'g *{ojknC4j 5ܱ??'[xB'VVn]͉W)6L57x:b.( ZxX~n(| ƯCOJf<fZA(y,馢 K A<[ܔ\@հCS?ӆno)K 2Mp%Z yŖ_wz n*i* !RǧK;HQ#@pRND89~yTcYEbηBƹ+f*ɉ|Svy TVFٻ*t/=O[\ZC\( P&ya`S7>?-J s^aB*6G<0=1 UY!,XU*G9`hgB2Mw0%ݝm w9:*Pl%ae5UC_J#`f| ± ηO=ww!̝Uo*fo,F;Ć1Bf _U8q{'U:9; 'կ4':;PK+!ί0\\eܳ_&Ur.8"Xȱ7vƚPJQAW6Kfշzt틄νba*{'Zp,۹(fNJ`eöQr#6BLLˌi\pi 88?>uU8y^؇^E읶o \>]N!dx~(ΐt$*0>Xe4mCЉ)x^!s}JC1ɠ")s Ppѯ8/N (|6mw:˜1F)n(=Fp*ML9 $4΅MPq趗ђ<.qqq`$с qtZWJЍ $pMmXF9%סyJTT\={m !& T%5On 1mȨ!DNY&^" A8wuhXl @w\]gܱHxs1q>>z_{ z*Yܨp.d$yA1MھRUvqdABM\nx w\ܟyb(SdĤ,\#NeW:QXxk#cw =,. Qo+CkC 4|[bם@v9EAn&$8mF 4:0fnǧ ;t>>"owK͐@M@5ckwHY/o/^ jE[ǧ+^[qTTt8AgY@=9e Zf@V _D6|ϴ?:5`O;ė` ( Ґ@ &NSg痪`HNXlS!f C|E\qӈxדAҕ* ^`TuI-=C7@? SsmO~ó=|ѫ{(`Hv0˖6~}y}3d>9{5̡}'O6*dJ䙔L*>v 4l8XV c(#liSW6n[`l `996J0$n{y)*b: s{0duݏ>W7~ٴE Ѣu\YV]AJ^BWy]Tkr.$tos H {Z~ ]JWqȀGPr81  :畮[CrYw!{x!˛:D-'SFgp.h:p0@F H wg0PEL*Vhր&cuuyWEQ\l\hK]e#|C n# (#?q7 6K-`K;ghAS>1 0̟ȔxJB͑ǀOOK^0-ScܾT UEsti1CWj._ Ruc>4ar}nw 5y>B:^mЛ<'oe<&Iz3N%7|G#^b,M+x(739EW-hz;3H--yJ~!2Y{y= o @ 4|6Gk}BZa,w97wiPN"įIHC$XFp (nt0;~n _鳣.@+/yDޔ0yp [u`ݱTC6:7dt>HUz( bK!ъƳ1kF߇!U?Uyn=m5ouF[?}㺊|@ǘi2)]i@P!2_Q[\188oBҿ8t^=$|`iqCFf A3N ;e +<ڪ.+30dd#bf"l ut_dβ[ yܶɛǩ}s^J8mLXE/k a<; &ǵBg. J1.F YI&l PUL F(:ms$0t%< "K NZ sߕuYC&  0ی1Gsr! m{柇`{m=/$#Ch'MO0#%oC(5mi0TmK)kAW K$ tiWQGJO)D&S lɟPUț(jㇷ9Yu?&x0٬ q)nުǑ QFfģh?!+ל}5?f#x4Ll-զIP"y/s׺ OB)3E[-e>(ݯXM (}\Rd&0tm3"MI.a#Jʚ̧rvmCD+#q4ۤ 1L/(p v& klojY7K86`a4f|ߋ|aC c1zOݵ6:?HR鶡e&KfG }y=s!e=Գ5zq=IDATmlFRƳg;.(iK7G!FK8_;4RH=q P]Aj_g~FbAD1boӄHr#KpaN@({ M /HB5`jbL8~ yVټ&.O[TiғhA [QT>8:9@1Mx FYO#ִam294ݎ2I^#`Mrr@#FD,ٷr1ϸ5keLg')<tE3)+5 #Ipeh\^`T0c1ӓo`AȢ(ai$l>a(veh* Z3?rCw< xMF:ڔJ'#QO Ȱ^oWz[ҋ5-y@T'JV^?OvEvZe뿕 ڄ2Mh"tU?w/W 1D&Qc~CJaNndDJ{Ѿ*3%j-ڧl&K&qSeD(cqsT6#/2YIENDB`qstardict-3.0.0/qstardict/pixmaps/list-add.png000066400000000000000000000242071472531462200214110ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATxy%W}?[oezG3-HBZ@ cy9^p}$x38ǎMl`lb`;%d6À 2B+]3ݯ{Uu.u뙖h;^իUu}ݥStN):EINv)ϾB2} /DDE w"rX.|fzL?-<3~x{o_E.v1*yla['3,k̗q3Ʈ>s&zg:Kq+o3{}ؓ]ԭ2g$7_s^_J̓9<|'~~K01ɺ1{6b_}o}?e Nv.=o[_[go-(9-)mXUD=QБ{fbmEY,ӹha1_>i"z2ӣuCt86FvĶv.lgNx]|4u8\CVGW:MGn3=:e] 1bpp~<(dymufƫ} VG+}rx+?vޏ۞:J: WxwLzQ,te]8R<¡)"13hgmˣ<1x4jh;} E.:Ti4@NcY6].xse[w;C]7##tCko{;l"J-X/WɤM-* G?ZaTYG.^~w0}E~_Ki3ΰ` neAo'%2]rĨ4 ւBasXJwPRQASUZ={!R% XED<p'?'4UꙂ[u&:´Z:;vVg2x) '|嫥R ( tnPXǍ/sNS \Pj^V/O%9eNES& [m@=ل2P{ 8[j`EN&MNE$~efS7WѤ95 nU+@_g~t?ŝt d@oӨNuZeKw&I}ݺPpxzRĹ5;4uH>u; c[/!ФFNNي Ca_~ﳣA'?$)o94uHz4 4/umKԄcj~E'^EL*l<e`,bPeq顩@5;g4BMT2Yf"I̐h,2>Je28Mza< x)$R |9z*9K(>ixT(Ph5f`+XY&h)@- 3&2_}+,L@FN2MbK՘Z9hDT_ZV@Qo0u2j&YIl N5anc J`u!i@c ;%F+ h? ~sUW]C3~w/ݽc.K Ѩl$ 'X%K\)!N׳x>7jM]d &ƅirb!L{;Gq9?yĈ`+_tbĸ%wL `z`59U{^o?#"8h:+}o{+[}lpdu)GQ1gu'Se#iU H>&å B&P#: MAmq,4 X+'apb{+He-uL1{ }M% H7ud6s 7^k~G>Q^G^&'r& +.iJK$؞d5'KPf-Lbq4j)4 CLT Ɓ!@ʬ|XTv֣mC[tV^?_x7q'Foܶ;vthgVtL[9yS؂Rcƃue]0(TBHw)hzg% Y05-[I@q4u$C8 #Nnv#kq[T[ewh06*F̴fzne= [TRRrLjՒm$C5Vv\81? vi40^hs[jVUBS3}~jު16t43˥/mY|uus;bd/n7 o\-]3,md[nÄf‡sy>08T kŵ0{J[Rj,ظ؛UM@ ñ60;;[(h(ViBuI7:Sm|0*ʡgV{oaLfgL{-Ҏ`ڦMZytOuxƛ|OW2+wRpE?́|Ebum>##d'KBMa=l}UFZqp0]{1 tDnLJ+?F|ckBv=϶6u< [ kU+r5"oImwd`$ CF#x/6w&-!i^D|Mh۟?̠\c :C3 uAʈֿO8_k*]h츀W^ :za\yפlO+䧎Z إO+#|:{urs<4SmLoGk'Z:V|z F2zu8g|SU?͗˫G* #r0*lgڵZdx[RoEt9/'\5NMцjגJ!]БEr>$$]eMpFKDj}*TO]-WAaE9kY|/Cz v_xa~@.F^ƏYp8ӌA1MͺYeZ\uUvf1GOhi.XEhvIo6{O-I1ck53IKk* \e5w}&'=_zo|8c\a9 #9P]sP0X[\,V(Ehlyux"㵵ƵO8Q*P4 z_ Vw{8J?D-iyop7w2\J%_x i<(C]cv@VY1Ev_( Vu''] w4X^?Imh!xϗХ?H$;Ǯ4Լ@*)ou;F䧪&7J&T{K(R|% ѶTꗺ8*Ri_gtKhK];|{;ͼswo\"ݒ?ncl\Z2,G..-=Dz/њWYIHՃ0/H4^|ZD9_)OxV5Ƈk|\y<||Ώ0(f s(jMT͋0 ҟͻw.Ǩ _;H~MIW_RWc:PIP-5T\mq8s˂ys/*w{iwO: Ȫ[QC-Vp< @CݏՂ޶BS&Wbzdã z'OB1 ވ2\$Uc6rFis\RΛbfHM4A=FNώrQg+{Ѩ]7!̝ϳcix[;o LP5ֻ6J[:s4}mqVd x4a=S{z8M!Ĭ}b<]Y6m߾]}DjHtX{/@u+tQL@ 临}cd:e])1l'<0ȺUrlJ1$Z)^o,rFlΞ;3ga=Cpp>r93# 09kjiʬ5;ؐlkQB P߬0f쥍cI!̧j=zwC$q*aJ`K=AClkogOLvϜi=fXyd!'(NUkNjR u?ɲ റc55Nj۱ 865SURUYe*z)ƛZ;밣}ݝ,vvi!=ġggNVFK^#Xcv3Hĩ@h,3<YuE:ٔ @o÷Y8v,hMkhy=k4NvtOc";;Yho'>|W,lIOL68Hށ#p]54>3;VHry{]ْhBҹPԪR&TK /bon'_[986Ԙ0 9Fuڈ) nn劳:5>UJX0˫;E{^r5·DqLHO`9|)_Ras 'w(CLG7g.,9c2E;Ppן~4|8Ax_1|{}`F sᱢCbv.MBe @(Z/ǷaT_ggHz,瘟qe1Y6Hp64RujIcSSSSALuB}x}xf7 dQ?jR3?H%2h # k1hý=5,%;'eݟ~0&`ǀʳ;Vfc ǺA6(}jmiSpC'4jfPfÓ4 J P&eT{9*,&G/YHZjM $=Sqݧ'v*OG0ܸX-&H1VO` G %|@W'ڠ^M9*|@^F~xdž<(6Pcp Tq^]1I[f܆TS6*~],1ęIk& 0TBwsn@ȫBL(iS''<-z?P!PWc 6oqP X硺P2T U::mnm_&@80VZAFF#G-vuU=@;q}2s4ST7V Jկ}w&^bx v>@g:`BS 2IDAT7mQZ(p PIM@BA "Rq"5*7hH? sō+I/h!H^1AS=c곱3$uSH=Lv%)jtƑ154o6ƻu& 6P+Zyǫ \>B2QCa&1+H|4}4^UKZY?c tQ0i9S|EWƩ a *I'iXf.lw`(V8u3Qyu74"O!'TCŦ!c(Z0n򪟢[R;=D tYF bhIs],%nnQYyQK _CCIH$gHb>x? iV* AO語 @"VC`Ko3M'4UKa#XM cT$1֯ QAJN;mPL) Җ6|%N]k8JfxC03I5ghz+I}] Xe&Xg5Uz0 7֒t9.}qS(0H)Nʜ5-ʠU%Bixc)CwTSE F/u-,)uL7UȌ85/QcCA<>O!6p[kmAQc*d}!Ư8HXUX/F4 ("Z2, bTnodL J9% INh:54 ZFENnK25tդ(a1U`_heOI514}dnh!ab=NT?4A#? RFhSCظ%6I}*xh$RglH:Pii@SzV@=aL')TQj1ӧa6)Ph ASGUݡ,?q fU3PũL!@_7 ~D7:P eN H gDžM#Foi->P"(Eh ̒k,j-qs U$Ttp'a4`C !QI{Ɨ *k}7Clf&_DVVi6j6j8$: z{:ؑoq{ }: o=M@2t@kjlJr/ta2o@gBE_] [A }X ?F 6'P PܦlgVFen- no͛ge'owsqa h:+LObFH 4BrN<0{Ȳ $3)D {?{-~dTV6qkasBIT|d?IDATx[y9p1"D %Q> (P"5jԇ)Ibࡕ$% <ةE5Á7vl5p9>{fa٬Z3{;J'fZfAAAAAAAAAAAAAAAAAAAAAA/&ϖvܹO~rŭCk:uEgeeC锳ziN'|oPڵ)9Rb6;́xFq·e ÓkK3@ofH.%噆5 CMffj5 /<|^1zh/oo}ykktu'OP"ge.cguogJSن<(ĵ]QDt{Z6l =z?J6j*سȘmUHiWgBĿ}79i{?{Z /(EA2P~8hM7b[Ѻm͕m5 !a]}emVo̶l׵r^|\&V\F6;h6INVJyV'4OGU4=xQD#?cRC7cb[EOfW;Y:P}uc3W9~}~}*CFW:Y۸m)m sů{kFZ|7w^`m}[{M7NxjvH]jR!VR\v7YW#SCl;5d4FW]\z L܉q#"?(ˇ*~(Z-Ps~*l*IH]T:O?an `ֵəyt3DssLIki;ƑȞ=tݡ_(#qm\!41V#p)3 ]@Èa>)_wy8W^acr ) x7WKVЯti6 qծ>'q!?NyyF{9rWI%T8+]G5Piz3iD 8A+ gg牶m#*zˬ~B+]0o՛ m8 [A:)7O~RE)sEU7n$'ܺpnT}0+#;C{m"ן6pe顭 I cGqc\I^Iy3^u #GhO@Vxמ?.z0~=y yS@'!oAzie\z)%_tݦHA7o O鐜>M|$oCwH͑1e^|L֕)썫p}LQDq[f;6 \b{`->4%  ry`rRQT(J2=MeA_OOLOSSZ?6ɶ*鮮[X >~ϧa^f]A J\m^d`ɬ>k 1=w/җ~ܳ$Ih6tڵA@ZDDZT+2t*AT*mσ ߘ~9sǤkk$gC$r^DWMן ]wQ;s‚3PٖzGzCO<~D2whF$tuzi+"n׶ԤH1QocK%᳟cuǘGZދf{#=ǰ/Ydp}~m[fڕW]2fU`{,ַF}n#9Gϑs!\wE~w1l7]n^}l\U*-׶n湶].Xleyy<~,۔Z ͥp5֧IOB1Mm~KY%c"f}=S%oǩNۖv=\ll0elJ0j M5?buHYz.[`oKkepN tm$*lCN][6||ᒵQE\yL^gIy!q+<)Լa+7-#OGH=/_\}oyfW8DŽm}J)",n-!乬֤@kd\c'-isfik+;|{KHAPM[To2՞j-cZE teJ4۰=O+Gq;  exx)O*\j)|X7؃7?                     \`:_IENDB`qstardict-3.0.0/qstardict/pixmaps/pixmaps.qrc000066400000000000000000000017521472531462200213720ustar00rootroot00000000000000 help-contents.png application-exit.png arrow-down.png arrow-left.png arrow-right.png arrow-up.png clear-right.png configure.png dialog-information.png dialog-warning.png document-print.png document-save-as.png download.png go-next.png go-previous.png list-add.png list-remove.png qstardict.png qstardict-disabled.png search-filter.png speaker.png view-refresh.png dialog-close.png system-search.png edit-select.png qstardict-3.0.0/qstardict/pixmaps/qstardict-disabled.png000066400000000000000000000120621472531462200234470ustar00rootroot00000000000000PNG  IHDRi7@sRGBbKGD̿ pHYs B(xtIME ×IDATx[,Ys=B 'EBd% ! )DP$"%  YJ+ #!cˮܺx蚚̴pvwꫯ5HL0`쉫(|,Q̮1X)LI T(9,Y@XHP&ev LTIg,O|R9*/v݌~Nf*j+$ (@Zyץ1=eS!MJ@0po.m[ B%6 bd5=w;kEc.2Q6gusK|DWNj ;JZ'HȬUYOʑ bBN$+ '~]6ǹ2}eVIO!mvPL*N)]Zl{.0Ok-t926%Li[PNeض~H;0yRUȠ-"+O :}Y׸L>pZl):AfǓ :Lg&@eΪYUt+<²ςt' `vg8 wNB@S술wE4MYbkƴC$J6c< zkPB 8c}iꮹ"ͷnvOR2 Px+\)G)o0P\i}eZ0i0Z8^2;iĀpD( <"U:'@05rS&/ ŃQjgiSpvN?:k|he 1Vte4(222M?9-z`Mo *:ZĜǾ4Y}ISh)ȍdH^Qրk(DQgkn9Mͭ!>2jV@8]8&pC AG5*j9q!KVܜWroyy3<toF:" gz99W}W^,kiYWa hqy.ůS8X4 A(/q£tQE+pM F1 ]u0kH[Ҙ -_iָĪ/,6',ggf56 y:K3;+n*0XMX/YPqp-2.W?Cd,f i3=^~:98PA(VFrL\O5_Gm&6{X_ИMج5`-H6G)\Gc26jW\ U #"b7]60 2ja p1?PnsSblzBgрՀ j@ 1`…$6~ 2j% Ȓp@[pjɂTZ^ S602k U|r@[U5j B8fRD`XڧaC]D<11Au!moshd<BD @sX] )K[-CzHZܻ%6G HPmi1dnΎ8󢦰/c}Lp=nqVZ,3[u畤MmI#K# e[lqDAAFە>c&[c&h%ǃFPX`RHÛ\-ii~7Ag*qs̠}oa?}k7x6gTSQ*AbWaa|{STcO:7iq!bL':d_]<@x ۼ`zlQl1f 1IU~[Dhв.D3PVҝ?2KiN'6O6Ø_Yy_.%9nzM9jی/^r)PG}f S{VMI[ Vd:(/pKpů熌صr3VʟdkGA#+Za`G<iS-`" ^ fs*@; ٦Sѵ%q>12~&Bb#CSGzD4;y=68-KBdC H (('3|+z17JmT8 >aBW*-K}$ފm6fsNo燞W}EJg3 W\k<9g 8JW>bQ=h`;Jꃙzdyn3<%mk.sucKNWy ؋N Ɍ#@D)GsJxxނEEJPns7DGB#qPfcb}2CCz'鶉k[It! 7$^?0z]=E"f[/D0F"ͦ^4fB#"UܲjHDWm)̎ӳ]` Lowfd졐+GB)KZW)z7B8E:B$ I=":Na}5z'qRn_訌$#GzJVU\,S/W ( YV)~KءlJYW%w<RVݴ3=5j$[Fj?{UV"S uw*]S!pb"-4 -L_!MH[E().Q11bu\=[ 7]@Us ;*bN5L;7װ)QX]p >}I'oD<7m\f\+7l])QT`> SX,*$>oC㪂U~@prnazK22P}s\6}-׊GJ3(-&ŕzx<-A&ԐgJ[|u7k ӏU(-Y_+)toBOL*qUe(>˩ƌ21) KZmmGZ' (U+\͓lNKќc}?ͺSQog% 5VJ";bKZBD>i ,Gg!6t)@(UzqY ]T&D-mv7ȂOYdwM}jպ*Q1ꥂ_++OB 3#PSE"?Eo} ",4Oh#uw*wL'J\SU =;"v{]_?]4\IENDB`qstardict-3.0.0/qstardict/pixmaps/qstardict.icns000066400000000000000000002171761472531462200220670ustar00rootroot00000000000000icns~is32!&+"k}`ehpced"7mG?ANI@N.>YnOTX[OZ' DKNTGDYPY%!G\SV^' (SHWNf%.YHQVq_-1\M]a\*3aMGhih L5 `Xq[q6%Yc~{k[dk 8(WSNPOV`Xd/$SSXXZXWW_ ;=<=>?AAC  &+!>mT sE x@"|A (óĊ@.؞F1Ưϧ>3îۛ2L5!̻ų26&28)1/%, ktqsstvuw%u )%-/0/-/&    f[T\ ([x.F*1MA3I5q#P6$?7> 8&  /"  s8mk <mvojd^XRLFB= 6k7il32 ΢ (=5631/-+)&$" Ӏ 0j~||9pmwFPKJKFbTCGDDEAV-  WiyUCJHKHRlKNQMP1 CUvmDKHHKD\YFLJLIT/  KE]RHLJLLMbNPLU4 IMDnyGPMNPLZZLQQNW&MKOFoUHNKLNQ_QQSOX  NMOSVvTUWYUMZZPUP[ # $PONG?YbAE>MYS]TVR\ & &ROUiFVZYVT^!"* )TO[_oOY\YU`!%,,VP\9DbUI[Ma[Wa")/0WR^IPgfnQ|TcVd#-24YS`DO[a]d^LgXe#037[UaHQaYgcXQfZg&34:\VcIRbZ^nSSg[f55<^XdLTc^ZeeRh^c75>_ZfLUe\i`t[h`e:6Aa[hPYh^[M_gedf=7 Ca\gKTce}lghefh ?6 D_\c߲à\beggeh A7! F\[\d_\febSQecacecf C7!#HYYZWZ]YZ\be]^``aac F8"%IVVWXXWZ XX[\]]^^` E5!%HSSTSUVWXYY[Z] :+BQPQQRRSTUUVVWV  -!9LJLKLLMMNNOPQPTG  1MIKKJKLLMNPNS>   3QHJFEDB@>=;966400(ހe j~|| a~I  Z U  $\'C+6/8"37%67") :𕪥Ç8%, =聝ˈ8). A툟9-1G눘̉803J쉜<33L슝㋡-54O쌞Ս74 Q팟:5 T鐢璡=6!V嗡 ?6"X˸ A6#Z C6#\F7$!^E4#!^:*X  . O| ! Jm&#$%#' !1))&$"   Ѐ j~{}               $'+!* "3:G%- )0  QL-3 05 25 56  77  5i:7!! <8##  :$ ?8%$۠u @8'&    C8)( E9,+ D6,* 9,%$  -" l8mk?X hu k g ` [UPJD?94.($   c'lwv{|uwC it32NPVVURQPSOLKJECBB?AA@<::;:8443122100..+'%$&(%"cddcbbaa``__^^]\[^_^^]\ZZYYXXWYYXXWWVVTSSRQPPOOQRQPPON MLJHGFEDEGD7* gwwxxwoonoldcpuvokkmnlcbaUUVTKF>72(%,=0| Ɂπ Ձ؂߀ 7%%&6 Ӏ W!%%)ȀʀҀԁӀԀ ހ #%%€ƂȀɀʁˀ̀ р ׂ؀ ܣ%&5 Ł!% E + %()++)'%!"$%$#''(()'+-,1/./1$!#$ '6987554542//-,(C#~{zyxwvuutrqmkkji]6' z]\WVWVUVUWz{]UTTUTSSTSTTUUTXnN'   K]EEL_EEFGP{PHIJK`QERPEE[HFGHH[sIHIJK` EEYIFFpmFGHh}[IJKJ F cGFGJFGHIJs~vJIJKLM  FovFFMuGHIS}|_IJKLK  F}gGGoNGHIJj|wLJKLMMN   FG H[GIxGHIJOy{`JJKLMN   GJQGdPHIJb{wNKLM   G HPKHzHHIJKMtyaKLMNP   GGHXIYRIJKZyuOLMNO   H`wI{IJKLmxbLMNOO   HIjgRUJKLUwtPMNOM   It[t}JKLMMgvcMNOM    IJVUKLMRvtPNOPU   IJLl}KLMNeucNOPU   JKPXKLMNQsrPNNOPQQU  JKT~LMNataOPQ  JKL\YLLMNOQppPOPQ  KLdMNOar_PQR  KLMm\MNOPPQooQPQR  LMuNOP^q^QRS  LMNNO]NOPQlmQRS   LMNRNOPQ]q\QRS ! MNOOkeOPQRmjRSTTU!"  !MNOP[OPQR^p[RRST"#  #NOdVPQRlgSTU#$! $NOPRQRS^nXSTU$%" %NNOP^xQRSlcTU%&#  'OPQ{nQQRSTT^mWTUV''$! (OPQYseRSTjbUV ((%" )PQRt_\RRSTUU`kWUV )(%" *PQCHQ SkaXhTPKMHAAFNTUVj`UUVW  +)&#  +PQ> ůlUMCNTUVaiVWX !,*'$!-QR?ثiNFTUVWi^VWXX "-+(%! .QR?ڔQDUV`hWX #.,)%" !/RGGJ:ˁK bfKL`WRVqLNVWXi]WX $0-)&# !1RSBˁSTT\jUZ~^UOEL_cGWbeXY $1-*&# "2RRSTBˁTUqYU`}[VRE[}GWXXZi\XYZ &2.+'$ ! #4STBˁTUWsVVfyWVSHFXbcXYZY'3/,($!# $6STUCˁTVi_VVlsWGsHXYY\i[YZ(40,)%!# $7STUCˁTV}zWskWHlrLYcbYYZ*51-*&"% %7TUDˁTV WW`fWWYwdWXHWVY\h[Z[Z*52.*'#%  &8TTUVDˁTWqZXX\z`XYL̂JYZd`Z[+62.+'#%  ':UVDˁTWX[sX_y\YRiiUZ]f\[\[-73/+'#% !(950,'#* '0LYZ[GˁV[[\]h|f]mW͂J^_c_`a(8=:51+'#*  (0LYZ[GˁW\]py`^_ŶK_a`f)8>950,'#* !)0 MZ[GˁW\]^`wt_^O҂J_`aj *:>:51,(#+ !)1 MZ[\HˁW]^czm^_TւH`a *:?:61,(#* ")2!N[\HˁW]^_gyh_UN`a +;?:61-(#* "*2!N[\]]IˁW]^_lyd__WSab +@;61-(#* #,4$O\]^IˁW_`duVYfbc .>@;62-(#, $,5%P]^IˁX_`agaRlfbc /@@<72-)$- %-5&P]^_IˁX__`aYvb`ckhcd/@A<72.)$, %-6'P]^_IˁY`abO‚Rcjhcd0AA<73.)$+ %.6(Q^_IˁY`ab\fr[cdhhde 0BA=82.)$, %.6)Q^_``JˁYabOłQcdhiede 2CA<73.)$+ &.7)R_`JˁYabccQd_dgied!3DB=83.)$+ '08*U_`aKˁYaabcTl\nedeghfef"3DB=83.)$- '08+U__`aKˁYbcShPgqmefhf"4FB>94/*%/ (09,U_`aa`aKˁYbcbOtOdehqlefgfgg#5FC>94/*%/ (0:,U^_`_``aKˁYbcddcSTPceiqjfgh$6GC>94/*%. (2:-V^__^^_^_`JˁYabcZNV߂yPdeefjpjfgh$6IC>94/*$/ *2;.U^_VLMM6ˁHNLKPWZzXTeffefioigh%7HC>94/*%/ *294/*%.!*3<0V]__^HɊXO^cddcdehkhffggffg'9ID?:4/*%."*4<1U\]]\]]^^]GιkXPSaccbcdcdeegkgefgfg':JD?:50*%1"+4>2U\]]\\TOTUZUWUOKS\abccbbdeigefg(:JE@:50+%2",4>3U\[\\]]\\]\]^__``__`__abbccbbcddehfdf);ID?;4/*%3#,6>4T[[Z[\\[\]\\]^__^__``__`aa`abbabcbbcdgfdeedf)KE@;50+#4$-7@8SZYZ[ZZ[\]]\]]^^]]^_``aa``aabce,?KF@;60+"3%.8A9TYXXYZYZ[\]\\]^_`a`aa``aabd,@LFA<61+!3%/8B;TWWXYYXXYZZYYZ[\\]]\\]\]^_``_aa`aabaac-@KFA<50+!5&/9B;TWXWXXYYXXYZYYZ[\\]]\\]^^]]^_``__``a`a.BLFA;60+ 9&/9B=SVWXWWXXYZZYYZ[\\[[\\]]\]]^^]]^_``_``c/BLGA<61+:'1:D>RVWWXXWXXWXYXXYYZ[ZZ[\]\]^^]]^^_d0CLGA<61+:'1:D?RTUVWVVWXYXYYXYYZYYZZ[\]^e0DMGB<71+;'1:DARTUVWVWXXWWXYYZZYZZYYZZ[\]a1EMHB<71,=(1?@??@ABA@?4.    ,+,+,./../.--14 jjifeeiedcb ]XWWUY[YXXVTTRQMKKJKLLKJJKKIIF@?;@A>=9850775}|{||{ zxwvvuuttssutrpoomkiihidSE gwwxxwoono ldc~xtpkib`ddO| Ɂπ Ձ؂߀ _``aa Ӏ hU``bȀʀҀԁӀԀ ހ <\`_€ƂȀɀʁˀ̀ р ׂ؀ ܭAL_a5 ŁGLW` E UOT_(EHHGECBA>>DCAGGHGHFEKLJI JPLKLLEDJZ '6987554542//-,(DπȀ UD pN   u                                "   $  %  '  )  +  -  /   1 ! 4!"  7"#  :#$! <$%" >%&#  A''$! C ((%" D )(%" Fvbnoop}xr|pmkmllqz  +)&#  Hm Ųygmr !,*'$!Jmدvkw "-+(%! Lnښgu #.,)%" !N|jpRˁ^pp~ppysjh}g $0-)&# !Pkˁnvmnqv $1-*&# "Rkˁnqlm &2.+'$ ! #Tkˁnim'3/,($!# $Vkˁns}r(40,)%!# $Xkˁnxv|}*51-*&"% %Ykˁork*52.*'#%  &[kˁoi͂q+62.+'#%  ']lˁoww-73/+'#% !(alˁonȂs .840,($ & ")blˁol /951-)%!'#*hmˁol~"0:62.)%!(#+lmˁorq#2;63.*&")%,nmˁpk#2;73/*&")%-pmˁpru%4<83/+&")&.rmˁp j%5=84/+'")'.tmˁpm{&6=840+'"('.vmˁpqׂs&7=940+'#)'/xnˁpq҂s'7>950,'#* '0znˁqw͂q(8=:51+'#*  (0znˁqŷr)8>950,'#* !)0 zoˁqq҂t *:>:51,(#+ !)1 {oˁqsւt *:?:61,(#* ")2!{oˁqo| +;?:61-(#* "*2!{pˁqk +@;61-(#* #,4$|pˁq{v .>@;62-(#, $,5%|pˁqu /@@<72-)$- %-5&}pˁrq/@A<72.)$, %-6'}pˁrtĂu0AA<73.)$+ %.6(}qˁrt~ 0BA=82.)$, %.6)~qˁroƂr 2CA<73.)$+ &.7)qˁr|s!3DB=83.)$+ '08*rˁrw"3DB=83.)$- '08+rˁrus"4FB>94/*%/ (09,rˁsv~n#5FC>94/*%/ (0:,rˁsjo$6GC>94/*%. (2:-qˁrvl߂v$6IC>94/*$/ *2;.{Sˁ\| }}|xwsqjk%7HC>94/*%/ *294/*%.!*3<0uʒkv '9ID?:4/*%."*4<1t λwmt':JD?:50*%1"+4>2agnkorsw(:JE@:50+%2",4>3);ID?;4/*%3#,6>4)KE@;50+#4$-7@8 ,?KF@;60+"3%.8A9,@LFA<61+!3%/8B; -@KFA<50+!5&/9B;.BLFA;60+ 9&/9B= /BLGA<61+:'1:D> 0CLGA<61+:'1:D?0DMGB<71+;'1:DA 1EMHB<71,=(1< +=<65443200.++-+)&&$ !""!! MLKKJJIIHHGGFEDHIHHGGFFECBACCBBAA@?>==<;::99;;:9987 6642210/020' gwwxxwoonoldcce ff]WWZ[[\[XNLJ<:.(&| Ɂπ Ձ؂߀  Ӏ MȀʀҀԁӀԀ ހ }€ƂȀɀʁˀ̀ р ׂ؀ܝ5 ŁϾ E (    '6987554542//-,(>+}|{yyvqmmkkiihgfba`^\XXWVUQOONLJIIGDC@>>=<1 !!  5#                                                       ! !"  "#  #$! $%" %&#  ''$!  ((%"  )(%" &+)!  +)&#   ūZ<  !,*'$!ئW& "-+(%! ڋ3 #.,)%" !ˁ2$0=`$ $0-)&# ! ˁ.JN $1-*&# " ˁ.Cq &2.+'$ ! # ˁ.|'3/,($!# $ ˁ.c (40,)%!# $  ˁ.^a*51-*&"% % ˁ. :*52.*'#%  & ˁ.!̂+62.+'#%  ' ˁ.VU-73/+'#% !(  ˁ.Ƃ .840,($ & ")  ˁ.hB /951-)%!'#*  ˁ.0"0:62.)%!(#+ ˁ. #2;63.*&")%, ˁ.}6#2;73/*&")%- ˁ.PS%4<83/+&")&. ˁ.9y%5=84/+'")'. ˁ.-&6=840+'"('. ˁ.!ׂ&7=940+'#)'/ ˁ.҂'7>950,'#* '0 ˁ.͂ (8=:51+'#*  (0 ˁ.̂ )8>950,'#* !)0  ˁ.҂ *:>:51,(#+ !)1  ˁ. ւ *:?:61,(#* ")2! ˁ., +;?:61-(#* "*2! ˁ.7| +@;61-(#* #,4$  ˁ. .>@;62-(#, $,5%  ˁ.. /@@<72-)$- %-5&  ˁ.aG/@A<72.)$, %-6'  ˁ.0AA<73.)$+ %.6(  ˁ.O^ 0BA=82.)$, %.6)  ˁ. 2CA<73.)$+ &.7) ˁ.zE!3DB=83.)$+ '08* ˁ.Wt"3DB=83.)$- '08+ ˁ.Q"4FB>94/*%/ (09, ˁ. b#5FC>94/*%/ (0:, ˁ..$6GC>94/*%. (2:- ˁ.2߂h $6IC>94/*$/ *2;.ˁ&)=h6%7HC>94/*%/ *294/*%.!*3<0|8 '9ID?:4/*%."*4<1 ηV4':JD?:50*%1"+4>236:10$(:JE@:50+%2",4>3);ID?;4/*%3#,6>4)KE@;50+#4$-7@8,?KF@;60+"3%.8A9,@LFA<61+!3%/8B;-@KFA<50+!5&/9B;.BLFA;60+ 9&/9B=/BLGA<61+:'1:D>0CLGA<61+:'1:D?0DMGB<71+;'1:DA1EMHB<71,=(1< +<6-- ~uuuttxtwtisis_rZrVpKoKn>n<n5n-n-nnnnm mmmmmmkkkkkkkkkjje[[[[[[ZtZuZmZiZgZ\Z]ZOZNZGZ=[?[+[,\ Q"\&   "%(*(%"  !#&),/f?2/,)&#!  "%'*-0<30-*'%"   #%(+-0258:<==>?@@ABBCDDEFFGGHIIJJKKLLMMMNNNNNOOOOOONNNNNMMMLLKKJJIIHGGFFEDDCBBA@@?>==<:8520-+(%#   !$&(*,.02468:<<==>>??@@@AABBBCCCCCDDDDDDDDDDDDDDCCCCCBBBAA@@@??>>==<<:86420.,*(&$!  !"#%&'()+,-./0012233444555555554443322100/.-,+)('&%#"!   ic08= jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 =,]ȾC$RR[j+]\gS0<įZw6[^Yia=p):G6B|b kh1`؜,)#Ip=̿8z¯M` '*Vñ8utlxu]sLucbyѣTyX긗YHTfoMw9AN* =63[׷SA/r xl\|!4 ,Um tӎq"o>5߃7tC"ߣB_ ݟqV+~gK3$9LldbT?g{):7gl;4?_ AmfR"pf~ZmDVKTtA7 @|$9a`0TT7B):7gYL#O@i$<6wZHX˦YI?Tbu֬xr7T0)EyN"f~i6^LRNFv^d4wØ`_/Un3cdd 8Pģu:g}T&\QHt5ޔ> +_sheq$# ϸ#_{:}Qf'nM>f㕏G}~|Fn鬡ù$",,*|RbRRMRFH$9w x ! =@ɻR7TT>pC.:H-.$KC(mҫ%2+ DP#hA:?1flAXS&Q~L}tã2l˕HE|*Q{(;TF9HMG8ŕѴL"Gd 40=bWwkSATuw9(}DYp7DwLmM wVg5.*åb=1uΔy6jvk55%j*|a[hsJa-ϧ1oti(wGkUzu5ֶaPAACqnOn"bTPrd=+y)K, kҭ!}n$_QA,EP"jB՛x~S&9FUޑd:V3輸˒qGvbAՀ:9iAᕦn1;QXURxa4R7.(?KD;hj(xXCrGĕWGSD5? 30F~d4j̶93D)ƨ*ijQӃ:!&Q~c)|Cynlԟ! .?=sa)|臌|^z6l"T_"ip8HRv!a88ũf1SV~/ɱCpTAE}ne*U"Bp֊r"9)BNy+vxFVu nNu5OKXԖt>a|Uq2JDvfz/- Q+TZ=Kp<ѬcaP`}/QQN"`;uk?u0Uw,&$t@Qa.e)V7|qہ]:Vi@1dp; Sdad*ePR{<3MԡE!CY\F@R3!}%FiM`%P0|)* |j4hQS!1&/u5`q=58tto&KpcAϞ2(-\-6i1kyFlW`xi_QRkKe@_T`.t,] d_ "ZL~o_@9@FՂ/Afe~)=J' )NȷLibi2LNG1 ``Ֆx-KgN/&+eEH+?ܑA]qj -/:D5_UIfbn4 ƾLsM:n3wzvb]v-?LJ l YgO8T6Y~hEDUib#d_UaZ187sZ\H)opŝNZUZ`'hh}uȑ=W~Ғ[!Iݮhp(MoYBf92sZ~LJkԱ^\'>3\Oxy37ZʸZBx:6W-$kM^5'$q kעm3׋@/!c#,?j5+#~EO4} e)̸#ps* pT%R +Y&FhଞXf9j6S󎊗<ΐO4*͞i!] *'P*0hLΡΉ6nJ8\1=./*<;Mm#Jҡ͡5W6+>* mAV !AHrT˒JI|跐8A BWl]*muX eю{AC& Ԝ=2cʒ8ʊwGx`dD[h(aY/4@K6?J̧ZP~Xo h7HHw Et9q}6t*0LdI6z؊+yG-_l /?l*5D/#wgܗ%|H1t,'ŏ8>e:nf|"5ZO(c t4Mr=swpi[3_$'aY'4""Uc+8Ր;)J@+0Mkq6Oؾ!R#xhxN3SyM6N9oc#q+QT!up#~1 K(traP3E/h[ΑWi3fBDЈFrb{ev91C#` .Duz4B.ֈ}KZZ6| JJTu:UͰkjzoХ_[܆_ $=1@Jh\:M=r:8H'\JkD\[A _q֢TdKdozB,aK p`qTcLT ?\^9( lf+;yR @1=:Z'̃B_( 0`錇[+_ӔQ^T-p]XU1H,L_Y?^/ 1. IRM+16SsdrX-yY -ӌ Op,"D=j)u:/ f R㈺n.Ũg TTGɨi=n{p+pVbz/RIM^ϸu P21)X_8eT?9+qZ ^ޜW)a)HQTYTM]qIxgCt[*0}pMBnO&\\Abd[uū9/el;$])a*%|VgXӕfnUcO1[{K: {"BI:T]/Jt?/Vx.uꉆkT+s%\NFJ^ĘCm=F(~Pde 7b/>x32$G7;ԬI(%IE"i[f2љaE7: h p~`3\Vl Fg tp 0\6Zb]>$qH΄F^]љÄi&w*i|^[ZǁQ> dø5=?y)`*01wI9PaIer#M4iVAhcsмt"H-;E.F dㅴ>EZ"0R[)ygI׸XޮOӲ ]n>"`sz$.1M% OPcx,ұ uNoB/\=*KƦiz[xY9ޔS/ B7)li MzgӣzpJ]( _7MG":runYl ;H} <oeg>0 ݐJڳH-㐔}(śf9^zS,k[ [볼T](ԍtwyJꊍPݢ5eSJ;o7^@Nv%5\пShʹ;INj(*,7| }K1 jAyko5ÁtGI!!j2^4CәEžKJܺsGCuVHz`>TΠ[ԪN !`Q)j/)7oqR* } _9r h>A-h|~``4yG(ք!Y'DZ-JuSU4b&ˎ:Bk:S7w y[Up;6)VF6q/h3mԂ4ϫ>UT0J<\E6gR Ux ?g;]=uۑn b**j`9)Ak&E'?+jbp]GOCt&Ho dxs JMbֿ] Z*P*(m:#ENNg1#p =*O1 Q#y ɂ"^MOJ*Ɣq\ W7C~35JJE̱IVnS6_ NxrL7ABCWr'Uw.F9H)Ȝ/h ѳ@lWly})֑Ve45ox9GO Bq`8tFcnW5.Aq87}eTNp.rR]X02 ~]Ԅ}ҀXGI_(H"3Ք1vzzly8s(Y {=.0>%_Έ|c0 _18e PwbS┪ Y#̥Jӛ/Di?an/۠R$Ѣ])^k$)$"`m&uCu23< R4[+ !:=c}t}w FL;TA&ǵrOE~1$2{4m,WSdL z!>w~cL8&dȺ3菆D73"7s)d Zb T݄m488]h I#!xdrE cu[yDU%f˲@'1ɑLǜWd4+LJB> ziq|y BbNJ{gmx]ȤXp̢V\7ئΨ ֡YdWtRP+ۺzI'%yTr$v ]lsE!2i1RByzOp_E_>1* ]zv|bp Pi${]uR/Nx{Q Yz{"` 2L(,vu|h CSq+$D5a1ϊf ex NX&E'YZ6!|A ot.9ټ330S{D"ͥ(`w;k0k%AzpՃ%V~R7ڳ a!" Bč2N4u}5MTG)?.P]\XOzLSA>s% ; 83dzm_vx"鞊w!:q{Tq|#z{Fʉ9h#P7buHWQ,w6e/~ R(]?/#@p6LwCKv{)ϲټqSIcd1ⷨVrd`|ڴ1Q|Ç_aqCxxGGv!Ka3uMУ^Z T@'JkpGFcؤ}N0VY8Ppœzdž]Onc_;NTx2f&Jw qv ͝U{+!a!hy"nm*YWս`/\JX8𦐩 tG7H`l8 @ &Y58Wq. kg"#P-BBTmLڥB|bP(4L9#m~o"#a}$;lU`ȎQa.qr6t^saxœgB"!NoFg_) iCtcTr&jah- tS{ ߗ v4Pa+x@kI۵cwBںa$U\|$Bdzͨn 4ٌ>F6aFG$泠T>++$ _8k|d޾%@ #+y,p! k?jke4/!YG$؆<*7uN)c)l*mю0-Ck|FUg .-%;zkԓkh}i_.:_{G0SocTkMe ̐:' |+%Xi] j]NR &H> VDu8ϻfs˜sدEgh)d Ȳx g$W{!Wڬx&E#D`A + %FbܲFؼ!f MBp nL6_w!OCa's"HϜ--NmYm!!]qo/){]ʨeo: ^2-ȇ<2tqout(~?\Z:^nLox=/Xb`{ ØH hh]T+Ái]UVrdz,AJ8{(/ԙby 0; W׈\4Uq)[[͖[j0$ TC4`> X fHQ?!.Tj} A:Yκ&< Red( ~;U| ]Ȉ㭏VrOPCMu)#xPf3,|jdO>s[4zplԳwNl%$2UEP+/O_Tm0J=⫤Yۋ;碂8iQxlI q"9SPϑ^ /,}ܯ >o=6Kxq6JD[FD*D$h\gcM3V7LGd!+uQrhDMkr:Ц6a_HIAM'!H t*_Y>O|xx6+"mqW]V5Tm2f k ?Bcz8IMbNE@i&T΍T J)iRu 7'ԋ&䯼\J:VO1)qD-rUGӚJn!l:Ccv cmj})9^d/=)j Q M)7GL|H>_goERB.ֱ>R \Y&zgTPD"%™z=߶1jx'\_V!)$ˎh| [[cpOKO ܻ*u*9CdJIxpLR9Uq˛pnF 1@UVUhdSPiE)vA} ޹ C{ 2T}?\N䬯"Ǟ. )aYhG c6673^AuTr!EKCjݷȎ7wRBlCakh%~sQ@rݪ}l> H@X)0pm⫂:Q뺜otux-k}7&;u W"ok@n1~n+B.E.wlճY@R(}Iܥ6nil Djs*i&G KV*G)HcBc|'cL `"('A7\Z`6fqPo;7|TmEo|]nWO¸t6åhX鶿8t  Lp5ؽ8 ~ '7׃4]_Z+:)FLHGIAhdk؅A(ewrm 申s1څmWȁ1O^b,[z2B9pF?oczf 1_qTTȬfEV؁e)h5̞ʼnZ*ayԼ5QzT}bq\h܇J^$߭}v%B@Z@E%º>U9#ҐyCTC#,-d1S9c*MȀ{w1m:TĐivVrmYaQnr6RőCxfBD*5?I<Â>}rq,NsSyP DpGxh(v+`24jA:*|*3W. )ƈm7t?d7F!нssDWzRC軼`=95|rXhq!i|&"b[i8Fli..MiCAGPWzG4@V_ӡb;F R|L^;kxz1Z=í&(O`$ |EYhrYdtBtC 6İg @L U`:'%{%@ە^cn,`_ qN!a_KmοjN-we-KS .Y RRJ:&p?!8HVOhkc:55kE Flt0 zmʅg7_,l \_؆˿w,WU}e\N ?YV(LW,=NyoH~dŋ"K6IdP- -oY+<+V4]=\J&G?Cpe8D>P`|>b3=W4(!S(K-z$ {d8Njn2hjOh;ۗkvˁeSd<T+OUO %uYwԀМ(.Cf29VLG8`NzGQe|Թ>W6A HՈɽ|c]{WVϫ?I?>;[~}_Sga4[HՒ^TsA' [C-A3(-w/ yCАB@rNST+E57Lăjt!6e;4RIc)l[7M?:].u 7rܿr61m&xۣ[I-;Zg/6(ߛk(!}$<6/NCtY|(VMzcu":;"|Q9:I.hX}&u!saȷQRr.z&4MlEm9iOGW, ٔO`AEs.x*t csW/-Hd98}c|O>иj DaYݍDNE'n趔[Aup{B vI(ä9c8 1&1:PoC۾_'q̅gV^oZLiDP$%9`b14LM'#*vy­jNReu(vyK[ERgAL[lJX^#! ` y`8䪊Wө%w>) DD߹a>AVf`DNm?mSyt}ƭ>f@9_6~k`UWJ, iHFI:ɩubm`S9wi$x7Cd`]jJ#P+7iL]>rv:L&) On?T:Hxu2\!,>\7_pM@N lRHV0"/4oB^Zs@SAJf_T468WY2ZSd%Sk:b@Ơj&%(軶ҁ9E~vu8)$? [ H"m<Կī *o j#L. :"h3I4Nً&A%4o S](+/q=al`XmJNkJfPpKôBds\/%+a GihUQ^\ν#PE ߨJuy܇w<>e~GR:1뿚u 6Aڴ;Zs3)s"L|A ~(%$BP]ӪhC*XU X 湖*̓qQ=^^(uA2Aӹ3hUu#hr6Vxwz.(cBz.^ p3+F/瞝H‹FF?ozo*?]"j ІE%>FZ_jY`(nm$G*#~%5)06QWn}Td>DZc@KK|rL!6.Bt{X(^}+%U 4E mwڹ}ۇ+q}I寞<n^)' n=P[(aZ3gHO<b7?9_5S,UFŴB<$PsiOD rX9nW{4,aPOn#%FV֠AoBzn qAl՜|nF{4WpV+#.R/ ~}Ris@xʌw$91CVLH cQWo2囁wiϷ RS*"K^^I훏P*"_\͑LxVoQ팈Ԣ:g#϶aJ²[$vCPߛ޳9NH*1N}y#djψE;%(Lz@fw`l skqpSyVSUߦ Eg@+FV+([sۭH6t~(Ra":-JEåavOb\!Nz6^BDT q`8x&BVߺ4N`]OSJv4mID)7XA,, @h?.;q\h J́,aRqQḨ;~Ѹ(3wT/#O,Vic09@P jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 ?cl f;M E?X㺱H5sBj8C -;u=ƽ];^p 80g@09~$, ;VYѣu;tPT0vxC ^!0g"jf\L=\tz;VY}w֔MpD?Z˺lP(A=1s1Uj4[LGy.a>3]j4 BeH>o*4~N0ՐnNpcFNn%ԣȴ6|rߜG.HCC{ҝ0%k|TBJ5Ε:i^`*?UCބ"$zђ=| hpI)-?qЂR |@<"R(@l:"$zGBd&\p/Mih3]K r2E6_2jN y8$ ?9ĽXqkGrىVo+K[m(#W -::0fj,d5187o-ɘi^D7Wb!e$c#9U 4ocm(Ugak6J7},/ݤ+RaC֖6vK`V4&Xi& h 3G'[mi8<`;h ġx$rs$qZ$cK_|#s`tz=%g룣 WSk҄0F˽z-)kȐMMU -U $2"Bnm~#G[ q}I&:nB1)vdA g8<4g{Z~' z1Wk_yeӀ&i}lXJ;u8 zPAyR:P?]a9 U"Tߏ%ʏkWe&¿Nw>NCj^a|c4MD2.[#2N5.]1V_joXEb% ȇvd, tFs(6}I[ۣ]^㙯gxmݾtp![y%8b/ՈH֣f8ap=;!&*2?TT &%Bg:C3xR;y, 2*"^ToVq[(k44@q#84~aiP=h1q'iPŝJ69 >7e%{Nmq:CFHBϓ5p) =Pp[Ud"םnJwxZ0:b`vOU~&NXBo)[e=c9R^dwU \@R3!}%Qԧ 0U Z שZ; jej%K ~q{&.w3YN2[yVn bt6'Ia*U{NOn WDKFJWQGTt g*ҽu#!;21ObF+-6h;ԃW\ȕk+E#}b/|U*۴5EdR *k.CZG+|*o:.sneOk`o@KMw"sg*0^$iX/P0^ }NS6A mL_jإ2gd0/+yevyJ)] n@O}d4fP ˝{9F_/Mb7`L!tK{:Sؓ k&!XKԺfW ¨N1,Rm[81^kg7!*H柰gހP~G9mgv\EX76XA5Jsꀌ)i1@Ȁ%5үn5rƭ+.(LIHB'@ '#bu6 :8TH2G+J'OGftnƊ~zk[x!K+jևh ln ȋKg/ DROBQ`ڠEN4wqm!F_8) %[ɫZ̰Hkfh\L BedIIщܜ)oppbN!٠Xfr8{J9GrzjZvSzy˦:d+Sۜj4-~|K@ЙWưxLfb{_F$R x2[+C҉_L"S›W1(J}~?کY@ROڶa1s6rʳH'{;,-b(9>zc= r"T'$-od& ֬, U sC]kUۅ 1ga5hdP>n KUA.]`s^9Z<fh~+vHgh+Y.,j큗"K咽*k2n󋡅#t&y ϙIrգ[@.1~ `#j]'<{6 ,V$/+NƂ Do]=sSi1 iɦ^~uXd,$##3ZV@J]slTC {馝rk$. -C}U jEr4qؕңG{ (-э$x*>ሴ$Lm{l S${vʀ٫Hs L;dilVq{h 0Ín6`0!{_DD~X\eJ+CJԀW]F`o&ɿ=coH>Vca}$u3p=kŸtFtr H)D PM"rAyȞJ~_E6JcV$|א  1ZL~z3,1|*j嵀|"~MM7qHasY.rK+f:)13M~ 9I~ Ua*To>[ܝE y2 y⦪snC| ~8!멑>^E0UQ;TޏQaP1U^U-TѾF;h>yMI hJ+%G[GIK{V1UˏځViQ߼ ıQOzy\4Ϋ]t%j0e}@sV;EeA;El}|U&uؗ^gv*p7lMRDwZ󍲃7޽d)D5Zx2ཅ\Q5>6b4ҫ7YMBztӍ E)dԇ[N䂡8V! kjт@ fv$ \UMb>zqMo{Vs&&1E)A>v2]#z'TQ8']; U?煛2%.xFSCᣓfU`j %l[bо˒9#̇OaO-Sۡſqm|է8\ @" Moxy</HN( Juj\v%`=3KO:ál$ɷ*'~d gVkH~ԯD~OG[YGuqVv~UQKtEBQJdmUۇ԰]\Ui t,h| 0?\&Jٞ5,*$QO:9ٖ/PUP`4w=(e/ܴ瘴pEnxwPgGG|)}ՌUu@RfÉc W!URuI3^w9`G\'lŽ*ؿV'!dȄ_(5e*lG5?j@3\kJp {yeҗ5ѴAՆ'144T0a 2*S"@b>fR+iʪn!d*!'!ȣsZװ{dL^^|F&YԊs'?|59_v ɛ=Oȧ %uZ"eSs?Rl< H De`]y.-te }iNeUޥL$vU&Ӳ-{z/{$V1,AO -#笛9Uӭ&C0Q^RwGbÎau2xr`|"|']Og:I9=ʑ.?iYGPopN &*g>^X?c֨`=Mrz~3+jNIϪkhHUQBgߓ2-< uI.: Uh2-GNrf3d ջ[rnI_!::`Gߩ~K )1= \t>ά&pRh!R:N;Ͱ]/7 [RQŢA7RP)"4jS'Xt6}u6*Q_p?DɑCi G_ټ$.քXtZBZurJUSx *(~QBXKt-~zojȕ[J%mdz-kLuWfocsTzV0 VE].$|uzOŦiJ\+f6_G{G:%mlatbр.]8B YlH)ʨ- { & :'9HlfLy!?Sz4lp'dNTł#.w2{ 6 ^'$ytH%5*Aks,AEjywi)M:ӨڤQ1LZW㟊JS.,FO]Cp KOՆWv]7=>m83ՙ4J*YUw)^_)Lwp!g͈1n#^w.@9_  ôùJ %5}pH.H|9ͶWާJA44 ^EqtvZjOyĔcҦ< J 56'. ]1;M-ϟ%`h&љU& ([&FSW4q%[mf{OE\z1a1zTؘC(4ZSnAn1Rq-ɪ݄.?iͭ}Jv7g3Pt;]vrx8{޹ۺ, YF|LJ;<H77_j)ѳXVyHPP<}9LG(9K퐙eښu#COs%Zd:>$ @}!*wиY|X.F^*U̔a|ZӖ~.9 aq뼄L#ף 1")h:}.'Yn^)HՖ~8gTpx7FOӛD?Ia4ۋtmC|R$Ѣ])^k$)$"`m&uCu23< R4[+ !:=c}t}w FL;TA&ǵrOE~1$2{4m,WSdL z!>w~cL8&dȺ3菆D73"7s)d Zb T݄m488]h I#!xdrE cu[yDU%f˲@'1ɑLǜWd4+LJB> ziq|y BbNJ{gmx]ȤXp̢V\7ئΨ ֡YdWtRP+ۺzI'%yTr$v ]lsE!2i1RByzOp_E_>1* ]zv|bp Pi${]uR/Nx{Q Yz{"` 2L(,vu|h CSq+$D5a1ϊf ex NX&E'YZ6!|A ot.9ټ330S{D"ͥ(`w;k0k%AzpՃ%V~R7ڳ a!" Bč2N4u}5MTG)?.P]\XOzLSA>s% ; 83dzm_vx"鞊w!:q{Tq|#z{Fʉ9h#P7buHWQ,w6e/~ R(]?/#@p6LwCKv{)ϲټqSIcd1ⷨVrd`|ڴ1Q|Ç_aqCxxGGv!Ka3uMУ^Z T@'JkpGFcؤ}N0VY8Ppœzdž]Onc_;NTx2f&Jw qv ͝U{+!a!hy"nm*YWս`/\JX8𦐩 tG7H`l8 @ &Y58Wq. kg"#P-BBTmLڥB|bP(4L9#m~o"#a}$;lU`ȎQa.qr6t^saxœgB"!NoFg_) iCtcTr&jah- tS{ ߗ v4Pa+x@kI۵cwBںa$U\|$Bdzͨn 4ٌ>F6aFG$泠T>++$ _8k|d޾%@ #+y,p! k?jke4/!YG$؆<*7uN)c)l*mю0-Ck|FUg .-%;zkԓkh}i_.:_{G0SocTkMe ̐:' |+%Xi] j]NR &H> VDu8ϻfs˜sدEgh)d Ȳx g$W{!Wڬx&E#D`A + %FbܲFؼ!f MBp nL6_w!OCa's"HϜ--NmYm!!]qo/){]ʨeo: ^2-ȇ<2tqout(~?\Z:^nLox=/Xb`{ ØH hh]T+Ái]UVrdz,AJ8{(/ԙby 0; W׈\4Uq)[[͖[j0$ TC4`> X fHQ?!.Tj} A:Yκ&< Red( ~;U| ]Ȉ㭏VrOPCMu)#xPf3,|jdO>s[4zplԳwNl%$2UEP+/O_Tm0J=⫤Yۋ;碂8iQxlI q"9SPϑ^ /,}ܯ >o=6Kxq6JD[FD*D$h\gcM3V7LGd!+uQrhDMkr:Ц6a_HIAM'!H t*_Y>O|xx6+"mqW]V5Tm2f k ?Bcz8IMbNE@i&T΍T J)iRu 7'ԋ&䯼\J:VO1)qD-rUGӚJn!l:Ccv cmj})9^d/=)j Q M)7GL|H>_goERB.ֱ>R \Y&zgTPD"%™z=G}/z"?V+ H@X)0pm⫂:Q뺜otux-k}7&;u W"ok@n1~n+B.E.wlճY@R(}Iܥ6nil Djs*i&G KV*G)HcBc|'cL `"('A7\Z`6fqPo;7|TmEo|]nWO¸t6åhX鶿8t  Lp5ؽ8 ~ '7׃4]_Z+:)FLHGIAhdk؅A(ewrm 申s1څmWȁ1O^b,[z2B9pF?oczf 1_qTTȬfEV؁e)h5̞ʼnZ*ayԼ5QzT}bq\h܇J^$߭}v%B@Z@E%º>U9#ҐyCTC#,-d1S9c*MȀ{w1m:TĐivVrmYaQnr6RőCxfBD*5?I<Â>}rq,NsSyP DpGxh(v+`24jA:*|*3W. )ƈm7t?d7F!нssDWzRC軼`=95|rXhq!i|&"b[i8Fli..MiCAGPWzG4@V_ӡb;F R|L^;kxz1Z=í&(O`$ |EYhrYdtBtC 6İg @L U`:'%{%@ە^cn,`_ qN!a_KmοjN-we-KS .Y RRJ:&p?!8HVOhkc:55kE Flt0 zmʅg7_,l \_؆˿w,WU}e\N ?YV(LW,=NyoH~dŋ"K6IdP- -oY+<+V4]=\J&G?Cpe8D>P`|>b3=W4(!S(K-z$ {d8Njn2hjOh;ۗkvˁeSd<T+OUO %uYwԀМ(.Cf29VLG8`NzGQe|Թ>W6A HՈɽBc~{dAH@ ȁ;%t_Sga4[HՒ^TsA' [C-A3(-w/ yCАB@rNST+E57Lăjt!6e;4RIc)l[7M?:].u 7rܿr61m&xۣ[I-;Zg/6(ߛk(!}$<6/NCtY|(VMzcu":;"|Q9:I.hX}&u!saȷQRr.z&4MlEm9iOGW, ٔO`AEs.x*t csW/-Hd98}c|O>иj DaYݍDNE'n趔[Aup{B vI(ä9c8 1&1:PoC۾_'q̅gV^oZLiDP$%9`b14LM'#*vy­jNReu(vyK[ERgAL[lJX^#! ` y`8䪊Wө%w>) DD߹a>AVf`DNm?mSyt}ƭ>f@9_6~k`UWJ, iHFI:ɩubm`S9wi$x7Cd`]jJ#P+7iL]>rv:L&) On?T:Hxu2\!,>\7_pM@N lRHV0"/4oB^Zs@SAJf_T468WY2ZSd%Sk:b@Ơj&%(軶ҁ9E~vu8)$? [ H"m<Կī *o j#L. :"h3I4Nً&A%4o S](+/q=al`XmJNkJfPpKôBds\/%+a GihUQ^\ν#PE ߨJuy܇w<>e~GR:1뿚u 6Aڴ;Zs3)s"L|A ~(%$BP]ӪhC*XU X 湖*̓qQ=^^(uA2Aӹ3hUu#hr6Vxwz.(cBz.^ p3+F/瞝H‹FF?ozo*?]"j ІE%>FZ_jY`(nm$G*#~%5)06QWn}Td>DZc@KK|rL!6.Bt{X(^}+%U 4E KA5_# ȟw~~][A+E~寞<n^)' n=P[(aZ3gHO<b7?9_5S,UFŴB<$PsiOD rX9nW{4,aPOn#%FV֠AoBzn qAl՜|nF{4WpV+#.R/ ~}Ris@xʌw$91CVLH cQWo2囁wiϷ RS*"K^^I훏P*"_\͑LxVoQ팈Ԣ:g#϶aJ²[$vCPߛ޳9NH*1N}y#djψE;%(Lz@fw`l skqpSyVSUߦ Eg@+FV+([sۭH6t~(Ra":-JEåavOb\!Nz6^BDT q`8x&BVߺ4N`]OSJv4mID)7XA,, @h?.;q\h J́,aRqQḨ;~Ѹ(3wT/#O,VicnV Bqstardict-3.0.0/qstardict/pixmaps/qstardict.ico000066400000000000000000000410761472531462200216770ustar00rootroot00000000000000@@ (B(@   !"####"!    %*/358;>@ABCDEFGHHIIIJJIIIHHGFEDCBA@>;853/*%   $*<    =&e5e6e6e6c6c6b5b5b5b5b5b5b5c5e7e7e7e7f7f7e7e7e7e8f8e8e8e8f9g9f9f9f9f9`62h0*$  r  U6FGFGHHHHHHHIIIJJJJJJJKJJKLLLLLLMMMNyE"  """&&& ###X9HJIJJJJJJJJKKKLLLLLLLMNMNNNNNNOOPPPP ''',,,%%%((([=KKKLLLLLLLLNMNNNNNOOOPPPPPPPQRRRRRRS,,,333+++###  ...^@LNLNNNNNOOOPPPPPPPQQQRRRRRSRSTTTTTTU111:::000(((%%%$$$444`CNOOPPPPPPPPQRRRRRRSTRTTTTTTUUVVVVVVW_ .555@@@666,,,'''(((888cFPQQQRRRRRRRSTRTTTTUUUVVVVVWWWXXXXYXX^.999FFF<<<111!!!***+++>>>!fHRRTRRTTTTTTUUUUVVVVWWWXXXXYYXZZZZ[[[`-:::JJJ???444$$$+++,,,@@@"fJTTTTUUUUVVVVVWWXXXXXZXYYYZ[[[\[\\\\]b!-999JJJ>>>444%%%))),,,???"dHUVVVVVWVWXWXXXXYZYZZZZ[[\\\\\\^]^^^^d'-777III>>>333&&&(((***>>> bHVVXXWXXXXYYYZZZZ[[[\\\\]]\^^^^___```b.-666III>>>333&&&&&&***=== aGXXYYYYZZZZZZ[\\\\]\]^]^^^^_``````abbd4-444HHH===222'''&&&(((;;;_EZYZZZ[[[\\\\\]]]^^^^^__````a`abbbbccd8- 222GGG===222'''&&&(((:::^D[Z[\[\\\\]]^^^^^_`_`````baabbbcdddddf=. 111GGG===222(((&&&'''999]D\\\\\Z~WXYYZZZZZ[[YW`abbbbbcdddffddffgA. 000FFF<<<222(((###&&&888\C]]]^^RV~[bcdcddehhfffgggE0 ...FFF<<<222'''$$$%%%777[B^^^^_WBlNxNq[{NyNyT~i|\eedfjjfgggghhK5 ,,,EEE<<<222((($$$$$$666YA^____```V]bbbcc\,f,fdfjjffffggghQ6+++DDD;;;111'''######444Y@_``````aV^bbbcccc^g0iileeefgffffW6***BBB:::000&&&""""""333V>___`````V]abbbbbbb_rcdddegeeefe]6(((AAA:::000&&&"""!!!222S=^^^^____T]`aaaabbbb\acegddddeec6&&&@@@:::000&&&""" 111R;]^^^^^^^T\`````aaaabLx^egcccddddi6%%%???888///&&&!!! 000P:\]]]]^^^T[___``````b e`fbbbbccccp6###>>>999///&&& ///O9\\\\\]]]SZ^^^____``oa`abbbbbbbv6"""===888///&&& ...N8[[[\\\\\RZ^^^^^^^_ki_X``aaabba|6!!!<<<777...%%% ---M6ZZZ[[[[\RZ\]]]]^^fn^^xT``````aa7 :::777...%%% ,,,L5YZZZZZZZQY\\\\\]`s^^bqT___`````7:::666...%%% +++J4XYYYYZZZPX[[[\\\ra\_jxS^^^b____7888666---$$$ ***H2XXXXXYYYPXZZZ[[kg\]k\V]^^b^^^_7666555,,,$$$ )))E0WWWXXXXXOXZZZZaqZ[j\W[\]`^]^^^7444444+++### '''B.VVVWWWWXNWYYYZv\Zj]ZT\\\\b\\]]]8222222***""" %%%=+VVVVVVVWNVXXXndYg_ZZQwV[[_^\\\\\9000000)))!!!###:(TUUUUVVVMVWW_sXccXXTXZZb[Z[[[[:///...((( """8'TTTTTUUU~LUVVw[^gWXTzTYY\`ZZZZZZ:,,,---&&& 6&SSSTTTTT~LUVflZlVVRv&\XXXbYYYYZZZ:***+++$$$3$RRRSSSST~KTVzWnUO>i!XWWW[`XXXXYYY:(((***###1"RRRRRJazrrxrruh QVVVVbXWWXXXXX@&&&(((""". QQQQR~HĿ@i OUUUVVYbVVVWWWWXB###&&&  ,PPPPPN|O~Q~Q~Q~QRogZ~P ~OJNTTTTTTTUcXUVVVVVVVB !!!%%% *OOPPPPPPPQQ^jRRRRRRSSSTTTVdTTUUUUVVVD ### (NNNOOOOPPPPvQQQQRRRRRRRSScXTTTTTTUUUE !!!  %NNNNNNNOOOcQPPPPQQQQRRRRUhRSSSSTTTTTF    "MMMMNNNNNPTOOOPPPPPPQQQQcZRRRRRSSSSTF  LLLLMMMMNvpNNNNOOOOPPPPPTjQQQRRRRRRRSF  KKLLLLLLnQMNNNNNNNOOOOPe\PPPPQQQRRRRG JJKKKKLdoLLLMMMMNNNNNNTmOOPPPPPPPQQQHJJJJJJ\NLLLLLLLMMMMNNh]NNNOOOOPPPPPUH  IIIIJTnJJKKKKLLLLLLMUqNNNNNNNNOOOOPP H  HHHHN`LJJJJJJKKKKLLLl\LMMMMNNNNNNNONL    GHHJXlIIIIJJJJJJJKKZrLLLLLLMMMMNNNNPL   GGGccJHHHHIIIIJJJJKt\KKKKLLLLLLLMMMNM  FFvrHjGGGHHHHHHHIIIatJJJJJKKKKLLLLLLL&N  FiFxGFFGGGGGHHHHHQ{YIIIJJJJJJJKKKKLK,N  ^Ha`FFFFFFFGGGGGJvoHHHHIIIIJJJJJJJPY0O Lĩ\^NæOXTTSRQN}L{JzJyHyGwDv>}:>s=p;o9n7l4k4i2h/g.f,e,d*c'`&_$\rMN'P###SSSZZZZZZZZZ[[[\\\\\\```\b_ZwhYwhVufXvgXvgXvgYvgWtfXxhXxhYxhYxhZxjZyjZxiZxi[|l\|l]|m^}n_}n_~n^|n_}naq`pcrdsdsdsdsdsfvgu9hOL!\$YBW~fT a&\:2cE_$`'bjjj~~~zyyywssstm`* b-\4?oKy]Jx\HwZGxZDvWCuVBtVAsT@qS@oR?nQ>pQ,_@,aA,`A)]>(]='[;%X8$V7"U6$W7M1bqstardict-3.0.0/qstardict/pixmaps/qstardict.png000066400000000000000000000217371472531462200217130ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs B(xtIME {Xo IDATx}{$Gy/{ٳ;YVvV>;O@ |!c;|;y?csA|p6ƁXzއ}_UUYYY5v*~^^^^^^^XNy't~7m{;n~ (D?$]:{!Np ဈ@j>y@q["sowD<At^g :U3 qksW}~[rƏrlJ=B/zEDVgQƎH'uʢJ@\h[XNX= <\WQ9N .>?sGZGmfK,~p,@)sQVŅ>\J4nt>5V D}@qAty'lT,:c8hv;VoY٩[;hMkׄ״55:8zk ~K<~ dm]\G;}k199iM=&7\qtYȏ\dcff=k(w]7vM<b"a\~1Q,LU }b1V.:ep]7& ew'v^Z .C\;n1p C=nvIMo `R"B)G묇, 2Q{0Q2S:+@y;XTe +ꕟjyCGdS@Y\|Bn03pΛ=P1 0 8v>яC\ M%D 3Y@:߬Nt^6e#bz~0NNYJh.`eeѣG裏vT&tdd j*nxyN8qpsKJKjb8( aKq0}S "yb!v N p0Y@ |͘ RFc@}ށ}D`l6 2 P('."bB!#N>pAt" xK $mBqYPCrAAD=mcM|v4iN)ZtezXpj eFyK8<ٜ#voX$VR(NzSŽ}88m լq9\'v:_>L?xphup:cc#Uz6s8(m '&w\fi<(?J&}j1;H\rCk]2{vS{iN<pQ6EN{W:1_.B>F "x%>E)}\J „Ͽ`v^D P.<=]ߥ"0;"pU})gI>$|MS'pǮ灛f<}Am)luju&whVOw@fl]Sה`iqWZp] ,pK@6q}ާ6T *o Sr 0Z#NRwg ! 9!""pfxMPXM b{H  u׋-q`e|]QWG$nyc'p h 8VDn,&[,@uY^iBi:pfQ!Z wĽcV`*ۦ@9 EvܐA'-Bħ//RFخTĶϨЁ@U:A8s y5Pv!YVqلb[d߹ \XL%aAm}.ZdzLܙ@bb! $98 nV8tCvJ58}t_b66 TGd9Dv`vXn8QFخ`"\Z=1`h\ L#` YA!t/qJ`/o!#ÖBX \Z=?rvϺٵŖ<WC+NWZA1& cl u.l"NTD DJ0ok}/X}a x8c*ohR̕@$oTLh@LAb53:TQ#9 FE "E& Yk 0:U [: ^s9`#P8!tE{َGXgqSCl?6me" W03̇ͪ-bj.0 =_\_ A^q2)j (*,3eTLaʰL/ v\Vq(bEr{5T. K. jDQf kuՏW W* S ب ȡZvk$hDZ@GFr">YIbr7՚#H%>LNN9 lDp Ж J~F uam̌u⍕rp=9ņ\&#\ZnN]#"t hE48*@!o ~ӢY6&Pc2Pv *tmϜ}[phc(QITh V` T`,!h@6}3& 5潸{sy9:|G^pI<,ΜGt9Jm͎ O,(6Ja*@'+ l#`f!ɓzc>MbN88 k4='?>mxIToU9ܻy '? _BF3F# 6(^FBW5'>pN;dPBv O Ke`vCGƀs%ށ~mxIvv߅Oq)e+lpS1A}Y.YiۥU0jtU`϶x6Z;~jqBnzz )#1Ĺ#ōq%*I1NjbЛWpqEҶ+-B=%H|au]u҇KKKkJ%y^X9=jwVޥACi $0MD \?_Su9_y4X,>:v 8fP&lRQ||ӂ1%`̝T+e/\~ltnScH6JOcKw#j{b:rGg療te70WpU x#G$ڵ }jI +% NfldO R}5K2>JkR/+>ݷ!-wM)l@ f6x7T4'uXf d3YpzLkv`qeXrd8|G|+qRgѸ<5j4V+@ 'u,I$b\5]o c\EWk7Qm{)\4##+̪i[XV nRxry&/RN-<$X.ߏ? 1ӈ[\,~w VFXf r dI+^l޸f z8?zz2BP2$L7)uJeBYPk WpäӢɊ KMӏhow^T:{U al#L MiQVQ YBMv< kb!UgޯZb-paC  j#>,2538.׀r/* \_r1\Z@ou x2֓$U_f:73k q~M:L4y 0 ;u_}:[ڀJCp;&tn*Ev߲pNk"q H`I nh$"WrDZ/FT+@&NP)O19_Yʖl6g".Uາ-_1f Y3*ūQfodlE,G&OS v`bbB{sN2( c@H |>rSQlm[aqrWv.@"dA%42eID8~ /\@f!\1(mgs}C_y([\# GYWy><&}~Gm\?2D< 'p@Y0\ F̰I2u\0VKD?1Y8}.P.IdzڛfY B;B(4|}9Kpp8nމ177g>o~3/_'0TM_ 43YAy~CYD 犺1njoPr`[~~Gމr9m|SC&fnH\J[7 X5-G|f)h XY&")T݀*P_Aq>&'~ RXO0sGL{. S [} {àMkUAW$M5lḱJچ"E#|n{o=fyرcGzxg羉Ca(tOT}P(AIà_Med B\Adk 텟;_7ŷtkbI_Em=ɦ QV1]FZܜqx2og_],Ƕp=kĤA wJʤN W|/m܀n< 4 "*{ߔyB7п3/--'FsLݲr5E)@; buJP(-8I"D~2pfV.(ZvZ zp3z4Z#Ý^ZO\,ҢaEt@잀`<`mF%#(?:=W7lő @n dnRwP&T0r[֤H& \F kTX@+@#7qTIsOdj'C)QD3+?tY.@r@55 5ԣY%']D'` QDOUxxc!OP{XRA(.hT@԰OV5 MJbS$DBڪ"nd4ֈ$žߔɯֹD椉5A1Ƭʂ=z9aaHP7EdP:Xh0q~dAߛRH\5jK*84܃Ilχn :[Nx9 ٔ0ж0ihgJOVEL rjMSJx)!3v[ fCmt  6 %y_'{q»3$Gzo#Kn!zN +Id$>Bt4룷d4* [ p@IӐ*Ū t( (m 5R 1`d}h,{U. l`tE'==Hq 6a,Y 9IZUՊɊA0L5X297B?}l ohR7zwL]S| p)\,9 ` ]Hg)ޏ&T JO-#8)n@ [U K8HЃ-dA책iɫ<OI$*B҆{*Dٕ1>dO 8n0E?Ŏh|?6%]fi(``|(E\>>eIzXnw}8ro-lUS/cH9r0kMnD%r,RƱ!_PsD?,"0=+|;`$ȤJZ ʿe(Vg@ӹD"H 9Y,C}cG|TNs8瓲Ol.4H^j'qűTLID%c$`قր"aG=YjebƠ&bFt* 0{U7EdPV$SIDAT1,dܫ. RHIcX20iF"M$ )ט,Fc;߳z~^ wzu_ 6 qKtg˳e; 8ޓ;>5Z]"'Xߔ}jT,yYT B"_S֎ŐێeY9M^0c\ݦ}.qJ&aLf?M̠iO&ɦȟ|SUT uCIENDB`qstardict-3.0.0/qstardict/pixmaps/search-filter.png000066400000000000000000000220101472531462200224260ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME "'M: IDATx}il׵MRdRKdڒ"[b;q^-8/{@H ـ3q C yx@`3I y%kuƎmŶ(ZR$KfdѶVJ$%RdUu3?X.IʶD6(f/u{wι j!X"XB)mR6BqI)mFBH9D)HF1J("(m̶mʵrO\B<@²zB!č1Rfr\S.k- -R" RUvB" PHΞ=Y5L% Xj 1sūSN;)]ҕ"! 6pm|B)a#]]]o\ݦ&DT=Ż SQMRM===k?/8qqe``?>00\xQBd2 q$ … q˲ ˲֐@kk鮮7tӻw}Y m&+GQm0::J:::୷[oeYgx#Šy{v\p]Zp!cE9畾MMMҥK0:: }kӤⱱ}}}wܹ}Qwٲe}ݯu]l'!xfRJTU%B8}4AD#@P|qw}$_eCCC ۶m__t{3뮃ŋ @QQR0ΡND"7엾~2EUȠf6ضmor{g_%_644{{ ~?qы/RJ: Xl8\:L&_7G?Dl/:BpplB|pp_߿gyVݽz?QJO|[/_~Zws-#RBǜ=+{ցs~]vO~r@Ju]Xp2ߴijD5";w?߿%(*|/${_:^H$VZ˗_GԎ;>7mߞze^2hƍkJ? !~Í7fP%0?7Ϝ9UtZF{춗_~/ Y*ny۽{lllRtRD"c֭ϵj y衇úud BCP(O:ŋGGGrBƠP(@XZmRFH$*NRD"566lٲ{M 5 b1f>_{O~7)oŃ;noood "qo~n: eY˗//hlllkR e(fP(eYkG`b1HRn(5/SU톆c',X{inu=I)5׬Y]b}=zW=1/C B:_dťKZNeنt:I H4hss3D"0 e뛦 B2 iQmǁ|>RJ, J$_u]]+&c c C4|az*!m !#H?L4m`Rlp2;410 s|3V?d2)8{D,YoP싈daYB5^WŸmQD5MSb5 NhE9 `&XUxmLIX,\. ˲ι-(@AQ|,GcT*5hFy`D18xꩧz"4M˴瞑H$׭[|xx w̙3^z饾k%Pud81,HOOO;D"Ý$`|7IsRq:BA:#!BtpI) =h&E1Rj !h9S望0A@!Rp5ܹsnu݊wޙ9͎|ʿ*ؿO?￟VɪeP('Ʉ8DUUiRuQDdRJGRJ B8RJ&8,$*$bB "n=[?L3 (pB9Mh4Z^zuFu8p@eY IJ|g:y(xጂR2Ƽ=ѧT[f ^mr@D.зV+yA̫e\N]e͞|WWCLZrرc;vk.Sph0eRɶmS rRO)GU{oJ)!Txü_ FE& [J)HĎFV[[[q%7CCC`ʖ-[Ҟ2=oހ_2'2L7d2 o~րRJԛSޤ !2UrRuoR)sy9)l݉l6{je۷yϞ= @PUd BHdW }bVzAL' 򇁁PV$+Vd(?~hh/W=Qu?````^qߛE9|ws.ŢI)B$)A"<čb* +w<x^hQ.J 'xbٳg^ pȑ۷o?n6 «tRJ|SʂJL0Mp#$HttCe^FH$b绺L7ٳ'[,/]TJKlْ*柉,ɔ3nTxLG_vҥ`<XDZdI1BӟtQ__ߟiZ~ɓ'Gvܹĉd:H]9$CSUިw@_I4MwY:7 2 ^pa.JBY~}ѣGkW_=nζonn*14?ܟ9,JVT#8TGeP\A`O\3^2K'z{{B0 KuRH&6ݻ{}'_(ڵ-[) a d$XUKo wF|U _)I},`k~P(={ؾ}{qppo6t1k3onzZHM钔9[D# 6%.}ccc񑑑f]׹v4s1_*׷g`rߌbZhAa.0d뤔0 MuEQJÔ>H !/{I!a|29bqMʆa]]]ca؄|ǚ??{-6 ¹ ~j\O]l:A{H BQH\5LBr8>)p8eY%!_?To/BO2_y?Jl@Yn_nnnmmmB " \.g9#@w} s~$w.\X`YzQ4MMMݻw8hN:M)m馛,Ab Z',N o"zn@!.E)pW?k T"-XZhp4!D(ׯtرs [o!V]v"RB0F !%oT̿\a J7:~E9gΜd9ZҚq۶s/̕>hm޼_vL"˲is.@Hx +1,qҥN&jTx'RMTEQ4GoWt6MӶ,˜I?00BUU[4%(sgyɓg⽞8EQ ˖-%%&BD$hTUU@H=BGRJ۶mۦmۦc~˗/7jj555e5M'|бcǎڶ1ƬH$RN$]vg}SN]{ZS/putt""QUz j$!c,!Q rYJ%V,E\V)RJ!Tl.sΉ(4"cLj&܄Pͷh-^8J(Զm, 8hYZ%-8s1cBUU P#_Q4/c -EQPUUKEQeYdʬoƘV@Yf.nB0O,".LVu/:j 64@V]T@ ETb6IAwcP+q8ڿ S?A? <˩܀_![~ݼ{LϦ 0A0o:! L]`/Ո? "OWl@BF}ts G҄OT%nA`𪼠ڲa)PxԪ<@FSf HЭ(9D|-@F3^A}&m*j*B ȕJU@YRq?j^@XV58{D@>O`&3UÈb50P60e>c bP<@HV:9F)F}hV ( z5y8?Lj` 5D${xG56UQ = CAP ika#qPXUasEuX$ UXIDATX̪g_H)AJItp&~`upԠ @)儽y>#Zp]4`Z@= Q7P,QqOe_8IZ:j- nt[ԣ|&8}Zs%^3uԚR(Xm*qR&Гի5Etj~ty$a1Sz =+(Nb~;lI(V! KVAY}ީ!a[K))"2)%R*sbF墱XٶBT)%CD2#DJIqqN(\E0cfê,i9$$=:f͚8"(n?DPZ*Pǡ, ܹV@ƽwI?̹;WK0=@JիWk 7кzHCC#m9ڶ-٬Hv.sl6[xbɓ.\8*=@ dw # ^ Wcۏs!dc su* %B|va#M!_ 0½8Pv_=?}kN3ٲ,)6K,w ZU{^e C|#->pB.ZZ etwmы@>pxȨj 3׌@Ty@000 s (LA4 *S)~:<˫?M𔄀ZW>(~*_; &p]kx?̠%Q@֯>ϞcIENDB`qstardict-3.0.0/qstardict/pixmaps/speaker.png000066400000000000000000000344441472531462200213460ustar00rootroot00000000000000PNG  IHDR>asBIT|d IDATxwdWy97T3ݓg4i ID`06k[6ڏwmYl,b0`lFAPBaFyz:s~\]=ea΍U]u}s{N-۲-۲-۲-۲-۲-۲-۲-۲Px#:|]N30#޲z#?P ,v1BUBU(Z<(MPӠ&L(iFkG;>q? ԇu{6.L u)J@R3xs_<{P=1:":P0ؕvf/Jݮcݠ BP] c{&+!M4RPryޖ?6p|&{IPX1PT6%h ./j1T= Ryo<١]Ptwt6A'l,mL(iT;m|{7ΰi `J?/-"HYq*45!?ݱyabFQ^A(Z`j |rd畤1 ͫ3afIRi膆t#4 N) 4kciqplfJy~ҳԫh{>Tf%C+8{ú9ds]I|ZS㍰*a}d\V=__(~RyId6n`n9z{ꤣ#a4&j acYe GJ4a нs4ЄXU7u]t ]P sS;Y(Zzfc$VT?Vs %NUVS? ߿|˓;/߈K~+})fN%7`C7r  L~jW 23;wRHOe}h7$/F]xpA:a=z8K?5w#Bw@H M w}$C@Rcvc'enz;`A_9\x^&AEU±4I qgO A<yW$?V%籵5~-]54 )|%RGz#P @_z8Q#8!1=5Mb٤RP7pM6l:|x ALίh4EPs9]lU?qL*! @t4֨+cXjWG݁ lbsx*鸛p'׉{)5} |p-, Z۶4M/?'u5R58xI/UvUV](&d?>qrgׅ'`vf dfTAn)$1ZN  P Vpkq58n,݉;%i&0M˲XXXV8ܷp/dl ?,_Z ۽J6Oxח#S6@ +AiZ?B3+HG"QbHlj%O {?鴐W$4$ &FH$[/׽.6~b~n?~{Gx} xY.{JPLkfɸ^A.X+ح鄾 kry U%qN t鹛DzT0T+JXK|!ۯy._}7J6ٷw'p'+E\wa?|G^s(x`ld~IAr*鴅::=o~E1DTt@NlҏH' {q\\" ӺvK]mWө Ai~r۲PJ143֟$UNqϷa\1 cDҤkEV:W=^3{s.9fH&5*rm p:0( >_s|"$ΫD7) $I6|dGءrv6nl6U=ir"q@o=؍e;\xe&&&aזpsb=f<+[ R7(^[@*g&A\hts,^= }e7ųd:ntƒjlWh:peIvȦNKfYv /7&jb҈{*Hq"AoCP xJ4M4M@ Yo:2k(+ԫ95 l\WCd}A*NWoM~󍝯JƫojrZ1#h-U"<ē؎5`<>Bm!myCP<>VD?˻/|b׿S i"F4O^4L2,=}Sa~{vfI&eG34r^.oIdX M֬Ϸf,K ֯_O:ĉ/ZÍpLd o/bnO ^$B.h?tU~$Ij:&tn@RY8L%]}tՃ#4A#+%ĕ?2 K]59^e|B;ғ :;<\BkI9GڶcAn;v0ڭQov,ʷގFv-9۶m;F*EG@:fb|ttl U>#OR }Ch^i Azlce6b1J) C24P{!H2rT[]%xi}Qr7i=v9)_T\|鏍uD\l C4MLdzzjJ:BT\B^j坌:tq7T& Ь[+~_qK*L)4~^s&O.?^WTx ?ɧl;ipsNR-+P+"! 7*(A."\_4b-KMhd2YK̐Jܔ8 _X΢Q~ɉL&Ʊe=OOw͟~IX<3k;k'NJiyA*3 ٷo௝@xň "!z-pZ|_Nvlj x4G;=bx5?W--dKFQIGQ|?JBma/ك864|t6c;R}KU-W|P)fې KeP$l,;x{fffKs0c*ǽ.TM3%B[mދ]N^ܝ"wK;yCq{hTM:9r01L!lBr=;4>r L|Kimxפ&mEDPZ*BPMg{Џi61E |vv5,!xK2RGZ4Q ۑ"qI8W3I$Q4]'HPSY0/YfaYcfrF!㽟7=Er :p̌E.)g ԰c:.]w1[2gR>?9)zDDjy*!/'rKSf)yGOq_c 4ǎAJI:A)H$(,Diid6WA#Ce?x_~/%p^fX95Ѥ;A6"y~݃10ϡCtq2Ir:} T _2c"~RuAa7(id39?L$seIMXV9t|/h_Aanr~ç~6/6X,I{AjS[m[elz{ ibG4ΎNpım)@hDBIrq*wHZPVi4HЄK ֠/ x^| "y,3*M> Ug7ϡ%QuOW7m̑R#'&aө62O\/-{;^>rXMJ^4ha$$~(󨗟gY\%^@Υ(T>ƿld[,uI Ie/pS<+>Uk9 -$[S $ ᩀwEFh5N:DL::v}ش AU0^ƒic1ytH^<+ّf,*sHoj2L=SP? pԍ7}./krVIiL#A: ^YrecfzٹFgM}*`jz 5MLx'nf3^O A^qstvtk:aklQ)Nl8IX? LNM0r+~HaN<@^ͦuB醎nba_157}1 YdbA̠'ui2Իξ২T*LMNDB+/0 3?L' V" z<4t A(ߎ>=J0c903}}e߁mBWcfұ9v9=\ O*4[I}q& NUmXGW Ybj. L!"@a?^񓘉FÎ,RsX% R$Dd'"ix0-eDc !~ 8S'T wXQjQNT:\&ϓ;cJL3guvqD$<9{/Z_UU_2NmuX-UsF ͙cfBaH*Z3 1241j'Ǒ<DPUl]7H L&k[ˆ47Ġ?"$B<ajfS'Xr B*ZCb5?2]MEM28N-]w"q ~ۛ D"Uk.MbZX(qjl 6mYQh@j=@u^ػ65U*JePtCQke?6^+e$w;ك}z1W 8]CE@)-"#:?LQϵ,,@{]d3YD\ [0&`Lxu% s4IDAT!̗Xv+ϸ|tgBBGcB`R IN=Uo#ԩ5/WD;vXۮ^q4gއ؏6GR($H߁ ]BʜgEnYq~"ZbTI.OH$I%#ˆ j~X$y}6:vdӖQ 5P$Ɓ> b{;? ΊQzMtv:ALM5 /EwSn !ԏ+c %g5lpjdzcXЌPדyDiZZIl4frr@ܖA*L jG{"għam3_*qY_;[ARD:xasvL&#ucB-[Rl+&'nG|-o:  3O > -4,㋂C frCk,z-\)ё 遟~SP~~arpRG΋Y֭H*:#MTEq~jBoOD3\N!0uNf:?sۥC.S#h"#FP%b).2]Lt033q֋Yr<]]~Ph&- 4@e, 6mZZy&rz!֬^.A6/sH2vMF*1sDf&9hB&'O23}[02J쓡Elr{@[q Zry!(6 I*JIV$tcT*‰N'no>7? ;%@G5-vQқ5'ɞϳz"BehJTW{u7^0J|HaB"G.PgMQ<1S,120X.d8G6ϕٹYg$˓0hm۱lۛnY[+ZjQ9X-1|On !8v0==$ɘP)drf'X B#`}m) EKBz B8Gdn ]L=h!dJƛJYzs٫IeVPőN$@QT8px?ߏ v,;"fϸ@[m׬;B KgZgTW?qb`|bT*C6 K 춬|7`;ɲkR>:H p(x7Dǻ@8(,;H'J~\rЍ<^<ЍT؎MӲ, `Yؖ!\đj}%Ui4N,r JAGf·I' W4_ xh4=b=+osO ZY>^*aTYYx5I\ds4 U|Q|Xk<?cx*^ c@+kp||)%۸Go9tG*ǎf5'5^s-LSuߵ f\U >0K@+@s%gyopx[(J9K/>`G'{5];xDj-=0Y&F#^#cA6O}dGvځ{6PvG#C84+BO&#D@Ԥ8]u+k.WJ4 zz{*paJ)-,t7"1nEiTs%-s3<=<]6{Ќ,!+ˠ22+ O;s3YO"i5h4*;i|7<zV@~[hWS `koϦXKx|߾kVԏW$IH$eCRelt |GyX"w1$ؓ(iQ^(\J-z{Hu\+4k'Ž8g}vfTf5xs ؂H.-7Fp"@#/B˶((tHfd[Lݶ-z&Q@46# 腎kOn /=d ,!v8~8nN,S)2Ywф:$=אk%5v?0w`|ϥt Ha4f}Zsc}ɧf1+@gm[;_DMVjCX+ qt@ CVT|.lkg_ǺU^rbu]Y&v1Ԛh50.|9r[TJ c d_`}8'P$a卛~՛n@h lR}P{ 1>:+t\ \)SUU+T[{&+/F {ś;2i!m5 JJVTNr/iEݽ+'*#,x_߻wTщ6#`Yw=u*Bwk+V`u$S hJ)d ~4(h wnキ&[؀@u 3SJLlaݏg7Tejf6å -dzٻiJSV&$go]WQ%dѓu >'XAQ?sJ)-:0 6lX4 q78-:;{uYn i.MBVp6neo5/LvV|SV"crt|#k( i뺎Fгh;ݟQngBnFVϳ.hB&^pތ'4hξk[ؼ.̗V]i֭[ݶq`&DX 4bU^\K*w@ U;F5F+ùl`[К1(`Ua#*#7ˌJ-lrr , MKtBJGYpH,;tt诲q9o !k#uUE%FOfR*'"Ͱz`J=yP b{ƊYL:&l+]D#:!8\t :̣d)؍ !1=؋C;2 a^E /F=U|iGr㎝L3T5rCC+Q^f={?S|2 jj n!:9Dd% C+{µY|Ǡ+ϲtj8Q5 ~^Jy⾿YQ]M4A&+n6RKW#A&fhxpa-{~ N8),+\1k%CkGY'v :ڒ0t8 Nv)BѴ2D*ܳF(\?&Eu%OK: _H$ZuO>$O=$ uZ{C7XϊtB )pq< d% s6tvu}=Yr4n"6UEhUtYXLW$V&'G߇{ ldx _הRh߀L&$Iydnv}cGz!I308@T- ;J# $6 `4kW&Ȥ S!c[(i&fD7t SC7tWtM.ЄpPBG! 5y'Ng@jJ~q)o~7>y%%]BH)чajr*$ΟNr}tuu-1R8u4g%=PS$O[C0<\V'I RIL&pJFa+ 8ְ)/Ԙq<7/X5yN_*o>O7_,E 3A__f"v:bs |":R)zz{$6+۪q#d)"TaAVVH=Z3P`ǽ̟P~g_B+111{8z\DjU49t mՔD* BV} n)ݞE͔RI/8}%9Kfį{?*rmc5/r JsqJbHdӤRn0c]ubLi|Gѿvwm '>-R_WJ .Zk:|l&S*3r$###ggA8u7]0Mt%&/D5bاگ!*=}wqjڛǻ!?zLfB tMkzoZ23= s,Qf"J(lǶ-] lYޮZ`q}B%J_Wg8TLvRRC2"H.²lJ%j jzF^r!a^-74#D7MwRG.vl{SO_goF3?3Î)QkU0tD2I4֒\њqNk&Ng vm"nerMK~]T:*C9)+k/,ϼdD GJl˝*nvl']O=q\L/#oUTJH"ƐrQBkvzͽ IO{]Ѿ`^3-~zAnvmV+R:/"AK1Ee;Wya#Q0'7~≧ry%E}"9Tkx@{7DK'?{ot9R%ov99;{nRJN O&s\I[?f~ǎ_ '@-PۤW*)/J .4+%+ԗt;wZo|5?ٵ7߼F98y(ށ!J>%JՕ5%ռR*%Gb|H3LfIfM,%,a}\pHK\VmzUzj.WiVą BBB d̚Y{$/9=?P(DCIC*UU׿/-^XXgڟ*}@L0U*}#G+RW-eqܹ*7BHwy%8|ާNFag*WMgz J~f !ePBxoؼy/aqXh0?CXb{H?jwHhii#[.}iLg ,>)'GF …3a߈ wcʙ>}=(?,{3srd6ܗy /U|q|f| 5ulJ%B᲼8 gO\۳x,_~gJEjjF h"+kN4)ѣ 7(.UbL5୻py P5).Y3 (0뗟={XRQp$N~I~2Tr'iq=LCj@HJ&[P^uYXy>y~eK_z?pG}dڵ0'[h&a? /#?3!Ɇ A09 ESG-Z09+_|j_8G~?R81Y L3y6K[Hq 6ó+- B*SsN'9p/33dCh9{}${Fh#0X8)qK~2TAvu3TUXy+w{ _.8XF!|znS;TKjAJY1'y<Sh͌cDŽ8qR@R%WuO5B8P]Q|3<#Uқ6 i@rriNy9>{hd,b'Ì[oSdZXjƴ{:?1oƏ~MhCq{S'5{-Rkԗ !c)Eǒ]v9 J @CyT-Yr'&ikSS3U$ظ8BѢwXO?cO('Xr2##CP*}0O^x LHܷ/\@h#>5wܼLS?&X3 JC.7Dkn]N]LirVgj  `}}Eiid텕d0(';́5 On~W2ZG}{)dowIg}u:&LFaMF@%\O# nwQ?0 \n h% ?";lI~*tFt ^$[NcXŘyytǝw{T p6\lTTT1Elz(~)nǎ hڴ7Q(3M?71RS}ݲttvJNk׬ᅱPZZ['<여,JqqEȾ 2><" &k94Ma Yh A:6JMKZUJ_]⭿.nypL$<@=uKK( DB`'+Mx"Ex"`fV|x񓘐Hymx"<Zhk|n9557& \}|7F_P*Uj3qfzl%nq,|"wj7ȓ  e@ RFIu5${Yps!'L)"Lj#&cJ:C7xM?x܄h=!TҰ  eG//aEHh|PVfY*&֍^+\`D)m6E}0:i5 P|$ߏH"E#>Tj )=x41K89b(3ER7(2|ୡysYsfqJHL" %|.40Є4=s"1P:*O6!*6';}|q'hQ}@ǥ]]2 RԘ&StcX!ⷢs1ԟ|`g|/0gAi!eX)W 3񰞸X- &QPh6g>:LQ J痕l~=G_hl 1&r7Ga}||*ck# VcJ`Ah5ֶi)l}wnr|+jTce O).f=a  /TE+$zrE667*Yl-QMm#B8)'rH kqH{l kI!=n2X³A&^.V,0aʘ7oָKT^H(;sfPWIXVZFJpZK_XP>0"=Ph rTIl4`0r٣ɑ,8̩S ]{p@w\v0H?GrQ3 AqW`>.]zʱ[``%`E#.1q ab-CGe*0Y*8.:8#ssr?]⢢73xЮ`>_+: ;}52\F(bj(M!VOz XK*IN[\iy',4tv߹v ho>=ŢpIBM?-CG9 [QPcd1኎.JZ%2Vns, [ir氂K@`8 4rnF,`|WBY@wݤ# S TpR *5any[T˖-'<~T@b7XoR9M gQN4 8UO^łPt xaxG \\`4J[|nǶF BZ2q-:ZB>Shk^:X'2D9rr"HMGFkiB7l 3@x|.XZI9"[[lC^5*L%3g*bץ?͢ÇӇ(2eaS'9nzMa1* έp :w y1Ajl%쓂^LhuTްq#՝@Yo‹/ M2> cq,:nXF"U cHdШS `SgJf|[;E:S6V:vb}{G;YN~teDš Z\~l |D&P  YL-$:HY(okjkHFt-":D[MD5.\ /CXaZq ?*`S8M7HG)I&9Q0} LF&#CD ":He%u[mTOG?ӡ?&Y{"?ÒzcPsHS@EmoKmnJ2nJ۷ok|f_&ITD,€m Z41ndXS*R33Ps4h# Aԧ!%rxT Cqv9k$E#*S&l{6(EJO ؀\l|cL[*lIw] s`e}|SSH|K5uSb\4e"}QTie`>\3Ԕa%K!0#3(4ݣ=c /8=.& \A-'f,^j6E4 y<8OrNT6sh+%ЌkΚ=In#D]h[RuvӰ!jWjHFks/ {pyw 9(hY_Op SMhd9Є[/8çN)SJ]FW4"Q"MxĚG`;e.uTR:jkjo[&Gh>Cښ^kԶ} *JTiK(BksS2*}{ue]qĤD"V_057*+θnzI x"UJ\jzju.ꓖΖ3xOc>BF%;IENDB`qstardict-3.0.0/qstardict/pixmaps/view-refresh.png000066400000000000000000000057041472531462200223170ustar00rootroot00000000000000PNG  IHDR>asRGBbKGD pHYs B(xtIME '`' DIDATx{pTǿs7 |t2*u /% &VU'>ZjtfF#% X1yAŠ؁+I6{w'sf'9;sY@h4Fh4Fh4Fh4&^ac}XoO[P %J-x,o-SW&0ZqBVB8l i J! ?*!&GY`5Y$4q#_BB%do. Jiq$ * @9PTc$$%Dt7*ւ(l2~u/`\) IIeOZ<ߪo\@S z1[ {A*Q_MGPTc$%%prm wwV`-|Ӗ,4WrgG^4@1eD*ȳz u?իTZ&%]^YI*7mIX`\QMJW_Hv?P]8`1$$*A jw'7t2][Ь`miFЬ[}cUl[6d%fqiǺ܃Zvw֤;(wݣǦG{-!vƍiK{aXy*@{$V<LP{DTb-eUy<zv+35p Hl+T@!ď  Sl;{sfOȸURHgBP {o+b" Zr9sK H~>Gpwﱮ]2-(p*gK R c^dzbZb*DIpӐ$>HbQFIsfp0܃خ=fkr_Uf["z #4_!jcޞ1mOi5/J^gn%01E |տ'+2Y xk({qZvZ gO RT:.^0'M h]3`@aI'y, w)hBJ|2s<;5)0/zOF I{#ϫ$ a/_!! QX6e—5`RRmGca`,e\̱VA]=u\fXb'dzMdZNwV*2s2-CHl %;&yJvL"1}(َ1QߞRz #h3_I 7ط*C;:~Q,jn ά | wpC]}і.XZWVO,+e.Ƙ@ʨz[Qq;n3wPPaӭ⇏Yli^5/mrU qd؎9≋p'/@]E(3X?aװD+fl'p%)/®*>X= x/R׳isDЌōZBY$SZRcxP 9psBpU$@>6~V>{_X޲ƫq5 Yd{Ca 3CFCc{Od7 `g8(03@fr)CF8'ĕ csي=@h"Ѫ@;ܥ qo} qUuoLRbk"Д{0W<ƌo%2iE7DSMM] bFW]ya۪#b\.`9@6Er7ߵL]f@ `Ǯ7}\͕t!Qgon 'x{ߘA%Ӈۃ{|W#Vh[?rjGz:RzvfD*pJ$}i^/c -{Cx-8j`2g)%a'.o1ט dltM@> C_,鎕>us IC(Q2r:V~4w_'VHIS5]jFh4Fh4a%ܶſkX'lp)aM](C}nQXp-a>i0 CAQ!-x@`JġG2p hb<V#"){pœ<7bf!`CiDKbF`Ю<@4?O"Æ7)ng(SB`H+NEʐk0"M%IENDB`qstardict-3.0.0/qstardict/popupwindow.cpp000066400000000000000000000111421472531462200206120ustar00rootroot00000000000000/***************************************************************************** * popupwindow.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "popupwindow.h" #include #include #include #include #include "dictwidget.h" #include "keyboard.h" #include "selection.h" #include "application.h" #include "speaker.h" namespace QStarDict { PopupWindow::PopupWindow(QWidget *parent) : ResizablePopup(parent) { m_dict = 0; translationView = new DictWidget(this); translationView->setFrameStyle(QFrame::NoFrame); translationView->setDict(m_dict); translationView->setMouseTracking(true); QGridLayout *mainLayout = new QGridLayout(this); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->addWidget(translationView); m_selection = new Selection(this); connect(m_selection, SIGNAL(changed(const QString&)), this, SLOT(selectionChanged(const QString&))); loadSettings(); } PopupWindow::~PopupWindow() { } void PopupWindow::loadSettings() { QSettings config; setScan(config.value("PopupWindow/scan", true).toBool()); setModifierKey(config.value("PopupWindow/modifierKey", 0).toInt()); setShowIfNotFound(config.value("PopupWindow/showIfNotFound", false).toBool()); setWindowOpacity(config.value("PopupWindow/opacity", 1.0).toDouble()); setTimeoutBeforeHide(config.value("PopupWindow/timeoutBeforeHide", 500).toInt()); setDefaultSize(config.value("PopupWindow/defaultSize", QSize(320, 240)).toSize()); setPronounceWord(config.value("PopupWindow/pronounceWord", true).toBool()); setDefaultStyleSheet(config.value("PopupWindow/defaultStyleSheet", defaultStyleSheet()).toString()); } void PopupWindow::saveSettings() { QSettings config; config.setValue("PopupWindow/scan", isScan()); config.setValue("PopupWindow/modifierKey", m_modifierKey); config.setValue("PopupWindow/showIfNotFound", m_showIfNotFound); config.setValue("PopupWindow/opacity", windowOpacity()); config.setValue("PopupWindow/timeoutBeforeHide", timeoutBeforeHide()); config.setValue("PopupWindow/defaultSize", defaultSize()); config.setValue("PopupWindow/pronounceWord", pronounceWord()); config.setValue("PopupWindow/defaultStyleSheet", defaultStyleSheet()); } void PopupWindow::setScan(bool scan) { m_selection->setScan(scan); emit scanChanged(scan); } bool PopupWindow::isScan() const { return m_selection->isScan(); } void PopupWindow::setDict(DictCore *dict) { translationView->setDict(dict); m_dict = dict; } void PopupWindow::selectionChanged(const QString &text) { if (m_modifierKey && ! Keyboard::activeModifiers().testFlag(static_cast(m_modifierKey))) return; showTranslation(text); } void PopupWindow::showTranslation(const QString &text) { QString simpl = text.simplified(); simpl.remove(QRegularExpression("[&%-/+?\\*#!:\\(\\)\\[\\]]+")); if (simpl.isEmpty()) return; bool isFound = m_dict->isTranslatable(simpl); if (m_showIfNotFound || isFound) { translationView->translate(simpl); translationView->clearHistory(); popup(); if (isFound && m_pronounceWord) Application::instance()->speaker()->speak(simpl); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/popupwindow.h000066400000000000000000000105041472531462200202600ustar00rootroot00000000000000/***************************************************************************** * popupwindow.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef POPUPWINDOW_H #define POPUPWINDOW_H #include "resizablepopup.h" #include "dictcore.h" #include "dictwidget.h" namespace QStarDict { class DictWidget; class Selection; /** * The PopupWindow is a window that scan selection and pop-up * when needed. */ class PopupWindow: public ResizablePopup { Q_OBJECT public: /** * Construct new PopupWindow. */ PopupWindow(QWidget *parent = 0); /** * Destructor. */ ~PopupWindow(); /** * Return true if scanning enabled, otherwise return false. */ bool isScan() const; /** * Return modifier key. The modifiers are from * Qt::KeyboardModifier enum. */ int modifierKey() const { return m_modifierKey; } /** * Set behaviour for not found in dictionary words. */ bool showIfNotFound() const { return m_showIfNotFound; } /** * Set the dictionary. */ void setDict(DictCore *dict); /** * Returns the dictionary. */ DictCore* dict() const { return m_dict; } /** * Return true if shown words will be pronounced, othewise * return false. */ bool pronounceWord() const { return m_pronounceWord; } void setDefaultStyleSheet(const QString &css) { translationView->setDefaultStyleSheet(css); } QString defaultStyleSheet() const { return translationView->defaultStyleSheet(); } public slots: /** * Enable or disable scanning of selection. */ void setScan(bool scan); /** * Set modifier key. If key not is 0 then popup will be shown * only if key is pressed. */ void setModifierKey(int key) { m_modifierKey = key; } /** * Set beahivour for words that not in dictionaris. * If true then popup will be shown with text "No found", otherwise * popup will not be shown. */ void setShowIfNotFound(bool mode) { m_showIfNotFound = mode; } /** * Popup with translation of text. */ void showTranslation(const QString &text); /** * If prounounceWord is true shown words will be prounounced. */ void setPronounceWord(bool pronounceWord) { m_pronounceWord = pronounceWord; } void saveSettings(); private slots: void selectionChanged(const QString &text); signals: void scanChanged(bool scan); private: void loadSettings(); DictWidget *translationView; DictCore* m_dict; int m_modifierKey; bool m_showIfNotFound; Selection *m_selection; bool m_pronounceWord; }; } #endif // POPUPWINDOW_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/qstardict.desktop000066400000000000000000000004351472531462200211070ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Comment=QStarDict is Qt version of StarDict Exec=qstardict GenericName=Dictionary Icon=qstardict Name=QStarDict Type=Application Categories=Qt;Dictionary;Utility; Name[ru]=QStarDict GenericName[ru]=Словарь Name[tr]=QStarDict GenericName[tr]=Sözlük qstardict-3.0.0/qstardict/qstardict.png000066400000000000000000000217221472531462200202240ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs B(xtIME "5 r IDATx}{$Gy/{ٳ;YVvV>;O@ |!c;|;y?csA|p6ƁXzއ}_UUYYY5v*~^^^^^^^XNy't~7m{;n~ (D?$]:{!Np ဈ@j>y@q["sowD<At^g :U3 qksW}~[rƏrlJ=B/zEDVgQƎH'uʢJ@\h[XNX= <\WQ9N .>?sGZGmfK,~p,@)sQVŅ>\J4nt>5V D}@qAty'lT,:c8hv;VoY٩[;hMkׄ״55:8zk ~K<~ dm]\G;}k199iM=&7\qtYȏ\dcff=k(w]7vM<b"a\~1Q,LU }b1V.:ep]7& ew'v^Z .C\;n1p C=nvIMo `R"B)G묇, 2Q{0Q2S:+@y;XTe +ꕟjyCGdS@Y\|Bn03pΛ=P1 0 8v>яC\ M%D 3Y@:߬Nt^6e#bz~0NNYJh.`eeѣG裏vT&tdd j*nxyN8qpsKJKjb8( aKq0}S "yb!v N p0Y@ |͘ RFc@}ށ}D`l6 2 P('."bB!#N>pAt" xK $mBqYPCrAAD=mcM|v4iN)ZtezXpj eFyK8<ٜ#voX$VR(NzSŽ}88m լq9\'v:_>L?xphup:cc#Uz6s8(m '&w\fi<(?J&}j1;H\rCk]2{vS{iN<pQ6EN{W:1_.B>F "x%>E)}\J „Ͽ`v^D P.<=]ߥ"0;"pU})gI>$|MS'pǮ灛f<}Am)luju&whVOw@fl]Sה`iqWZp] ,pK@6q}ާ6T *o Sr 0Z#NRwg ! 9!""pfxMPXM b{H  u׋-q`e|]QWG$nyc'p h 8VDn,&[,@uY^iBi:pfQ!Z wĽcV`*ۦ@9 EvܐA'-Bħ//RFخTĶϨЁ@U:A8s y5Pv!YVqلb[d߹ \XL%aAm}.ZdzLܙ@bb! $98 nV8tCvJ58}t_b66 TGd9Dv`vXn8QFخ`"\Z=1`h\ L#` YA!t/qJ`/o!#ÖBX \Z=?rvϺٵŖ<WC+NWZA1& cl u.l"NTD DJ0ok}/X}a x8c*ohR̕@$oTLh@LAb53:TQ#9 FE "E& Yk 0:U [: ^s9`#P8!tE{َGXgqSCl?6me" W03̇ͪ-bj.0 =_\_ A^q2)j (*,3eTLaʰL/ v\Vq(bEr{5T. K. jDQf kuՏW W* S ب ȡZvk$hDZ@GFr">YIbr7՚#H%>LNN9 lDp Ж J~F uam̌u⍕rp=9ņ\&#\ZnN]#"t hE48*@!o ~ӢY6&Pc2Pv *tmϜ}[phc(QITh V` T`,!h@6}3& 5潸{sy9:|G^pI<,ΜGt9Jm͎ O,(6Ja*@'+ l#`f!ɓzc>MbN88 k4='?>mxIToU9ܻy '? _BF3F# 6(^FBW5'>pN;dPBv O Ke`vCGƀs%ށ~mxIvv߅Oq)e+lpS1A}Y.YiۥU0jtU`϶x6Z;~jqBnzz )#1Ĺ#ōq%*I1NjbЛWpqEҶ+-B=%H|au]u҇KKKkJ%y^X9=jwVޥACi $0MD \?_Su9_y4X,>:v 8fP&lRQ||ӂ1%`̝T+e/\~ltnScH6JOcKw#j{b:rGg療te70WpU x#G$ڵ }jI +% NfldO R}5K2>JkR/+>ݷ!-wM)l@ f6x7T4'uXf d3YpzLkv`qeXrd8|G|+qRgѸ<5j4V+@ 'u,I$b\5]o c\EWk7Qm{)\4##+̪i[XV nRxry&/RN-<$X.ߏ? 1ӈ[\,~w VFXf r dI+^l޸f z8?zz2BP2$L7)uJeBYPk WpäӢɊ KMӏhow^T:{U al#L MiQVQ YBMv< kb!UgޯZb-paC  j#>,2538.׀r/* \_r1\Z@ou x2֓$U_f:73k q~M:L4y 0 ;u_}:[ڀJCp;&tn*Ev߲pNk"q H`I nh$"WrDZ/FT+@&NP)O19_Yʖl6g".Uາ-_1f Y3*ūQfodlE,G&OS v`bbB{sN2( c@H |>rSQlm[aqrWv.@"dA%42eID8~ /\@f!\1(mgs}C_y([\# GYWy><&}~Gm\?2D< 'p@Y0\ F̰I2u\0VKD?1Y8}.P.IdzڛfY B;B(4|}9Kpp8nމ177g>o~3/_'0TM_ 43YAy~CYD 犺1njoPr`[~~Gމr9m|SC&fnH\J[7 X5-G|f)h XY&")T݀*P_Aq>&'~ RXO0sGL{. S [} {àMkUAW$M5lḱJچ"E#|n{o=fyرcGzxg羉Ca(tOT}P(AIà_Med B\Adk 텟;_7ŷtkbI_Em=ɦ QV1]FZܜqx2og_],Ƕp=kĤA wJʤN W|/m܀n< 4 "*{ߔyB7п3/--'FsLݲr5E)@; buJP(-8I"D~2pfV.(ZvZ zp3z4Z#Ý^ZO\,ҢaEt@잀`<`mF%#(?:=W7lő @n dnRwP&T0r[֤H& \F kTX@+@#7qTIsOdj'C)QD3+?tY.@r@55 5ԣY%']D'` QDOUxxc!OP{XRA(.hT@԰OV5 MJbS$DBڪ"nd4ֈ$žߔɯֹD椉5A1Ƭʂ=z9aaHP7EdP:Xh0q~dAߛRH\5jK*84܃Ilχn :[Nx9 ٔ0ж0ihgJOVEL rjMSJx)!3v[ fCmt  6 %y_'{q»3$Gzo#Kn!zN +Id$>Bt4룷d4* [ p@IӐ*Ū t( (m 5R 1`d}h,{U. l`tE'==Hq 6a,Y 9IZUՊɊA0L5X297B?}l ohR7zwL]S| p)\,9 ` ]Hg)ޏ&T JO-#8)n@ [U K8HЃ-dA책iɫ<OI$*B҆{*Dٕ1>dO 8n0E?Ŏh|?6%]fi(``|(E\>>eIzXnw}8ro-lUS/cH9r0kMnD%r,RƱ!_PsD?,"0=+|;`$ȤJZ ʿe(Vg@ӹD"H 9Y,C}cG|TNs8瓲Ol.4H^j'qűTLID%c$`قր"aG=YjebƠ&bFt* 0{U7EdPV$SIDAT1,dܫ. RHIcX20iF"M$ )ט,Fc;߳z~^ wzu_ 6 qKtg˳e; 8ޓ;>5Z]"'Xߔ}jT,yYT B"_S֎ŐێeY9M^0c\ݦ}.qJ&aLf?M̠iO&ɦȟ|SUT uCIENDB`qstardict-3.0.0/qstardict/qstardict.pro000066400000000000000000000055751472531462200202500ustar00rootroot00000000000000############################################################################# # qstardict.pro - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TEMPLATE = app TARGET = qstardict macx { TARGET = QStarDict } include(../qstardict.pri) FORMS += \ cssedit.ui \ mainwindow.ui \ settingsdialog.ui \ dictbrowsersearch.ui HEADERS += \ application.h \ cssedit.h \ dictbrowser.h \ dictcore.h \ ../plugins/dictplugin.h \ dictwidget.h \ keyboard.h \ mainwindow.h \ popupwindow.h \ resizablepopup.h \ selection.h \ settingsdialog.h \ speaker.h \ trayicon.h \ dictbrowsersearch.h unix:isEmpty(NO_DBUS):HEADERS += \ dbusadaptor.h SOURCES += \ application.cpp \ cssedit.cpp \ dictbrowser.cpp \ dictcore.cpp \ dictwidget.cpp \ keyboard.cpp \ main.cpp \ mainwindow.cpp \ popupwindow.cpp \ resizablepopup.cpp \ selection.cpp \ settingsdialog.cpp \ speaker.cpp \ trayicon.cpp \ dictbrowsersearch.cpp unix:isEmpty(NO_DBUS):SOURCES += \ dbusadaptor.cpp RESOURCES += \ pixmaps/pixmaps.qrc win32:RC_FILE += \ qstardict.rc DISTFILES += \ qstardict.png \ qstardict.desktop target.path = $$BIN_DIR INSTALLS += target # translations *has* go after current target (mac required) isEmpty(NO_TRANSLATIONS):include("translations/translations.pri") unix:!macx { desktop_icon.files = qstardict.png desktop_icon.path = $$INSTALL_PREFIX/share/pixmaps desktop_file.files = qstardict.desktop desktop_file.path = $$INSTALL_PREFIX/share/applications INSTALLS += desktop_icon desktop_file } macx { ICON = pixmaps/qstardict.icns } qstardict-3.0.0/qstardict/qstardict.rc000066400000000000000000000001101472531462200200300ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "pixmaps/qstardict.ico" qstardict-3.0.0/qstardict/resizablepopup.cpp000066400000000000000000000226201472531462200212660ustar00rootroot00000000000000/***************************************************************************** * resizablepopup.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "resizablepopup.h" #include #include #include #include #include #include namespace { const int CornerSize = 10; } namespace QStarDict { ResizablePopup::ResizablePopup(QWidget *parent) : QFrame(parent, Qt::Popup) { m_isMoving = false; m_resizeDirection = None; m_timeoutBeforeHide = 0; m_timerCloseId = 0; m_timerResizeId = 0; m_isPopuped = false; setMouseTracking(true); setLineWidth(1); setMidLineWidth(2); setFrameStyle(QFrame::Box); setFrameShadow(QFrame::Raised); } void ResizablePopup::popup() { if (m_defaultSize != size()) resize(m_defaultSize); QWidget window; window.setStyleSheet("background:transparent;"); window.setAttribute(Qt::WA_TranslucentBackground); window.setWindowFlags(Qt::FramelessWindowHint); window.setWindowState(Qt::WindowMaximized); window.show(); QPoint newPosition = QCursor::pos() - QPoint(30, 30); if (newPosition.x() < 0) newPosition.setX(0); else if (newPosition.x() + width() > QGuiApplication::primaryScreen()->geometry().width()) newPosition.setX(QGuiApplication::primaryScreen()->geometry().width() - width()); if (newPosition.y() < 0) newPosition.setY(0); else if (newPosition.y() + height() > QGuiApplication::primaryScreen()->geometry().height()) newPosition.setY(QGuiApplication::primaryScreen()->geometry().height() - height()); move(newPosition); show(); m_isPopuped = true; } void ResizablePopup::enterEvent(QEvent*) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } } void ResizablePopup::leaveEvent(QEvent*) { if (geometry().contains(QCursor::pos())) return; if (m_resizeDirection) return; if (m_timeoutBeforeHide < 0) return; if (m_timeoutBeforeHide == 0) { m_isPopuped = false; hide(); } else if (! m_timerCloseId) m_timerCloseId = startTimer(m_timeoutBeforeHide); } void ResizablePopup::mouseMoveEvent(QMouseEvent *event) { Qt::CursorShape cursorShape = Qt::ArrowCursor; if ((event->position().x() >= 0 && event->position().x() < CornerSize && event->position().y() >= 0 && event->position().y() < CornerSize) || (event->position().x() < width() && event->position().x() >= width() - CornerSize && event->position().y() < height() && event->position().y() >= height() - CornerSize)) cursorShape = Qt::SizeFDiagCursor; else if ((event->position().x() < width() && event->position().x() >= width() - CornerSize && event->position().y() >= 0 && event->position().y() < CornerSize) || (event->position().x() >= 0 && event->position().x() < CornerSize && event->position().y() < height() && event->position().y() >= height() - CornerSize)) cursorShape = Qt::SizeBDiagCursor; else if ((event->position().x() >= 0 && event->position().x() < frameWidth()) || (event->position().x() < width() && event->position().x() >= width() - frameWidth())) cursorShape = Qt::SizeHorCursor; else if ((event->position().y() >= 0 && event->position().y() < frameWidth()) || (event->position().y() < height() && event->position().y() >= height() - frameWidth())) cursorShape = Qt::SizeVerCursor; if (cursor().shape() != cursorShape) setCursor(cursorShape); else if (event->buttons().testFlag(Qt::LeftButton)) { if (m_isMoving) move(pos() + (event->globalPosition().toPoint() - m_oldCursorPos)); m_oldCursorPos = event->globalPosition().toPoint(); return; } m_isMoving = false; } void ResizablePopup::mousePressEvent(QMouseEvent *event) { if (! geometry().contains(event->globalPosition().toPoint())) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } m_isPopuped = false; hide(); return; } if (event->buttons().testFlag(Qt::LeftButton)) { if (event->position().x() < CornerSize && event->position().y() < CornerSize) m_resizeDirection = TopLeft; else if (event->position().x() >= width() - CornerSize && event->position().y() < CornerSize) m_resizeDirection = TopRight; else if (event->position().x() < CornerSize && event->position().y() >= height() - CornerSize) m_resizeDirection = BottomLeft; else if (event->position().x() >= width() - CornerSize && event->position().y() >= height() - CornerSize) m_resizeDirection = BottomRight; else if (event->position().x() < frameWidth()) m_resizeDirection = Left; else if (event->position().x() >= width() - frameWidth()) m_resizeDirection = Right; else if (event->position().y() < frameWidth()) m_resizeDirection = Top; else if (event->position().y() >= height() - frameWidth()) m_resizeDirection = Bottom; else m_resizeDirection = None; if (m_resizeDirection) m_timerResizeId = startTimer(8); } m_isMoving = true; m_oldCursorPos = event->globalPosition().toPoint(); } void ResizablePopup::mouseReleaseEvent(QMouseEvent*) { stopResize(); } void ResizablePopup::mouseDoubleClickEvent(QMouseEvent*) { m_isPopuped = false; if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } hide(); } void ResizablePopup::timerEvent(QTimerEvent *event) { if (event->timerId() == m_timerResizeId) { doResize(); } else if (event->timerId() == m_timerCloseId) { m_isPopuped = false; hide(); killTimer(m_timerCloseId); m_timerCloseId = 0; stopResize(); } } void ResizablePopup::doResize() { if (! QApplication::mouseButtons().testFlag(Qt::LeftButton)) stopResize(); if (m_resizeDirection) { QRect newGeometry = geometry(); switch (m_resizeDirection) { case TopLeft: newGeometry.setTopLeft(QCursor::pos()); break; case TopRight: newGeometry.setTopRight(QCursor::pos()); break; case BottomLeft: newGeometry.setBottomLeft(QCursor::pos()); break; case BottomRight: newGeometry.setBottomRight(QCursor::pos()); break; case Left: newGeometry.setLeft(QCursor::pos().x()); break; case Right: newGeometry.setRight(QCursor::pos().x()); break; case Top: newGeometry.setTop(QCursor::pos().y()); break; case Bottom: newGeometry.setBottom(QCursor::pos().y()); break; default: ; // Nothing } if (newGeometry.width() < minimumSize().width()) { newGeometry.setWidth(width()); newGeometry.moveLeft(geometry().left()); } if (newGeometry.height() < minimumSize().height()) { newGeometry.setHeight(height()); newGeometry.moveTop(geometry().top()); } if (newGeometry != geometry()) setGeometry(newGeometry); } } void ResizablePopup::stopResize() { if (m_resizeDirection) { m_resizeDirection = None; killTimer(m_timerResizeId); m_timerResizeId = 0; } } bool ResizablePopup::event(QEvent *event) { if (event->type() == QEvent::WindowUnblocked && m_isPopuped) { if (m_timerCloseId) { killTimer(m_timerCloseId); m_timerCloseId = 0; } show(); return true; } else return QFrame::event(event); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/resizablepopup.h000066400000000000000000000071031472531462200207320ustar00rootroot00000000000000/***************************************************************************** * resizablepopup.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef RESIZABLEPOPUP_H #define RESIZABLEPOPUP_H #include class QEvent; class QMouseEvent; class QTimerEvent; namespace QStarDict { /** * The ResizablePopup widget is a resizable top-level window * without decorations. */ class ResizablePopup: public QFrame { Q_OBJECT public: /** * Construct a ResizablePopup widget. */ ResizablePopup(QWidget *parent = 0); /** * Return timeout before hiding after mouse leaving. */ int timeoutBeforeHide() const { return m_timeoutBeforeHide; } /** * Return a default size of new-shown popup. */ const QSize& defaultSize() const { return m_defaultSize; } public slots: /** * Set timeout before hiding after mouse leaving. */ void setTimeoutBeforeHide(int timeoutBeforeHide) { m_timeoutBeforeHide = timeoutBeforeHide; } /** * Set default size of new-shown popup. */ void setDefaultSize(const QSize &defaultSize) { m_defaultSize = defaultSize; } /** * Show popup under mouse cursor. */ void popup(); protected: void enterEvent(QEvent*); void leaveEvent(QEvent*); void mouseMoveEvent(QMouseEvent*); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseDoubleClickEvent(QMouseEvent*); void timerEvent(QTimerEvent*); bool event(QEvent *event); private: void stopResize(); void doResize(); enum ResizeDirection { None, Top, Bottom, Left, Right, TopLeft, TopRight, BottomLeft, BottomRight }; QPoint m_oldCursorPos; bool m_isMoving; QSize m_defaultSize; ResizeDirection m_resizeDirection; int m_timeoutBeforeHide; int m_timerCloseId; int m_timerResizeId; bool m_isPopuped; }; } #endif // RESIZABLEPOPUP_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/selection.cpp000066400000000000000000000053531472531462200202130ustar00rootroot00000000000000/***************************************************************************** * selection.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "selection.h" #ifdef Q_WS_WIN #include namespace { QString currentSelection() { POINT Point; HWND hWindow; DWORD dwStart, dwEnd; char szWindowText[256]; if (! GetCursorPos(&Point)) return QString(); if( ! (hWindow = WindowFromPoint(Point))) return QString(); SendMessage(hWindow, WM_GETTEXT, 256, (LPARAM)szWindowText); SendMessage(hWindow, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); return QString::fromLocal8Bit(szWindowText); } } #else // Q_WS_WIN #include #include namespace { inline QString currentSelection() { return QApplication::clipboard()->text(QClipboard::Selection); } } #endif // Q_WS_WIN namespace QStarDict { Selection::Selection(QObject *parent) : QObject(parent) { m_scan = false; m_timerId = 0; } void Selection::setScan(bool scan) { if (m_scan == scan) return; m_scan = scan; if (m_scan) { m_lastState = currentSelection(); m_timerId = startTimer(300); } else killTimer(m_timerId); } void Selection::timerEvent(QTimerEvent*) { if (m_lastState != currentSelection()) { m_lastState = currentSelection(); emit changed(m_lastState); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/selection.h000066400000000000000000000044401472531462200176540ustar00rootroot00000000000000/***************************************************************************** * selection.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SELECTION_H #define SELECTION_H #include class QTimerEvent; namespace QStarDict { /** * Mouse selection representation class. */ class Selection: public QObject { Q_OBJECT public: /** * Constructor. */ Selection(QObject *parent = 0); /** * Return scan state. */ bool isScan() const { return m_scan; } public slots: /** * Set scan mode. */ void setScan(bool scan); signals: /** * Emits when selection text is changed. */ void changed(const QString &newText); protected: void timerEvent(QTimerEvent*); private: QString m_lastState; int m_scan; int m_timerId; }; } #endif // SELECTION_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/settingsdialog.cpp000066400000000000000000000350171472531462200212460ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "settingsdialog.h" #include #include #include #include #include #include #include #include #include "dictcore.h" #include "mainwindow.h" #include "popupwindow.h" #include "application.h" #include "speaker.h" #include "trayicon.h" namespace { int toPercents(double value) { int integralValue = static_cast(value * 100.0); if (value * 100.0 - 0.5 > integralValue) ++integralValue; return integralValue; } } namespace QStarDict { SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) { setupUi(this); DictCore *dict = Application::instance()->dictCore(); m_oldPlugins = dict->loadedPlugins(); m_oldDicts = dict->loadedDicts(); m_pluginsModel = new QStandardItemModel(this); m_pluginsModel->setHorizontalHeaderLabels( QStringList() << tr("Enabled") << tr("Name")); loadPluginsList(); pluginsTableView->setModel(m_pluginsModel); pluginsTableView->verticalHeader()->hide(); pluginsTableView->setColumnWidth(0, 60); pluginsTableView->setColumnWidth(1, 320); m_dictsModel = new QStandardItemModel(this); m_dictsModel->setHorizontalHeaderLabels(QStringList() << tr("Enabled") << tr("Name") << tr("Plugin")); loadDictsList(); dictsTableView->setModel(m_dictsModel); dictsTableView->verticalHeader()->hide(); dictsTableView->setColumnWidth(0, 60); dictsTableView->setColumnWidth(1, 200); dictsTableView->setColumnWidth(2, 120); // Load global settings systemTrayBox->setChecked(Application::instance()->trayIcon()->isVisible()); instantSearchBox->setChecked(Application::instance()->mainWindow()->isInstantSearch()); speechCmdEdit->setText(Application::instance()->speaker()->speechCmd()); #ifdef Q_OS_LINUX QFile desktop(QDir::homePath() + "/.config/autostart/qstardict.desktop"); if (desktop.open(QIODevice::ReadOnly) && QString(desktop.readAll()) .contains(QRegularExpression("\\bhidden\\s*=\\s*false", QRegularExpression::CaseInsensitiveOption))) { autostartBox->setChecked(true); } #elif defined(Q_OS_WIN) QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" "CurrentVersion\\Run", QSettings::NativeFormat); autostartBox->setChecked( reg.contains(QCoreApplication::applicationName())); #else autostartBox->setVisible(false); #endif // Load popup window settings PopupWindow *popup = Application::instance()->popupWindow(); useScanBox->setChecked(popup->isScan()); if (popup->modifierKey()) { useScanModifierBox->setChecked(true); QString modifierName; switch (popup->modifierKey()) { case Qt::ShiftModifier: modifierName = "Shift"; break; case Qt::ControlModifier: modifierName = "Control"; break; case Qt::AltModifier: modifierName = "Alt"; break; case Qt::MetaModifier: modifierName = "Win"; break; } modifierKeyBox->setCurrentIndex(modifierKeyBox->findText(modifierName)); } showIfNotFoundBox->setChecked(popup->showIfNotFound()); popupOpacitySpin->setValue(toPercents(popup->windowOpacity())); timeoutBeforeHideSpin->setValue(popup->timeoutBeforeHide() / 1000.0); popupDefaultWidthSpin->setValue(popup->defaultSize().width()); popupDefaultHeightSpin->setValue(popup->defaultSize().height()); pronounceWordBox->setChecked(popup->pronounceWord()); // Load translations CSS QHash cssAliases; cssAliases["body"] = tr("All translation"); cssAliases["font.dict_name"] = tr("Dictionary name"); cssAliases["font.title"] = tr("Title"); cssAliases["font.explanation"] = tr("Explanation"); cssAliases["font.abbreviature"] = tr("Abbreviation"); cssAliases["font.example"] = tr("Example"); cssAliases["font.transcription"] = tr("Transcription"); appearanceCSSEdit->setElementsAliases(cssAliases); appearanceCSSEdit->setCSS(Application::instance()->mainWindow()->defaultStyleSheet()); connect(m_pluginsModel, SIGNAL(itemChanged(QStandardItem*)), SLOT(pluginsItemChanged(QStandardItem*))); } void SettingsDialog::accept() { // Save dicts and plugins settings DictCore *dict = Application::instance()->dictCore(); QStringList loadedPlugins; int rowCount = m_pluginsModel->rowCount(); for (int i = 0; i < rowCount; ++i) if (m_pluginsModel->item(i, 0)->checkState() == Qt::Checked) loadedPlugins << m_pluginsModel->item(i, 1)->text(); dict->setLoadedPlugins(loadedPlugins); QList loadedDicts; rowCount = m_dictsModel->rowCount(); for (int i = 0; i < rowCount; ++i) if (m_dictsModel->item(i, 0)->checkState() == Qt::Checked) loadedDicts << DictCore::Dictionary(m_dictsModel->item(i, 2)->text(), m_dictsModel->item(i, 1)->text()); dict->setLoadedDicts(loadedDicts); // Save global settings Application::instance()->trayIcon()->setVisible(systemTrayBox->isChecked()); Application::instance()->mainWindow()->setInstantSearch(instantSearchBox->isChecked()); Application::instance()->speaker()->setSpeechCmd(speechCmdEdit->text()); #ifdef Q_OS_LINUX QDir home = QDir::home(); if (!home.exists(".config/autostart")) { home.mkpath(".config/autostart"); } QFile desktopFile(QSTARDICT_INSTALL_PREFIX "/share/applications/qstardict.desktop"); if (desktopFile.open(QIODevice::ReadOnly)) { QByteArray contents = desktopFile.readAll(); QFile f(home.absolutePath() + "/.config/autostart/qstardict.desktop"); if (f.open(QIODevice::WriteOnly | QIODevice::Text)) { f.write(contents.trimmed()); f.write(QString("\nHidden=%1").arg(autostartBox->isChecked()? "false\n":"true\n").toUtf8()); } } #elif defined(Q_OS_WIN) QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" "CurrentVersion\\Run", QSettings::NativeFormat); if(autostartBox->isChecked()) reg.setValue(QCoreApplication::applicationName(), '"' + QDir::toNativeSeparators(QCoreApplication:: applicationFilePath()) + '"'); else reg.remove(QCoreApplication::applicationName()); #endif // Save popup window settings PopupWindow *popup = Application::instance()->popupWindow(); popup->setScan(useScanBox->isChecked()); int modifierKey = 0; if (useScanModifierBox->isChecked()) { if (modifierKeyBox->currentText() == "Shift") modifierKey = Qt::ShiftModifier; else if (modifierKeyBox->currentText() == "Control") modifierKey = Qt::ControlModifier; else if (modifierKeyBox->currentText() == "Alt") modifierKey = Qt::AltModifier; else if (modifierKeyBox->currentText() == "Win") modifierKey = Qt::MetaModifier; } popup->setShowIfNotFound(showIfNotFoundBox->isChecked()); popup->setModifierKey(modifierKey); popup->setWindowOpacity(popupOpacitySpin->value() / 100.0); popup->setTimeoutBeforeHide(static_cast(timeoutBeforeHideSpin->value() * 1000.0)); popup->setDefaultSize(QSize(popupDefaultWidthSpin->value(), popupDefaultHeightSpin->value())); popup->setPronounceWord(pronounceWordBox->isChecked()); // Save translations CSS Application::instance()->mainWindow()->setDefaultStyleSheet(appearanceCSSEdit->css()); Application::instance()->popupWindow()->setDefaultStyleSheet(appearanceCSSEdit->css()); if (! Application::instance()->trayIcon()->isVisible()) Application::instance()->mainWindow()->show(); Application::instance()->mainWindow()->reload(); Application::instance()->dictCore()->saveSettings(); Application::instance()->mainWindow()->saveSettings(); Application::instance()->trayIcon()->saveSettings(); Application::instance()->popupWindow()->saveSettings(); QDialog::accept(); } void SettingsDialog::reject() { DictCore *dict = Application::instance()->dictCore(); dict->setLoadedPlugins(m_oldPlugins); dict->setLoadedDicts(m_oldDicts); QDialog::reject(); } void SettingsDialog::loadDictsList() { int i; QList loadedDicts = Application::instance()->dictCore()->loadedDicts(); m_dictsModel->setRowCount(0); for (i = 0; i < loadedDicts.size(); ++i) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(Qt::Checked); m_dictsModel->setItem(i, 0, item); m_dictsModel->setItem(i, 1, new QStandardItem(loadedDicts[i].name())); m_dictsModel->setItem(i, 2, new QStandardItem(loadedDicts[i].plugin())); } QList dicts = Application::instance()->dictCore()->availableDicts(); for (QList::const_iterator iter = dicts.begin(); iter != dicts.end(); ++iter) { if (! loadedDicts.contains(*iter)) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(Qt::Unchecked); m_dictsModel->setItem(i, 0, item); m_dictsModel->setItem(i, 1, new QStandardItem(iter->name())); m_dictsModel->setItem(i, 2, new QStandardItem(iter->plugin())); ++i; } } } void SettingsDialog::loadPluginsList() { m_pluginsModel->setRowCount(0); DictCore *dict = Application::instance()->dictCore(); QStringList plugins = dict->availablePlugins(); QStringList loaded = dict->loadedPlugins(); for (int i = 0; i < plugins.size(); ++i) { QStandardItem *item = new QStandardItem(); item->setCheckable(true); item->setCheckState(loaded.contains(plugins[i]) ? Qt::Checked : Qt::Unchecked); m_pluginsModel->setItem(i, 0, item); m_pluginsModel->setItem(i, 1, new QStandardItem(plugins[i])); } } void SettingsDialog::on_dictsMoveUpButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow > 0) { m_dictsModel->insertRow(currentRow - 1, m_dictsModel->takeRow(currentRow)); dictsTableView->selectRow(currentRow - 1); } } void SettingsDialog::on_dictsMoveDownButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow < m_dictsModel->rowCount() - 1) { m_dictsModel->insertRow(currentRow + 1, m_dictsModel->takeRow(currentRow)); dictsTableView->selectRow(currentRow + 1); } } void SettingsDialog::on_dictsShowInfoButton_clicked() { int currentRow = dictsTableView->currentIndex().row(); if (currentRow == -1) return; QString dict = m_dictsModel->item(currentRow, 1)->text(); QString plugin = m_dictsModel->item(currentRow, 2)->text(); DictPlugin::DictInfo info = Application::instance()->dictCore()->plugin(plugin)->dictInfo(dict); QMessageBox::information(this, tr("Information about dictionary \"%1\"").arg(dict), tr("Name: %1
    ").arg(dict) + tr("Plugin: %1
    ").arg(plugin) + tr("Author: %1
    ").arg(info.author()) + tr("Words count: %1
    ").arg((info.wordsCount() == -1) ? tr("unknown") : QString::number(info.wordsCount())) + tr("Description: %1").arg(info.description())); } void SettingsDialog::on_pluginsShowInfoButton_clicked() { int currentRow = pluginsTableView->currentIndex().row(); if (currentRow == -1) return; DictPlugin *plugin = Application::instance()->dictCore()->plugin(m_pluginsModel->item(currentRow, 1)->text()); if (! plugin) return; QMessageBox::information(this, tr("Information about %1 plugin").arg(plugin->name()), tr("Name: %1
    ").arg(plugin->name()) + tr("Version: %1
    ").arg(plugin->version()) + tr("Authors: %1
    ").arg(plugin->authors().replaceInStrings("<", "<").replaceInStrings(">", ">").join(tr("
    "))) + tr("Can search similar words: %1
    ").arg(plugin->features().testFlag(DictPlugin::SearchSimilar) ? tr("yes") : tr("no")) + tr("Description: %1").arg(plugin->description())); } void SettingsDialog::on_pluginsConfigureButton_clicked() { int currentRow = pluginsTableView->currentIndex().row(); if (currentRow == -1) return; DictCore *dict = Application::instance()->dictCore(); DictPlugin *plugin = dict->plugin(m_pluginsModel->item(currentRow, 1)->text()); if (plugin && plugin->execSettingsDialog(this) == QDialog::Accepted) { dict->reloadDicts(); loadDictsList(); } } void SettingsDialog::pluginsItemChanged(QStandardItem *item) { if (item->isCheckable()) { DictCore *dict = Application::instance()->dictCore(); QStringList loadedPlugins; int rowCount = m_pluginsModel->rowCount(); for (int i = 0; i < rowCount; ++i) if (m_pluginsModel->item(i, 0)->checkState() == Qt::Checked) loadedPlugins << m_pluginsModel->item(i, 1)->text(); dict->setLoadedPlugins(loadedPlugins); dict->reloadDicts(); loadDictsList(); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/settingsdialog.h000066400000000000000000000051411472531462200207060ustar00rootroot00000000000000/***************************************************************************** * settingsdialog.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2007 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" #include "dictcore.h" class QStandardItemModel; class QStandardItem; namespace QStarDict { class MainWindow; /** * The settings dialog. */ class SettingsDialog: public QDialog, private Ui::SettingsDialog { Q_OBJECT public: /** * Construct new SettingsDialog widget with parent MainWindow. */ SettingsDialog(QWidget *parent = 0); void accept(); void reject(); private slots: void on_dictsMoveUpButton_clicked(); void on_dictsMoveDownButton_clicked(); void on_dictsShowInfoButton_clicked(); void on_pluginsShowInfoButton_clicked(); void on_pluginsConfigureButton_clicked(); void pluginsItemChanged(QStandardItem *item); private slots: void loadDictsList(); void loadPluginsList(); private: QStringList m_oldPlugins; QList m_oldDicts; QStandardItemModel *m_dictsModel; QStandardItemModel *m_pluginsModel; }; } #endif // SETTINGSDIALOG_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/settingsdialog.ui000066400000000000000000000475461472531462200211130ustar00rootroot00000000000000 QStarDict::SettingsDialog 0 0 466 498 QStarDict Settings 9 6 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok false 0 Global settings Use system tray Start with system Instant search 6 0 Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Qt::Vertical 426 318 Dictionaries Dictionaries QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false Move up Up :/icons/arrow-up.png:/icons/arrow-up.png Move down Down :/icons/arrow-down.png:/icons/arrow-down.png Show information about dictionary Show info :/icons/dialog-information.png:/icons/dialog-information.png Qt::Horizontal 40 20 16777215 196 Plugins Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft QAbstractItemView::NoEditTriggers QAbstractItemView::SingleSelection QAbstractItemView::SelectRows false Show information about plugin Info :/icons/dialog-information.png:/icons/dialog-information.png Configure plugin Configure :/icons/configure.png:/icons/configure.png Qt::Horizontal 40 20 Popup window 9 6 Behavior 9 6 6 0 Pronounce the word 6 0 Timeout before hide after mouse over Don't hide sec 1 0.000000000000000 10.000000000000000 0.100000000000000 0.500000000000000 6 0 true Show only if modifier pressed false Alt Control Shift Win Scan selection true Show if word not found Appearance 9 6 6 0 Opacity % 1 100 100 6 0 Default width 96 9999 320 6 0 Default height 96 9999 240 Qt::Vertical 20 101 Appearance QStarDict::CSSEdit QWidget
    cssedit.h
    1
    instantSearchBox speechCmdEdit buttonBox tabWidget dictsTableView dictsMoveUpButton dictsMoveDownButton dictsShowInfoButton pluginsTableView pluginsShowInfoButton pluginsConfigureButton useScanBox showIfNotFoundBox useScanModifierBox modifierKeyBox timeoutBeforeHideSpin pronounceWordBox popupDefaultWidthSpin popupDefaultHeightSpin popupOpacitySpin buttonBox accepted() QStarDict::SettingsDialog accept() 330 587 410 299 buttonBox rejected() QStarDict::SettingsDialog reject() 406 587 410 299 useScanModifierBox toggled(bool) modifierKeyBox setEnabled(bool) 165 140 273 137
    qstardict-3.0.0/qstardict/speaker.cpp000066400000000000000000000050131472531462200176510ustar00rootroot00000000000000/***************************************************************************** * speaker.cpp - QStarDict, a StarDict clone written using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "speaker.h" #include #include namespace QStarDict { Speaker::Speaker() { m_speechProcess = new QProcess; QSettings settings; m_speechCmd = settings.value("Speaker/speechCmd", "festival --tts").toString(); } Speaker::~Speaker() { QSettings settings; settings.setValue("Speaker/speechCmd", m_speechCmd); delete m_speechProcess; } void Speaker::speak(const QString &word) { if (m_speechCmd.isEmpty()) return; if (m_speechProcess->state() != QProcess::NotRunning) m_speechProcess->kill(); QString s = m_speechCmd; s.replace("%s", word); QStringList cmdTokens = QProcess::splitCommand(s); QString program = cmdTokens[0]; QStringList arguments = cmdTokens.sliced(1); m_speechProcess->start(program, arguments, QIODeviceBase::WriteOnly); if (! m_speechProcess->waitForStarted()) return; if (! m_speechCmd.contains("%s")) { m_speechProcess->write(word.toUtf8()); m_speechProcess->closeWriteChannel(); } } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/speaker.h000066400000000000000000000036471472531462200173310ustar00rootroot00000000000000/***************************************************************************** * speaker.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef SPEAKER_H #define SPEAKER_H #include class QProcess; namespace QStarDict { class Speaker { public: Speaker(); virtual ~Speaker(); void speak(const QString &word); void setSpeechCmd(const QString &cmd) { m_speechCmd = cmd; } const QString &speechCmd() const { return m_speechCmd; } private: QString m_speechCmd; QProcess *m_speechProcess; }; } #endif // SPEAKER_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent qstardict-3.0.0/qstardict/translations/000077500000000000000000000000001472531462200202355ustar00rootroot00000000000000qstardict-3.0.0/qstardict/translations/qstardict-bg_BG.qm000066400000000000000000000105361472531462200235350ustar00rootroot00000000000000J+LbWY e  uv7G $ *I JU<7 Ng lo W " e   5ns :n T$C 5 y @ e4D e4D s( w p #:4 bY Vi &0?078 2J2 D09; &Save to fileQStarDict::DictWidget @5H:0ErrorQStarDict::DictWidget0?078 ?@52>40Save translationQStarDict::DictWidget "J@A8SearchQStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow&0 QStarDict&AboutQStarDict::MainWindow.&0AB@>9:0 =0 QStarDict&Configure QStarDictQStarDict::MainWindow &$09;&FileQStarDict::MainWindow &><>I&HelpQStarDict::MainWindow &7E>4&QuitQStarDict::MainWindow&!:0=8@0I0 G0AB&ScanQStarDict::MainWindow&0AB@>9:8 &SettingsQStarDict::MainWindow 0 &Qt About &QtQStarDict::MainWindow0 QStarDictAbout QStarDictQStarDict::MainWindow7G8AB8ClearQStarDict::MainWindow27G8AB8 ?>;5B> 70 BJ@A5=5Clear the search boxQStarDict::MainWindowCopyright (C) 2007-2009 ;5:A0=4J@  >48= <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindow5OA=> BJ@A5=5 Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow "J@A8SearchQStarDict::MainWindow8AB A 4C<8 Words listQStarDict::MainWindowA5:C=48 secQStarDict::SettingsDialog%%QStarDict::SettingsDialogAltAltQStarDict::SettingsDialog 73;54 AppearanceQStarDict::SettingsDialog>2545=85BehaviorQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog0>4@0718@0I0 A5 28A>G8=0Default heightQStarDict::SettingsDialog,>4@0718@0I0 A5 H8@8=0 Default widthQStarDict::SettingsDialog 5G=8F8 DictionariesQStarDict::SettingsDialog5 :@89 Don't hideQStarDict::SettingsDialog 04>;CDownQStarDict::SettingsDialog5?@>7@0G=>ABOpacityQStarDict::SettingsDialog;025= ?@>7>@5F Popup windowQStarDict::SettingsDialog,0AB@>9:8 =0 QStarDictQStarDict SettingsQStarDict::SettingsDialog(!5;5:B82=> A:0=8@0=5Scan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialog<>:068, 0:> 4C<0 =5 5 =0<5@5=0Show if word not foundQStarDict::SettingsDialogP>:068, A0<> 0:> <>48D8:0B>@0 5 =0B8A=0BShow only if modifier pressedQStarDict::SettingsDialogd@5<5, ?@548 40 A5 A:@85, A;54 ?>A>G20=5 A <8H:0B0$Timeout before hide after mouse overQStarDict::SettingsDialog 03>@5UpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialog.&0AB@>9:0 =0 QStarDict&Configure QStarDictQStarDict::TrayIcon &7E>4&QuitQStarDict::TrayIcon&!:0=8@0I0 G0AB&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-bg_BG.ts000066400000000000000000000621531472531462200235500ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Запази превода HTML files (*.html, *.htm) Text files (*.txt) Search Търси HTML files (*.html *.htm) Error Грешка Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Запази във файл Speak &word Prin&t translation QStarDict::MainWindow About QStarDict За QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 Александър Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Изчисти полето за търсене Clear Изчисти Fuzzy query Неясно търсене Search Търси Words list Лист с думи &File &Файл &Help &Помощ &Settings &Настройки &Quit &Изход Ctrl+Q Ctrl+Q &About &За QStarDict About &Qt За &Qt &Configure QStarDict &Настройка на QStarDict &Scan &Сканираща част QStarDict &Help F1 QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Настройки на QStarDict Show information about dictionary Global settings Start with system Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Речници Move up Up Нагоре Move down Down Надолу Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Главен прозорец Behavior Поведение Pronounce the word Timeout before hide after mouse over Време, преди да се скрие, след посочване с мишката Don't hide Не крий sec секунди Show only if modifier pressed Покажи, само ако модификатора е натиснат Alt Alt Control Control Shift Shift Win Win Scan selection Селективно сканиране Show if word not found Покажи, ако дума не е намерена Appearance Изглед Opacity Непрозрачност % % Default width Подразбираща се ширина Default height Подразбираща се височина <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканираща част &Configure QStarDict &Настройка на QStarDict &Quit &Изход QStarDict: scanning is %1 enabled disabled qstardict-3.0.0/qstardict/translations/qstardict-cs_CZ.qm000066400000000000000000000106651472531462200236010ustar00rootroot00000000000000*0{++G+~+~J+-Lb[Y He GD : u~7G $ *I Ujg3Ng l * e   5n :n T$s ]  @ e4D e4D s< w ~ #:4 (bY Vi$&Ulo~it do souboru &Save to fileQStarDict::DictWidget ChybaErrorQStarDict::DictWidgetUlo~it pYekladSave translationQStarDict::DictWidgetVyhledatSearchQStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow*& aplikaci QStarDict&AboutQStarDict::MainWindow(&Nastaven QStarDict&Configure QStarDictQStarDict::MainWindow&Soubor&FileQStarDict::MainWindow&Npovda&HelpQStarDict::MainWindow &Konec&QuitQStarDict::MainWindow&Vyhledvat&ScanQStarDict::MainWindow&Nastaven &SettingsQStarDict::MainWindow &verzi Qt About &QtQStarDict::MainWindow(O aplikaci QStarDictAbout QStarDictQStarDict::MainWindowVymazatClearQStarDict::MainWindow8Vymazat pole pro vyhledvnClear the search boxQStarDict::MainWindowCopyright (C) 2007-2009Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindowFuzzy query Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindowVyhledatSearchQStarDict::MainWindowSeznam slov Words listQStarDict::MainWindowsek secQStarDict::SettingsDialog%%QStarDict::SettingsDialogAltAltQStarDict::SettingsDialog Vzhled AppearanceQStarDict::SettingsDialogChovnBehaviorQStarDict::SettingsDialogControlControlQStarDict::SettingsDialogVchoz vakaDefault heightQStarDict::SettingsDialogVchoz aYka Default widthQStarDict::SettingsDialogSlovnky DictionariesQStarDict::SettingsDialogNeschovvat Don't hideQStarDict::SettingsDialogDoluDownQStarDict::SettingsDialog SytostOpacityQStarDict::SettingsDialogPlovouc okno Popup windowQStarDict::SettingsDialogVyslovitPronounce the wordQStarDict::SettingsDialog&Nastaven QStarDictQStarDict SettingsQStarDict::SettingsDialogVyhledat vbrScan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialog>Zobrazit pokud se slovo nenajdeShow if word not foundQStarDict::SettingsDialogDZobrazit pouze pYi stistku klvesyShow only if modifier pressedQStarDict::SettingsDialogZa jakou dobu se zavYe okno s pYekladem potom co kurzor opust vbr$Timeout before hide after mouse overQStarDict::SettingsDialog NahoruUpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialog(&Nastaven QStarDict&Configure QStarDictQStarDict::TrayIcon &Konec&QuitQStarDict::TrayIcon&Vyhledvat&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-cs_CZ.ts000066400000000000000000000613561472531462200236150ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Uložit překlad HTML files (*.html, *.htm) Text files (*.txt) Search Vyhledat HTML files (*.html *.htm) Error Chyba Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Uložit do souboru Speak &word Prin&t translation QStarDict::MainWindow About QStarDict O aplikaci QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Vymazat pole pro vyhledávání Clear Vymazat Fuzzy query Fuzzy query Search Vyhledat Words list Seznam slov &File &Soubor &Help &Nápověda &Settings &Nastavení &Quit &Konec Ctrl+Q Ctrl+Q &About &О aplikaci QStarDict About &Qt О &verzi Qt &Configure QStarDict &Nastavení QStarDict &Scan &Vyhledávat QStarDict &Help F1 QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Nastavení QStarDict Show information about dictionary Global settings Start with system Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Slovníky Move up Up Nahoru Move down Down Dolu Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Plovoucí okno Behavior Chování Pronounce the word Vyslovit Timeout before hide after mouse over Za jakou dobu se zavře okno s překladem potom co kurzor opustí výběr Don't hide Neschovávat sec sek Show only if modifier pressed Zobrazit pouze při stistku klávesy Alt Alt Control Control Shift Shift Win Win Scan selection Vyhledat výběr Show if word not found Zobrazit pokud se slovo nenajde Appearance Vzhled Opacity Sytost % % Default width Výchozí šířka Default height Výchozí výška <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Vyhledávat &Configure QStarDict &Nastavení QStarDict &Quit &Konec QStarDict: scanning is %1 enabled disabled qstardict-3.0.0/qstardict/translations/qstardict-de_DE.qm000066400000000000000000000270111472531462200235310ustar00rootroot00000000000000%1</b> wurde nicht gefunden. The word %1 is not found.QStarDict::DictBrowser&In &Datei speichern &Save to fileQStarDict::DictWidgetNKann bersetzung nicht als %1 speichernCannot save translation as %1QStarDict::DictWidget FehlerErrorQStarDict::DictWidget@Gehe zur &vorherigen bersetzungGo to &next translationQStarDict::DictWidget<Gehe zur &nchsten bersetzungGo to &previous translationQStarDict::DictWidget8HTML-Dateien (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget(bersetzung &druckenPrin&t translationQStarDict::DictWidget*bersetzung speichernSave translationQStarDict::DictWidget SucheSearchQStarDict::DictWidget"&Wort aussprechen Speak &wordQStarDict::DictWidget&Textdateien (*.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindowber Q&StarDict&AboutQStarDict::MainWindow0QStarDict &konfigurieren&Configure QStarDictQStarDict::MainWindow &Datei&FileQStarDict::MainWindow &Hilfe&HelpQStarDict::MainWindow&Beenden&QuitQStarDict::MainWindow&Scannen&ScanQStarDict::MainWindow&Einstellungen &SettingsQStarDict::MainWindowd<b>QStarDict %1 </b> - Qt-Version von StarDict<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowber &Qt About &QtQStarDict::MainWindowber QStarDictAbout QStarDictQStarDict::MainWindowLschenClearQStarDict::MainWindow&Das Suchfeld leerenClear the search boxQStarDict::MainWindowCopyright (C) 2007-2009Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Strg+QCtrl+QQStarDict::MainWindowF1F1QStarDict::MainWindowUngenaue Suche Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow QStarDict &HilfeQStarDict &HelpQStarDict::MainWindow SucheSearchQStarDict::MainWindowWrterliste Words listQStarDict::MainWindowSek. secQStarDict::SettingsDialog%%QStarDict::SettingsDialog(<b>Autor:</b> %1<br>Author: %1
    QStarDict::SettingsDialog,<b>Autoren:</b> %1<br>Authors: %1
    QStarDict::SettingsDialogT<b>Kann hnliche Wrter suchen:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog.<b>Beschreibung:</b> %1Description: %1QStarDict::SettingsDialog&<b>Name:</b> %1<br>Name: %1
    QStarDict::SettingsDialog*<b>Plugin:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog,<b>Version:</b> %1<br>Version: %1
    QStarDict::SettingsDialog@<b>Enthaltene Wrter:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog<br>
    QStarDict::SettingsDialogAbkrzung AbbreviationQStarDict::SettingsDialog$Alle bersetzungenAll translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialog Erscheinungsbild AppearanceQStarDict::SettingsDialogVerhaltenBehaviorQStarDict::SettingsDialogKonfigurieren ConfigureQStarDict::SettingsDialog(Plugin konfigurierenConfigure pluginQStarDict::SettingsDialogStrgControlQStarDict::SettingsDialogStandardhheDefault heightQStarDict::SettingsDialogStandardbreite Default widthQStarDict::SettingsDialogWrterbcher DictionariesQStarDict::SettingsDialogWrterbuchnameDictionary nameQStarDict::SettingsDialog Nicht verstecken Don't hideQStarDict::SettingsDialogAbDownQStarDict::SettingsDialogAktiviertEnabledQStarDict::SettingsDialogGeben Sie das Kommando fr das Ausspracheprogramm ein.<br>Falls das Kommando "%s" enthlt, wird dies durch das Wort ersetzt, andernfalls wird das Wort auf die stdin des Sprachprozesses geschrieben.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogBeispielExampleQStarDict::SettingsDialogErluterung ExplanationQStarDict::SettingsDialog*Globale EinstellungenGlobal settingsQStarDict::SettingsDialogInfoInfoQStarDict::SettingsDialog:Informationen zum Plugin "%1"Information about %1 pluginQStarDict::SettingsDialogBInformationen zum Wrterbuch "%1"!Information about dictionary "%1"QStarDict::SettingsDialogSofortsucheInstant searchQStarDict::SettingsDialogNach unten Move downQStarDict::SettingsDialogNach obenMove upQStarDict::SettingsDialogNameNameQStarDict::SettingsDialogOpazittOpacityQStarDict::SettingsDialog PluginPluginQStarDict::SettingsDialogPluginsPluginsQStarDict::SettingsDialogPopup-Fenster Popup windowQStarDict::SettingsDialog Spreche das WortPronounce the wordQStarDict::SettingsDialogXFolgendes Kommando zur Aussprache verwenden:#Pronounce words using this command:QStarDict::SettingsDialog0QStarDicts EinstellungenQStarDict SettingsQStarDict::SettingsDialogAuswahl scannenScan selectionQStarDict::SettingsDialogUmschaltShiftQStarDict::SettingsDialogDAnzeigen falls Wort nicht gefundenShow if word not foundQStarDict::SettingsDialog,Informationen anzeigen Show infoQStarDict::SettingsDialogJInformationen zum Wrterbuch anzeigen!Show information about dictionaryQStarDict::SettingsDialogBInformationen zum Plugin anzeigenShow information about pluginQStarDict::SettingsDialog>Nur zeigen falls Taste gedrcktShow only if modifier pressedQStarDict::SettingsDialog\Zeitdauer bis zum Verschwinden nach Mouse Over$Timeout before hide after mouse overQStarDict::SettingsDialog TitelTitleQStarDict::SettingsDialogAbschrift TranscriptionQStarDict::SettingsDialogAufUpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogneinnoQStarDict::SettingsDialogunbekanntunknownQStarDict::SettingsDialogjayesQStarDict::SettingsDialog0QStarDict &konfigurieren&Configure QStarDictQStarDict::TrayIcon&Beenden&QuitQStarDict::TrayIcon&Scannen&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon2QStarDict: Scannen ist %1QStarDict: scanning is %1QStarDict::TrayIcondeaktiviertdisabledQStarDict::TrayIconaktiviertenabledQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-de_DE.ts000066400000000000000000000602731472531462200235510ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Vorschau Element Element Foreground Vordergrund Background Hintergrund Select element Element wählen Click to select color Klicken zur Farbauswahl #000000 #000000 Font Schriftart Size Größe Select font Schriftart wählen Select font size Schriftgröße wählen pt pt Bold Fett B B Italic Kursiv I I Underline Unterstrichen U U QStarDict::DictBrowser The word <b>%1</b> is not found. Das Wort <b>%1</b> wurde nicht gefunden. QStarDict::DictWidget Save translation Übersetzung speichern HTML files (*.html, *.htm) HTML-Dateien (*.html, *.htm) Text files (*.txt) Textdateien (*.txt) Search Suche HTML files (*.html *.htm) Error Fehler Cannot save translation as %1 Kann Übersetzung nicht als %1 speichern Go to &previous translation Gehe zur &nächsten Übersetzung Go to &next translation Gehe zur &vorherigen Übersetzung &Save to file In &Datei speichern Speak &word &Wort aussprechen Prin&t translation Übersetzung &drucken QStarDict::MainWindow About QStarDict Über QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Qt-Version von StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Das Suchfeld leeren Clear Löschen Fuzzy query Ungenaue Suche Search Suche Words list Wörterliste &File &Datei &Help &Hilfe &Settings &Einstellungen &Quit &Beenden Ctrl+Q Strg+Q &About Über Q&StarDict About &Qt Über &Qt &Configure QStarDict QStarDict &konfigurieren &Scan &Scannen QStarDict &Help QStarDict &Hilfe F1 F1 QStarDict::SettingsDialog Enabled Aktiviert Name Name Plugin Plugin Information about dictionary "%1" Informationen zum Wörterbuch "%1" <b>Name:</b> %1<br> <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>Plugin:</b> %1<br> unknown unbekannt <b>Description:</b> %1 <b>Beschreibung:</b> %1 Information about %1 plugin Informationen zum Plugin "%1" <b>Version:</b> %1<br> <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <b>Autoren:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Kann ähnliche Wörter suchen:</b> %1<br> yes ja no nein QStarDict Settings QStarDicts Einstellungen Show information about dictionary Informationen zum Wörterbuch anzeigen Global settings Globale Einstellungen Start with system Instant search Sofortsuche Pronounce words using this command: Folgendes Kommando zur Aussprache verwenden: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Geben Sie das Kommando für das Ausspracheprogramm ein.<br>Falls das Kommando "%s" enthält, wird dies durch das Wort ersetzt, andernfalls wird das Wort auf die stdin des Sprachprozesses geschrieben. Dictionaries Wörterbücher Move up Nach oben Up Auf Move down Nach unten Down Ab Show info Informationen anzeigen Plugins Plugins Show information about plugin Informationen zum Plugin anzeigen Info Info Configure plugin Plugin konfigurieren Configure Konfigurieren Popup window Popup-Fenster Behavior Verhalten Pronounce the word Spreche das Wort Timeout before hide after mouse over Zeitdauer bis zum Verschwinden nach Mouse Over Don't hide Nicht verstecken sec Sek. Show only if modifier pressed Nur zeigen falls Taste gedrückt Alt Alt Control Strg Shift Umschalt Win Win Scan selection Auswahl scannen Show if word not found Anzeigen falls Wort nicht gefunden Appearance Erscheinungsbild Opacity Opazität % % Default width Standardbreite Default height Standardhöhe <b>Author:</b> %1<br> <b>Autor:</b> %1<br> <b>Words count:</b> %1<br> <b>Enthaltene Wörter:</b> %1<br> All translation Alle Übersetzungen Dictionary name Wörterbuchname Title Titel Explanation Erläuterung Abbreviation Abkürzung Example Beispiel Transcription Abschrift Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Scannen &Configure QStarDict QStarDict &konfigurieren &Quit &Beenden QStarDict: scanning is %1 QStarDict: Scannen ist %1 enabled aktiviert disabled deaktiviert qstardict-3.0.0/qstardict/translations/qstardict-es_ES.qm000066400000000000000000000137561472531462200236020ustar00rootroot00000000000000H4]Xy  C*%*0[+++~+~.J+ LbY[ %Te!GD  up7G jE Q*ICUHlw Ϧs ?la; CY~ 8o =mC   aQ e E , m *(7 :ni   B @ e4D e4D w } 0q s w Ge B #:4 wbY iVLa palabra <b>%1</b> no ha sido encontrada. The word %1 is not found.QStarDict::DictBrowser&&Guardar al archivo &Save to fileQStarDict::DictWidget ErrorErrorQStarDict::DictWidget&ImprimirPrin&t translationQStarDict::DictWidget BuscarSearchQStarDict::DictWidget&Pronunciar &palabra Speak &wordQStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow&Acerca de&AboutQStarDict::MainWindow*&Configurar QStarDict&Configure QStarDictQStarDict::MainWindow&Archivo&FileQStarDict::MainWindow &Ayuda&HelpQStarDict::MainWindow &Salir&QuitQStarDict::MainWindow&Explorar&ScanQStarDict::MainWindow&Configuracin &SettingsQStarDict::MainWindowAcerca de &Qt About &QtQStarDict::MainWindow&Acerca de QStarDictAbout QStarDictQStarDict::MainWindow BorrarClearQStarDict::MainWindow:Limpiar el cuadro de bsquedaClear the search boxQStarDict::MainWindow Ctrl+SCtrl+QQStarDict::MainWindowF1F1QStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow QStarDict &AyudaQStarDict &HelpQStarDict::MainWindow BuscarSearchQStarDict::MainWindowseg secQStarDict::SettingsDialog%%QStarDict::SettingsDialogAbreviacin AbbreviationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialogApariencia AppearanceQStarDict::SettingsDialogComportamientoBehaviorQStarDict::SettingsDialogConfigurar ConfigureQStarDict::SettingsDialog(Configurar extensinConfigure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog*Altura predeterminadaDefault heightQStarDict::SettingsDialog(Ancho predeterminado Default widthQStarDict::SettingsDialog,Nombre del diccionarioDictionary nameQStarDict::SettingsDialogNo ocultar Don't hideQStarDict::SettingsDialog AbajoDownQStarDict::SettingsDialogEjemploExampleQStarDict::SettingsDialogExplicacin ExplanationQStarDict::SettingsDialog2Configuraciones GeneralesGlobal settingsQStarDict::SettingsDialogInfoInfoQStarDict::SettingsDialog Bajar Move downQStarDict::SettingsDialog SubirMove upQStarDict::SettingsDialogExtensionPluginQStarDict::SettingsDialogExtensionesPluginsQStarDict::SettingsDialog"Ventana emergente Popup windowQStarDict::SettingsDialog*Pronunciar la palabraPronounce the wordQStarDict::SettingsDialogPPronunciar palabras usando este comando:#Pronounce words using this command:QStarDict::SettingsDialog4Configuracin de QStarDictQStarDict SettingsQStarDict::SettingsDialog*Escanear la seleccinScan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialogLMostrar si la palabra no es encontradaShow if word not foundQStarDict::SettingsDialogMostrar info Show infoQStarDict::SettingsDialogPMostrar informacin sobre el diccionario!Show information about dictionaryQStarDict::SettingsDialogLMostrar informacin sobre la extensinShow information about pluginQStarDict::SettingsDialog\Mostrar solo si el modificador est presionadoShow only if modifier pressedQStarDict::SettingsDialognTiempo de espera antes de esconder el puntero del ratn$Timeout before hide after mouse overQStarDict::SettingsDialog TtuloTitleQStarDict::SettingsDialogTranscripcin TranscriptionQStarDict::SettingsDialog ArribaUpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialog*&Configurar QStarDict&Configure QStarDictQStarDict::TrayIcon &Salir&QuitQStarDict::TrayIcon&Explorar&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon ) , qstardict-3.0.0/qstardict/translations/qstardict-es_ES.ts000066400000000000000000000576231472531462200236140ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. La palabra <b>%1</b> no ha sido encontrada. QStarDict::DictWidget Go to &previous translation Go to &next translation &Save to file &Guardar al archivo Prin&t translation &Imprimir Speak &word Pronunciar &palabra Search Buscar Save translation HTML files (*.html *.htm) HTML files (*.html, *.htm) Text files (*.txt) Error Error Cannot save translation as %1 QStarDict::MainWindow About QStarDict Acerca de QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Limpiar el cuadro de búsqueda Clear Borrar Fuzzy query Search Buscar Words list &File &Archivo &Help &Ayuda &Settings &Configuración &Quit &Salir Ctrl+Q Ctrl+S &About &Acerca de About &Qt Acerca de &Qt &Configure QStarDict &Configurar QStarDict &Scan &Explorar QStarDict &Help QStarDict &Ayuda F1 F1 QStarDict::SettingsDialog Enabled Name Plugin Extension All translation Dictionary name Nombre del diccionario Title Título Explanation Explicación Abbreviation Abreviación Example Ejemplo Transcription Transcripción Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>Author:</b> %1<br> <b>Words count:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Configuración de QStarDict Global settings Configuraciones Generales Start with system Instant search Pronounce words using this command: Pronunciar palabras usando este comando: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Move up Subir Up Arriba Move down Bajar Down Abajo Show information about dictionary Mostrar información sobre el diccionario Show info Mostrar info Plugins Extensiones Show information about plugin Mostrar información sobre la extensión Info Info Configure plugin Configurar extensión Configure Configurar Popup window Ventana emergente Behavior Comportamiento Pronounce the word Pronunciar la palabra Timeout before hide after mouse over Tiempo de espera antes de esconder el puntero del ratón Don't hide No ocultar sec seg Show only if modifier pressed Mostrar solo si el modificador está presionado Alt Alt Control Control Shift Shift Win Win Scan selection Escanear la selección Show if word not found Mostrar si la palabra no es encontrada Appearance Apariencia Opacity % % Default width Ancho predeterminado Default height Altura predeterminada Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Explorar &Configure QStarDict &Configurar QStarDict &Quit &Salir QStarDict: scanning is %1 enabled disabled qstardict-3.0.0/qstardict/translations/qstardict-fr_FR.qm000066400000000000000000000273241472531462200235760ustar00rootroot00000000000000Ϧ s JQ.ؐ^-wN g  2>?#l v; ϗ=wY~;7./S.W8 g! =mC #s V ]* ? aQ e8  ) t, *( 5nz :n" T$r le   5  ,< @ G* G} RV(\ e4D e4D( wE  s d w Gej #:4{ w  bYoYrJ0sNIV.i+!GBQStarDict::CSSEditArrire-plan BackgroundQStarDict::CSSEditGrasBoldQStarDict::CSSEdit8Veuillez choisir une couleurClick to select colorQStarDict::CSSEditlmentElementQStarDict::CSSEdit PoliceFontQStarDict::CSSEditPremier-plan ForegroundQStarDict::CSSEditIIQStarDict::CSSEditItaliqueItalicQStarDict::CSSEdit AperuPreviewQStarDict::CSSEdit6Veuillez choisir un lmentSelect elementQStarDict::CSSEdit6Veuillez choisir une police Select fontQStarDict::CSSEditJVeuillez choisir une taille de policeSelect font sizeQStarDict::CSSEdit TailleSizeQStarDict::CSSEditSUQStarDict::CSSEditSoulign UnderlineQStarDict::CSSEditptptQStarDict::CSSEditBLe mot <b>%1</b> est introuvable. The word %1 is not found.QStarDict::DictBrowser(&Enregistrer sous... &Save to fileQStarDict::DictWidgetBcriture du fichier %1 impossibleCannot save translation as %1QStarDict::DictWidget ErreurErrorQStarDict::DictWidgetPage &suivanteGo to &next translationQStarDict::DictWidget Page &prcdenteGo to &previous translationQStarDict::DictWidget8fichier HTML (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget"&Imprimer la pagePrin&t translationQStarDict::DictWidget2Sauvegarder la traductionSave translationQStarDict::DictWidgetRechercherSearchQStarDict::DictWidget"&Prononcer le mot Speak &wordQStarDict::DictWidget.Fichiers textes (*.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow &propos&AboutQStarDict::MainWindow*&Configurer QStarDict&Configure QStarDictQStarDict::MainWindow&Fichier&FileQStarDict::MainWindow &Aide&HelpQStarDict::MainWindow&Quitter&QuitQStarDict::MainWindow*&Traduction au survol&ScanQStarDict::MainWindow&Configuration &SettingsQStarDict::MainWindowh<b>QStarDict %1 </b> - clone de StarDict pour Qt<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow &propos de &Qt About &QtQStarDict::MainWindow* propos de QStarDictAbout QStarDictQStarDict::MainWindowEffacerClearQStarDict::MainWindowEffacerClear the search boxQStarDict::MainWindowCopyright (C) 2007-2009 Alexandre Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindow:Chercher les mots ressemblant Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindowRechercherSearchQStarDict::MainWindowMots semblables Words listQStarDict::MainWindowsec secQStarDict::SettingsDialog%%QStarDict::SettingsDialog,<b>Auteur :</b> %1<br>Author: %1
    QStarDict::SettingsDialog.<b>Auteurs :</b> %1<br>Authors: %1
    QStarDict::SettingsDialogZ<b>Support des mots ressemblants :</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog.<b>Description :</b> %1Description: %1QStarDict::SettingsDialog(<b>Nom :</b> %1 <br>Name: %1
    QStarDict::SettingsDialog4<b>Extension :</b> %1 <br>Plugin: %1
    QStarDict::SettingsDialog0<b>Version :</b> %1 <br>Version: %1
    QStarDict::SettingsDialog<<b>Nombre de mots :</b> %1<br>Words count: %1
    QStarDict::SettingsDialogAbrviation AbbreviationQStarDict::SettingsDialog Style par dfautAll translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialogApparence AppearanceQStarDict::SettingsDialogComportementBehaviorQStarDict::SettingsDialogConfigurer ConfigureQStarDict::SettingsDialog,Configurer l'extensionConfigure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog$Hauteur par dfautDefault heightQStarDict::SettingsDialog$Largeur par dfaut Default widthQStarDict::SettingsDialogDictionnaires DictionariesQStarDict::SettingsDialog&Nom du dictionnaireDictionary nameQStarDict::SettingsDialogNe pas masquer Don't hideQStarDict::SettingsDialogBasDownQStarDict::SettingsDialog ActivEnabledQStarDict::SettingsDialogVeuillez entrer la commande executer pour la prononciation des mots. <br>Si la commande contient la chaine de caractre "%s", celle-ci sera remplace par le mot prononcer sinon le mot sera envoy la sortie standard du processus lanc (stdin).Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogExempleExampleQStarDict::SettingsDialogExplication ExplanationQStarDict::SettingsDialog&Paramtres gnrauxGlobal settingsQStarDict::SettingsDialogInformationsInfoQStarDict::SettingsDialogLInformation propos de l'extension %1Information about %1 pluginQStarDict::SettingsDialogRInformation propos du dictionnaire "%1"!Information about dictionary "%1"QStarDict::SettingsDialog*Recherche la saisieInstant searchQStarDict::SettingsDialogDescendre Move downQStarDict::SettingsDialog MonterMove upQStarDict::SettingsDialogNomNameQStarDict::SettingsDialogOpacitOpacityQStarDict::SettingsDialogExtensionPluginQStarDict::SettingsDialogExtensionsPluginsQStarDict::SettingsDialog(Traduction au survol Popup windowQStarDict::SettingsDialog Prononcer le motPronounce the wordQStarDict::SettingsDialogVPrononcer les mots en lanant la commande :#Pronounce words using this command:QStarDict::SettingsDialog4Configuration de QStarDictQStarDict SettingsQStarDict::SettingsDialogDTraduire les lments slectionnsScan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialogBAvertir si le mot est introuvableShow if word not foundQStarDict::SettingsDialog2Afficher les informations Show infoQStarDict::SettingsDialogbAfficher les information propos du dictionnaire!Show information about dictionaryQStarDict::SettingsDialogbAfficher les informations propos de l'extensionShow information about pluginQStarDict::SettingsDialogjAfficher seulement si la touche suivante est enfonceShow only if modifier pressedQStarDict::SettingsDialog^dure attendre avant de masquer la traduction$Timeout before hide after mouse overQStarDict::SettingsDialog TitreTitleQStarDict::SettingsDialogTranscription TranscriptionQStarDict::SettingsDialogHautUpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialognonnoQStarDict::SettingsDialoginconnuunknownQStarDict::SettingsDialogouiyesQStarDict::SettingsDialog*&Configurer QStarDict&Configure QStarDictQStarDict::TrayIcon&Quitter&QuitQStarDict::TrayIcon*&Traduction au survol&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIconLL'option "traduction au survol" est %1QStarDict: scanning is %1QStarDict::TrayIcondsactivedisabledQStarDict::TrayIconactiveenabledQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-fr_FR.ts000066400000000000000000000610741472531462200236070ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Aperçu Element Élément Foreground Premier-plan Background Arrière-plan Select element Veuillez choisir un élément Click to select color Veuillez choisir une couleur #000000 Font Police Size Taille Select font Veuillez choisir une police Select font size Veuillez choisir une taille de police pt pt Bold Gras B G Italic Italique I I Underline Souligné U S QStarDict::DictBrowser The word <b>%1</b> is not found. Le mot <b>%1</b> est introuvable. QStarDict::DictWidget Save translation Sauvegarder la traduction HTML files (*.html, *.htm) fichier HTML (*.html, *.htm) Text files (*.txt) Fichiers textes (*.txt) Search Rechercher HTML files (*.html *.htm) Error Erreur Cannot save translation as %1 Écriture du fichier %1 impossible Go to &previous translation Page &précédente Go to &next translation Page &suivante &Save to file &Enregistrer sous... Speak &word &Prononcer le mot Prin&t translation &Imprimer la page QStarDict::MainWindow About QStarDict à propos de QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - clone de StarDict pour Qt<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 Alexandre Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Effacer Clear Effacer Fuzzy query Chercher les mots ressemblant Search Rechercher Words list Mots semblables &File &Fichier &Help &Aide &Settings &Configuration &Quit &Quitter Ctrl+Q Ctrl+Q &About À &propos About &Qt À &propos de &Qt &Configure QStarDict &Configurer QStarDict &Scan &Traduction au survol QStarDict &Help F1 QStarDict::SettingsDialog Enabled Activé Name Nom Plugin Extension Information about dictionary "%1" Information à propos du dictionnaire "%1" <b>Name:</b> %1<br> <b>Nom :</b> %1 <br> <b>Plugin:</b> %1<br> <b>Extension :</b> %1 <br> unknown inconnu <b>Description:</b> %1 <b>Description :</b> %1 Information about %1 plugin Information à propos de l'extension %1 <b>Version:</b> %1<br> <b>Version :</b> %1 <br> <b>Authors:</b> %1<br> <b>Auteurs :</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>Support des mots ressemblants :</b> %1<br> yes oui no non QStarDict Settings Configuration de QStarDict Show information about dictionary Afficher les information à propos du dictionnaire Global settings Paramètres généraux Start with system Instant search Recherche à la saisie Pronounce words using this command: Prononcer les mots en lançant la commande : Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Veuillez entrer la commande à executer pour la prononciation des mots. <br>Si la commande contient la chaine de caractère "%s", celle-ci sera remplacée par le mot à prononcer sinon le mot sera envoyé à la sortie standard du processus lancé (stdin). Dictionaries Dictionnaires Move up Monter Up Haut Move down Descendre Down Bas Show info Afficher les informations Plugins Extensions Show information about plugin Afficher les informations à propos de l'extension Info Informations Configure plugin Configurer l'extension Configure Configurer Popup window Traduction au survol Behavior Comportement Pronounce the word Prononcer le mot Timeout before hide after mouse over durée à attendre avant de masquer la traduction Don't hide Ne pas masquer sec sec Show only if modifier pressed Afficher seulement si la touche suivante est enfoncée Alt Alt Control Control Shift Shift Win Win Scan selection Traduire les éléments sélectionnés Show if word not found Avertir si le mot est introuvable Appearance Apparence Opacity Opacité % % Default width Largeur par défaut Default height Hauteur par défaut <b>Author:</b> %1<br> <b>Auteur :</b> %1<br> <b>Words count:</b> %1<br> <b>Nombre de mots :</b> %1<br> All translation Style par défaut Dictionary name Nom du dictionnaire Title Titre Explanation Explication Abbreviation Abréviation Example Exemple Transcription Transcription Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Traduction au survol &Configure QStarDict &Configurer QStarDict &Quit &Quitter QStarDict: scanning is %1 L'option "traduction au survol" est %1 enabled activée disabled désactivée qstardict-3.0.0/qstardict/translations/qstardict-he_IL.qm000066400000000000000000000223601472531462200235530ustar00rootroot00000000000000%1</b>  . The word %1 is not found.QStarDict::DictBrowser&   &Save to fileQStarDict::DictWidget ErrorQStarDict::DictWidget   &Go to &next translationQStarDict::DictWidget"   &Go to &previous translationQStarDict::DictWidget4 HTML ( *.html *.htm)HTML files (*.html *.htm)QStarDict::DictWidget6 HTML ( *.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget& Prin&t translationQStarDict::DictWidget Save translationQStarDict::DictWidgetSearchQStarDict::DictWidget & Speak &wordQStarDict::DictWidget&  ( *.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDictQStarDict::MainWindow &&AboutQStarDict::MainWindow$&  QStarDict&Configure QStarDictQStarDict::MainWindow &&FileQStarDict::MainWindow &&HelpQStarDict::MainWindow &&QuitQStarDict::MainWindow &&ScanQStarDict::MainWindow& &SettingsQStarDict::MainWindow` <b>QStarDict %1 </b> -  Qt  StarDict<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow &Qt About &QtQStarDict::MainWindow QStarDictAbout QStarDictQStarDict::MainWindowClearQStarDict::MainWindow$   Clear the search boxQStarDict::MainWindow  (C)  2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindowCtrl+QQStarDict::MainWindowF1QStarDict::MainWindow  Fuzzy queryQStarDict::MainWindow QStarDictQStarDict::MainWindow& QStarDictQStarDict &HelpQStarDict::MainWindowSearchQStarDict::MainWindow  Words listQStarDict::MainWindow%QStarDict::SettingsDialog&<b>:</b> %1<br>Author: %1
    QStarDict::SettingsDialog*<b>:</b> %1<br>Authors: %1
    QStarDict::SettingsDialog <b>:</b> %1Description: %1QStarDict::SettingsDialog"<b>:</b> %1<br>Name: %1
    QStarDict::SettingsDialog(<b>:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog&<b>:</b> %1<br>Version: %1
    QStarDict::SettingsDialog4<b> :</b> %1<br>Words count: %1
    QStarDict::SettingsDialog
    QStarDict::SettingsDialog  AbbreviationQStarDict::SettingsDialog All translationQStarDict::SettingsDialogAltQStarDict::SettingsDialog  AppearanceQStarDict::SettingsDialogBehaviorQStarDict::SettingsDialog ConfigureQStarDict::SettingsDialog Configure pluginQStarDict::SettingsDialogControlQStarDict::SettingsDialog Default heightQStarDict::SettingsDialog  Default widthQStarDict::SettingsDialog DictionariesQStarDict::SettingsDialog Dictionary nameQStarDict::SettingsDialog  Don't hideQStarDict::SettingsDialogDownQStarDict::SettingsDialog ExampleQStarDict::SettingsDialog ExplanationQStarDict::SettingsDialog Global settingsQStarDict::SettingsDialogInfoQStarDict::SettingsDialog&   %1Information about %1 pluginQStarDict::SettingsDialog*   "%1"!Information about dictionary "%1"QStarDict::SettingsDialog Instant searchQStarDict::SettingsDialog  Move downQStarDict::SettingsDialog Move upQStarDict::SettingsDialogNameQStarDict::SettingsDialog OpacityQStarDict::SettingsDialog PluginQStarDict::SettingsDialog PluginsQStarDict::SettingsDialog  Popup windowQStarDict::SettingsDialog  Pronounce the wordQStarDict::SettingsDialog  QStarDictQStarDict SettingsQStarDict::SettingsDialog Scan selectionQStarDict::SettingsDialogShiftQStarDict::SettingsDialog(    Show if word not foundQStarDict::SettingsDialog  Show infoQStarDict::SettingsDialog*   !Show information about dictionaryQStarDict::SettingsDialog*   Show information about pluginQStarDict::SettingsDialog TitleQStarDict::SettingsDialog  TranscriptionQStarDict::SettingsDialogUpQStarDict::SettingsDialog   Use system trayQStarDict::SettingsDialogWinQStarDict::SettingsDialognoQStarDict::SettingsDialog unknownQStarDict::SettingsDialogyesQStarDict::SettingsDialog$&  QStarDict&Configure QStarDictQStarDict::TrayIcon &&QuitQStarDict::TrayIcon &&ScanQStarDict::TrayIcon QStarDictQStarDict::TrayIcon0QStarDict:   %1QStarDict: scanning is %1QStarDict::TrayIcondisabledQStarDict::TrayIconenabledQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-he_IL.ts000066400000000000000000000602451472531462200235700ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview תצוגה מקדימה Element אלמנט Foreground רקע קדמי Background רקע אחורי Select element בחר אלמנט Click to select color הקלק כדי לברור צבע #000000 Font גופן Size מידה Select font בחר גופן Select font size בחר מידת גופן pt points? Bold בולט B Italic נטוי I Underline קו תחתון U QStarDict::DictBrowser The word <b>%1</b> is not found. המילה <b>%1</b> אינה נמצאת. QStarDict::DictWidget Save translation שמור תרגום HTML files (*.html, *.htm) קבצי HTML ‏(‎*.html, *.htm) Text files (*.txt) קבצי תמליל (‎*.txt) Search חפש HTML files (*.html *.htm) קבצי HTML ‏(‎*.html *.htm) Error שגיאה Cannot save translation as %1 Go to &previous translation לך אל תרגום &קודם Go to &next translation לך אל תרגום &בא &Save to file &שמור אל קובץ Speak &word אמור &מילה Prin&t translation ה&דפס תרגום QStarDict::MainWindow About QStarDict אודות QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> ‏<b>QStarDict %1 </b> - גרסאת Qt של StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> זכויות יוצרים (C)‏ 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict %1 - QStarDict Clear the search box טהר את תיבת החיפוש Clear טהר Fuzzy query שאילתא מטושטשת Search חפש Words list רשימת מילה &File &קובץ &Help &עזרה &Settings &הגדרות &Quit י&ציאה Ctrl+Q &About &אודות About &Qt אודות &Qt &Configure QStarDict &הגדר את QStarDict &Scan &סרוק QStarDict &Help &עזרת QStarDict F1 QStarDict::SettingsDialog Enabled Name שם Plugin תוספת Information about dictionary "%1" מידע אודות מילון "%1" <b>Name:</b> %1<br> <b>שם:</b> %1<br> <b>Plugin:</b> %1<br> <b>תוספת:</b> %1<br> unknown לא ידועה <b>Description:</b> %1 <b>תיאור:</b> %1 Information about %1 plugin מידע אודות תוספת %1 <b>Version:</b> %1<br> <b>גרסא:</b> %1<br> <b>Authors:</b> %1<br> <b>מחברים:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes כן no לא QStarDict Settings הגדרות QStarDict Show information about dictionary הצג מידע אוודות מילון Global settings הגדרות גלובליות Start with system Instant search חיפוש מיידי Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries מילוניפ Move up הזז מעלה Up מעלה Move down הזז מטה Down מטה Show info הצג מידע Plugins תוספות Show information about plugin הצג מידע אוודות תוספת Info מידע Configure plugin הגדר תוספת Configure הגדר Popup window חלון מוקפץ Behavior התנהגות Pronounce the word השמע את המילה Timeout before hide after mouse over Don't hide אל תסתיר sec Show only if modifier pressed Alt Control Shift Win Scan selection סרוק בחירה Show if word not found הצג אם מילה לא נמצאה Appearance הופעה Opacity אטימות % Default width רוחב משתמט Default height גובה משתמט <b>Author:</b> %1<br> <b>מחבר:</b> %1<br> <b>Words count:</b> %1<br> <b>ספירת מילים:</b> %1<br> All translation כל התרגום Dictionary name שם מילון Title כותרת Explanation הסבר Abbreviation קיצור Example דוגמא Transcription תעתיק Use system tray השתמש במגש מערכת QStarDict::TrayIcon QStarDict &Scan &סרוק &Configure QStarDict &הגדר את QStarDict &Quit י&ציאה QStarDict: scanning is %1 QStarDict: סריקה הינה %1 enabled מאופשרת disabled מנוטרלת qstardict-3.0.0/qstardict/translations/qstardict-it_IT.qm000066400000000000000000000271131472531462200236040ustar00rootroot00000000000000Click per selezionare il coloreClick to select colorQStarDict::CSSEditElementoElementQStarDict::CSSEditCarattereFontQStarDict::CSSEditPrimo piano ForegroundQStarDict::CSSEditIIQStarDict::CSSEditCorsivoItalicQStarDict::CSSEditAnteprimaPreviewQStarDict::CSSEdit$Seleziona elementiSelect elementQStarDict::CSSEdit&Seleziona carattere Select fontQStarDict::CSSEdit<Seleziona dimensione carattereSelect font sizeQStarDict::CSSEditDimensioneSizeQStarDict::CSSEditUUQStarDict::CSSEditSottolineato UnderlineQStarDict::CSSEditptptQStarDict::CSSEditPLa parola <b>%1</b> non stata trovata. The word %1 is not found.QStarDict::DictBrowser&Salva come &Save to fileQStarDict::DictWidgetNNon posso salvare la traduzione come %1Cannot save translation as %1QStarDict::DictWidget ErroreErrorQStarDict::DictWidget>Vai alla traduzione s&uccessivaGo to &next translationQStarDict::DictWidget>Vai alla traduzione &precedenteGo to &previous translationQStarDict::DictWidget2File HTML (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget$S&tampa traduzionePrin&t translationQStarDict::DictWidget&Salva la traduzioneSave translationQStarDict::DictWidget CercaSearchQStarDict::DictWidget Pronuncia f&rase Speak &wordQStarDict::DictWidget*File di testo (*.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow I&nformazioni su&AboutQStarDict::MainWindow(C&onfigura QStarDict&Configure QStarDictQStarDict::MainWindow &File&FileQStarDict::MainWindow &Aiuto&HelpQStarDict::MainWindow &Esci&QuitQStarDict::MainWindow &Cerca&ScanQStarDict::MainWindow&Impostazioni &SettingsQStarDict::MainWindowd<b>QStarDict %1 </b> - Versione Qt di StarDict<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow&Informazioni su &Qt About &QtQStarDict::MainWindow2Informazioni su QStarDictAbout QStarDictQStarDict::MainWindowCancellaClearQStarDict::MainWindow&Cancella la ricercaClear the search boxQStarDict::MainWindowCopyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindowF1F1QStarDict::MainWindowFuzzy query Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow &Aiuto QStarDictQStarDict &HelpQStarDict::MainWindow CercaSearchQStarDict::MainWindow"Lista delle Frasi Words listQStarDict::MainWindowsec secQStarDict::SettingsDialog%%QStarDict::SettingsDialog*<b>Autore:</b> %1<br>Author: %1
    QStarDict::SettingsDialog*<b>Autori:</b> %1<br>Authors: %1
    QStarDict::SettingsDialogR<b>Puoi cercare parole simili:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog,<b>Descrizione:</b> %1Description: %1QStarDict::SettingsDialog&<b>Nome:</b> %1<br>Name: %1
    QStarDict::SettingsDialog2<b>Estensione:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog.<b>Versione:</b> %1<br>Version: %1
    QStarDict::SettingsDialog6<b>Conto parole:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog<br>
    QStarDict::SettingsDialogAbbreviazione AbbreviationQStarDict::SettingsDialog&Tutta la traduzioneAll translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialogAspetto AppearanceQStarDict::SettingsDialogComportamentoBehaviorQStarDict::SettingsDialogConfigura ConfigureQStarDict::SettingsDialog(Configura estensioneConfigure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog$Altezza di defaultDefault heightQStarDict::SettingsDialog&Ampiezza di default Default widthQStarDict::SettingsDialogDizionari DictionariesQStarDict::SettingsDialog&Nome del dizionarioDictionary nameQStarDict::SettingsDialogNon nascondere Don't hideQStarDict::SettingsDialogGiDownQStarDict::SettingsDialogAttivatoEnabledQStarDict::SettingsDialognInserisci il comando per il programma di pronuncia.<br>Se il comando contiene "%s" la parola verr sostituita, altrimenti la parola sar scritta nello stdin del processo di pronuncia.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogEsempioExampleQStarDict::SettingsDialogSpiegazione ExplanationQStarDict::SettingsDialog(Impostazioni globaliGlobal settingsQStarDict::SettingsDialogInformazioniInfoQStarDict::SettingsDialog>Informazione sull'estensione %1Information about %1 pluginQStarDict::SettingsDialog@Informazione sul dizionario "%1"!Information about dictionary "%1"QStarDict::SettingsDialog$Ricerca istantaneaInstant searchQStarDict::SettingsDialogSposta in gi Move downQStarDict::SettingsDialogSposta in suMove upQStarDict::SettingsDialogNomeNameQStarDict::SettingsDialogOpacitOpacityQStarDict::SettingsDialogEstensionePluginQStarDict::SettingsDialogEstensioniPluginsQStarDict::SettingsDialog"Finestra di popup Popup windowQStarDict::SettingsDialog&Pronuncia la parolaPronounce the wordQStarDict::SettingsDialogTPronuncia le parole usando questo comando:#Pronounce words using this command:QStarDict::SettingsDialog,Impostazioni QStarDictQStarDict SettingsQStarDict::SettingsDialogCerca selezioneScan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialogJMostra se la parola non viene trovataShow if word not foundQStarDict::SettingsDialog&Mostra informazioni Show infoQStarDict::SettingsDialogDMostra informazioni sul dizionario!Show information about dictionaryQStarDict::SettingsDialogFMostra informazioni sull'estensioneShow information about pluginQStarDict::SettingsDialog.Mostra solo se si premeShow only if modifier pressedQStarDict::SettingsDialogVTempo di scomparsa dopo aver mosso il mouse$Timeout before hide after mouse overQStarDict::SettingsDialog TitoloTitleQStarDict::SettingsDialogTrascrizione TranscriptionQStarDict::SettingsDialogSuUpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialognonoQStarDict::SettingsDialog ignotounknownQStarDict::SettingsDialogsiyesQStarDict::SettingsDialog(&Configura QStarDict&Configure QStarDictQStarDict::TrayIcon &Esci&QuitQStarDict::TrayIcon &Cerca&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon4QStarDict: la ricerca %1QStarDict: scanning is %1QStarDict::TrayIcondisabilitatodisabledQStarDict::TrayIconabilitatoenabledQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-it_IT.ts000066400000000000000000000603011472531462200236110ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Anteprima Element Elemento Foreground Primo piano Background Sfondo Select element Seleziona elementi Click to select color Click per selezionare il colore #000000 #000000 Font Carattere Size Dimensione Select font Seleziona carattere Select font size Seleziona dimensione carattere pt pt Bold Grassetto B B Italic Corsivo I I Underline Sottolineato U U QStarDict::DictBrowser The word <b>%1</b> is not found. La parola <b>%1</b> non è stata trovata. QStarDict::DictWidget Save translation Salva la traduzione HTML files (*.html, *.htm) File HTML (*.html, *.htm) Text files (*.txt) File di testo (*.txt) Search Cerca HTML files (*.html *.htm) Error Errore Cannot save translation as %1 Non posso salvare la traduzione come %1 Go to &previous translation Vai alla traduzione &precedente Go to &next translation Vai alla traduzione s&uccessiva &Save to file &Salva come Speak &word Pronuncia f&rase Prin&t translation S&tampa traduzione QStarDict::MainWindow About QStarDict Informazioni su QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Versione Qt di StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Cancella la ricerca Clear Cancella Fuzzy query Fuzzy query Search Cerca Words list Lista delle Frasi &File &File &Help &Aiuto &Settings &Impostazioni &Quit &Esci Ctrl+Q Ctrl+Q &About I&nformazioni su About &Qt Informazioni su &Qt &Configure QStarDict C&onfigura QStarDict &Scan &Cerca QStarDict &Help &Aiuto QStarDict F1 F1 QStarDict::SettingsDialog Enabled Attivato Name Nome Plugin Estensione Information about dictionary "%1" Informazione sul dizionario "%1" <b>Name:</b> %1<br> <b>Nome:</b> %1<br> <b>Plugin:</b> %1<br> <b>Estensione:</b> %1<br> unknown ignoto <b>Description:</b> %1 <b>Descrizione:</b> %1 Information about %1 plugin Informazione sull'estensione %1 <b>Version:</b> %1<br> <b>Versione:</b> %1<br> <b>Authors:</b> %1<br> <b>Autori:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Puoi cercare parole simili:</b> %1<br> yes si no no QStarDict Settings Impostazioni QStarDict Show information about dictionary Mostra informazioni sul dizionario Global settings Impostazioni globali Start with system Instant search Ricerca istantanea Pronounce words using this command: Pronuncia le parole usando questo comando: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Inserisci il comando per il programma di pronuncia.<br>Se il comando contiene "%s" la parola verrà sostituita, altrimenti la parola sarà scritta nello stdin del processo di pronuncia. Dictionaries Dizionari Move up Sposta in su Up Su Move down Sposta in giù Down Giù Show info Mostra informazioni Plugins Estensioni Show information about plugin Mostra informazioni sull'estensione Info Informazioni Configure plugin Configura estensione Configure Configura Popup window Finestra di popup Behavior Comportamento Pronounce the word Pronuncia la parola Timeout before hide after mouse over Tempo di scomparsa dopo aver mosso il mouse Don't hide Non nascondere sec sec Show only if modifier pressed Mostra solo se si preme Alt Alt Control Control Shift Shift Win Win Scan selection Cerca selezione Show if word not found Mostra se la parola non viene trovata Appearance Aspetto Opacity Opacità % % Default width Ampiezza di default Default height Altezza di default <b>Author:</b> %1<br> <b>Autore:</b> %1<br> <b>Words count:</b> %1<br> <b>Conto parole:</b> %1<br> All translation Tutta la traduzione Dictionary name Nome del dizionario Title Titolo Explanation Spiegazione Abbreviation Abbreviazione Example Esempio Transcription Trascrizione Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Cerca &Configure QStarDict &Configura QStarDict &Quit &Esci QStarDict: scanning is %1 QStarDict: la ricerca è %1 enabled abilitato disabled disabilitato qstardict-3.0.0/qstardict/translations/qstardict-ka_GE.qm000066400000000000000000000302631472531462200235420ustar00rootroot00000000000000U') O)t~H4])*Uy)^#${T֍xH5!E'*% *0 &++ i+*+~ +~+-J+LbY$z[ %(|, %#(,e&GD"'o1 qF)= u: C7G"_ 4$WjE*I#) .7qC&;Ulw!(Ϧ hs! \ؐ^MwNL338g! 2?%Cl !;"ϗY~g;7.MS.8] g! =mC $ ]+ ?4 aQ ex  +n t: *( 2 5nW :n$ T$ le =    ,< @> G,` G RV* e4D e4D* w )H  0 s w! Ge"  #:4 w * bY1oYr0sNSV .)i,D    Case sensitiveDictBrowserSearch FormDictBrowserSearch_:Search:DictBrowserSearch   Whole wordsDictBrowserSearch#000000#000000QStarDict::CSSEditBQStarDict::CSSEdit BackgroundQStarDict::CSSEditBoldQStarDict::CSSEdit6  Click to select colorQStarDict::CSSEditElementQStarDict::CSSEdit FontQStarDict::CSSEdit  ForegroundQStarDict::CSSEditIIQStarDict::CSSEdit ItalicQStarDict::CSSEditPreviewQStarDict::CSSEdit  Select elementQStarDict::CSSEdit  Select fontQStarDict::CSSEdit&  Select font sizeQStarDict::CSSEditSizeQStarDict::CSSEditUUQStarDict::CSSEdit UnderlineQStarDict::CSSEditptQStarDict::CSSEditB <b>%1</b>  . The word %1 is not found.QStarDict::DictBrowser&  &Save to fileQStarDict::DictWidget@  ,  %1Cannot save translation as %1QStarDict::DictWidgetErrorQStarDict::DictWidget4  &Go to &next translationQStarDict::DictWidget0 & Go to &previous translationQStarDict::DictWidget6HTML  (*.html *.htm)HTML files (*.html *.htm)QStarDict::DictWidget8HTML  (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget& &Prin&t translationQStarDict::DictWidget" Save translationQStarDict::DictWidget SearchQStarDict::DictWidget$ & Speak &wordQStarDict::DictWidget0  (*.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow&&AboutQStarDict::MainWindow*&QStarDict- &Configure QStarDictQStarDict::MainWindow &&FileQStarDict::MainWindow&&HelpQStarDict::MainWindow&&QuitQStarDict::MainWindow&&ScanQStarDict::MainWindow& &SettingsQStarDict::MainWindow`<b>QStarDict %1 </b> - StarDict- Qt <br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow&Qt-  About &QtQStarDict::MainWindow(QStarDict- About QStarDictQStarDict::MainWindowClearQStarDict::MainWindow0  Clear the search boxQStarDict::MainWindow   (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindowF1F1QStarDict::MainWindow$  Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow.QStarDict- &QStarDict &HelpQStarDict::MainWindow SearchQStarDict::MainWindow  Words listQStarDict::MainWindow  secQStarDict::SettingsDialog%%QStarDict::SettingsDialog*<b>:</b> %1<br>Author: %1
    QStarDict::SettingsDialog.<b>:</b> %1<br>Authors: %1
    QStarDict::SettingsDialogf<b>   :</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog"<b>:</b> %1Description: %1QStarDict::SettingsDialog*<b>:</b> %1<br>Name: %1
    QStarDict::SettingsDialog.<b>:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog*<b>:</b> %1<br>Version: %1
    QStarDict::SettingsDialogD<b> :</b> %1<br>Words count: %1
    QStarDict::SettingsDialog<br>
    QStarDict::SettingsDialog AbbreviationQStarDict::SettingsDialog All translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialog  AppearanceQStarDict::SettingsDialog BehaviorQStarDict::SettingsDialog ConfigureQStarDict::SettingsDialog" Configure pluginQStarDict::SettingsDialogControlQStarDict::SettingsDialog( Default heightQStarDict::SettingsDialog&  Default widthQStarDict::SettingsDialog DictionariesQStarDict::SettingsDialog" Dictionary nameQStarDict::SettingsDialog  Don't hideQStarDict::SettingsDialog DownQStarDict::SettingsDialog EnabledQStarDict::SettingsDialogn   .<br>   "%s"-,   .        .Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogExampleQStarDict::SettingsDialog  ExplanationQStarDict::SettingsDialog* Global settingsQStarDict::SettingsDialogInfoQStarDict::SettingsDialog> %1  Information about %1 pluginQStarDict::SettingsDialogD "%1"  !Information about dictionary "%1"QStarDict::SettingsDialog Instant searchQStarDict::SettingsDialog  Move downQStarDict::SettingsDialog Move upQStarDict::SettingsDialog NameQStarDict::SettingsDialogOpacityQStarDict::SettingsDialogPluginQStarDict::SettingsDialogPluginsQStarDict::SettingsDialog   Popup windowQStarDict::SettingsDialog" Pronounce the wordQStarDict::SettingsDialogB   :#Pronounce words using this command:QStarDict::SettingsDialog(QStarDict- QStarDict SettingsQStarDict::SettingsDialog( Scan selectionQStarDict::SettingsDialogShiftQStarDict::SettingsDialog>,    Show if word not foundQStarDict::SettingsDialog&  Show infoQStarDict::SettingsDialogL   !Show information about dictionaryQStarDict::SettingsDialogJ   Show information about pluginQStarDict::SettingsDialogT, ,   Show only if modifier pressedQStarDict::SettingsDialog2  Start with systemQStarDict::SettingsDialogJ   $Timeout before hide after mouse overQStarDict::SettingsDialogTitleQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialogUpQStarDict::SettingsDialog  Use system trayQStarDict::SettingsDialogWinWinQStarDict::SettingsDialognoQStarDict::SettingsDialogunknownQStarDict::SettingsDialogyesyesQStarDict::SettingsDialog*&QStarDict- &Configure QStarDictQStarDict::TrayIcon&&QuitQStarDict::TrayIcon&&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon.QStarDict:  %1QStarDict: scanning is %1QStarDict::TrayIcondisabledQStarDict::TrayIconenabledQStarDict::TrayIcon ) , qstardict-3.0.0/qstardict/translations/qstardict-ka_GE.ts000066400000000000000000000566521472531462200235650ustar00rootroot00000000000000 DictBrowserSearch Form ფორმა Search: _ძებნა: Case sensitive დიდი და პატარა ასოების განსხვავება Whole words მთლიანი სიტყვები QStarDict::CSSEdit Preview მინიატურა Element ელემენტი Foreground წინა პლანი Background ფონი Select element აირჩიეთ ელემენტი Click to select color დააწკაპუნეთ ფერის ასარჩევად #000000 #000000 Font ფონტი Size ზომა Select font აირჩიეთ ფონტი Select font size აირჩიეთ ფონტის ზომა pt წრტ Bold გასქელება B Italic დახრა I I Underline ხაზგასმული U U QStarDict::DictBrowser The word <b>%1</b> is not found. სიტყვა <b>%1</b> აღმოჩენილი არაა. QStarDict::DictWidget Save translation თარგმანის შენახვა HTML files (*.html, *.htm) HTML ფაილები (*.html, *.htm) Text files (*.txt) ტექსტური ფაილები (*.txt) Search ძებნა HTML files (*.html *.htm) HTML ფაილები (*.html *.htm) Error შეცდომა Cannot save translation as %1 ვერ შევინახე თარგმანი, როგორც %1 Go to &previous translation გადასვლა &წინა თარგმანზე Go to &next translation გადასვლა შემდეგ თარგმა&ნზე &Save to file &ფაილში შენახვა Speak &word სიტყვის &წარმოთქმა Prin&t translation თარგმანის &დაბეჭდვა QStarDict::MainWindow About QStarDict QStarDict-ის შესახებ <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - StarDict-ის Qt ვერსია<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> ყველა უფლება დაცულია (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box ძებნის ზოლის გასუფთავება Clear გაწმენდა Fuzzy query ბუნდოვანი მოთხოვნა Search ძებნა Words list სიტყვების სია &File &ფაილი &Help დახმა&რება &Settings &პარამეტრები &Quit გა&სვლა Ctrl+Q Ctrl+Q &About &შესახებ About &Qt &Qt-ის შესახებ &Configure QStarDict &QStarDict-ის მორგება &Scan &სკანირება QStarDict &Help QStarDict-ის &დახმარება F1 F1 QStarDict::SettingsDialog Enabled ჩაირთო Name სახელი Plugin დამატება Information about dictionary "%1" ინფორმაცია "%1" ლექსიკონის შესახებ <b>Name:</b> %1<br> <b>სახელი:</b> %1<br> <b>Plugin:</b> %1<br> <b>დამატება:</b> %1<br> unknown უცნობია <b>Description:</b> %1 <b>აღწერა:</b> %1 Information about %1 plugin ინფორმაცია %1 დამატების შესახებ <b>Version:</b> %1<br> <b>ვერსია:</b> %1<br> <b>Authors:</b> %1<br> <b>ავტორები:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>შესაძლებელია მსგავსი სიტყვების ძებნა:</b> %1<br> yes yes no არა QStarDict Settings QStarDict-ის მორგება Show information about dictionary ლექსიკონის შესახებ ინფორმაციის ჩვენება Global settings გლობალური პარამეტრები Start with system გაშვება სისტემასთან ერთად Instant search მყისი ძებნა Pronounce words using this command: სიტყვების წარმოთქმა ამ ბრძანებით: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. შეიყვანეთ ბრძანება წარმოთქმის პროგრამისთვის.<br>თუ ბრძანება შეიცავს "%s"-ს, ის სიტყვით ჩანაცვლდება. წინააღმდეგ შემთხვევაში სიტყვები წარმოთქმის პროცესის სტანდარტულ შეყვანაში ჩაიწერება. Dictionaries ლექსიკონები Move up აწევა Up ჩართული Move down დაწევა Down დაბლა Show info ინფორმაციის ჩვენება Plugins დამატებები Show information about plugin ინფორმაციის ჩვენება დამატების შესახებ Info ინფორმაცია Configure plugin დამატების მორგება Configure მორგება Popup window მხტუნარა ფანჯარა Behavior ქცევა Pronounce the word სიტყვის წარმოთქმა Timeout before hide after mouse over ვადა დამალვამდე თაგუნას გადატარებისას Don't hide არ დამალო sec წმ Show only if modifier pressed ჩვენება, მხოლოდ, თუ დაჭერილია მოდიფიკატორი Alt Alt Control კონტროლი Shift წანაცვლება Win Win Scan selection მონიშნულის სკანირება Show if word not found ჩვენება, თუ სიტყვა ვერ მოიძებნა Appearance გარემოს იერსახე Opacity გაუმჭირვალობა % % Default width ნაგულისხმევი სიგანე Default height ნაგულისხმევი სიმაღლე <b>Author:</b> %1<br> <b>ავტორი:</b> %1<br> <b>Words count:</b> %1<br> <b>სიტყვების რაოდენობა:</b> %1<br> All translation ყველა თარგმანი Dictionary name ლექსიკონის სახელი Title ჩინი Explanation ახსნა Abbreviation აბრევიატურა Example მაგალითი Transcription ტრანსკრიფცია Use system tray სისტემის კუთხეში QStarDict::TrayIcon QStarDict QStarDict &Scan &სკანირება &Configure QStarDict &QStarDict-ის მორგება &Quit გა&სვლა QStarDict: scanning is %1 QStarDict: სკანირება %1 enabled ჩართული disabled გათისული qstardict-3.0.0/qstardict/translations/qstardict-lt_LT.qm000066400000000000000000000272061472531462200236150ustar00rootroot00000000000000 @ G*b G RV( e4D e4D(~ w ',  0. s : wn Ge] #:4 w bYvoYr`0sN5V.ri*#000000#000000QStarDict::CSSEditJBQStarDict::CSSEdit Fonas BackgroundQStarDict::CSSEditPusjuodisBoldQStarDict::CSSEdit$Pasirinkite spalvClick to select colorQStarDict::CSSEditElementasElementQStarDict::CSSEdit`riftasFontQStarDict::CSSEdit Priekinis planas ForegroundQStarDict::CSSEditKIQStarDict::CSSEditKursyvasItalicQStarDict::CSSEditPer~ikraPreviewQStarDict::CSSEdit(Pasirinkite elementSelect elementQStarDict::CSSEdit$Pasirinkite arift Select fontQStarDict::CSSEdit.Pasirinkite arifto dyd/Select font sizeQStarDict::CSSEdit DydisSizeQStarDict::CSSEditPUQStarDict::CSSEditPabraukimas UnderlineQStarDict::CSSEdit taakaiptQStarDict::CSSEdit2}odis <b>%1</b> nerastas. The word %1 is not found.QStarDict::DictBrowser&.&raayti / rinkmen &Save to fileQStarDict::DictWidget:Vertimo nepavyko /raayti / %1Cannot save translation as %1QStarDict::DictWidget KlaidaErrorQStarDict::DictWidget$&Tolesnis vertimasGo to &next translationQStarDict::DictWidget(&Ankstesnis vertimasGo to &previous translationQStarDict::DictWidget<HTML rinkmenos (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget&&Spausdinti puslap/Prin&t translationQStarDict::DictWidget.raayti vertimSave translationQStarDict::DictWidgetIeakotiSearchQStarDict::DictWidgetIa&tarti ~od/ Speak &wordQStarDict::DictWidget0Teksto rinkmenos (*.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow &Apie&AboutQStarDict::MainWindow.&Konfigkruoti QStarDict&Configure QStarDictQStarDict::MainWindow&Rinkmena&FileQStarDict::MainWindow&Pagalba&HelpQStarDict::MainWindow&Baigti&QuitQStarDict::MainWindow&Per~velgimas&ScanQStarDict::MainWindow&Nuostatos &SettingsQStarDict::MainWindowl<b>QStarDict %1 </b> - StarDict versija Qt ssajai<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowApie &Qt About &QtQStarDict::MainWindowApie QStarDictAbout QStarDictQStarDict::MainWindowIavalytiClearQStarDict::MainWindow2Iavalyti paieakos laukel/Clear the search boxQStarDict::MainWindowAutorins teiss (C) 2007-2009 Alexandre Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Vald+QCtrl+QQStarDict::MainWindowF1F1QStarDict::MainWindow"Apytiksl paieaka Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow$QStarDict &pagalbaQStarDict &HelpQStarDict::MainWindowIeakotiSearchQStarDict::MainWindow}od~is sraaas Words listQStarDict::MainWindows secQStarDict::SettingsDialog%%QStarDict::SettingsDialog0<b>Autorius :</b> %1<br>Author: %1
    QStarDict::SettingsDialog0<b>Autoriai :</b> %1<br>Authors: %1
    QStarDict::SettingsDialog\<b>Palaikoma panaais ~o~is paieaka:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog*<b>Apraaymas :</b> %1Description: %1QStarDict::SettingsDialog8<b>Pavadinimas :</b> %1 <br>Name: %1
    QStarDict::SettingsDialog2<b>Pltinys :</b> %1 <br>Plugin: %1
    QStarDict::SettingsDialog0<b>Versija :</b> %1 <br>Version: %1
    QStarDict::SettingsDialog<<b>}od~is skai ius:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog<br>
    QStarDict::SettingsDialogSantrumpa AbbreviationQStarDict::SettingsDialog&Numatytasis stiliusAll translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialogIavaizda AppearanceQStarDict::SettingsDialogElgsenaBehaviorQStarDict::SettingsDialogKonfigkruoti ConfigureQStarDict::SettingsDialog,konfigkruoti papildin/Configure pluginQStarDict::SettingsDialogValdControlQStarDict::SettingsDialog&Numatytasis aukatisDefault heightQStarDict::SettingsDialog$Numatytasis plotis Default widthQStarDict::SettingsDialog}odynai DictionariesQStarDict::SettingsDialog$}odyno pavadinimasDictionary nameQStarDict::SettingsDialogNeslpti Don't hideQStarDict::SettingsDialog }emynDownQStarDict::SettingsDialog.galintaEnabledQStarDict::SettingsDialogb.veskite komand, naudojam ~od~is iatarimui.<br>Jei komanda turi reiakin/ %s , jis bus pakeistas iatarsimu ~od~iu, preiaingu atveju ~odis bus priraaytas komandos gale (stdin).Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogPavyzdysExampleQStarDict::SettingsDialogApibkdinimas ExplanationQStarDict::SettingsDialog"Bendros nuostatosGlobal settingsQStarDict::SettingsDialogInformacijaInfoQStarDict::SettingsDialog>%1  informacija apie papildin/Information about %1 pluginQStarDict::SettingsDialog< %1   informacij apie ~odyn!Information about dictionary "%1"QStarDict::SettingsDialogIeakoti vedantInstant searchQStarDict::SettingsDialogNuleisti ~emyn Move downQStarDict::SettingsDialogKelti aukatynMove upQStarDict::SettingsDialogPavadinimasNameQStarDict::SettingsDialogDengiamumasOpacityQStarDict::SettingsDialogPapildinysPluginQStarDict::SettingsDialogPapildiniaiPluginsQStarDict::SettingsDialog"Iakylantis langas Popup windowQStarDict::SettingsDialogIatarti ~od/Pronounce the wordQStarDict::SettingsDialog>}od~is tarimui naudoti komand:#Pronounce words using this command:QStarDict::SettingsDialog&QStarDict nuostatosQStarDict SettingsQStarDict::SettingsDialog8Per~velgti pa~ymtus tekstusScan selectionQStarDict::SettingsDialogLyg2ShiftQStarDict::SettingsDialog0Rodyti ir neradus ~od~ioShow if word not foundQStarDict::SettingsDialog$Rodyti informacij Show infoQStarDict::SettingsDialog<Rodyti informacij apie ~odyn!Show information about dictionaryQStarDict::SettingsDialogBRodyti informacij apie papildin/Show information about pluginQStarDict::SettingsDialogRRodyti tik nuspaudus modifikavimo klaviaShow only if modifier pressedQStarDict::SettingsDialog\Lango rodymo laikas po to, kai j/ palieka pel$Timeout before hide after mouse overQStarDict::SettingsDialogAntraatTitleQStarDict::SettingsDialogTranskripcija TranscriptionQStarDict::SettingsDialogAukatynUpQStarDict::SettingsDialog,Naudoti sistemos dklUse system trayQStarDict::SettingsDialogWinWinQStarDict::SettingsDialognenoQStarDict::SettingsDialogne~inomaunknownQStarDict::SettingsDialogtaipyesQStarDict::SettingsDialog.&Konfigkruoti QStarDict&Configure QStarDictQStarDict::TrayIcon&Baigti&QuitQStarDict::TrayIcon&Per~velgimas&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon2Per~velgimo parinktis: %1QStarDict: scanning is %1QStarDict::TrayIconu~draustadisabledQStarDict::TrayIcon/galintaenabledQStarDict::TrayIcon ) , qstardict-3.0.0/qstardict/translations/qstardict-lt_LT.ts000066400000000000000000000604061472531462200236250ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Peržiūra Element Elementas Foreground Priekinis planas Background Fonas Select element Pasirinkite elementą Click to select color Pasirinkite spalvą #000000 #000000 Font Šriftas Size Dydis Select font Pasirinkite šriftą Select font size Pasirinkite šrifto dydį pt taškai Bold Pusjuodis B J Italic Kursyvas I K Underline Pabraukimas U P QStarDict::DictBrowser The word <b>%1</b> is not found. Žodis <b>%1</b> nerastas. QStarDict::DictWidget Save translation Įrašyti vertimą HTML files (*.html, *.htm) HTML rinkmenos (*.html, *.htm) Text files (*.txt) Teksto rinkmenos (*.txt) Search Ieškoti HTML files (*.html *.htm) Error Klaida Cannot save translation as %1 Vertimo nepavyko įrašyti į %1 Go to &previous translation &Ankstesnis vertimas Go to &next translation &Tolesnis vertimas &Save to file Į&rašyti į rinkmeną Speak &word Iš&tarti žodį Prin&t translation &Spausdinti puslapį QStarDict::MainWindow About QStarDict Apie QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - StarDict versija Qt sąsajai<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Autorinės teisės (C) 2007-2009 Alexandre Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Išvalyti paieškos laukelį Clear Išvalyti Fuzzy query Apytikslė paieška Search Ieškoti Words list Žodžių sąrašas &File &Rinkmena &Help &Pagalba &Settings &Nuostatos &Quit &Baigti Ctrl+Q Vald+Q &About &Apie About &Qt Apie &Qt &Configure QStarDict &Konfigūruoti QStarDict &Scan &Peržvelgimas QStarDict &Help QStarDict &pagalba F1 F1 QStarDict::SettingsDialog Enabled Įgalinta Name Pavadinimas Plugin Papildinys Information about dictionary "%1" „%1“ – informaciją apie žodyną <b>Name:</b> %1<br> <b>Pavadinimas :</b> %1 <br> <b>Plugin:</b> %1<br> <b>Plėtinys :</b> %1 <br> unknown nežinoma <b>Description:</b> %1 <b>Aprašymas :</b> %1 Information about %1 plugin %1 – informacija apie papildinį <b>Version:</b> %1<br> <b>Versija :</b> %1 <br> <b>Authors:</b> %1<br> <b>Autoriai :</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Palaikoma panašių žožių paieška:</b> %1<br> yes taip no ne QStarDict Settings QStarDict nuostatos Show information about dictionary Rodyti informaciją apie žodyną Global settings Bendros nuostatos Start with system Instant search Ieškoti vedant Pronounce words using this command: Žodžių tarimui naudoti komandą: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Įveskite komandą, naudojamą žodžių ištarimui.<br>Jei komanda turi reiškinį „%s“, jis bus pakeistas ištarsimu žodžiu, preišingu atveju žodis bus prirašytas komandos gale (stdin). Dictionaries Žodynai Move up Kelti aukštyn Up Aukštyn Move down Nuleisti žemyn Down Žemyn Show info Rodyti informaciją Plugins Papildiniai Show information about plugin Rodyti informaciją apie papildinį Info Informacija Configure plugin konfigūruoti papildinį Configure Konfigūruoti Popup window Iškylantis langas Behavior Elgsena Pronounce the word Ištarti žodį Timeout before hide after mouse over Lango rodymo laikas po to, kai jį palieka pelė Don't hide Neslėpti sec s Show only if modifier pressed Rodyti tik nuspaudus modifikavimo klavišą Alt Alt Control Vald Shift Lyg2 Win Win Scan selection Peržvelgti pažymėtus tekstus Show if word not found Rodyti ir neradus žodžio Appearance Išvaizda Opacity Dengiamumas % % Default width Numatytasis plotis Default height Numatytasis aukštis <b>Author:</b> %1<br> <b>Autorius :</b> %1<br> <b>Words count:</b> %1<br> <b>Žodžių skaičius:</b> %1<br> All translation Numatytasis stilius Dictionary name Žodyno pavadinimas Title Antraštė Explanation Apibūdinimas Abbreviation Santrumpa Example Pavyzdys Transcription Transkripcija Use system tray Naudoti sistemos dėklą QStarDict::TrayIcon QStarDict QStarDict &Scan &Peržvelgimas &Configure QStarDict &Konfigūruoti QStarDict &Quit &Baigti QStarDict: scanning is %1 Peržvelgimo parinktis: %1 enabled įgalinta disabled uždrausta qstardict-3.0.0/qstardict/translations/qstardict-pl_PL.qm000066400000000000000000000260171472531462200236040ustar00rootroot00000000000000%1</b> nie zostaBo znalezione. The word %1 is not found.QStarDict::DictBrowser &Zapisz do pliku &Save to fileQStarDict::DictWidgetHNie mog zapisa tBumaczenia jako %1Cannot save translation as %1QStarDict::DictWidgetBBdErrorQStarDict::DictWidget<Idz do &nastpnego tBumaczeniaGo to &next translationQStarDict::DictWidget@Idz do &poprzedniego tBumaczeniaGo to &previous translationQStarDict::DictWidget4Pliki HTML (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget&Drukuj &tBumaczeniePrin&t translationQStarDict::DictWidget$Zapisz tBumaczenieSave translationQStarDict::DictWidget SzukajSearchQStarDict::DictWidgetWymw sBo&wo Speak &wordQStarDict::DictWidget,Pliki tekstowe (*.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow&O QStarDict&AboutQStarDict::MainWindow*&Konfiguruj QStarDict&Configure QStarDictQStarDict::MainWindow &Plik&FileQStarDict::MainWindow &Pomoc&HelpQStarDict::MainWindow&Zamknij&QuitQStarDict::MainWindow&Skanuj&ScanQStarDict::MainWindow&Ustawienia &SettingsQStarDict::MainWindowZ<b>QStarDict %1 </b> - StarDict wersja QT<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow O &Qt About &QtQStarDict::MainWindowO QStarDictAbout QStarDictQStarDict::MainWindowWyczy[ClearQStarDict::MainWindow8Wyczy[ okienko wyszukiwaniaClear the search boxQStarDict::MainWindowCopyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> {2007-2009 ?}uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindowMtne zapytanie Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow SzukajSearchQStarDict::MainWindowLista sBw Words listQStarDict::MainWindow sec secQStarDict::SettingsDialog%%QStarDict::SettingsDialog(<b>Autor:</b> %1<br>Author: %1
    QStarDict::SettingsDialog,<b>Autorzy:</b> %1<br>Authors: %1
    QStarDict::SettingsDialogT<b>Mo|e wyszuka podobne sBowa:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog<b>Opis:</b> %1Description: %1QStarDict::SettingsDialog&<b>Imi:</b> %1<br>Name: %1
    QStarDict::SettingsDialog,<b>Wtyczka:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog*<b>Wersja:</b> %1<br>Version: %1
    QStarDict::SettingsDialog2<b>Ilo[ sBw:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog<br>
    QStarDict::SettingsDialog Skrt AbbreviationQStarDict::SettingsDialog*Wszystkie tBumaczeniaAll translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialog Wygld AppearanceQStarDict::SettingsDialogZachowanieBehaviorQStarDict::SettingsDialogKonfiguruj ConfigureQStarDict::SettingsDialog$Konfiguruj wtyczkConfigure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog"Domy[lna wysoko[Default heightQStarDict::SettingsDialog$Domy[lna szeroko[ Default widthQStarDict::SettingsDialogSBowniki DictionariesQStarDict::SettingsDialogNazwa sBownikaDictionary nameQStarDict::SettingsDialogNie ukrywaj Don't hideQStarDict::SettingsDialogDBDownQStarDict::SettingsDialogWBczoneEnabledQStarDict::SettingsDialog0Wpisz komend dla syntezatora mowy.<br>Je[li komenda zawiera "%s" to bdzie ona zastpiona sBowem lub sBowo zostanie zapisane do stdin procesu mwienia.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogPrzykBadExampleQStarDict::SettingsDialogWytBumaczenie ExplanationQStarDict::SettingsDialogGlobalne opcjeGlobal settingsQStarDict::SettingsDialogInfoInfoQStarDict::SettingsDialog.Informacj o wtyczce %1Information about %1 pluginQStarDict::SettingsDialog4Informacja o sBowniku "%1"!Information about dictionary "%1"QStarDict::SettingsDialog*BByskawiczne szukanieInstant searchQStarDict::SettingsDialogPrzesuD w dB Move downQStarDict::SettingsDialogPrzesuD w grMove upQStarDict::SettingsDialog NazwaNameQStarDict::SettingsDialog$Nieprzezroczysto[OpacityQStarDict::SettingsDialogWtyczkaPluginQStarDict::SettingsDialogWtyczkiPluginsQStarDict::SettingsDialogOkno popup Popup windowQStarDict::SettingsDialogWymw sBowoPronounce the wordQStarDict::SettingsDialogHWymw sBowo u|ywajc tego polecenia:#Pronounce words using this command:QStarDict::SettingsDialog(Ustawienia QStarDictQStarDict SettingsQStarDict::SettingsDialog$Skanuj zaznaczenieScan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialogPPoka| je[li sBowo nie zostaBo znalezioneShow if word not foundQStarDict::SettingsDialogPoka| info Show infoQStarDict::SettingsDialog6Poka| informacje o sBowniku!Show information about dictionaryQStarDict::SettingsDialog4Poka| informacje o wtyczceShow information about pluginQStarDict::SettingsDialogbPoka| tylko je[li modyfikator zostanie naci[nityShow only if modifier pressedQStarDict::SettingsDialogXOpznienie zanim ukryje po najechaniu myszk$Timeout before hide after mouse overQStarDict::SettingsDialog TytuBTitleQStarDict::SettingsDialogTranskrypcja TranscriptionQStarDict::SettingsDialogGraUpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialognienoQStarDict::SettingsDialognieznanyunknownQStarDict::SettingsDialogtakyesQStarDict::SettingsDialog*&Konfiguruj QStarDict&Configure QStarDictQStarDict::TrayIcon&Zamknij&QuitQStarDict::TrayIcon&Skanuj&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIconwyBczonedisabledQStarDict::TrayIconwBczoneenabledQStarDict::TrayIcon , qstardict-3.0.0/qstardict/translations/qstardict-pl_PL.ts000066400000000000000000000610141472531462200236110ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Podgląd Element Element Foreground Pierwszy plan Background Tło Select element Wybierz element Click to select color Kliknij by wybrać kolor #000000 Font Czcionka Size Rozmiar Select font Wybierz czcionkę Select font size Wybierz rozmiar czionki pt Bold Pogrubiona B Italic Pochyła I Underline Podkreślona U QStarDict::DictBrowser The word <b>%1</b> is not found. Słowo <b>%1</b> nie zostało znalezione. QStarDict::DictWidget Save translation Zapisz tłumaczenie HTML files (*.html, *.htm) Pliki HTML (*.html, *.htm) Text files (*.txt) Pliki tekstowe (*.txt) Search Szukaj HTML files (*.html *.htm) Error Błąd Cannot save translation as %1 Nie mogę zapisać tłumaczenia jako %1 Go to &previous translation Idź do &poprzedniego tłumaczenia Go to &next translation Idź do &następnego tłumaczenia &Save to file &Zapisz do pliku Speak &word Wymów sło&wo Prin&t translation Drukuj &tłumaczenie QStarDict::MainWindow About QStarDict O QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - StarDict wersja QT<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Wyczyść okienko wyszukiwania Clear Wyczyść Fuzzy query Mętne zapytanie Search Szukaj Words list Lista słów &File &Plik &Help &Pomoc &Settings &Ustawienia &Quit &Zamknij Ctrl+Q Ctrl+Q &About &O QStarDict About &Qt O &Qt &Configure QStarDict &Konfiguruj QStarDict &Scan &Skanuj Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> {2007-2009 ?} QStarDict &Help F1 QStarDict::SettingsDialog Enabled Włączone Name Nazwa Plugin Wtyczka Information about dictionary "%1" Informacja o słowniku "%1" <b>Name:</b> %1<br> <b>Imię:</b> %1<br> <b>Plugin:</b> %1<br> <b>Wtyczka:</b> %1<br> unknown nieznany <b>Description:</b> %1 <b>Opis:</b> %1 Information about %1 plugin Informację o wtyczce %1 <b>Version:</b> %1<br> <b>Wersja:</b> %1<br> <b>Authors:</b> %1<br> <b>Autorzy:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Może wyszukać podobne słowa:</b> %1<br> yes tak no nie QStarDict Settings Ustawienia QStarDict Show information about dictionary Pokaż informacje o słowniku Global settings Globalne opcje Start with system Instant search Błyskawiczne szukanie Pronounce words using this command: Wymów słowo używając tego polecenia: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Wpisz komendę dla syntezatora mowy.<br>Jeśli komenda zawiera "%s" to będzie ona zastąpiona słowem lub słowo zostanie zapisane do stdin procesu mówienia. Dictionaries Słowniki Move up Przesuń w górę Up Góra Move down Przesuń w dół Down Dół Show info Pokaż info Plugins Wtyczki Show information about plugin Pokaż informacje o wtyczce Info Info Configure plugin Konfiguruj wtyczkę Configure Konfiguruj Popup window Okno popup Behavior Zachowanie Pronounce the word Wymów słowo Timeout before hide after mouse over Opóźnienie zanim ukryje po najechaniu myszką Don't hide Nie ukrywaj sec sec Show only if modifier pressed Pokaż tylko jeśli modyfikator zostanie naciśnięty Alt Alt Control Control Shift Shift Win Win Scan selection Skanuj zaznaczenie Show if word not found Pokaż jeśli słowo nie zostało znalezione Appearance Wygląd Opacity Nieprzezroczystość % % Default width Domyślna szerokość Default height Domyślna wysokość <b>Author:</b> %1<br> <b>Autor:</b> %1<br> <b>Words count:</b> %1<br> <b>Ilość słów:</b> %1<br> All translation Wszystkie tłumaczenia Dictionary name Nazwa słownika Title Tytuł Explanation Wytłumaczenie Abbreviation Skrót Example Przykład Transcription Transkrypcja Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Skanuj &Configure QStarDict &Konfiguruj QStarDict &Quit &Zamknij QStarDict: scanning is %1 enabled włączone disabled wyłączone qstardict-3.0.0/qstardict/translations/qstardict-pt_BR.qm000066400000000000000000000074661472531462200236130ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Element Foreground Background Select element Click to select color #000000 Font Size Select font Select font size pt Bold B Italic I Underline U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Salvar tradução HTML files (*.html, *.htm) Text files (*.txt) Search Buscar HTML files (*.html *.htm) Error Erro Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Salvar para arquivo Speak &word Prin&t translation QStarDict::MainWindow About QStarDict Sobre QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict %1 - QStarDict Clear the search box Limpar caixa de Busca Clear Limpar Fuzzy query Fuzzy Consulta Search Buscar Words list Lista de Palavras &File &Arquivo &Help &Ajuda &Settings &Configurações &Quit &Sair Ctrl+Q Ctrl+Q &About &Sobre About &Qt Sobre Qt &Configure QStarDict &Configurar QStarDict &Scan &Busca QStarDict &Help F1 QStarDict::SettingsDialog Enabled Name Plugin Information about dictionary "%1" <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> unknown <b>Description:</b> %1 Information about %1 plugin <b>Version:</b> %1<br> <b>Authors:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> yes no QStarDict Settings Configurações QStarDict Show information about dictionary Global settings Start with system Instant search Pronounce words using this command: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries Dicionários Move up Up Cima Move down Down Baixo Show info Plugins Show information about plugin Info Configure plugin Configure Popup window Janela Popup Behavior Comportamento Pronounce the word Pronúciar esta palavra Timeout before hide after mouse over Esperar antes esconder depois de passar o mouse sobre Don't hide Não Esconder sec seg Show only if modifier pressed Mostrar somente com modificador pressionando Alt Alt Control Control Shift Shift Win Win Scan selection Buscar Seleção Show if word not found Mostrar as palavras não encontradas Appearance Aparencia Opacity Opacidade % % Default width Largura padrão Default height Altura Padrão <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation Dictionary name Title Explanation Abbreviation Example Transcription Use system tray QStarDict::TrayIcon QStarDict &Scan &Busca &Configure QStarDict &Configurar QStarDict &Quit &Sair QStarDict: scanning is %1 enabled disabled qstardict-3.0.0/qstardict/translations/qstardict-ru_RU.qm000066400000000000000000000277151472531462200236400ustar00rootroot00000000000000=0 BackgroundQStarDict::CSSEdit 8@=K9BoldQStarDict::CSSEdit:06<8B5 GB>1K 2K1@0BL M;5<5=BClick to select colorQStarDict::CSSEdit-;5<5=BElementQStarDict::CSSEdit (@8DBFontQStarDict::CSSEdit&25B H@8DB0 ForegroundQStarDict::CSSEditIQStarDict::CSSEdit C@A82ItalicQStarDict::CSSEdit0@5420@8B5;L=K9 ?@>A<>B@PreviewQStarDict::CSSEdit K15@8B5 M;5<5=BSelect elementQStarDict::CSSEditK15@8B5 H@8DB Select fontQStarDict::CSSEdit,K15@8B5 @07<5@ H@8DB0Select font sizeQStarDict::CSSEdit  07<5@SizeQStarDict::CSSEditUQStarDict::CSSEdit>4G5@:=CBK9 UnderlineQStarDict::CSSEdit?BptQStarDict::CSSEdit6!;>2> <b>%1</b> =5 =0945=>. The word %1 is not found.QStarDict::DictBrowser"&!>E@0=8BL 2 D09; &Save to fileQStarDict::DictWidgetF52>7<>6=> A>E@0=8BL ?5@52>4 :0: %1Cannot save translation as %1QStarDict::DictWidget H81:0ErrorQStarDict::DictWidget<5@59B8 : &A;54CNI5<C ?5@52>4CGo to &next translationQStarDict::DictWidget>5@59B8 : &?@54K4CI5<C ?5@52>4CGo to &previous translationQStarDict::DictWidget2$09;K HTML (*.html *.htm)HTML files (*.html *.htm)QStarDict::DictWidget4HTML-D09;K (*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidget&0?5G0B0&BL ?5@52>4Prin&t translationQStarDict::DictWidget"!>E@0=8BL ?5@52>4Save translationQStarDict::DictWidget >8A:SearchQStarDict::DictWidget"&@>87=5AB8 A;>2> Speak &wordQStarDict::DictWidget."5:AB>2K5 D09;K (*.txt)Text files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow,& ?@>3@0<<5 QStarDict&AboutQStarDict::MainWindow&>=D83C@0F8O&Configure QStarDictQStarDict::MainWindow &$09;&FileQStarDict::MainWindow&!?@02:0&HelpQStarDict::MainWindow &KE>4&QuitQStarDict::MainWindow&!:0=8@>20BL&ScanQStarDict::MainWindow&0AB@>9:8 &SettingsQStarDict::MainWindown<b>QStarDict %1 </b> - Qt-25@A8O ?@>3@0<<K StarDict<br>1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow  &181;8>B5:5 Qt About &QtQStarDict::MainWindow* ?@>3@0<<5 QStarDictAbout QStarDictQStarDict::MainWindowG8AB8BLClearQStarDict::MainWindow,G8AB8BL AB@>:C ?>8A:0Clear the search boxQStarDict::MainWindowCopyright (C) 2007-2009 ;5:A0=4@  >48= <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindowF1QStarDict::MainWindow5B>G=K9 70?@>A Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow*&!?@02:0 ?> QStarDictQStarDict &HelpQStarDict::MainWindow >8A:SearchQStarDict::MainWindow!?8A>: A;>2 Words listQStarDict::MainWindowA5: secQStarDict::SettingsDialog%%QStarDict::SettingsDialog(<b>2B>@:</b> %1<br>Author: %1
    QStarDict::SettingsDialog*<b>2B>@K:</b> %1<br>Authors: %1
    QStarDict::SettingsDialog^<b>>7<>6=>ABL 8A:0BL ?>E>685 A;>20:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog&<b>?8A0=85:</b> %1Description: %1QStarDict::SettingsDialog.<b>0720=85:</b> %1<br>Name: %1
    QStarDict::SettingsDialog*<b>;038=:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog*<b>5@A8O:</b> %1<br>Version: %1
    QStarDict::SettingsDialog<<b>>;8G5AB2> A;>2:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog<br>
    QStarDict::SettingsDialog11@5280BC@0 AbbreviationQStarDict::SettingsDialog5AL ?5@52>4All translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialog=5H=89 284 AppearanceQStarDict::SettingsDialog>2545=85BehaviorQStarDict::SettingsDialog0AB@>8BL ConfigureQStarDict::SettingsDialog 0AB@>8BL ?;038=Configure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog&KA>B0 ?> C<>;G0=8NDefault heightQStarDict::SettingsDialog&(8@8=0 ?> C<>;G0=8N Default widthQStarDict::SettingsDialog!;>20@8 DictionariesQStarDict::SettingsDialog 0720=85 A;>20@ODictionary nameQStarDict::SettingsDialog5 A:@K20BL Don't hideQStarDict::SettingsDialog=87DownQStarDict::SettingsDialog:;NG5=EnabledQStarDict::SettingsDialogV2548B5 :><0=4C 4;O 70?CA:0 ?@>3@0<<K.<br>A;8 :><0=40 A>45@68B 2K@065=85 "%s", >=> 1C45B 70<5=5=> =0 A;>2>; 8=0G5 A;>2> 1C45B 70?8A0=> 2 AB0=40@B=K9 ?>B>: 22>40 ?@>F5AA0.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog2@8<5@ C?>B@51;5=8O A;>20ExampleQStarDict::SettingsDialog>OA=5=85 ExplanationQStarDict::SettingsDialog1I85 =0AB@>9:8Global settingsQStarDict::SettingsDialog=D>@<0F8OInfoQStarDict::SettingsDialog.=D>@<0F8O > ?;038=5 %1Information about %1 pluginQStarDict::SettingsDialog2=D>@<0F8O > A;>20@5 "%1"!Information about dictionary "%1"QStarDict::SettingsDialog >8A: ?@8 =01>@5Instant searchQStarDict::SettingsDialog 5@5<5AB8BL 2=87 Move downQStarDict::SettingsDialog"5@5<5AB8BL 225@EMove upQStarDict::SettingsDialog0720=85NameQStarDict::SettingsDialog5?@>7@0G=>ABLOpacityQStarDict::SettingsDialog ;038=PluginQStarDict::SettingsDialog;038=KPluginsQStarDict::SettingsDialog A?;K20NI55 >:=> Popup windowQStarDict::SettingsDialog"@>87=>A8BL A;>2>Pronounce the wordQStarDict::SettingsDialogN@>87=>A8BL A;>20, 8A?>;L7CO ?@>3@0<<C:#Pronounce words using this command:QStarDict::SettingsDialog&0AB@>9:8 QStarDictQStarDict SettingsQStarDict::SettingsDialog*!:0=8@>20BL 2K45;5=85Scan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialog@>:07K20BL 5A;8 A;>2> =5 =0945=>Show if word not foundQStarDict::SettingsDialog*>:07K20BL 8=D>@<0F8N Show infoQStarDict::SettingsDialog:>:070BL 8=D>@<0F8N > A;>20@5!Show information about dictionaryQStarDict::SettingsDialog:>:070BL 8=D>@<0F8N > ?;038=5Show information about pluginQStarDict::SettingsDialogb>:07K20BL B>;L:> 5A;8 =060B0 :;028H0-<>48D8:0B>@Show only if modifier pressedQStarDict::SettingsDialog:0?CA:0BLAO 2<5AB5 A A8AB5<>9Start with systemQStarDict::SettingsDialogl045@6:0 ?5@54 A:@KB85< ?>A;5 >B2545=8O C:070B5;O <KH8$Timeout before hide after mouse overQStarDict::SettingsDialog03>;>2>:TitleQStarDict::SettingsDialog"@0=A:@8?F8O TranscriptionQStarDict::SettingsDialog 25@EUpQStarDict::SettingsDialogHA?>;L7>20BL 7=0G>: 2 A8AB5<=>< B@55Use system trayQStarDict::SettingsDialogWinWinQStarDict::SettingsDialog=5BnoQStarDict::SettingsDialog=58725AB=>unknownQStarDict::SettingsDialog5ABLyesQStarDict::SettingsDialog&>=D83C@0F8O&Configure QStarDictQStarDict::TrayIcon &KE>4&QuitQStarDict::TrayIcon&!:0=8@>20BL&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon4QStarDict: A:0=8@>20=85 %1QStarDict: scanning is %1QStarDict::TrayIcon2K:;NG5=>disabledQStarDict::TrayIcon2:;NG5=>enabledQStarDict::TrayIcon ) , qstardict-3.0.0/qstardict/translations/qstardict-ru_RU.ts000066400000000000000000000632601472531462200236440ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Предварительный просмотр Element Элемент Foreground Цвет шрифта Background Цвет фона Select element Выберите элемент Click to select color Нажмите чтобы выбрать элемент #000000 #000000 Font Шрифт Size Размер Select font Выберите шрифт Select font size Выберите размер шрифта pt пт Bold Жирный B Ж Italic Курсив I К Underline Подчеркнутый U П QStarDict::DictBrowser The word <b>%1</b> is not found. Слово <b>%1</b> не найдено. QStarDict::DictWidget Save translation Сохранить перевод HTML files (*.html, *.htm) HTML-файлы (*.html, *.htm) Text files (*.txt) Текстовые файлы (*.txt) Search Поиск HTML files (*.html *.htm) Файлы HTML (*.html *.htm) Error Ошибка Cannot save translation as %1 Невозможно сохранить перевод как %1 Go to &previous translation Перейти к &предыдущему переводу Go to &next translation Перейти к &следующему переводу &Save to file &Сохранить в файл Speak &word П&роизнести слово Prin&t translation Напечата&ть перевод QStarDict::MainWindow About QStarDict О программе QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> <b>QStarDict %1 </b> - Qt-версия программы StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 Александр Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box Очистить строку поиска Clear Очистить Fuzzy query Неточный запрос Search Поиск Words list Список слов &File &Файл &Help &Справка &Settings &Настройки &Quit &Выход Ctrl+Q Ctrl+Q &About &О программе QStarDict About &Qt О &библиотеке Qt &Configure QStarDict &Конфигурация &Scan &Сканировать QStarDict &Help &Справка по QStarDict F1 QStarDict::SettingsDialog Enabled Включен Name Название Plugin Плагин Information about dictionary "%1" Информация о словаре "%1" <b>Name:</b> %1<br> <b>Название:</b> %1<br> <b>Plugin:</b> %1<br> <b>Плагин:</b> %1<br> unknown неизвестно <b>Description:</b> %1 <b>Описание:</b> %1 Information about %1 plugin Информация о плагине %1 <b>Version:</b> %1<br> <b>Версия:</b> %1<br> <b>Authors:</b> %1<br> <b>Авторы:</b> %1<br> <br> <br> <b>Can search similar words:</b> %1<br> <b>Возможность искать похожие слова:</b> %1<br> yes есть no нет QStarDict Settings Настройки QStarDict Show information about dictionary Показать информацию о словаре Global settings Общие настройки Start with system Запускаться вместе с системой Instant search Поиск при наборе Pronounce words using this command: Произносить слова, используя программу: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Введите команду для запуска программы.<br>Если команда содержит выражение "%s", оно будет заменено на слово; иначе слово будет записано в стандартный поток ввода процесса. Dictionaries Словари Move up Переместить вверх Up Вверх Move down Переместить вниз Down Вниз Show info Показывать информацию Plugins Плагины Show information about plugin Показать информацию о плагине Info Информация Configure plugin Настроить плагин Configure Настроить Popup window Всплывающее окно Behavior Поведение Pronounce the word Произносить слово Timeout before hide after mouse over Задержка перед скрытием после отведения указателя мыши Don't hide Не скрывать sec сек Show only if modifier pressed Показывать только если нажата клавиша-модификатор Alt Alt Control Control Shift Shift Win Win Scan selection Сканировать выделение Show if word not found Показывать если слово не найдено Appearance Внешний вид Opacity Непрозрачность % % Default width Ширина по умолчанию Default height Высота по умолчанию <b>Author:</b> %1<br> <b>Автор:</b> %1<br> <b>Words count:</b> %1<br> <b>Количество слов:</b> %1<br> All translation Весь перевод Dictionary name Название словаря Title Заголовок Explanation Пояснение Abbreviation Аббревиатура Example Пример употребления слова Transcription Транскрипция Use system tray Использовать значок в системном трее QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканировать &Configure QStarDict &Конфигурация &Quit &Выход QStarDict: scanning is %1 QStarDict: сканирование %1 enabled включено disabled выключено qstardict-3.0.0/qstardict/translations/qstardict-ua_UA.qm000066400000000000000000000226461472531462200235740ustar00rootroot00000000000000.$i"p04=V9 ?;0= BackgroundQStarDict::CSSEdit 8@=89BoldQStarDict::CSSEdit.;V: 4;O 281>@C :>;L>@CClick to select colorQStarDict::CSSEdit;5<5=BElementQStarDict::CSSEdit (@8DBFontQStarDict::CSSEdit5@54=V9 ?;0= ForegroundQStarDict::CSSEdit C@A82ItalicQStarDict::CSSEdit&>?5@54=V9 ?5@53;O4PreviewQStarDict::CSSEdit81V@ 5;5<5=B0Select elementQStarDict::CSSEdit81V@ H@8DBC Select fontQStarDict::CSSEdit(81V@ @>7<V@C H@8DBCSelect font sizeQStarDict::CSSEdit  >7<V@SizeQStarDict::CSSEditV4:@5A;5=89 UnderlineQStarDict::CSSEdit &15@53B8 2 D09; &Save to fileQStarDict::DictWidget><8;:0ErrorQStarDict::DictWidget"15@53B8 ?5@5:;04Save translationQStarDict::DictWidget >HC:SearchQStarDict::DictWidget.&@> ?@>3@0<C QStarDict&AboutQStarDict::MainWindow&>=Di3C@0FiO&Configure QStarDictQStarDict::MainWindow &$09;&FileQStarDict::MainWindow&>2i4:0&HelpQStarDict::MainWindow &8Ei4&QuitQStarDict::MainWindow&!:0=C20B8&ScanQStarDict::MainWindow&0;0HBC20==O &SettingsQStarDict::MainWindow$@> &1i1;i>B5:C Qt About &QtQStarDict::MainWindow,@> ?@>3@0<C QStarDictAbout QStarDictQStarDict::MainWindow>G8AB8B8ClearQStarDict::MainWindow*G8AB8B8 @O4>: ?>HC:CClear the search boxQStarDict::MainWindowCopyright (C) 2007-2009 ;5:A0=4@  >48= <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindow5GiB:89 70?8B Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow >HC:SearchQStarDict::MainWindow!?8A>: A;i2 Words listQStarDict::MainWindowA5: secQStarDict::SettingsDialog%%QStarDict::SettingsDialog(<b>2B>@:</b> %1<br>Author: %1
    QStarDict::SettingsDialog*<b>2B>@8:</b> %1<br>Authors: %1
    QStarDict::SettingsDialogF<b>(C:0B8 ?>4V1=V A;>20:</b> %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog<b>?8A:</b> %1Description: %1QStarDict::SettingsDialog&<b><'O:</b> %1<br>Name: %1
    QStarDict::SettingsDialog*<b>;03V=:</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog*<b>5@AVO:</b> %1<br>Version: %1
    QStarDict::SettingsDialog:<b>V;L:VABL A;V2:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog1@52V0BC@8 AbbreviationQStarDict::SettingsDialogAV ?5@5:;048All translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialog >2=iH=i9 283;O4 AppearanceQStarDict::SettingsDialog>254i=:0BehaviorQStarDict::SettingsDialog>=DV3C@0FVO ConfigureQStarDict::SettingsDialog$0;0HBC20B8 ?;03V=Configure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog.8A>B0 70 70<>2GC20==O<Default heightQStarDict::SettingsDialog.(8@8=0 70 70<>2GC20==O< Default widthQStarDict::SettingsDialog!;>2=8:8 DictionariesQStarDict::SettingsDialog<'O A;>2=8:0Dictionary nameQStarDict::SettingsDialog5 ?@8E>2C20B8 Don't hideQStarDict::SettingsDialog=87DownQStarDict::SettingsDialog:;NG5=>EnabledQStarDict::SettingsDialog254VBL :><0=4C 4;O @>7<>2=>W ?@>3@0<8. <br>/:I> :><0=40 <VAB8BL "%s" F5 1C45 70<V=5=> A;>2><, V=a:H5 A;>2> 1C45 70?8A0=> =0 stdin.Enter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog@8:;04ExampleQStarDict::SettingsDialog@>3>;>H5==O ExplanationQStarDict::SettingsDialog,;>10;L=V =0;0HBC20==OGlobal settingsQStarDict::SettingsDialog=D>InfoQStarDict::SettingsDialog0=D>@<0FVO ?@> %1 ?;03V=Information about %1 pluginQStarDict::SettingsDialog6=D>@<0FVO ?@> A;>2=8: "%1"!Information about dictionary "%1"QStarDict::SettingsDialog8BBT289 ?>HC:Instant searchQStarDict::SettingsDialog5@59B8 2=87 Move downQStarDict::SettingsDialog5@59B8 225@EMove upQStarDict::SettingsDialog<'ONameQStarDict::SettingsDialog5?@>7>@iABLOpacityQStarDict::SettingsDialog ;03V=PluginQStarDict::SettingsDialog;03V=8PluginsQStarDict::SettingsDialog$i:=> ?>2i4><;5==O Popup windowQStarDict::SettingsDialog8<>28B8 A;>2>Pronounce the wordQStarDict::SettingsDialogX8<>2;OB8 A;>20, 28:>@8AB>2CNG8 FN :><0=4C: #Pronounce words using this command:QStarDict::SettingsDialog,0;0HBC20==O QStarDictQStarDict SettingsQStarDict::SettingsDialog&!:0=C20B8 284i;5==OScan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialogD>:07C20B8, O:I> A;>2> =5 7=0945=>Show if word not foundQStarDict::SettingsDialog&>:070B8 V=D>@<0FVN Show infoQStarDict::SettingsDialog>>:070B8 V=D>@<0FVN ?@> A;>2=8:!Show information about dictionaryQStarDict::SettingsDialog<>:070B8 V=D>@<0FVN ?@> ?;03V=Show information about pluginQStarDict::SettingsDialogh>:07C20B8 Bi;L:8 O:I> =0B8A=CB0 :;02iH0-<>48Di:0B>@Show only if modifier pressedQStarDict::SettingsDialogt0B@8<:0 ?@8E>2C20==O ?iA;O "2B5Gi" <8Hi 7 2i:=0 ?5@5:;040$Timeout before hide after mouse overQStarDict::SettingsDialog03>;>2>:TitleQStarDict::SettingsDialog"@0=A:@8?FVO TranscriptionQStarDict::SettingsDialog #25@EUpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogVnoQStarDict::SettingsDialog=52V4><>unknownQStarDict::SettingsDialog"0:yesQStarDict::SettingsDialog&>=Di3C@0FiO&Configure QStarDictQStarDict::TrayIcon &8Ei4&QuitQStarDict::TrayIcon&!:0=C20B8&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon ) , qstardict-3.0.0/qstardict/translations/qstardict-ua_UA.ts000066400000000000000000000655751472531462200236150ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview Попередній перегляд Element Елемент Foreground Передній план Background Задній план Select element Вибір елемента Click to select color Клік для вибору кольору #000000 Font Шрифт Size Розмір Select font Вибір шрифту Select font size Вибір розміру шрифту pt Bold Жирний B Italic Курсив I Underline Підкреслений U QStarDict::DictBrowser The word <b>%1</b> is not found. QStarDict::DictWidget Save translation Зберегти переклад HTML files (*.html, *.htm) Text files (*.txt) Search Пошук HTML files (*.html *.htm) Error Помилка Cannot save translation as %1 Go to &previous translation Go to &next translation &Save to file &Зберегти в файл Speak &word Prin&t translation QStarDict::MainWindow About QStarDict Про програму QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> Copyright (C) 2007-2009 Александр Родин <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict Clear the search box Очистити рядок пошуку Clear Почистити Fuzzy query Нечiткий запит Search Пошук Words list Список слiв &File &Файл &Help &Довiдка &Settings &Налаштування &Quit &Вихiд Ctrl+Q Ctrl+Q &About &Про програму QStarDict About &Qt Про &бiблiотеку Qt &Configure QStarDict &Конфiгурацiя &Scan &Сканувати QStarDict &Help F1 QStarDict::SettingsDialog Enabled Включено Name Ім'я Plugin Плагін Information about dictionary "%1" Інформація про словник "%1" <b>Name:</b> %1<br> <b>Ім'я:</b> %1<br> <b>Plugin:</b> %1<br> <b>Плагін:</b> %1<br> unknown невідомо <b>Description:</b> %1 <b>Опис:</b> %1 Information about %1 plugin Інформація про %1 плагін <b>Version:</b> %1<br> <b>Версія:</b> %1<br> <b>Authors:</b> %1<br> <b>Автори:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>Шукати подібні слова:</b> %1<br> yes Так no Ні QStarDict Settings Налаштування QStarDict Show information about dictionary Показати інформацію про словник Global settings Глобальні налаштування Start with system Instant search Миттєвий пошук Pronounce words using this command: Вимовляти слова, використовуючи цю команду: Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Введіть команду для розмовної програми. <br>Якщо команда містить "%s" це буде замінено словом, інaкше слово буде записано на stdin. Dictionaries Словники Move up Перейти вверх Up Уверх Move down Перейти вниз Down Вниз Show info Показати інформацію Plugins Плагіни Show information about plugin Показати інформацію про плагін Info Інфо Configure plugin Налаштувати плагін Configure Конфігурація Popup window Вiкно повiдомлення Behavior Поведiнка Pronounce the word Вимовити слово Timeout before hide after mouse over Затримка приховування пiсля "втечi" мишi з вiкна переклада Don't hide Не приховувати sec сек Show only if modifier pressed Показувати тiльки якщо натиснута клавiша-модифiкатор Alt Alt Control Control Shift Shift Win Win Scan selection Сканувати видiлення Show if word not found Показувати, якщо слово не знайдено Appearance Зовнiшнiй вигляд Opacity Непрозорiсть % % Default width Ширина за замовчуванням Default height Висота за замовчуванням <b>Author:</b> %1<br> <b>Автор:</b> %1<br> <b>Words count:</b> %1<br> <b>Кількість слів:</b> %1<br> All translation Всі переклади Dictionary name Ім'я словника Title Заголовок Explanation Проголошення Abbreviation Абревіатури Example Приклад Transcription Транскрипція Use system tray QStarDict::TrayIcon QStarDict QStarDict &Scan &Сканувати &Configure QStarDict &Конфiгурацiя &Quit &Вихiд QStarDict: scanning is %1 enabled disabled qstardict-3.0.0/qstardict/translations/qstardict-zh_CN.qm000066400000000000000000000212431472531462200235730ustar00rootroot00000000000000%1</b>  The word %1 is not found.QStarDict::DictBrowserO[XR0eN(&S) &Save to fileQStarDict::DictWidgetN \O[XN: %1Cannot save translation as %1QStarDict::DictWidgetErrorQStarDict::DictWidgetRM_TN (&n)Go to &next translationQStarDict::DictWidgetRM_RMN (&p)Go to &previous translationQStarDict::DictWidget*HTMLeN(*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidgetbSSp(&t)Prin&t translationQStarDict::DictWidgetO[XSave translationQStarDict::DictWidgetQSU(&w) Speak &wordQStarDict::DictWidgeteg,eNText files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow QsN(&A)&AboutQStarDict::MainWindow n(&C)&Configure QStarDictQStarDict::MainWindow eN(&F)&FileQStarDict::MainWindow ^.R(&H)&HelpQStarDict::MainWindow y_(&Q)&QuitQStarDict::MainWindow S֋(&S)&ScanQStarDict::MainWindow n(&S) &SettingsQStarDict::MainWindow1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindowQsNQt(&Q) About &QtQStarDict::MainWindowQsN QStarDictAbout QStarDictQStarDict::MainWindowndClearQStarDict::MainWindow ndd}"hFClear the search boxQStarDict::MainWindowrHgC (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> {2007-2009 ?}uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindowj!|g Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow ^.R(&H)QStarDict &HelpQStarDict::MainWindowd}"SearchQStarDict::MainWindowlGRh Words listQStarDict::MainWindow y secQStarDict::SettingsDialog%%QStarDict::SettingsDialogAuthor: %1
    QStarDict::SettingsDialog"<b>O\</b> %1<br>Authors: %1
    QStarDict::SettingsDialog.<b>SNd}"vO %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog<b>cϏ</b> %1Description: %1QStarDict::SettingsDialogName: %1
    QStarDict::SettingsDialog"<b>cN</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog"<b>rHg,</b> %1<br>Version: %1
    QStarDict::SettingsDialogWords count: %1
    QStarDict::SettingsDialog
    QStarDict::SettingsDialog)Q AbbreviationQStarDict::SettingsDialog b@g vAll translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialogY ApperanceQStarDict::SettingsDialogLN:BehaviorQStarDict::SettingsDialog[ ConfigureQStarDict::SettingsDialog[cNConfigure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog؋^Default heightQStarDict::SettingsDialog؋[^ Default widthQStarDict::SettingsDialog[WQx DictionariesQStarDict::SettingsDialog[WQxT yDictionary nameQStarDict::SettingsDialogN  Don't hideQStarDict::SettingsDialogN DownQStarDict::SettingsDialogT/u(EnabledQStarDict::SettingsDialogEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialogO[PExampleQStarDict::SettingsDialog ExplanationQStarDict::SettingsDialogQh\@nGlobal settingsQStarDict::SettingsDialogO`oInfoQStarDict::SettingsDialogQsNcN %1 vO`oInformation about %1 pluginQStarDict::SettingsDialog[WQx"%1" vO`o!Information about dictionary "%1"QStarDict::SettingsDialogSsdInstant searchQStarDict::SettingsDialogN y Move downQStarDict::SettingsDialogN yMove upQStarDict::SettingsDialogT yNameQStarDict::SettingsDialogN f^OpacityQStarDict::SettingsDialogcNPluginQStarDict::SettingsDialogcNPluginsQStarDict::SettingsDialog_9QzS Popup windowQStarDict::SettingsDialogSUSїPronounce the wordQStarDict::SettingsDialogOu(YN T}NSї#Pronounce words using this command:QStarDict::SettingsDialogQStarDict nQStarDict SettingsQStarDict::SettingsDialog bS:S֋Scan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialog_Sg*b~R0ef>y:Show if word not foundQStarDict::SettingsDialogf>y:O`o Show infoQStarDict::SettingsDialog f>y:[WQxO`o!Show information about dictionaryQStarDict::SettingsDialog f>y:cNO`oShow information about pluginQStarDict::SettingsDialogf>y: N_Sc N Show only if modifier pressedQStarDict::SettingsDialog h`P\ύe$Timeout before hide after mouse overQStarDict::SettingsDialoghTitleQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialogN UpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogT&noQStarDict::SettingsDialogg*wunknownQStarDict::SettingsDialogf/yesQStarDict::SettingsDialog n QStarDict(&C)&Configure QStarDictQStarDict::TrayIcon y_(&Q)&QuitQStarDict::TrayIcon S֋(&S)&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-zh_CN.ts000066400000000000000000000575221472531462200236150ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview 预览 Element 元素 Foreground 前景 Background 背景 Select element 选择元素 Click to select color 点击以选择 #000000 #000000 Font 字体 Size 大小 Select font 选择字体 Select font size 选择字体大小 pt pt Bold 黑体 B B Italic 斜体 I I Underline 下划线 U U QStarDict::DictBrowser The word <b>%1</b> is not found. 找不到单词 <b>%1</b> QStarDict::DictWidget Save translation 保存翻译 HTML files (*.html, *.htm) HTML文件(*.html, *.htm) Text files (*.txt) 文本文件 Search 搜索 HTML files (*.html *.htm) Error 错误 Cannot save translation as %1 不能将翻译保存为 %1 Go to &previous translation 前往前一翻译 (&p) Go to &next translation 前往后一翻译 (&n) &Save to file 保存到文件(&S) Speak &word 读出单词(&w) Prin&t translation 打印翻译(&t) QStarDict::MainWindow About QStarDict 关于 QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> 版权 (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box 清除搜索框 Clear 清除 Fuzzy query 模糊查询 Search 搜索 Words list 词汇列表 &File 文件(&F) &Help 帮助(&H) &Settings 设置(&S) &Quit 离开(&Q) Ctrl+Q Ctrl+Q &About 关于(&A) About &Qt 关于Qt(&Q) &Configure QStarDict 设置(&C) &Scan 取词(&S) Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> 版权 (C) 2007 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> {2007-2009 ?} QStarDict &Help 帮助(&H) F1 QStarDict::SettingsDialog Enabled 启用 Name 名称 Plugin 插件 Information about dictionary "%1" 字典"%1" 的信息 <b>Name:</b> %1<br> <b>Plugin:</b> %1<br> <b>插件:</b> %1<br> unknown 未知 <b>Description:</b> %1 <b>描述:</b> %1 Information about %1 plugin 关于插件 %1 的信息 <b>Version:</b> %1<br> <b>版本:</b> %1<br> <b>Authors:</b> %1<br> <b>作者:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>可以搜索相似单词:</b> %1<br> yes no QStarDict Settings QStarDict 设置 Show information about dictionary 显示字典信息 Global settings 全局设置 Use system tray Start with system Instant search 即搜 Pronounce words using this command: 使用如下命令发音 Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries 字典 Move up 上移 Up Move down 下移 Down Show info 显示信息 Plugins 插件 Show information about plugin 显示插件信息 Info 信息 Configure plugin 设定插件 Configure 设定 Popup window 弹出窗口 Behavior 行为 Pronounce the word 单词发音 Timeout before hide after mouse over 鼠标悬停隐藏超时 Don't hide 不隐藏 sec Show only if modifier pressed 显示,仅当按下 Alt Alt Control Control Shift Shift Win Win Scan selection 选择区取词 Show if word not found 当未找到词时显示 Appearance 外观 Opacity 不透明度 % % Default width 默认宽度 Default height 默认高度 <b>Author:</b> %1<br> <b>Words count:</b> %1<br> All translation 所有的翻译 Dictionary name 字典名称 Title 标题 Explanation Abbreviation 缩写 Example 例子 Transcription QStarDict::TrayIcon QStarDict QStarDict &Scan 取词(&S) &Configure QStarDict 设置 QStarDict(&C) &Quit 离开(&Q) QStarDict: scanning is %1 enabled disabled qstardict-3.0.0/qstardict/translations/qstardict-zh_TW.qm000066400000000000000000000221051472531462200236230ustar00rootroot000000000000007q|C#U OlwJp Ϧ s Wؐ^.wN 33g 2h?l Lj;2ϗ1Y~Q;7.S.8 g!Y =mC 5  ] ?n aQ ed   tD *( 5n | :n T$ le\   o ,< @ G X G# RVF e4D e4D w  0 s w Ge #:4 w bYoYr0sNVQ.i #000000#000000QStarDict::CSSEditBBQStarDict::CSSEditfo BackgroundQStarDict::CSSEdit|BoldQStarDict::CSSEditސxr_iClick to select colorQStarDict::CSSEditQC} ElementQStarDict::CSSEdit[WWFontQStarDict::CSSEditRMfo ForegroundQStarDict::CSSEditIIQStarDict::CSSEditeItalicQStarDict::CSSEditPreviewQStarDict::CSSEditxSQC} Select elementQStarDict::CSSEditxS[WW Select fontQStarDict::CSSEdit xS[WWY'\Select font sizeQStarDict::CSSEditY'\SizeQStarDict::CSSEditUUQStarDict::CSSEdit^} UnderlineQStarDict::CSSEditptptQStarDict::CSSEdit b~N R0U[W <b>%1</b>  The word %1 is not found.QStarDict::DictBrowserQ2[XR0jhH(&S) &Save to fileQStarDict::DictWidgetq!l\oQ2[Xp %1Cannot save translation as %1QStarDict::DictWidget/ErrorQStarDict::DictWidget_NP o (&n)Go to &next translationQStarDict::DictWidgetRMNP o (&p)Go to &previous translationQStarDict::DictWidget*HTMLjhH(*.html, *.htm)HTML files (*.html, *.htm)QStarDict::DictWidgetRSpo(&t)Prin&t translationQStarDict::DictWidgetQ2[XoSave translationQStarDict::DictWidgetQU[W (&w) Speak &wordQStarDict::DictWidgete[WjText files (*.txt)QStarDict::DictWidget%1 - QStarDict%1 - QStarDictQStarDict::MainWindow e(&A)&AboutQStarDict::MainWindow -[ QStarDict(&C)&Configure QStarDictQStarDict::MainWindow jhH(&F)&FileQStarDict::MainWindow f(&H)&HelpQStarDict::MainWindow ╋(&Q)&QuitQStarDict::MainWindow S֊^(&S)&ScanQStarDict::MainWindow&-[ &SettingsQStarDict::MainWindow1QStarDict %1 - Qt version of StarDict
    QStarDict::MainWindow e Qt About &QtQStarDict::MainWindowe QStarDictAbout QStarDictQStarDict::MainWindowndClearQStarDict::MainWindow ndd\ hFClear the search boxQStarDict::MainWindowrHk (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a>uCopyright (C) 2007-2009 Alexander Rodin http://qstardict.ylsoftware.comQStarDict::MainWindow Ctrl+QCtrl+QQStarDict::MainWindowF1QStarDict::MainWindowj!|gb Fuzzy queryQStarDict::MainWindowQStarDict QStarDictQStarDict::MainWindow QStarDict f(&H)QStarDict &HelpQStarDict::MainWindowd\ SearchQStarDict::MainWindow[W_YnU Words listQStarDict::MainWindow y secQStarDict::SettingsDialog%%QStarDict::SettingsDialog"<b>O\:</b> %1<br>Author: %1
    QStarDict::SettingsDialog"<b>O\</b> %1<br>Authors: %1
    QStarDict::SettingsDialog.<b>SNd\ vO %1<br>'Can search similar words: %1
    QStarDict::SettingsDialog<b>f</b> %1Description: %1QStarDict::SettingsDialog&<b>[WQxT z1:</b> %1<br>Name: %1
    QStarDict::SettingsDialog&<b>Ycz _</b> %1<br>Plugin: %1
    QStarDict::SettingsDialog"<b>rHg,</b> %1<br>Version: %1
    QStarDict::SettingsDialog$<b>U[Wex:</b> %1<br>Words count: %1
    QStarDict::SettingsDialog
    QStarDict::SettingsDialog~.[ AbbreviationQStarDict::SettingsDialog b@g voAll translationQStarDict::SettingsDialogAltAltQStarDict::SettingsDialogY ApperanceQStarDict::SettingsDialogLpBehaviorQStarDict::SettingsDialog-[ ConfigureQStarDict::SettingsDialog -[Ycz _Configure pluginQStarDict::SettingsDialogControlControlQStarDict::SettingsDialog-^Default heightQStarDict::SettingsDialog-[^ Default widthQStarDict::SettingsDialog[WQx DictionariesQStarDict::SettingsDialog[WQxT z1Dictionary nameQStarDict::SettingsDialogN  Don't hideQStarDict::SettingsDialogN DownQStarDict::SettingsDialogU_u(EnabledQStarDict::SettingsDialogEnter cmd for the speaching program.
    If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process.QStarDict::SettingsDialog{OExampleQStarDict::SettingsDialog ExplanationQStarDict::SettingsDialogQhWߊ-[Global settingsQStarDict::SettingsDialogNJ InfoQStarDict::SettingsDialogeYcz _ %1 vNJ Information about %1 pluginQStarDict::SettingsDialog[WQx"%1" vNJ !Information about dictionary "%1"QStarDict::SettingsDialogSsfBd\ Instant searchQStarDict::SettingsDialogN y Move downQStarDict::SettingsDialogN yMove upQStarDict::SettingsDialogT z1NameQStarDict::SettingsDialogN f^OpacityQStarDict::SettingsDialogYcz _PluginQStarDict::SettingsDialogYcz _PluginsQStarDict::SettingsDialog_oz Popup windowQStarDict::SettingsDialogU[Wv|Pronounce the wordQStarDict::SettingsDialogOu(YN cNv|#Pronounce words using this command:QStarDict::SettingsDialogQStarDict -[QStarDict SettingsQStarDict::SettingsDialog xSS@S֊^Scan selectionQStarDict::SettingsDialog ShiftShiftQStarDict::SettingsDialoguvg*b~R0[WfBoy:Show if word not foundQStarDict::SettingsDialogoy:NJ  Show infoQStarDict::SettingsDialog oy:[WQxNJ !Show information about dictionaryQStarDict::SettingsDialogoy:Ycz _NJ Show information about pluginQStarDict::SettingsDialogoy: Puvc N Show only if modifier pressedQStarDict::SettingsDialognџ aP\ϐ>fB$Timeout before hide after mouse overQStarDict::SettingsDialogjLTitleQStarDict::SettingsDialog TranscriptionQStarDict::SettingsDialogN UpQStarDict::SettingsDialogWinWinQStarDict::SettingsDialogT&noQStarDict::SettingsDialogg*wunknownQStarDict::SettingsDialogf/yesQStarDict::SettingsDialog -[ QStarDict(&C)&Configure QStarDictQStarDict::TrayIcon ╋(&Q)&QuitQStarDict::TrayIcon S֊^(&S)&ScanQStarDict::TrayIconQStarDict QStarDictQStarDict::TrayIcon QStarDict: S֊^]%1QStarDict: scanning is %1QStarDict::TrayIconP\u(disabledQStarDict::TrayIconU_u(enabledQStarDict::TrayIconqstardict-3.0.0/qstardict/translations/qstardict-zh_TW.ts000066400000000000000000000365451472531462200236510ustar00rootroot00000000000000 DictBrowserSearch Form Search: Case sensitive Whole words QStarDict::CSSEdit Preview 預覽 Element 元素 Foreground 前景 Background 背景 Select element 選取元素 Click to select color 點選色彩 #000000 #000000 Font 字型 Size 大小 Select font 選取字型 Select font size 選取字型大小 pt pt Bold 粗體 B B Italic 斜體 I I Underline 底線 U U QStarDict::DictBrowser The word <b>%1</b> is not found. 找不到單字 <b>%1</b> QStarDict::DictWidget Save translation 儲存翻譯 HTML files (*.html, *.htm) HTML檔案(*.html, *.htm) Text files (*.txt) 文字檔 Error 錯誤 Cannot save translation as %1 無法將翻譯儲存為 %1 Go to &previous translation 前一個翻譯 (&p) Go to &next translation 後一個翻譯 (&n) &Save to file 儲存到檔案(&S) Speak &word 讀出單字 (&w) Prin&t translation 列印翻譯(&t) HTML files (*.html *.htm) Search 搜尋 QStarDict::MainWindow About QStarDict 關於 QStarDict <b>QStarDict %1 </b> - Qt version of StarDict<br> Copyright (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> 版權 (C) 2007-2009 Alexander Rodin <a href="http://qstardict.ylsoftware.com">http://qstardict.ylsoftware.com</a> QStarDict QStarDict %1 - QStarDict %1 - QStarDict Clear the search box 清除搜尋框 Clear 清除 Fuzzy query 模糊查詢 Search 搜尋 Words list 字彙清單 &File 檔案(&F) &Help 說明(&H) &Settings &設定 &Quit 離開(&Q) Ctrl+Q Ctrl+Q &About 關於(&A) About &Qt 關於 Qt &Configure QStarDict 設定 QStarDict(&C) &Scan 取詞(&S) QStarDict &Help QStarDict 說明(&H) F1 QStarDict::SettingsDialog Enabled 啟用 Name 名稱 Plugin 外掛程式 Information about dictionary "%1" 字典"%1" 的資訊 <b>Name:</b> %1<br> <b>字典名稱:</b> %1<br> <b>Plugin:</b> %1<br> <b>外掛程式:</b> %1<br> unknown 未知 <b>Description:</b> %1 <b>說明:</b> %1 Information about %1 plugin 關於外掛程式 %1 的資訊 <b>Version:</b> %1<br> <b>版本:</b> %1<br> <b>Authors:</b> %1<br> <b>作者:</b> %1<br> <br> <b>Can search similar words:</b> %1<br> <b>可以搜尋相似單字:</b> %1<br> yes no QStarDict Settings QStarDict 設定 Show information about dictionary 顯示字典資訊 Global settings 全域設定 Instant search 即時搜尋 Pronounce words using this command: 使用如下指令發音 Enter cmd for the speaching program.<br>If cmd contains "%s" it will be replaced to word, else word will be writen to stdin of speech process. Dictionaries 字典 Move up 上移 Up Move down 下移 Down Show info 顯示資訊 Plugins 外掛程式 Show information about plugin 顯示外掛程式資訊 Info 資訊 Configure plugin 設定外掛程式 Configure 設定 Popup window 快顯視窗 Behavior 行為 Pronounce the word 單字發音 Timeout before hide after mouse over 滑鼠懸停隱藏逾時 Don't hide 不隱藏 sec Show only if modifier pressed 顯示,僅當按下 Alt Alt Control Control Shift Shift Win Win Scan selection 選取區取詞 Show if word not found 當未找到字時顯示 Appearance 外觀 Opacity 不透明度 % % Default width 預設寬度 Default height 預設高度 <b>Author:</b> %1<br> <b>作者:</b> %1<br> <b>Words count:</b> %1<br> <b>單字數:</b> %1<br> All translation 所有的翻譯 Dictionary name 字典名稱 Title 標題 Explanation Abbreviation 縮寫 Example 範例 Transcription Use system tray Start with system QStarDict::TrayIcon QStarDict QStarDict &Scan 取詞(&S) &Configure QStarDict 設定 QStarDict(&C) &Quit 離開(&Q) QStarDict: scanning is %1 QStarDict: 取詞已%1 enabled 啟用 disabled 停用 qstardict-3.0.0/qstardict/translations/translations.pri000066400000000000000000000046371472531462200235040ustar00rootroot00000000000000############################################################################# # translations.pri - QStarDict, a StarDict clone written with using Qt # # Copyright (C) 2008-2009 Alexander Rodin # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License along # # with this program; if not, write to the Free Software Foundation, Inc., # # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # ############################################################################# TRANSLATIONS += \ qstardict-bg_BG.ts \ qstardict-cs_CZ.ts \ qstardict-de_DE.ts \ qstardict-es_ES.ts \ qstardict-fr_FR.ts \ qstardict-he_IL.ts \ qstardict-it_IT.ts \ qstardict-ka_GE.ts \ qstardict-lt_LT.ts \ qstardict-pl_PL.ts \ qstardict-pt_BR.ts \ qstardict-ru_RU.ts \ qstardict-ua_UA.ts \ qstardict-tr_TR.ts \ qstardict-zh_CN.ts \ qstardict-zh_TW.ts COMPILED_TRANSLATIONS += \ qstardict-bg_BG.qm \ qstardict-cs_CZ.qm \ qstardict-de_DE.qm \ qstardict-es_ES.qm \ qstardict-fr_FR.qm \ qstardict-he_IL.qm \ qstardict-it_IT.qm \ qstardict-ka_GE.ts \ qstardict-lt_LT.qm \ qstardict-pl_PL.qm \ qstardict-pt_BR.qm \ qstardict-ru_RU.qm \ qstardict-ua_UA.qm \ qstardict-tr_TR.qm \ qstardict-zh_CN.qm \ qstardict-zh_TW.qm DISTFILES += $$COMPILED_TRANSLATIONS isEmpty(NO_TRANSLATIONS) { for(t, COMPILED_TRANSLATIONS):translations.files += "translations/$${t}" translations.path = $$TRANSLATIONS_DIR INSTALLS += translations } qstardict-3.0.0/qstardict/trayicon.cpp000066400000000000000000000107661472531462200200620ustar00rootroot00000000000000/***************************************************************************** * trayicon.cpp - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #include "trayicon.h" #include #include #include #include "application.h" #include "mainwindow.h" #include "popupwindow.h" #include "settingsdialog.h" namespace QStarDict { TrayIcon::TrayIcon(QObject *parent) : QSystemTrayIcon(parent) { QMenu *trayMenu = new QMenu(tr("QStarDict")); QAction *actionScan = new QAction(QIcon(":/icons/edit-select.png"), tr("&Scan"), this); actionScan->setCheckable(true); actionScan->setChecked(Application::instance()->popupWindow()->isScan()); setScanEnabled(Application::instance()->popupWindow()->isScan()); connect(actionScan, SIGNAL(toggled(bool)), Application::instance()->popupWindow(), SLOT(setScan(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), actionScan, SLOT(setChecked(bool))); connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)), SLOT(setScanEnabled(bool))); trayMenu->addAction(actionScan); QAction *actionSettings = new QAction(QIcon(":/icons/configure.png"), tr("&Configure QStarDict"), this); connect(actionSettings, SIGNAL(triggered()), SLOT(on_actionSettings_triggered())); trayMenu->addAction(actionSettings); QAction *actionQuit = new QAction(QIcon(":/icons/application-exit.png"), tr("&Quit"), this); connect(actionQuit, SIGNAL(triggered()), Application::instance(), SLOT(saveSettingsAndQuit())); trayMenu->addAction(actionQuit); setContextMenu(trayMenu); connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(on_activated(QSystemTrayIcon::ActivationReason))); loadSettings(); } TrayIcon::~TrayIcon() { saveSettings(); } void TrayIcon::on_activated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: // It's quite uncomfortable on OS X to handle show/hide main window // in all cases... at least for me (petr) #ifndef Q_WS_MAC Application::instance()->mainWindow()->setVisible(! Application::instance()->mainWindow()->isVisible()); #else Application::instance()->mainWindow()->show(); #endif break; case QSystemTrayIcon::MiddleClick: Application::instance()->popupWindow()->showTranslation(Application::clipboard()->text(QClipboard::Selection)); break; default: ; // nothing } } void TrayIcon::on_actionSettings_triggered() { SettingsDialog dialog(Application::instance()->mainWindow()); dialog.exec(); } void TrayIcon::setScanEnabled(bool enabled) { QIcon icon(enabled ? ":/icons/qstardict.png" : ":/icons/qstardict-disabled.png"); setIcon(icon); setToolTip(tr("QStarDict: scanning is %1").arg(enabled ? tr("enabled") : tr("disabled"))); } void TrayIcon::saveSettings() { QSettings config; config.setValue("TrayIcon/visible", isVisible()); } void TrayIcon::loadSettings() { QSettings config; setVisible(config.value("TrayIcon/visible", true).toBool()); } } // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc qstardict-3.0.0/qstardict/trayicon.h000066400000000000000000000037071472531462200175240ustar00rootroot00000000000000/***************************************************************************** * trayicon.h - QStarDict, a StarDict clone written with using Qt * * Copyright (C) 2008 Alexander Rodin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *****************************************************************************/ #ifndef TRAYICON_H #define TRAYICON_H #include namespace QStarDict { class TrayIcon: public QSystemTrayIcon { Q_OBJECT public: TrayIcon(QObject *parent = 0); virtual ~TrayIcon(); void saveSettings(); private slots: void on_activated(QSystemTrayIcon::ActivationReason reason); void on_actionSettings_triggered(); void setScanEnabled(bool enabled); private: void loadSettings(); }; } #endif // TRAYICON_H // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent