From 97c496705a49c6cb8fc228b0397d9c7793ad6fb7 Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Sat, 19 May 2012 14:01:09 +0000 Subject: added LangMan git-svn-id: http://svn.miranda-ng.org/main/trunk@74 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/LangMan/Info_Src.txt | 30 ++ plugins/LangMan/License_Appendix.txt | 64 +++ plugins/LangMan/common.h | 54 +++ plugins/LangMan/docs/LangMan-Developer.txt | 46 ++ plugins/LangMan/docs/LangMan-License.txt | 278 +++++++++++ plugins/LangMan/docs/LangMan-Readme.txt | 146 ++++++ plugins/LangMan/docs/LangMan-Translation.txt | 293 ++++++++++++ plugins/LangMan/langman.sln | 25 + plugins/LangMan/langman.vcxproj | 407 ++++++++++++++++ plugins/LangMan/langman.vcxproj.filters | 131 ++++++ plugins/LangMan/langpack.c | 456 ++++++++++++++++++ plugins/LangMan/langpack.h | 49 ++ plugins/LangMan/main.c | 172 +++++++ plugins/LangMan/options.c | 681 +++++++++++++++++++++++++++ plugins/LangMan/options.h | 27 ++ plugins/LangMan/resource.h | 48 ++ plugins/LangMan/resource.rc | 197 ++++++++ plugins/LangMan/utils.c | 69 +++ plugins/LangMan/utils.h | 23 + plugins/LangMan/version.h | 42 ++ plugins/LangMan/version.rc | 51 ++ 21 files changed, 3289 insertions(+) create mode 100644 plugins/LangMan/Info_Src.txt create mode 100644 plugins/LangMan/License_Appendix.txt create mode 100644 plugins/LangMan/common.h create mode 100644 plugins/LangMan/docs/LangMan-Developer.txt create mode 100644 plugins/LangMan/docs/LangMan-License.txt create mode 100644 plugins/LangMan/docs/LangMan-Readme.txt create mode 100644 plugins/LangMan/docs/LangMan-Translation.txt create mode 100644 plugins/LangMan/langman.sln create mode 100644 plugins/LangMan/langman.vcxproj create mode 100644 plugins/LangMan/langman.vcxproj.filters create mode 100644 plugins/LangMan/langpack.c create mode 100644 plugins/LangMan/langpack.h create mode 100644 plugins/LangMan/main.c create mode 100644 plugins/LangMan/options.c create mode 100644 plugins/LangMan/options.h create mode 100644 plugins/LangMan/resource.h create mode 100644 plugins/LangMan/resource.rc create mode 100644 plugins/LangMan/utils.c create mode 100644 plugins/LangMan/utils.h create mode 100644 plugins/LangMan/version.h create mode 100644 plugins/LangMan/version.rc (limited to 'plugins') diff --git a/plugins/LangMan/Info_Src.txt b/plugins/LangMan/Info_Src.txt new file mode 100644 index 0000000000..af92c5afb8 --- /dev/null +++ b/plugins/LangMan/Info_Src.txt @@ -0,0 +1,30 @@ + +Language Pack Manager 1.0.2.2 for Miranda IM 0.6+ +------------------------------------------------------------------------ + Source Code + +Reminder: +'Language Pack Manager' is released under the terms of the +GNU General Public License. +See 'LangMan-License.txt' for more details. +'Language Pack Manager' is copyright 2005-2007 by H. Herkenrath. + +Please notify me of any changes that improve +'Language Pack Manager' or add new features. +If you have any questions on the code, feel free +to contact me at my email address. + + H. Herkenrath (hrathh at users.sourceforge.net) + + +Notes +------------------------------------------------------------------------ +The following files need to be changed to bump the version number: + +Info_Src.txt (1 place) +version.h (4 places) +m_langman.h (1 place) +m_langman.inc (1 place) +docs\LangMan-Readme.txt (3 places) +docs\LangMan-Translation.txt (2 places) +docs\LangMan-Developer.txt (1 place) diff --git a/plugins/LangMan/License_Appendix.txt b/plugins/LangMan/License_Appendix.txt new file mode 100644 index 0000000000..c590c3f5fb --- /dev/null +++ b/plugins/LangMan/License_Appendix.txt @@ -0,0 +1,64 @@ + +Excecpt of GNU General Public License (Appendix): + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + 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 St, 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 Library General +Public License instead of this License. diff --git a/plugins/LangMan/common.h b/plugins/LangMan/common.h new file mode 100644 index 0000000000..1f47d8ef75 --- /dev/null +++ b/plugins/LangMan/common.h @@ -0,0 +1,54 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#define _CRT_SECURE_NO_WARNINGS + +#define __RPCASYNC_H__ /* header shows warnings in VS6 */ +#include +#pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union */ +#include +#pragma warning(default:4201) /* nonstandard extension used : nameless struct/union */ +#include + +#include +#include /* for mir_snprintf() */ +#include /* for time() */ + +#define MIRANDA_VER 0x0600 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "langpack.h" +#include "options.h" +//#include "update.h" +//#include "unzip.h" +#include "utils.h" +#include "resource.h" +#include "m_langman.h" diff --git a/plugins/LangMan/docs/LangMan-Developer.txt b/plugins/LangMan/docs/LangMan-Developer.txt new file mode 100644 index 0000000000..6ce0c8dabb --- /dev/null +++ b/plugins/LangMan/docs/LangMan-Developer.txt @@ -0,0 +1,46 @@ + +Language Pack Manager 1.0.2.2 for Miranda IM 0.6+ +------------------------------------------------------------------------ + Developer Information + + Contents: ------------------------------- + | Translation, Services (API), Debug Symbols, + | Coding Language, Rebase Info + +Translation +----------------- + Translation strings can be found in 'LangMan-Translation.txt'. + If you are a translator please refer to 'LangMan-Translation.txt' + for more information about how your langpack file info needs to be formated + to be viewable in a nice way. + +Services (API) +----------------- + For more information about which service functions are provided by + 'Language Pack Manager' and about how they can be used by your plugin please + refer to 'm_langman.h'. + If you would like to use Delphi/Pascal please refer to 'm_langman.inc'. + +Debug Symbols +----------------- + Debug symbols are also available for debugging purposes. + Copy the PDB-files in the SDK-zip into the same directory as the + corresponding DLL-files. + +Coding Language +----------------- + 'Language Pack Manager' was written using Microsoft Visual C++ 6.0 SP6 + and the Microsoft Platform SDK shipped along with it. + +Rebase Info +----------------- + 'Language Pack Manager' has set its base address to: + 0x24100000 + + Please avoid using this base address for your plugins because + it will slow down the startup of Miranda IM a little bit. + + Using Microsoft Visual C++, the base address can be configured at: + 'Project' -> 'Settings' -> 'Linker' -> 'Output' -> 'Base Address' + +H. Herkenrath (hrathh at users.sourceforge.net) diff --git a/plugins/LangMan/docs/LangMan-License.txt b/plugins/LangMan/docs/LangMan-License.txt new file mode 100644 index 0000000000..a726a52df1 --- /dev/null +++ b/plugins/LangMan/docs/LangMan-License.txt @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/plugins/LangMan/docs/LangMan-Readme.txt b/plugins/LangMan/docs/LangMan-Readme.txt new file mode 100644 index 0000000000..61bc8adc71 --- /dev/null +++ b/plugins/LangMan/docs/LangMan-Readme.txt @@ -0,0 +1,146 @@ + +Language Pack Manager 1.0.2.2 +------------------------------------------------------------------------ + Plugin for Miranda IM 0.6 and + + + Plugin Info: ---------------------------- + | Version: 1.0.2.2 + | Filename: langman.dll + | Author: H. Herkenrath (hrathh at users.sourceforge.net) + | Description: Helps you manage Language Packs of different languages. + + Contents: ------------------------------- + | Features, Requirements, Usage, Installation, + | Bugs and Wishes, Version History, + | Translation, License and Copyright + +Features +---------------------- + + Allows to switch installed Language Packs easily + + Displays all information about the Language Packs in one place + + Shows which Language Pack includes support for what plugins + + Right-click on a language pack entry to be able to uninstall it + + Auto-Updates for all installed Language Packs + + Wizard helping you to download and install your native language + + Unicode support + + Automatic installation of all files, just unzip into Plugins directory + + Supported plugins: Database Editor, Country Flags + +Requirements +---------------------- + -> Miranda IM 0.6+: + Miranda IM is needed in version 0.6 or greater. + +Usage +---------------------- + The Language Packs can be managed here: + 'Options' -> 'Customize' -> 'Language' + + When you do a right-click on a specific language pack, you are able to + uninstall that file if it is no longer needed. + +Installation +---------------------- + Find 'miranda32.exe' on your computer. + + Just copy all the contents of the zip-file as they are into the 'Plugins' + subdirectory in the Miranda IM folder. + 'Language Pack Manager' will detect the files and move them into the appropriate + directories on it's first run. + + You can also do all the installation by hand, if you want to: + + Main Plugin: Copy the file 'langman.dll' into the 'Plugins' subdirectory + in the Miranda IM folder. + + The Unicode version of the plugin will only work on Windows NT/2000/XP, + Windows Server 2000, Windows Vista or later with an installed + Unicode version of Miranda IM. + To use it on Windows 95/98/Me, please download the ANSI version of the plugin. + + Documentation: The txt-files should be moved along with the SDK-zip into the + 'Docs' directory in the Miranda IM folder. + + That's it! + +Bugs and Wishes +---------------------- + Feel free to mail me your wishes about 'Language Pack Manager' and tell + me all the bugs you may find. + My email address is: hrathh at users.sourceforge.net + +Version History +---------------------- + 1.0.2.2 - try to fix radio buttons on Win9x + - try to fix anything else + - fixed langpack download + - fixed selected flag icon + 1.0.2.1 - added flag icons using flags.dll + - only search for updates if a langpack is present + - better displays incompatible locales + - added v0.8 support + - minor improvements + 1.0.2.0 - fixed langpack removal in context menu + - fixed automatic installaton + - updated to use new miranda headers + - auto-cleanup of langpack info + - support for WinXP style radio buttons in list + - moved options to 'Customize' section + - shows langpack filenames in expert mode + - auto-updates for language packs + - download wizard to install your native language + - other improvements + 1.0.1.1 - minor fixes and adjustments + 1.0.1.0 - minor fixes + - right-click on a language pack entry to uninstall a file + - enlarged not-included list a bit + - del key is shortcut for context menu item 'remove' + 1.0.0.0 - Initial release + +Translation +---------------------- + Translation strings for language pack maintainers can be found + in 'LangMan-Translation.txt' of the SDK package. + +License and Copyright +---------------------- + 'Language Pack Manager' is released under the terms of the + GNU General Public License. + See 'LangMan-License.txt' for more details. + + Copyright (C) 2005-2007 by H. Herkenrath. All rights reserved. + + The included unzip code for ZIP-files is + Copyright (C) 1995-1998 Jean-Loup Gailly and Mark Adler. + It is based on a modification by + Copyright (C) 1998 Gilles Vollant, Lucian Wischik. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. + 2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + 3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + 4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +H. Herkenrath (hrathh at users.sourceforge.net) diff --git a/plugins/LangMan/docs/LangMan-Translation.txt b/plugins/LangMan/docs/LangMan-Translation.txt new file mode 100644 index 0000000000..70dd24253a --- /dev/null +++ b/plugins/LangMan/docs/LangMan-Translation.txt @@ -0,0 +1,293 @@ + +Language Pack Manager 1.0.2.2 for Miranda IM 0.6+ +------------------------------------------------------------------------ + Translator Information + + Contents: ------------------------------- + | General Info, Langpack Header, + | String Listing + +General Info +----------------------------- + 'Language Pack Manager' can be translated with the Miranda IM + language files. + + Put the following strings in a file called 'langpack_.txt' + in the Miranda IM directory and translate them into your + language. + If you need more info on Miranda IM language files visit: + http://miranda.svn.sourceforge.net/viewvc/*checkout*/miranda/trunk/miranda/i18n/readme.txt + +Langpack Header +----------------------------- + The information that is shown in the options about your + Language Pack file is taken from the header privided + in that file. + If you are the author of a langpack file, please make sure + the information you give there is accurate and does follow + the offical rules. + + The official names of the header tags and what they specify + are described here: + http://miranda.svn.sourceforge.net/viewvc/*checkout*/miranda/trunk/miranda/i18n/readme.txt + + Following, I provide a summary of the available tags and + I also provide some ideas on how those data could be formated. + You do not need to follow those suggestions, but I think it would + make the provided information more comfortable to read and more informative. + + 'Language' header (optional): + A full description of the language in the file, in English, e.g. + 'English (UK)', 'English (US) humorous' or 'German'. + This field should really be in in English so everybody knows what + is is about. The string is translated using the current langpack + before it is displayed. + Just provide a country abbreviation in brackets if it is useful. + A value of 'French (fr-FR)' is not very senseful as the + information is duplicated in the specified locale. + 'German (AT)' would be a useful example. + Just be a bit smart ;) to find out when those brackets are + necessary and when not. + Several langpack files for the same language are possible + using this field, e.g. + 'German' pack using 'Sie' and 'German (informal)' using 'Du'. + + 'Locale' header: + The Windows language code. A complete list is available at + http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_238z.asp + Please make sure this is a correct value. There were some + langpack files out there specifying the English Locale + instead of their own. + + 'Last-Modified-Using' header: + Please keep this line up-to-date, containing the last version + of Miranda IM you made changes with, so people can compare files + containing the same language to see which is the most up-to-date. + The formatting of the value is unimportant, as long as it's human-readable. + However, it is more comfortable to read when all Language Packs use + the same format. + I think we could agree upon the following format: 'Miranda IM 0.6' + When you use an alpha build the following format fits well: + 'Miranda IM 0.6 alpha build #1' (as shown on 'Help'->'About' dialog). + + 'Authors' header: + A list of people who have worked on this file. + When you do something, add (or move) your name to the front, + and put a comma (', ') between each name, e.g. + 'Hari Seldon, Gaal Dornick' + By the nature of the options dialog the place to display this value + is very limited. + Important and actively developing people should be listed first. + Real names should be prefered instead of just nicknames. + + 'Author-email' header: + Should contain the e-mail of the person that last changed + the file only, on the assumption that that person is qualified + to manage the file. + It is enough when the user knows one single email address + he can write to. + You can use ' at ' instead of '@' to obfuscate your email address. + + 'Plugins-included' header: + Contains a list of the plugins that are also translated in this file. It + should be a comma-delimited list of the plugin DLL filenames, e.g. + 'Plugins-included: splitmsgdialogs,import,historyp'. + You really should follow standards here. ;) + The Language Pack Manager uses this list to display a list of installed + plugins which are not included in this package. + 'miranda32' or something like that does not need to be listed here. + The list is case-insensitive, but it is a good idea to use exactly the same + case of the DLL file. + Just use filenames of the plugin DLLs here, e.g. + the plugin named 'ICQ.dll' should be listed as 'ICQ'. + It is a good idea to even include plugins into this list that do not have + any strings for translation, as for example 'png2dib.dll'. + The inclusion list states which plugins are fully language adapted. + 'png2dib' is, so it should be listed in the header. + Additionalliy, each plugin has at least one string to be translated: + the long description shown on the plugin's info page in 'Options'->Plugins'. + + 'X-FLName' header (optional, non-standard extension): + You can add this header item for Auto-Update support. + It contains the name of the language pack as shown on the + file listing at http://addons.miranda-im.org. + When this tag is omitted the package needs to be listed as + 'xyz Language Pack' on the file listing. Whereas 'xyz' is the name + of the language pack as stored in the 'Language' header. + + 'X-Version' header (non-standard extension): + You can add this header item for Auto-Update support. + It contains the version number of the langpack as stated on + the file listing at http://addons.miranda-im.org. + + 'langpack_*.txt' file name: + To use the file, place it in the same directory as miranda32.exe, + and call it langpack_*.txt where * can be anything, however it is + recommended that it be the language. + It makes sense when the * part of the file name is English(!) and + lower case, e.g. 'langpack_chineset.txt' for the + 'Chinese (Traditional)' package. + Please avoid using any other character than a-z, 0-9 in this name + to keep it portable. + Please do not include a version number in the file name. + It is very hard to replace the file manually when the file name + changes all the time. + +String Listing +----------------------------- + +; --- Plugin: Language Pack Manager 1.0.2.2 (German) --- +; Translation by hrathh +; Please report any mistakes or missing strings in here. + +[Language pack manager] +Sprachdatei-Manager +[Helps you manage Language Packs of different languages.] +Hilft dabei Sprachdateien verschiedener Sprachen zu verwalten. +[Language Pack Manager Plugin] +Sprachdatei-Manager +[The Language Pack Manager Plugin can not be loaded. It requires Miranda IM %hs or later.] +Der Sprachdatei-Manager kann nicht geladen werden. Er benötigt Miranda IM %hs oder neuer. +[Language Pack Update HTTP connection] +Sprachdatei-Update HTTP-Verbindung + +; Options +;[Customize] +[Language] +Sprachen +[&Remove...] +&Entfernen... +[Installed Languages] +Installierte Sprachen +[File] +Datei +[built-in] +enthalten +[Author(s):] +Autor(en): +[E-mail:] +E-Mail: +[Last modified using:] +Verwendung von: +[Date:] +Datum: +;[Version:] +;[Locale:] +[(incompatible)] +(inkompatibel) +[Unknown] +Unbekannt +[Current] +Aktuell +[Not included:] +Nicht enthalten: +;[%hs (%s)] +[All installed plugins are included.] +Alle installierten Plugins sind enthalten. +[Download more Language Packs] +Weitere Sprachdateien herunterladen +[Please restart Miranda IM for your changes to take effect.] +Bitte Miranda IM neu starten, damit die Änderungen wirksam werden. +[Check for new &versions of Language Packs periodically] +Regelmäßig auf neue Sprachdatei-&Versionen überprüfen +[&Download Language] +Sprache &herunterladen + +; All names of the language packs can be translated +[English (default)] +Englisch (Standard) + +; Update Notify +[Language Pack Update Now Available] +Update für Sprachdatei ist jetzt verfügbar +[A new version of a Language Pack is now available. Click the install button to download and install this new update.] +Eine neue Version einer Sprachdatei ist verfügbar. Klicken Sie auf "Jetzt installieren" um das neue Update herunterzuladen und zu installieren. +[Language:] +Sprache: +[Current:] +Aktuell: +[New:] +Neu: +[&Install Now] +Jetzt &installieren +;[Close] +[Language Pack Update succeeded] +Sprachdatei-Update erfolgreich +[The language pack "%s" has been sucessfully downloaded and installed.] +Die Sprachdatei "%s" wurde erfolgreich heruntergeladen und aktualisiert. +[Language Pack Update failed] +Sprachdatei-Update fehlgeschlagen +[The language pack "%s" could not be downloaded or extracted.] +Die Sprachdatei "%s" konnte nicht heruntergeladen oder extrahiert werden. + +; Download Language +[Select your language] +Sprache wählen +[Miranda IM is available in many languages.\nHere is a list of all available languages of the file listing, please select your native &language:] +Miranda IM is in vielen Sprachen verfügbar.\nEs folgt eine Liste aller verfügbaren Sprachen auf der Website. Bitte wählen Sie Ihre gewünschte &Sprache aus: +[Download &all languages] +&Alle Sprachen herunterladen +[Note: This will download and install the newest language pack available for the selected language. There might be language packs from other authors available on the file listing.] +Hinweis: Es wird die jeweils neueste Sprachdatei für die gewählte Sprache heruntergeladen. Es könnten noch weitere Sprachdateien von anderen Autoren auf der Website verfügbar sein. +[downloading] +downloaden +;[OK] +;[Cancel] +[Language Pack Download finished] +Sprachdatei-Download beendet +[The download succeeded!] +Der Download war erfolgreich! +[The download failed!\n\nThe language pack could not be downloaded or extracted.] +Der Download schlug fehl!\n\nDie Sprachdatei konnte nicht heruntergeladen oder extrahiert werden. + +; All language subcategory names on the website can be translated +;[English (default)] +[Chinese] +Chinesisch +[Portuguese] +Portugiesisch +[French] +Französisch +[Hebrew] +Hebräisch +[Hungarian] +Ungarisch +[Italian] +Italienisch +[Spanish] +Spanisch +[Ukrainian] +Ukrainisch +[Russian] +Russisch +[German] +Deutsch +[Dutch] +Holländisch +[Bulgarian] +Bulgarisch +[Czech] +Tschechisch +[Korean] +Koreanisch +[Polish] +Polnisch +[Turkish] +Türkisch +[Swedish] +Schwedisch +[Japanese] +Japanisch +[Belarusian] +Weißrussisch +[Danish] +Dänisch +[Finnish] +Finnisch +[Croatian] +Kroatisch + +; --- + + +H. Herkenrath (hrathh at users.sourceforge.net) diff --git a/plugins/LangMan/langman.sln b/plugins/LangMan/langman.sln new file mode 100644 index 0000000000..c005320ebe --- /dev/null +++ b/plugins/LangMan/langman.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langman", "langman.vcxproj", "{F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Unicode|Win32 = Debug Unicode|Win32 + Debug|Win32 = Debug|Win32 + Release Unicode|Win32 = Release Unicode|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Debug Unicode|Win32.ActiveCfg = Debug Unicode|Win32 + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Debug Unicode|Win32.Build.0 = Debug Unicode|Win32 + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Debug|Win32.ActiveCfg = Debug|Win32 + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Debug|Win32.Build.0 = Debug|Win32 + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Release Unicode|Win32.ActiveCfg = Release Unicode|Win32 + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Release Unicode|Win32.Build.0 = Release Unicode|Win32 + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Release|Win32.ActiveCfg = Release|Win32 + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/plugins/LangMan/langman.vcxproj b/plugins/LangMan/langman.vcxproj new file mode 100644 index 0000000000..0cabb458fa --- /dev/null +++ b/plugins/LangMan/langman.vcxproj @@ -0,0 +1,407 @@ + + + + + Debug Unicode + Win32 + + + Debug + Win32 + + + Release Unicode + Win32 + + + Release + Win32 + + + + {F2ABCBFB-FEB8-49DF-B166-C2FA5148ACE1} + langman + + + + DynamicLibrary + false + Unicode + true + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + MultiByte + + + DynamicLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + true + true + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + true + true + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + true + false + $(SolutionDir)$(Configuration)/Plugins\ + $(SolutionDir)$(Configuration)/Obj/$(ProjectName)\ + true + false + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;$(SolutionDir)\..\SVN\Miranda\Trunk\miranda\include + false + + + + _DEBUG;UNICODE;_UNICODE;%(PreprocessorDefinitions) + true + true + Win32 + .\temp/Debug/Unicode/langman.tlb + + + + + Disabled + ../../include;../ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;UNICODE;WIN32;_WINDOWS;_USRDLL;STRICT;LANGMAN_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + true + Level4 + true + EditAndContinue + Use + common.h + + + _DEBUG;UNICODE;_UNICODE;%(PreprocessorDefinitions) + 0x0809 + ..\..\include;%(AdditionalIncludeDirectories) + + + comctl32.lib;%(AdditionalDependencies) + true + uuid.lib;OLDNAMES;%(IgnoreSpecificDefaultLibraries) + true + true + 0x24100000 + false + + + $(IntDir)$(TargetName).lib + MachineX86 + + + true + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\temp/Debug/ANSI/langman.tlb + + + + + Disabled + ../../include;../ExternalAPI;%(AdditionalIncludeDirectories) + _DEBUG;WIN32;_WINDOWS;_USRDLL;STRICT;LANGMAN_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + true + Level4 + true + EditAndContinue + Use + common.h + + + _DEBUG;%(PreprocessorDefinitions) + 0x0809 + ..\..\include;%(AdditionalIncludeDirectories) + + + comctl32.lib;%(AdditionalDependencies) + true + uuid.lib;OLDNAMES;%(IgnoreSpecificDefaultLibraries) + true + true + 0x24100000 + false + + + $(IntDir)$(TargetName).lib + MachineX86 + + + true + + + + + NDEBUG;%(PreprocessorDefinitions) + true + Win32 + .\temp/Release/ANSI/langman.tlb + + + + + /opt:nowin98 %(AdditionalOptions) + Full + OnlyExplicitInline + ../../include;../ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;_USRDLL;STRICT;LANGMAN_EXPORTS;%(PreprocessorDefinitions) + true + MultiThreadedDLL + true + true + Level4 + true + Size + true + Use + common.h + + + NDEBUG;%(PreprocessorDefinitions) + 0x0809 + ..\..\include;%(AdditionalIncludeDirectories) + + + /ignore:4078 %(AdditionalOptions) + comctl32.lib;%(AdditionalDependencies) + true + uuid.lib;OLDNAMES;%(IgnoreSpecificDefaultLibraries) + true + true + true + 0x24100000 + false + + + $(IntDir)$(TargetName).lib + MachineX86 + true + true + UseLinkTimeCodeGeneration + + + true + + + + + NDEBUG;%(PreprocessorDefinitions) + true + Win32 + .\temp/Release/Unicode/langman.tlb + + + + + Full + OnlyExplicitInline + Size + true + ../../include;../ExternalAPI;%(AdditionalIncludeDirectories) + NDEBUG;UNICODE;WIN32;_WINDOWS;_USRDLL;STRICT;LANGMAN_EXPORTS;%(PreprocessorDefinitions) + true + MultiThreadedDLL + false + NotSet + $(IntDir) + false + Level3 + true + Fast + true + false + false + false + false + false + Use + common.h + + + NDEBUG;UNICODE;_UNICODE;%(PreprocessorDefinitions) + 0x0809 + ..\..\include;%(AdditionalIncludeDirectories) + + + comctl32.lib;%(AdditionalDependencies) + true + uuid.lib;OLDNAMES;%(IgnoreSpecificDefaultLibraries) + true + false + true + 0x24100000 + true + + + $(IntDir)$(TargetName).lib + MachineX86 + true + true + false + + + true + + + $(IntDir)$(TargetName).xml + + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + Create + Create + Create + Create + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(UndefinePreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/LangMan/langman.vcxproj.filters b/plugins/LangMan/langman.vcxproj.filters new file mode 100644 index 0000000000..05ea25b63c --- /dev/null +++ b/plugins/LangMan/langman.vcxproj.filters @@ -0,0 +1,131 @@ + + + + + {3713035e-f4de-4b1b-8c15-b86c77bd853c} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + {a70dee03-4c9e-4cc9-ba2d-8bd243a18bf6} + h;hpp;hxx;hm;inl + + + {835877bf-050d-4034-b3fb-78e456d60765} + ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + {b84ecfeb-8124-4339-b93d-5acdd3d205d9} + *.txt + + + {515684a1-c0d8-47e1-8a93-d714f9d40790} + c;h + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Resource Files + + + Resource Files + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + SDK + + + + + Resource Files + + + + + Documentation + + + Documentation + + + Documentation + + + Documentation + + + Documentation + + + + + \ No newline at end of file diff --git a/plugins/LangMan/langpack.c b/plugins/LangMan/langpack.c new file mode 100644 index 0000000000..6ce827c71a --- /dev/null +++ b/plugins/LangMan/langpack.c @@ -0,0 +1,456 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "common.h" + +/************************* Load ***************************************/ + +static void TrimString(char *str) +{ + int len,start; + len = lstrlenA(str); + while (str[0]!='\0' && (unsigned char)str[len-1]<=' ') str[--len]=0; + for (start=0; str[start] && (unsigned char)str[start]<=' '; ++start); + MoveMemory(str,str+start,len-start+1); +} + +static BOOL IsEmpty(const char *str) +{ + int i; + for(i=0;str[i]!='\0';i++) + if(str[i]!=' ' && str[i]!='\r' && str[i]!='\n') + return FALSE; + return TRUE; +} + +static void CleanupLanguage(char *szLanguage) +{ + char *p; + /* remove any appended ' (default)' */ + p=strstr(szLanguage," (default)"); + if(p!=NULL) *p='\0'; +} + +static void CleanupAuthors(char *szAuthors) +{ + char *p,*p2; + /* remove trailing dot (if any) */ + p=&szAuthors[lstrlenA(szAuthors)-1]; + if(*p=='.') *p='\0'; + /* remove any extra info in parentheses, which is ok + * but makes the list very long for some packs */ + for(;;) { + p=strchr(szAuthors,'('); + p2=strchr(szAuthors,')'); + if(p==NULL || p2==NULL) { + p=strchr(szAuthors,'['); + p2=strchr(szAuthors,']'); + if(p==NULL || p2==NULL) break; + } + if(*(p-1)==' ') --p; + MoveMemory(p,p2+1,lstrlenA(p2+1)+1); + } +} + +static void CleanupEmail(char *szAuthorEmail) +{ + char c,*p,*pAt; + /* replace ' dot ' with '.' (may be removed) */ + p=strstr(szAuthorEmail," dot "); + if(p!=NULL) { + *p='.'; + MoveMemory(p+1,p+5,lstrlenA(p+5)+1); + } + /* also allow ' at ' instead of '@' for obfuscation */ + p=strstr(szAuthorEmail," at "); + if(p!=NULL) { + *p='@'; + MoveMemory(p+1,p+4,lstrlenA(p+4)+1); + } + /* is valid? */ + pAt=strchr(szAuthorEmail,'@'); + if(pAt==NULL) { + szAuthorEmail[0]='\0'; + return; + } + /* strip-off extra text except exactly one email address + * this is needed as a click on the email addres brings up the mail client */ + for(c=' ';;c=',') { + p=strchr(pAt,c); + if(p!=NULL) *p='\0'; + p=strrchr(szAuthorEmail,c); + if(p!=NULL) MoveMemory(szAuthorEmail,p+1,lstrlenA(p+1)+1); + if(c==',') break; + } + p=strstr(szAuthorEmail,"__"); + if(p!=NULL) MoveMemory(szAuthorEmail,p+2,lstrlenA(p+2)+1); + /* lower case */ + CharLowerA(szAuthorEmail); + /* 'none' specified */ + if(!lstrcmpiA(szAuthorEmail,"none")) szAuthorEmail[0]='\0'; +} + +static void CleanupLastModifiedUsing(char *szLastModifiedUsing,int nSize) +{ + char *p; + /* remove 'Unicode', as it doesn't matter */ + p=strstr(szLastModifiedUsing," Unicode"); + if(p!=NULL) MoveMemory(p,p+8,lstrlenA(p+8)+1); + /* use 'Miranda IM' instead of 'Miranda' */ + p=strstr(szLastModifiedUsing,"Miranda"); + if(p!=NULL && strncmp(p+7," IM",3)) { + MoveMemory(p+10,p+7,lstrlenA(p+7)+1); + CopyMemory(p+7," IM",3); + } + /* use 'Plugin' instead of 'plugin' */ + p=strstr(szLastModifiedUsing," plugin"); + if(p!=NULL) CopyMemory(p," Plugin",7); + /* remove 'v' prefix */ + p=strstr(szLastModifiedUsing," v0."); + if(p!=NULL) MoveMemory(p+1,p+2,lstrlenA(p+2)+1); + /* default if empty */ + if(!szLastModifiedUsing[0]) { + lstrcpynA(szLastModifiedUsing,MIRANDANAME" ",nSize); + CallService(MS_SYSTEM_GETVERSIONTEXT,nSize-lstrlenA(szLastModifiedUsing),(LPARAM)szLastModifiedUsing+lstrlenA(szLastModifiedUsing)); + } +} + +// pack struct should be initialized to zero before call +// pack->szFileName needs to be filled in before call +static BOOL LoadPackData(LANGPACK_INFO *pack,BOOL fEnabledPacks,const char *pszFileVersionHeader) +{ + FILE *fp; + TCHAR szFileName[MAX_PATH]; + char line[4096],*pszColon,*buf; + char szLanguageA[64]; /* same size as pack->szLanguage */ + /* + Miranda Language Pack Version 1 + Language: (optional) + Locale: 0809 + Authors: Miranda IM Development Team (multiple tags allowed) + Author-email: project-info at miranda-im.org (" at " instead of "@" allowed) + Last-Modified-Using: Miranda IM 0.7 + Plugins-included: (multiple tags allowed) + X-FLName: name as used on the file listing (non-standard extension) + X-Version: 1.2.3.4 (non-standard extension) + see 'LangMan-Translation.txt' for some header quidelines + */ + if ( !GetPackPath( szFileName, SIZEOF(szFileName), fEnabledPacks, pack->szFileName)) + return FALSE; + + fp = _tfopen(szFileName,_T("rt")); + if (fp == NULL) + return FALSE; + + fgets(line, sizeof(line), fp); + TrimString(line); + buf = line; + + if (strlen(line) >= 3 && line[0] == '\xef' && line[1] == '\xbb' && line[2] == '\xbf') { + pack->codepage = CP_UTF8; + buf += 3; + } + + if ( lstrcmpA(buf, pszFileVersionHeader )) { + fclose(fp); + return FALSE; + } + pack->flags = LPF_NOLOCALE; + szLanguageA[0] = '\0'; + while( !feof( fp )) { + if ( fgets(line, sizeof(line), fp) == NULL) break; + TrimString(line); + if ( IsEmpty(line) || line[0]==';' || line[0]=='\0') continue; + if ( line[0]=='[' ) break; + pszColon = strchr(line,':'); + if ( pszColon == NULL ) continue; + *pszColon = '\0'; + TrimString(pszColon+1); + if ( !lstrcmpA(line,"Language") && !pack->szLanguage[0] ) + lstrcpynA(szLanguageA, pszColon+1, sizeof(szLanguageA)); /* buffer safe */ + else if ( !lstrcmpA(line, "Last-Modified-Using") && !pack->szLastModifiedUsing[0] ) + lstrcpynA(pack->szLastModifiedUsing, pszColon+1, sizeof(pack->szLastModifiedUsing)); /* buffer safe */ + else if ( !lstrcmpA(line, "Authors")) { + buf=pack->szAuthors+lstrlenA(pack->szAuthors); /* allow multiple tags */ + if((sizeof(pack->szAuthors)-lstrlenA(pack->szAuthors))>0) /* buffer safe */ + mir_snprintf(buf,sizeof(pack->szAuthors)-lstrlenA(pack->szAuthors),(pack->szAuthors[0]=='\0')?"%s":" %s",pszColon+1); + } else if ( !lstrcmpA(line, "Author-email") && !pack->szAuthorEmail[0]) + lstrcpynA(pack->szAuthorEmail, pszColon+1, sizeof(pack->szAuthorEmail)); /* buffer safe */ + else if ( !lstrcmpA(line,"Locale") && (pack->flags & LPF_NOLOCALE)) { + pack->Locale = MAKELCID((USHORT)strtol(pszColon+1, NULL, 16), SORT_DEFAULT); + if(pack->Locale) pack->flags &= ~LPF_NOLOCALE; + } + else if ( !lstrcmpA(line,"Plugins-included")) { + buf = pack->szPluginsIncluded + lstrlenA(pack->szPluginsIncluded); /* allow multiple tags */ + if (( sizeof(pack->szPluginsIncluded)-lstrlenA(pack->szPluginsIncluded)) > 0 ) /* buffer safe */ + mir_snprintf(buf, sizeof(pack->szPluginsIncluded)-lstrlenA(pack->szPluginsIncluded),(pack->szPluginsIncluded[0]=='\0')?"%s":", %s",CharLowerA(pszColon+1)); + } + else if ( !lstrcmpA(line,"X-Version") && !pack->szVersion[0] ) + lstrcpynA(pack->szVersion, pszColon+1, sizeof(pack->szVersion)); /* buffer safe */ + else if ( !lstrcmpA(line,"X-FLName") && !pack->szFLName[0] ) + lstrcpynA(pack->szFLName, pszColon+1, sizeof(pack->szFLName)); /* buffer safe */ + } + CleanupLanguage(szLanguageA); + CleanupAuthors(pack->szAuthors); + CleanupEmail(pack->szAuthorEmail); + CleanupLastModifiedUsing(pack->szLastModifiedUsing,sizeof(pack->szLastModifiedUsing)); + /* codepage */ + if(!(pack->flags&LPF_NOLOCALE)) + if(GetLocaleInfoA(pack->Locale,LOCALE_IDEFAULTANSICODEPAGE,line,6)) + pack->codepage=(WORD)atoi(line); /* CP_ACP on error */ + /* language */ +#if defined(_UNICODE) + MultiByteToWideChar(pack->codepage,0,szLanguageA,-1,pack->szLanguage,SIZEOF(pack->szLanguage)); +#else + lstrcpyA(pack->szLanguage,szLanguageA); /* buffer safe */ +#endif + /* ensure the pack always has a language name */ + if(!pack->szLanguage[0] && !GetLocaleInfo(pack->Locale,LOCALE_SENGLANGUAGE,pack->szLanguage,SIZEOF(pack->szLanguage))) { + TCHAR *p; + lstrcpyn(pack->szLanguage,pack->szFileName,SIZEOF(pack->szLanguage)); /* buffer safe */ + p=_tcsrchr(pack->szLanguage,_T('.')); + if(p!=NULL) *p='\0'; + } + /* ensure the pack always has a filelisting name */ + if(!pack->szFLName[0]) + lstrcatA(lstrcpyA(pack->szFLName,szLanguageA)," Language Pack"); /* buffer safe */ + fclose(fp); + return TRUE; +} + +/************************* Enum ***************************************/ + +BOOL GetPackPath(TCHAR *pszPath,int nSize,BOOL fEnabledPacks,const TCHAR *pszFile) +{ + TCHAR *p; + /* main path */ + if(!GetModuleFileName(NULL,pszPath,nSize)) return FALSE; + p=_tcsrchr(pszPath,_T('\\')); + if(p!=NULL) *(p+1)=_T('\0'); + /* subdirectory */ + if(!fEnabledPacks) { + if(nSize<(lstrlen(pszPath)+10)) return FALSE; + lstrcat(pszPath,_T("Plugins\\Language\\")); + } + /* file name */ + if(pszFile!=NULL) { + if(nSize<(lstrlen(pszFile)+11)) return FALSE; + lstrcat(pszPath,pszFile); + } + return TRUE; +} + +// callback is allowed to be NULL +// returns TRUE if any pack exists except default +BOOL EnumPacks(ENUM_PACKS_CALLBACK callback,const TCHAR *pszFilePattern,const char *pszFileVersionHeader,BOOL fEnglishDefault,WPARAM wParam,LPARAM lParam) +{ + BOOL fPackFound=FALSE; + BOOL res=FALSE; + LANGPACK_INFO pack; + WIN32_FIND_DATA wfd; + HANDLE hFind; + + /* enabled packs */ + if(GetPackPath(pack.szFileName,SIZEOF(pack.szFileName),TRUE,pszFilePattern)) { + hFind=FindFirstFile(pack.szFileName,&wfd); + if(hFind!=INVALID_HANDLE_VALUE) { + do { + if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) continue; + if((lstrlen(wfd.cFileName)<4) || wfd.cFileName[lstrlen(wfd.cFileName)-4]!=_T('.')) continue; + /* get data */ + ZeroMemory(&pack,sizeof(pack)); + lstrcpy(pack.szFileName,CharLower(wfd.cFileName)); /* buffer safe */ + if(LoadPackData(&pack,TRUE,pszFileVersionHeader)) { + pack.ftFileDate=wfd.ftLastWriteTime; + /* enabled? */ + if(!fPackFound) pack.flags|=LPF_ENABLED; + fPackFound=TRUE; + /* callback */ + if(callback!=NULL) res=callback(&pack,wParam,lParam); + if(!res) { FindClose(hFind); return FALSE; } + } + } while(FindNextFile(hFind,&wfd)); + FindClose(hFind); + } + } + + /* default: English (GB) */ + if(fEnglishDefault && callback!=NULL) { + ZeroMemory(&pack,sizeof(pack)); + pack.Locale=LOCALE_USER_DEFAULT; /* miranda uses default locale in this case */ + lstrcpy(pack.szLanguage,_T("English (default)")); /* buffer safe */ + lstrcpyA(pack.szAuthors,"Miranda IM Development Team"); /* buffer safe */ + lstrcpyA(pack.szAuthorEmail,"project-info at miranda-im.org"); /* buffer safe */ + CleanupEmail(pack.szAuthorEmail); /* correct " at " */ + CleanupLastModifiedUsing(pack.szLastModifiedUsing,sizeof(pack.szLastModifiedUsing)); + /* file date */ + if(GetModuleFileName(NULL,pack.szFileName,SIZEOF(pack.szFileName))) { + HANDLE hFile; + hFile=CreateFile(pack.szFileName,0,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); + if(hFile!=INVALID_HANDLE_VALUE) { + GetFileTime(hFile,NULL,NULL,&pack.ftFileDate); + CloseHandle(hFile); + } + } + pack.flags=LPF_NOLOCALE|LPF_DEFAULT; + if(!fPackFound) pack.flags|=LPF_ENABLED; + /* callback */ + if(!callback(&pack,wParam,lParam)) return FALSE; + } + + /* disabled packs */ + if(GetPackPath(pack.szFileName,SIZEOF(pack.szFileName),FALSE,pszFilePattern)) { + hFind=FindFirstFile(pack.szFileName, &wfd); + if(hFind!=INVALID_HANDLE_VALUE) { + do { + if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) continue; + if(lstrlen(wfd.cFileName)<4 || wfd.cFileName[lstrlen(wfd.cFileName)-4]!=_T('.')) continue; + /* get data */ + ZeroMemory(&pack,sizeof(pack)); + lstrcpy(pack.szFileName,CharLower(wfd.cFileName)); /* buffer safe */ + if(LoadPackData(&pack,FALSE,pszFileVersionHeader)) { + pack.ftFileDate=wfd.ftLastWriteTime; + fPackFound=TRUE; + /* callback */ + if(callback!=NULL) res=callback(&pack,wParam,lParam); + if(!res) { FindClose(hFind); return FALSE; } + } + } while(FindNextFile(hFind,&wfd)); + FindClose(hFind); + } + } + return fPackFound; +} + +BOOL IsPluginIncluded(const LANGPACK_INFO *pack,char *pszFileBaseName) +{ + char *p; + if(!lstrcmpiA(pszFileBaseName,"png2dib") || !lstrcmpiA(pszFileBaseName,"loadavatars")) + return TRUE; /* workaround: does not need no translation */ + for(p=(char*)pack->szPluginsIncluded;;) { + p=strstr(p,CharLowerA(pszFileBaseName)); + if(p==NULL) return FALSE; + if(p==pack->szPluginsIncluded || *(p-1)==' ' || *(p-1)==',') { + p+=lstrlenA(pszFileBaseName)+1; + if(*p==',' || *p==' ' || *p==0) return TRUE; + } + else p+=lstrlenA(pszFileBaseName)+1; + } +} + +/************************* Switch *************************************/ + +BOOL EnablePack(const LANGPACK_INFO *pack,const TCHAR *pszFilePattern) +{ + TCHAR szFrom[MAX_PATH],szDest[MAX_PATH]; + HANDLE hFind; + WIN32_FIND_DATA wfd; + + /* disable previous pack */ + if(GetPackPath(szFrom,SIZEOF(szFrom),TRUE,pszFilePattern)) { + hFind=FindFirstFile(szFrom,&wfd); + if(hFind!=INVALID_HANDLE_VALUE) { + do { + if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) continue; + if(lstrlen(wfd.cFileName)<4 || wfd.cFileName[lstrlen(wfd.cFileName)-4]!=_T('.')) continue; + /* ensure dir exists */ + if(GetPackPath(szFrom,SIZEOF(szFrom),FALSE,NULL)) + CreateDirectory(szFrom,NULL); + /* move file */ + if(GetPackPath(szFrom,SIZEOF(szFrom),TRUE,wfd.cFileName)) + if(GetPackPath(szDest,SIZEOF(szDest),FALSE,wfd.cFileName)) + if(!MoveFile(szFrom,szDest) && GetLastError()==ERROR_ALREADY_EXISTS) { + DeleteFile(szDest); + MoveFile(szFrom,szDest); + } + break; + } while(FindNextFile(hFind,&wfd)); + FindClose(hFind); + } + } + + /* enable current pack */ + if(pack->flags&LPF_DEFAULT) return TRUE; + if(GetPackPath(szFrom,SIZEOF(szFrom),FALSE,pack->szFileName)) + if(GetPackPath(szDest,SIZEOF(szDest),TRUE,pack->szFileName)) + return MoveFile(szFrom,szDest); + return FALSE; +} + +void CorrectPacks(const TCHAR *pszFilePattern,BOOL fDisableAll) +{ + TCHAR szFrom[MAX_PATH],szDest[MAX_PATH],szDir[MAX_PATH],*pszFile; + BOOL fDirCreated=FALSE; + HANDLE hFind; + WIN32_FIND_DATA wfd; + + /* main path */ + if(!GetModuleFileName(NULL,szDir,SIZEOF(szDir))) return; + pszFile=_tcsrchr(szDir,_T('\\')); + if(pszFile!=NULL) *pszFile=_T('\0'); + + /* move wrongly placed packs from 'Plugins' to 'Language' */ + mir_sntprintf(szFrom,SIZEOF(szFrom),_T("%s\\Plugins\\%s"),szDir,pszFilePattern); + hFind=FindFirstFile(szFrom,&wfd); + if(hFind!=INVALID_HANDLE_VALUE) { + do { + if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) continue; + if(lstrlen(wfd.cFileName)<4 || wfd.cFileName[lstrlen(wfd.cFileName)-4]!=_T('.')) continue; + /* ensure dir exists */ + if(!fDirCreated && GetPackPath(szFrom,SIZEOF(szFrom),FALSE,NULL)) + fDirCreated=CreateDirectory(szFrom,NULL); + /* move file */ + if(GetPackPath(szDest,SIZEOF(szDest),FALSE,wfd.cFileName)) { + mir_sntprintf(szFrom,SIZEOF(szFrom),_T("%s\\Plugins\\%s"),szDir,wfd.cFileName); + if(!MoveFile(szFrom,szDest) && GetLastError()==ERROR_ALREADY_EXISTS) { + DeleteFile(szDest); + MoveFile(szFrom,szDest); + } + } + } while(FindNextFile(hFind,&wfd)); + FindClose(hFind); + } + + /* disable all packs except one */ + if(GetPackPath(szFrom,SIZEOF(szFrom),TRUE,pszFilePattern)) { + hFind=FindFirstFile(szFrom,&wfd); + if(hFind!=INVALID_HANDLE_VALUE) { + do { + if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) continue; + if(lstrlen(wfd.cFileName)<4 || wfd.cFileName[lstrlen(wfd.cFileName)-4]!=_T('.')) continue; + /* skip first file */ + if(!fDisableAll) { fDisableAll=TRUE; continue; } + /* ensure dir exists */ + if(!fDirCreated && GetPackPath(szFrom,SIZEOF(szFrom),FALSE,NULL)) + fDirCreated=CreateDirectory(szFrom,NULL); + /* move file */ + if(GetPackPath(szFrom,SIZEOF(szFrom),TRUE,wfd.cFileName)) + if(GetPackPath(szDest,SIZEOF(szDest),FALSE,wfd.cFileName)) { + if(!MoveFile(szFrom,szDest) && GetLastError()==ERROR_ALREADY_EXISTS) { + DeleteFile(szDest); + MoveFile(szFrom,szDest); + } + } + } while(FindNextFile(hFind,&wfd)); + FindClose(hFind); + } + } +} \ No newline at end of file diff --git a/plugins/LangMan/langpack.h b/plugins/LangMan/langpack.h new file mode 100644 index 0000000000..17e3f26d1d --- /dev/null +++ b/plugins/LangMan/langpack.h @@ -0,0 +1,49 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* Langpack Info */ +typedef struct { + TCHAR szLanguage[64]; + LCID Locale; + WORD codepage; + char szAuthors[1024]; + char szAuthorEmail[128]; + char szLastModifiedUsing[64]; + char szPluginsIncluded[4080]; + char szVersion[21]; + char szFLName[128]; + FILETIME ftFileDate; + TCHAR szFileName[MAX_PATH]; /* just the file name itself */ + BYTE flags; /* see LPIF_* flags */ +} LANGPACK_INFO; +#define LPF_ENABLED 0x01 // pack is enabled +#define LPF_NOLOCALE 0x02 // pack has no valid locale +#define LPF_DEFAULT 0x04 // pack is the english default (no langpack) + +/* Enum */ +BOOL GetPackPath(TCHAR *pszPath,int nSize,BOOL fEnabledPacks,const TCHAR *pszFile); +typedef BOOL (*ENUM_PACKS_CALLBACK)(LANGPACK_INFO *pack,WPARAM wParam,LPARAM lParam); +BOOL EnumPacks(ENUM_PACKS_CALLBACK callback,const TCHAR *pszFilePattern,const char *pszFileVersionHeader,BOOL fEnglishDefault,WPARAM wParam,LPARAM lParam); +BOOL IsPluginIncluded(const LANGPACK_INFO *pack,char *pszFileBaseName); + +/* Switch */ +BOOL EnablePack(const LANGPACK_INFO *pack,const TCHAR *pszFilePattern); +void CorrectPacks(const TCHAR *pszFilePattern,BOOL fDisableAll); diff --git a/plugins/LangMan/main.c b/plugins/LangMan/main.c new file mode 100644 index 0000000000..2061a57098 --- /dev/null +++ b/plugins/LangMan/main.c @@ -0,0 +1,172 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "common.h" +#include "version.h" + +HINSTANCE hInst; +PLUGINLINK *pluginLink; +struct MM_INTERFACE mmi; +static HANDLE hHookModulesLoaded; +int hLangpack; + +static char szEmail[100] = PLUGIN_EMAIL; + +static PLUGININFOEX pluginInfo={ + sizeof(PLUGININFOEX), + "Language Pack Manager", + PLUGIN_VERSION, +#if defined(_DEBUG) + "Development build not intended for release. ("__DATE__")", /* autotranslated */ +#else + "Helps you manage Language Packs of different languages.", /* autotranslated */ +#endif + "H. Herkenrath", + szEmail, /* @ will be set later */ + "© 2005-2007 H. Herkenrath", + PLUGIN_WEBSITE, + UNICODE_AWARE, + 0, +#if defined(_UNICODE) + // {D4BDD1EB-56F1-4a87-A187-67246EE919A2} + {0xd4bdd1eb,0x56f1,0x4a87,{0xa1,0x87,0x67,0x24,0x6e,0xe9,0x19,0xa2}}, +#else + // {08A6937A-4906-4c23-8B9F-B3690B929D52} + {0x8a6937a,0x4906,0x4c23,{0x8b,0x9f,0xb3,0x69,0xb,0x92,0x9d,0x52}} +#endif +}; +static const MUUID interfaces[]={MIID_LANGMAN,MIID_LAST}; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,void *pReserved) +{ + UNREFERENCED_PARAMETER(pReserved); + if(fdwReason==DLL_PROCESS_ATTACH) { + /* Do not call this from a DLL that is linked to the static C run-time library (CRT). + * The static CRT requires DLL_THREAD_ATTACH and DLL_THREAD_DETATCH notifications + * to function properly. */ + DisableThreadLibraryCalls(hInst=hinstDLL); + } + return TRUE; +} + +static void InstallFile(const TCHAR *pszFileName,const TCHAR *pszDestSubDir) +{ + TCHAR szFileFrom[MAX_PATH+1],szFileTo[MAX_PATH+1],*p; + HANDLE hFile; + + if ( !GetModuleFileName(hInst, szFileFrom, SIZEOF(szFileFrom) - lstrlen(pszFileName))) + return; + p = _tcsrchr(szFileFrom,_T('\\')); + if ( p != NULL ) *(++p)=0; + lstrcat(szFileFrom, pszFileName); /* buffer safe */ + + hFile = CreateFile(szFileFrom, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + if ( hFile == INVALID_HANDLE_VALUE ) return; + CloseHandle(hFile); + + if ( !GetModuleFileName(NULL, szFileTo, SIZEOF(szFileTo) - lstrlen(pszDestSubDir) - lstrlen(pszFileName))) + return; + p = _tcsrchr(szFileTo, _T('\\')); + if ( p != NULL ) *(++p)=0; + lstrcat(szFileTo, pszDestSubDir); /* buffer safe */ + CreateDirectory(szFileTo, NULL); + lstrcat(szFileTo, pszFileName); /* buffer safe */ + + if ( !MoveFile(szFileFrom, szFileTo) && GetLastError() == ERROR_ALREADY_EXISTS) { + DeleteFile(szFileTo); + MoveFile(szFileFrom, szFileTo); + } +} + +static int LangManModulesLoaded(WPARAM wParam,LPARAM lParam) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + if ( ServiceExists("DBEditorpp/RegisterSingleModule")) + CallService("DBEditorpp/RegisterSingleModule", (WPARAM)"LangMan", 0); + return 0; +} + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(dllexport) const PLUGININFO* MirandaPluginInfo(DWORD mirandaVersion) +{ + if(mirandaVersion +#include + +extern HINSTANCE hInst; +static HANDLE hHookOptInit; + +/************************* Utils **************************************/ + +#define BOX(str) BOX2("%s (err:%i)",str,GetLastError()) +#define BOX2(fmt,p1,p2) { char str[256]; wsprintfA(str,fmt,p1,p2); MessageBoxA(NULL,str,"dbg",0); } + +// ImageList_Destroy() the return value +// refresh on WM_THEMECHANGED +static HIMAGELIST CreateRadioImages(COLORREF clrBk,COLORREF clrText) +{ + register HDC hdc,hdcScreen; + SIZE size; + RECT rc; + HBITMAP hbm,hbmPrev; + HIMAGELIST himl=NULL; + + /* the WinXP+ themed way */ + HMODULE hUxThemeDLL; + HTHEME (WINAPI *pfnOpenThemeData)(HWND,const WCHAR*); + HTHEME (WINAPI *pfnCloseThemeData)(HTHEME); + HRESULT (WINAPI *pfnDrawThemeBackground)(HTHEME,HDC,int,int,const RECT*,const RECT*); + hUxThemeDLL=LoadLibraryA("UXTHEME"); /* all ascii */ + + /* draw bitmap */ + hdcScreen=GetDC(NULL); + if(hdcScreen!=NULL) { + hdc=CreateCompatibleDC(NULL); /* compatible to screen */ + if(hdc!=NULL) { + size.cx=GetSystemMetrics(SM_CXSMICON); + size.cy=GetSystemMetrics(SM_CYSMICON); + SetRect(&rc,0,0,2*size.cx,size.cy); + hbm=CreateCompatibleBitmap(hdcScreen,rc.right,rc.bottom); + if(hbm!=NULL) { + hbmPrev=SelectObject(hdc,hbm); + if(hbmPrev!=NULL) { /* error on select? */ + /* the WinXP+ themed way */ + if(hUxThemeDLL!=NULL) { + *(PROC*)&pfnOpenThemeData=GetProcAddress(hUxThemeDLL,"OpenThemeData"); + *(PROC*)&pfnCloseThemeData=GetProcAddress(hUxThemeDLL,"CloseThemeData"); + *(PROC*)&pfnDrawThemeBackground=GetProcAddress(hUxThemeDLL,"DrawThemeBackground"); + if(pfnOpenThemeData!=NULL && pfnCloseThemeData!=NULL && pfnDrawThemeBackground!=NULL) { + HTHEME hTheme; + hTheme=pfnOpenThemeData(NULL,L"Button"); + if(hTheme!=NULL) { + SetRect(&rc,0,0,size.cx,size.cy); + /* unchecked */ + if(!pfnDrawThemeBackground(hTheme,hdc,BP_RADIOBUTTON,RBS_UNCHECKEDNORMAL,&rc,NULL)) { + /* checked */ + OffsetRect(&rc,size.cx,0); + if(!pfnDrawThemeBackground(hTheme,hdc,BP_RADIOBUTTON,RBS_CHECKEDNORMAL,&rc,NULL)) + himl=ImageList_Create(size.cx,size.cy,ILC_COLOR32|ILC_MASK,3,0); + } + pfnCloseThemeData(hTheme); + } + } + } + /* the classic way */ + if(himl==NULL) { + register HDC hdcMono; + HBITMAP hbmMono,hbmPrevMono; + RECT rcRadio; + COLORREF clrPrevText,clrPrevBk; + HBRUSH hbrBk; + hbrBk=CreateSolidBrush(clrBk); + if(hbrBk!=NULL) { + FillRect(hdc,&rc,hbrBk); + DeleteObject(hbrBk); + hdcMono=CreateCompatibleDC(hdc); + if(hdcMono!=NULL) { + hbmMono=CreateBitmap(rc.right,rc.bottom,1,1,NULL); + if(hbmMono!=NULL) { + hbmPrevMono=SelectObject(hdcMono,hbmMono); + if(hbmPrevMono!=NULL) { /* error on select? */ + /* draws a black-and-white mask (see docs) + * we need to colorize it using BitBlt with text and background color */ + clrPrevText=SetTextColor(hdc,clrText); + clrPrevBk=SetBkColor(hdc,clrBk); + /* check mark is slightly smaller than icon size */ + SetRect(&rcRadio,0,0,GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK)); + if(rcRadio.right>size.cx) rcRadio.right=size.cx; + if(rcRadio.bottom>size.cy) rcRadio.bottom=size.cy; + SetRect(&rc,((size.cx-rcRadio.right)/2)+1,((size.cy-rcRadio.bottom)/2)+1,rcRadio.right+1,rcRadio.bottom+1); + /* unchecked */ + if(BitBlt(hdcMono,0,0,rcRadio.right,rcRadio.bottom,NULL,0,0,WHITENESS)) { /* white back */ + if(DrawFrameControl(hdcMono,&rcRadio,DFC_BUTTON,DFCS_BUTTONRADIO|DFCS_FLAT)) { + if(BitBlt(hdc,rc.left,rc.top,rcRadio.right,rcRadio.bottom,hdcMono,0,0,SRCCOPY|NOMIRRORBITMAP)) { + /* checked */ + OffsetRect(&rc,size.cx,0); + if(BitBlt(hdcMono,0,0,rcRadio.right,rcRadio.bottom,NULL,0,0,WHITENESS)) {/* white back */ + if(DrawFrameControl(hdcMono,&rcRadio,DFC_BUTTON,DFCS_BUTTONRADIO|DFCS_FLAT|DFCS_CHECKED)) { + if(BitBlt(hdc,rc.left,rc.top,rcRadio.right,rcRadio.bottom,hdcMono,0,0,SRCCOPY|NOMIRRORBITMAP)) + himl=ImageList_Create(size.cx,size.cy,ILC_COLOR|ILC_MASK,3,0); + } else BOX("second DrawFrameControl() failed"); + } else BOX("second BitBlt() failed"); + } else BOX("intermediate BitBlt() failed"); + } else BOX("DrawFrameControl() failed"); + } else BOX("first BitBlt() failed"); + /* restore */ + SetBkColor(hdc,clrPrevBk); + SetTextColor(hdc,clrPrevText); + SelectObject(hdcMono,hbmPrevMono); + } else BOX("hbmPrevMono==NULL"); + DeleteObject(hbmMono); + } else BOX("hbmMono==NULL"); + DeleteDC(hdcMono); + } else BOX("hdcMono==NULL"); + } + } + SelectObject(hdc,hbmPrev); + /* create imagelist */ + if(himl!=NULL) { + if(himl==NULL) BOX("img list create failed"); + if(himl!=NULL) if(ImageList_AddMasked(himl,hbm,clrBk)==-1) BOX("add failed"); + } else BOX("Win9x: drawing code not reached"); + } + DeleteObject(hbm); + } + DeleteDC(hdc); + } + ReleaseDC(NULL,hdcScreen); + } + + if(hUxThemeDLL!=NULL) FreeLibrary(hUxThemeDLL); + return himl; +} + +static void CleanupPluginName(char *szShortName) +{ + char *p; + int len; + /* strip-off anything in brackets */ + for(p=szShortName;*p!='\0';++p) + if(*p=='(' || *p=='[') { + *p='\0'; + break; + } + /* remove trailing space */ + len=lstrlenA(szShortName); + while(szShortName[0]!='\0' && szShortName[len-1]==' ') + szShortName[--len]=0; +} + +static void DisplayNotIncludedPlugins(HWND hwndListBox,const LANGPACK_INFO *pack) +{ + WIN32_FIND_DATA wfd; + HANDLE hFind; + TCHAR szSearch[MAX_PATH],szDir[MAX_PATH],*p; + HMODULE hModule; + BOOL fNeedsFree; + char buf[128]; + TCHAR buf2[128]; + DWORD mirandaVersion; + PLUGININFO *pluginInfo; + PLUGININFO *(__cdecl *MirandaPluginInfo)(DWORD); + + /* enum plugins */ + if(!(pack->flags&LPF_DEFAULT) && GetModuleFileName(NULL,szDir,SIZEOF(szDir))) { + p=_tcsrchr(szDir,_T('\\')); + if(p!=NULL) *p=_T('\0'); + mir_sntprintf(szSearch,SIZEOF(szSearch),_T("%s\\Plugins\\*.dll"),szDir); + hFind=FindFirstFile(szSearch, &wfd); + if(hFind!=INVALID_HANDLE_VALUE) { + mirandaVersion=CallService(MS_SYSTEM_GETVERSION,0,0); + SendMessage(hwndListBox,LB_SETLOCALE,CallService(MS_LANGPACK_GETLOCALE,0,0),0); /* for sort order */ + SendMessage(hwndListBox,LB_INITSTORAGE,128,lstrlenA(pack->szPluginsIncluded)); /* speed up */ + do { + if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) continue; + if((lstrlen(wfd.cFileName)<4) || (wfd.cFileName[lstrlen(wfd.cFileName)-4]!=_T('.'))) continue; + /* file name */ + lstrcpy(szSearch,wfd.cFileName); /* buffer safe */ + p=_tcsrchr(szSearch,_T('.')); + if(p!=NULL) *p=_T('\0'); +#if defined(_UNICODE) + { char cFileNameA[MAX_PATH]; + cFileNameA[0]='\0'; + WideCharToMultiByte(CP_ACP,0,szSearch,-1,cFileNameA,sizeof(cFileNameA),NULL,NULL); + if(IsPluginIncluded(pack,cFileNameA)) continue; + } +#else + if(IsPluginIncluded(pack,szSearch)) continue; +#endif + /* friendly name of the plugin */ + mir_sntprintf(szSearch,SIZEOF(szSearch),_T("%s\\Plugins\\%s"),szDir,wfd.cFileName); + hModule=GetModuleHandle(szSearch); + fNeedsFree=(hModule==NULL); + if(hModule==NULL) { + hModule=LoadLibrary(szSearch); + if(hModule==NULL) continue; + } + /* plugin info */ + *(PROC*)&MirandaPluginInfo=GetProcAddress(hModule,"MirandaPluginInfo"); + if(MirandaPluginInfo==NULL) /* v0.8 support */ + *(PROC*)&MirandaPluginInfo=GetProcAddress(hModule,"MirandaPluginInfoEx"); + if(MirandaPluginInfo!=NULL) { /* both structs have the same header */ + pluginInfo=MirandaPluginInfo(mirandaVersion); + if(pluginInfo!=NULL && pluginInfo->cbSize>=sizeof(PLUGININFO) && pluginInfo->shortName!=NULL) { + lstrcpynA(buf,pluginInfo->shortName,sizeof(buf)); /* buffer safe */ + CleanupPluginName(buf); + mir_sntprintf(buf2,SIZEOF(buf2),TranslateT("%hs (%s)"),buf,CharLower(wfd.cFileName)); + SendMessage(hwndListBox,LB_ADDSTRING,0,(LPARAM)buf2); + } + } + if(fNeedsFree) FreeLibrary(hModule); + } while(FindNextFile(hFind,&wfd)); + FindClose(hFind); + } + } + /* all are included? */ + if(!SendMessage(hwndListBox,LB_GETCOUNT,0,0)) + SendMessage(hwndListBox,LB_ADDSTRING,0,(LPARAM)TranslateT("All installed plugins are included.")); +} + +static void DisplayPackInfo(HWND hwndDlg,const LANGPACK_INFO *pack) +{ + /* compute not-included from included list */ + SendDlgItemMessage(hwndDlg,IDC_LANGNOTINCLUDED,LB_RESETCONTENT,0,0); + DisplayNotIncludedPlugins(GetDlgItem(hwndDlg,IDC_LANGNOTINCLUDED),pack); + /* locale string */ + if(!(pack->flags&LPF_NOLOCALE)) { + TCHAR szLocaleName[128]; + szLocaleName[0]=_T('\0'); + /* can't use LOCALE_SNAME as it is not present on pre WinVista */ + if(!GetLocaleInfo(pack->Locale,LOCALE_SISO639LANGNAME,szLocaleName,SIZEOF(szLocaleName))) { /* Win98/NT4+ */ + if(!GetLocaleInfo(pack->Locale,LOCALE_SLANGUAGE,szLocaleName,SIZEOF(szLocaleName))) /* not unique! */ + szLocaleName[0]=_T('\0'); + } else { + if(GetLocaleInfo(pack->Locale,LOCALE_SISO3166CTRYNAME,&szLocaleName[3],SIZEOF(szLocaleName)-3)) /* Win98/NT4+ */ + szLocaleName[2]=_T('-'); + } + /* add some note if its incompatible */ + if(szLocaleName[0]) { + if(!IsValidLocale(pack->Locale,LCID_INSTALLED)) { + TCHAR *pszIncompat; + pszIncompat=TranslateT("(incompatible)"); + szLocaleName[SIZEOF(szLocaleName)-lstrlen(pszIncompat)-1]=0; + lstrcat(lstrcat(szLocaleName,_T(" ")),pszIncompat); /* buffer safe */ + } + SetDlgItemText(hwndDlg,IDC_LANGLOCALE,szLocaleName); + } + else SetDlgItemText(hwndDlg,IDC_LANGLOCALE,TranslateT("Unknown")); + } + else SetDlgItemText(hwndDlg,IDC_LANGLOCALE,TranslateT("Current")); + /* file date */ + { SYSTEMTIME stFileDate; + TCHAR szDate[128]; + szDate[0]=_T('\0'); + if(FileTimeToSystemTime(&pack->ftFileDate,&stFileDate)) + GetDateFormat((LCID)CallService(MS_LANGPACK_GETLOCALE,0,0),DATE_SHORTDATE,&stFileDate,NULL,szDate,SIZEOF(szDate)); + SetDlgItemText(hwndDlg,IDC_LANGDATE,szDate); + } + /* version */ + SetDlgItemTextA(hwndDlg,IDC_LANGVERSION,pack->szVersion); + if(pack->szVersion[0] && pack->szFLName[0]) { + if(!IsWindowVisible(GetDlgItem(hwndDlg,IDC_LANGVERSIONLABEL))) { + ShowWindow(GetDlgItem(hwndDlg,IDC_LANGVERSIONLABEL),SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg,IDC_LANGVERSION),SW_SHOW); + } + } else { + ShowWindow(GetDlgItem(hwndDlg,IDC_LANGVERSIONLABEL),SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg,IDC_LANGVERSION),SW_HIDE); + } + /* general */ + SetDlgItemTextA(hwndDlg,IDC_LANGMODUSING,pack->szLastModifiedUsing); + SetDlgItemTextA(hwndDlg,IDC_LANGAUTHORS,pack->szAuthors); + SetDlgItemTextA(hwndDlg,IDC_LANGEMAIL,pack->szAuthorEmail); + SetDlgItemText(hwndDlg,IDC_LANGINFOFRAME,TranslateTS(pack->szLanguage)); +} + +/************************* Insert/Delete ******************************/ + +#define M_RELOADLIST (WM_APP+1) +#define M_SHOWFILECOL (WM_APP+2) + +static void DeletePackFile(HWND hwndDlg,HWND hwndList,int iItem,LANGPACK_INFO *pack) +{ + SHFILEOPSTRUCT sfo; + TCHAR szFileName[MAX_PATH]; + ZeroMemory(&sfo,sizeof(sfo)); + sfo.hwnd=hwndDlg; + sfo.wFunc=FO_DELETE; + sfo.fFlags=FOF_SIMPLEPROGRESS|FOF_SILENT; /* silent = no progress */ + /* double zero terminated */ + if(GetPackPath(szFileName,SIZEOF(szFileName)-1,pack->flags&LPF_ENABLED,pack->szFileName)) { + szFileName[lstrlen(szFileName)+1]=_T('\0'); + sfo.pFrom=szFileName; + /* ask to delete file */ + if(!SHFileOperation(&sfo) && !sfo.fAnyOperationsAborted) { + LVITEM lvi; + int nCount; + lvi.iItem=iItem; + lvi.iSubItem=0; + lvi.mask=LVIF_STATE; + lvi.stateMask=LVIS_STATEIMAGEMASK|LVIS_SELECTED|LVIS_FOCUSED; + if(ListView_GetItem(hwndList,&lvi)) { + ListView_DeleteItem(hwndList,iItem); + /* enable/select next item at same position */ + nCount=ListView_GetItemCount(hwndList); + if(iItemflags&LPF_DEFAULT) + hIcon=(HICON)CallService(MS_FLAGS_CREATEMERGEDFLAGICON,CTRY_UNITED_STATES,CTRY_UNITED_KINGDOM); + else { + int countryId=0xFFFF; /* Unknown */ + TCHAR szBuf[6]; + /* get country id from locale */ + if(!(pack->flags&LPF_NOLOCALE)) + if(GetLocaleInfo(pack->Locale,LOCALE_ICOUNTRY,szBuf,SIZEOF(szBuf))) + countryId=_ttoi(szBuf); + hIcon=(HICON)CallService(MS_FLAGS_LOADFLAGICON,countryId,0); + } + if(hIcon==NULL) lvi.iImage=-1; + else lvi.iImage=ImageList_AddIcon((HIMAGELIST)lParam,hIcon); + lvi.mask|=LVIF_IMAGE; + } + /* insert */ + lvi.iItem=lvi.iSubItem=0; + lvi.stateMask=LVIS_STATEIMAGEMASK|LVIS_SELECTED; + lvi.state=INDEXTOSTATEIMAGEMASK((pack->flags&LPF_ENABLED)?2:1); + if(pack->flags&LPF_ENABLED) lvi.state|=LVIS_SELECTED|LVIS_FOCUSED; + lvi.pszText=TranslateTS(pack->szLanguage); + lvi.lParam=(LPARAM)pack2; + ListView_InsertItem((HWND)wParam,&lvi); + + return TRUE; +} + +static int CALLBACK CompareListItem(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort) +{ + int cmp; + cmp=CompareString((LCID)lParamSort,0,((LANGPACK_INFO*)lParam1)->szLanguage,-1,((LANGPACK_INFO*)lParam2)->szLanguage,-1); + if(cmp!=0) cmp-=2; + return cmp; +} + +/************************* Options Page *******************************/ + +static HWND hwndLangOpt; + +static BOOL CALLBACK LangOptDlgProc(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + { HWND hwndList; + LVCOLUMN lvc; + hwndList=GetDlgItem(hwndDlg,IDC_LANGLIST); + hwndLangOpt=hwndDlg; + TranslateDialogDefault(hwndDlg); + ListView_SetExtendedListViewStyle(hwndList,LVS_EX_FULLROWSELECT|LVS_EX_LABELTIP); + ListView_SetImageList(hwndList,CreateRadioImages(ListView_GetBkColor(hwndList),ListView_GetTextColor(hwndList)),LVSIL_STATE); /* auto-destroyed */ + + lvc.mask=LVCF_TEXT; + lvc.pszText=TranslateT("Installed Languages"); + ListView_InsertColumn(hwndList,0,&lvc); + if(ServiceExists(MS_FLAGS_LOADFLAGICON)) + ListView_SetImageList(hwndList,ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR24,8,8),LVSIL_SMALL); + CorrectPacks(_T("langpack_*.txt"),FALSE); + CheckDlgButton(hwndDlg,IDC_ENABLEAUTOUPDATES,DBGetContactSettingByte(NULL,"LangMan","EnableAutoUpdates",SETTING_ENABLEAUTOUPDATES_DEFAULT)!=0); + SendMessage(hwndDlg,M_RELOADLIST,0,0); + SendMessage(hwndDlg,M_SHOWFILECOL,0,SendMessage(GetParent(hwndDlg),PSM_ISEXPERT,0,0)); + return TRUE; + } + case M_RELOADLIST: + { HWND hwndList; + HIMAGELIST himl; + int iItem; + /* init list */ + hwndList=GetDlgItem(hwndDlg,IDC_LANGLIST); + ListView_DeleteAllItems(hwndList); + ListView_DeleteColumn(hwndList,1); /* if present */ + himl=ListView_GetImageList(hwndList,LVSIL_SMALL); + ImageList_RemoveAll(himl); + /* enum all packs */ + EnumPacks(InsertPackItemEnumProc,_T("langpack_*.txt"),"Miranda Language Pack Version 1",TRUE,(WPARAM)hwndList,(LPARAM)himl); + /* make it use current langpack locale for sort */ + ListView_SortItems(hwndList,CompareListItem,CallService(MS_LANGPACK_GETLOCALE,0,0)); + CheckDlgButton(hwndDlg,IDC_ENABLEAUTOUPDATES,DBGetContactSettingByte(NULL,"LangMan","EnableAutoUpdates",SETTING_ENABLEAUTOUPDATES_DEFAULT)!=0); + /* show selection */ + iItem=ListView_GetNextItem(hwndList,-1,LVNI_SELECTED); + if(iItem!=-1) ListView_EnsureVisible(hwndList,iItem,FALSE); + return TRUE; + } + case M_SHOWFILECOL: + { HWND hwndList; + hwndList=GetDlgItem(hwndDlg,IDC_LANGLIST); + if((BOOL)lParam && ListView_GetItemCount(hwndList)>1) { + LVCOLUMN lvc; + LVITEM lvi; + LANGPACK_INFO *pack; + /* add column */ + ListView_SetColumnWidth(hwndList,0,LVSCW_AUTOSIZE_USEHEADER); + lvc.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + lvc.pszText=TranslateT("File"); + lvc.cx=160; + ListView_InsertColumn(hwndList,lvc.iSubItem=1,&lvc); + ListView_SetColumnWidth(hwndList,0,ListView_GetColumnWidth(hwndList,0)-lvc.cx); + /* add text */ + lvi.mask=LVIF_PARAM; + lvi.iSubItem=0; + for(lvi.iItem=0;ListView_GetItem(hwndList,&lvi);++lvi.iItem) { + pack=(LANGPACK_INFO*)lvi.lParam; + ListView_SetItemText(hwndList,lvi.iItem,1,(pack->flags&LPF_DEFAULT)?TranslateT("built-in"):pack->szFileName); + } + } + else { + ListView_DeleteColumn(hwndList,1); + ListView_SetColumnWidth(hwndList,0,LVSCW_AUTOSIZE_USEHEADER); + } + return TRUE; + } + case WM_DESTROY: + ListView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_LANGLIST)); + return TRUE; + case WM_THEMECHANGED: + case WM_SETTINGCHANGE: + { HIMAGELIST himl; + HWND hwndList; + hwndList=GetDlgItem(hwndDlg,IDC_LANGLIST); + himl=ListView_SetImageList(hwndList,CreateRadioImages(ListView_GetBkColor(hwndList),ListView_GetTextColor(hwndList)),LVSIL_STATE); /* auto-destroyed */ + if(himl!=NULL) ImageList_Destroy(himl); + break; + } + case WM_CTLCOLORLISTBOX: /* mimic readonly edit */ + return (BOOL)SendMessage(hwndDlg,WM_CTLCOLORSTATIC,wParam,lParam); + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDC_LANGEMAIL: + { char buf[512]; + lstrcpyA(buf,"mailto:"); + if(GetWindowTextA(GetDlgItem(hwndDlg,LOWORD(wParam)),&buf[7],sizeof(buf)-7)) + CallService(MS_UTILS_OPENURL,FALSE,(LPARAM)buf); + return TRUE; + } + case IDC_MORELANG: + CallService(MS_UTILS_OPENURL,TRUE,(LPARAM)"http://addons.miranda-im.org/index.php?action=display&id=23"); + return TRUE; +/* case IDC_ENABLEAUTOUPDATES: + SendMessage(GetParent(hwndDlg),PSM_CHANGED,0,0); /* enable apply */ +/* return TRUE; + case IDC_DOWNLOADLANG: + ServiceShowLangDialog(0,0); + return TRUE;*/ + } + break; + case WM_CONTEXTMENU: + if(GetDlgCtrlID((HWND)wParam)==IDC_LANGLIST) { + LVHITTESTINFO hti; + HMENU hContextMenu; + RECT rc; + LVITEM lvi; + LANGPACK_INFO *pack; + /* get item */ + POINTSTOPOINT(hti.pt,MAKEPOINTS(lParam)); + if(hti.pt.x==-1 && hti.pt.y==-1) { + /* keyboard invoked */ + hti.iItem=ListView_GetNextItem((HWND)wParam,-1,LVNI_SELECTED); + if(hti.iItem!=-1) + break; + if(!ListView_GetItemRect((HWND)wParam,hti.iItem,&rc,LVIR_SELECTBOUNDS)) + break; + hti.pt.x=rc.left+(rc.right-rc.left)/2; + hti.pt.y=rc.top+(rc.bottom-rc.top)/2; + ClientToScreen((HWND)wParam,&hti.pt); + } else { + ScreenToClient((HWND)wParam,&hti.pt); + if(ListView_HitTest((HWND)wParam,&hti)==-1 || !(hti.flags&LVHT_ONITEM)) + break; + POINTSTOPOINT(hti.pt,MAKEPOINTS(lParam)); + } + /* param */ + lvi.iItem=hti.iItem; + lvi.iSubItem=0; + lvi.mask=LVIF_PARAM; + if(!ListView_GetItem((HWND)wParam,&lvi)) break; + pack=(LANGPACK_INFO*)lvi.lParam; + /* context menu */ + if(!(pack->flags&LPF_DEFAULT)) { + hContextMenu=CreatePopupMenu(); + if(hContextMenu!=NULL) { + AppendMenu(hContextMenu,MF_STRING,2,TranslateT("&Remove...")); + if(TrackPopupMenuEx(hContextMenu,TPM_RETURNCMD|TPM_NONOTIFY|TPM_TOPALIGN|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_HORPOSANIMATION|TPM_VERPOSANIMATION,hti.pt.x,hti.pt.y,(HWND)wParam,NULL)) + DeletePackFile(hwndDlg,(HWND)wParam,hti.iItem,pack); + DestroyMenu(hContextMenu); + } + } + return TRUE; + } + break; +#if defined(_UNICODE) + case WM_NOTIFYFORMAT: + SetWindowLong(hwndDlg,DWL_MSGRESULT,NFR_UNICODE); + return TRUE; +#endif + case WM_NOTIFY: + { NMHDR *nmhdr=(NMHDR*)lParam; + switch(nmhdr->idFrom) { + case IDC_LANGLIST: + switch(nmhdr->code) { + case LVN_DELETEITEM: + { LVITEM lvi; + lvi.iItem=((NMLISTVIEW*)lParam)->iItem; /* nmlv->lParam is invalid */ + lvi.iSubItem=0; + lvi.mask=LVIF_PARAM; + if(ListView_GetItem(nmhdr->hwndFrom,&lvi)) + mir_free((LANGPACK_INFO*)lvi.lParam); + break; + } + case LVN_ITEMCHANGED: + { NMLISTVIEW *nmlv=(NMLISTVIEW*)lParam; + if(!(nmlv->uChanged&LVIF_STATE)) break; + /* display info and check radio item */ + if(nmlv->uNewState&LVIS_SELECTED && !(nmlv->uOldState&LVIS_SELECTED)) { + ListView_SetItemState(nmhdr->hwndFrom,nmlv->iItem,INDEXTOSTATEIMAGEMASK(2),LVIS_STATEIMAGEMASK); + DisplayPackInfo(hwndDlg,(LANGPACK_INFO*)nmlv->lParam); + } + /* disable all other radio items */ + else if(nmlv->uNewState&INDEXTOSTATEIMAGEMASK(2)) { + int iItem; + for(iItem=ListView_GetItemCount(nmhdr->hwndFrom)-1;iItem!=-1;--iItem) + if(iItem!=nmlv->iItem) + ListView_SetItemState(nmhdr->hwndFrom,iItem,INDEXTOSTATEIMAGEMASK(1),LVIS_STATEIMAGEMASK); + /* enable apply */ + if(nmlv->uOldState) { + SendMessage(GetParent(hwndDlg),PSM_CHANGED,0,0); + ShowWindow(GetDlgItem(hwndDlg,IDC_RESTART),SW_SHOW); + } + } + break; + } + case LVN_KEYDOWN: + { int iItem; + iItem=ListView_GetNextItem(nmhdr->hwndFrom,-1,LVNI_SELECTED); + switch(((NMLVKEYDOWN*)lParam)->wVKey) { + case VK_SPACE: + ListView_SetItemState(nmhdr->hwndFrom,iItem,INDEXTOSTATEIMAGEMASK(2),LVIS_STATEIMAGEMASK); + break; + case VK_DELETE: + { LVITEM lvi; + LANGPACK_INFO *pack; + lvi.iItem=iItem; + lvi.iSubItem=0; + lvi.mask=LVIF_PARAM; + if(ListView_GetItem(nmhdr->hwndFrom,&lvi)) { + pack=(LANGPACK_INFO*)lvi.lParam; + if(!(pack->flags&LPF_DEFAULT)) + DeletePackFile(hwndDlg,nmhdr->hwndFrom,iItem,pack); + } + break; + } + } + break; + } + case NM_CLICK: + { LVHITTESTINFO hti; + lParam=GetMessagePos(); + POINTSTOPOINT(hti.pt,MAKEPOINTS(lParam)); + ScreenToClient(nmhdr->hwndFrom,&hti.pt); + if(ListView_HitTest(nmhdr->hwndFrom,&hti)!=-1) + if(hti.flags&(LVHT_ONITEMSTATEICON|LVHT_ONITEMICON)) /* one of them */ + ListView_SetItemState(nmhdr->hwndFrom,hti.iItem,LVIS_SELECTED,LVIS_SELECTED); + break; + } + } /* switch nmhdr->code */ + break; + case 0: + switch(nmhdr->code) { + case PSN_APPLY: + { HWND hwndList; + LVITEM lvi; + LANGPACK_INFO *pack; + hwndList=GetDlgItem(hwndDlg,IDC_LANGLIST); + lvi.mask=LVIF_STATE|LVIF_PARAM; + lvi.stateMask=LVIS_STATEIMAGEMASK; + lvi.iSubItem=0; + for(lvi.iItem=0;ListView_GetItem(hwndList,&lvi);++lvi.iItem) { + pack=(LANGPACK_INFO*)lvi.lParam; + if(lvi.state&INDEXTOSTATEIMAGEMASK(2)) { + EnablePack(pack,_T("langpack_*.txt")); + pack->flags|=LPF_ENABLED; + } else pack->flags&=~LPF_ENABLED; + } + DBWriteContactSettingByte(NULL,"LangMan","EnableAutoUpdates",(BYTE)(IsDlgButtonChecked(hwndDlg,IDC_ENABLEAUTOUPDATES)!=0)); + return TRUE; + } + case PSN_EXPERTCHANGED: + SendMessage(hwndDlg,M_SHOWFILECOL,0,((PSHNOTIFY*)lParam)->lParam); + return TRUE; + } /* switch nmhdr->code */ + break; + } /* switch nmhdr->idFrom */ + break; + } + } + return FALSE; +} + +void ReloadLangOptList(void) +{ + if(hwndLangOpt!=NULL) { + SendMessage(hwndLangOpt,M_RELOADLIST,0,0); + SendMessage(hwndLangOpt,M_SHOWFILECOL,0,SendMessage(GetParent(hwndLangOpt),PSM_ISEXPERT,0,0)); + } +} + +static int LangOptInit(WPARAM wParam,LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp; + UNREFERENCED_PARAMETER(lParam); + ZeroMemory(&odp,sizeof(odp)); + odp.cbSize=sizeof(odp); + odp.hInstance=hInst; + odp.flags=ODPF_BOLDGROUPS|ODPF_TCHAR; + odp.position=1200000090; /* plugin opts=1300000000 */ +// odp.ptszGroup=_T("Appearance"); /* autotranslated */ + odp.ptszTitle=_T("Appearance"); /* autotranslated */ +// odp.ptszTab=_T("Language"); /* autotranslated, can be made a tab */ + odp.pszTemplate=MAKEINTRESOURCEA(IDD_OPT_LANG); + odp.pfnDlgProc=LangOptDlgProc; + CallService(MS_OPT_ADDPAGE,wParam,(LPARAM)&odp); + return 0; +} + +/************************* Misc ***************************************/ + +void InitOptions(void) +{ + hwndLangOpt=NULL; + hHookOptInit=HookEvent(ME_OPT_INITIALISE,LangOptInit); + CorrectPacks(_T("langpack_*.txt"),FALSE); +} + +void UninitOptions(void) +{ + UnhookEvent(hHookOptInit); +} \ No newline at end of file diff --git a/plugins/LangMan/options.h b/plugins/LangMan/options.h new file mode 100644 index 0000000000..94236f750a --- /dev/null +++ b/plugins/LangMan/options.h @@ -0,0 +1,27 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* Options Page */ +void ReloadLangOptList(void); + +/* Misc */ +void InitOptions(void); +void UninitOptions(void); diff --git a/plugins/LangMan/resource.h b/plugins/LangMan/resource.h new file mode 100644 index 0000000000..623b2d01e5 --- /dev/null +++ b/plugins/LangMan/resource.h @@ -0,0 +1,48 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by resource.rc +// +#define IDD_OPT_LANG 101 +#define IDD_UPDATENOTIFY 102 +#define IDD_DOWNLOADLANG 103 +#define IDC_LANGLIST 1001 +#define IDC_LANGINFOFRAME 1002 +#define IDC_LANGAUTHORSLABEL 1003 +#define IDC_LANGAUTHORS 1004 +#define IDC_LANGEMAILLABEL 1005 +#define IDC_LANGEMAIL 1006 +#define IDC_LANGMODUSINGLABEL 1007 +#define IDC_LANGMODUSING 1008 +#define IDC_LANGDATELABEL 1009 +#define IDC_LANGDATE 1010 +#define IDC_LANGVERSIONLABEL 1011 +#define IDC_LANGVERSION 1012 +#define IDC_LANGLOCALELABEL 1013 +#define IDC_LANGLOCALE 1014 +#define IDC_LANGNOTINCLUDEDLABEL 1015 +#define IDC_LANGNOTINCLUDED 1016 +#define IDC_MORELANG 1017 +#define IDC_RESTART 1018 +#define IDC_ENABLEAUTOUPDATES 1019 +#define IDC_DOWNLOADLANG 1020 +#define IDC_LANGCOMBO 1021 +#define IDC_LANGAUTHORS2 1021 +#define IDC_DOWNLOADALL 1022 +#define IDC_LOADING 1023 +#define IDC_LANGUAGELABEL 1024 +#define IDC_LANGUAGE 1025 +#define IDC_CURRENTVERSION 1026 +#define IDC_NEWVERSION 1027 +#define IDC_NEWVERSIONLABEL 1028 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 104 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1029 +#define _APS_NEXT_SYMED_VALUE 2001 +#endif +#endif diff --git a/plugins/LangMan/resource.rc b/plugins/LangMan/resource.rc new file mode 100644 index 0000000000..03eb1e4ade --- /dev/null +++ b/plugins/LangMan/resource.rc @@ -0,0 +1,197 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Englisch (GB) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE MOVEABLE PURE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include \r\n" + "\0" +END + +3 TEXTINCLUDE MOVEABLE PURE +BEGIN + "#include ""version.rc""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +/*IDD_UPDATENOTIFY DIALOGEX 0, 0, 259, 115 +STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "Language Pack Update Now Available" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "A new version of a Language Pack is now available. Click the install button to download and install this new update.", + IDC_STATIC,8,7,243,21,SS_NOPREFIX + CONTROL "Language:",IDC_LANGUAGELABEL,"Static",SS_SIMPLE | + SS_NOPREFIX | WS_GROUP,8,29,65,8 + EDITTEXT IDC_LANGUAGE,78,29,173,8,ES_AUTOHSCROLL | ES_READONLY | + NOT WS_BORDER + CONTROL "Current:",IDC_STATIC,"Static",SS_SIMPLE | SS_NOPREFIX | + WS_GROUP,8,43,65,8 + EDITTEXT IDC_CURRENTVERSION,78,43,173,8,ES_AUTOHSCROLL | + ES_READONLY | NOT WS_BORDER + CONTROL "New:",IDC_NEWVERSIONLABEL,"Static",SS_SIMPLE | + SS_NOPREFIX | WS_GROUP,8,58,65,8 + EDITTEXT IDC_NEWVERSION,78,58,173,8,ES_AUTOHSCROLL | ES_READONLY | + NOT WS_BORDER + PUSHBUTTON "&Install Now",IDOK,7,73,66,15,WS_GROUP + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,92,245,1 + DEFPUSHBUTTON "Close",IDCANCEL,202,96,50,15 +END + +IDD_DOWNLOADLANG DIALOG DISCARDABLE 0, 0, 200, 126 +STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "Select your language" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Miranda IM is available in many languages.\nHere is a list of all available languages of the file listing, please select your native &language:", + IDC_STATIC,5,5,189,26 + COMBOBOX IDC_LANGCOMBO,46,36,106,126,CBS_DROPDOWNLIST | + CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + CONTROL "Download &all languages",IDC_DOWNLOADALL,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,46,53,148,10 + LTEXT "Note: This will download and install the newest language pack available for the selected language. There might be language packs from other authors available on the file listing.", + IDC_STATIC,5,69,189,34,SS_NOPREFIX | WS_DISABLED + CTEXT "",IDC_LOADING,1,109,86,8,SS_NOPREFIX | SS_CENTERIMAGE | + NOT WS_VISIBLE + PUSHBUTTON "OK",IDOK,89,106,50,14,WS_DISABLED + DEFPUSHBUTTON "Cancel",IDCANCEL,144,106,50,15 +END*/ + +IDD_OPT_LANG DIALOGEX 0, 0, 301, 227 +STYLE DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",IDC_LANGLIST,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | + WS_BORDER | WS_GROUP | WS_TABSTOP,2,3,299,61 + GROUPBOX "",IDC_LANGINFOFRAME,2,68,298,119,WS_GROUP + RTEXT "Author(s):",IDC_LANGAUTHORSLABEL,5,78,66,9,SS_NOPREFIX + EDITTEXT IDC_LANGAUTHORS,74,78,220,18,ES_MULTILINE | + ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER | + WS_VSCROLL + RTEXT "E-mail:",IDC_LANGEMAILLABEL,5,99,66,8,SS_NOPREFIX + CONTROL "",IDC_LANGEMAIL,"Hyperlink",WS_TABSTOP,76,99,207,10 + RTEXT "Last modified using:",IDC_LANGMODUSINGLABEL,5,112,66,9, + SS_NOPREFIX + EDITTEXT IDC_LANGMODUSING,75,112,207,12,ES_AUTOHSCROLL | + ES_READONLY | NOT WS_BORDER + RTEXT "Date:",IDC_LANGDATELABEL,5,125,66,9,SS_NOPREFIX + EDITTEXT IDC_LANGDATE,75,125,66,12,ES_AUTOHSCROLL | ES_READONLY | + NOT WS_BORDER + RTEXT "Version:",IDC_LANGVERSIONLABEL,150,125,39,9,SS_NOPREFIX | + NOT WS_VISIBLE + EDITTEXT IDC_LANGVERSION,194,125,88,12,ES_AUTOHSCROLL | + ES_READONLY | NOT WS_VISIBLE | NOT WS_BORDER + RTEXT "Locale:",IDC_LANGLOCALELABEL,5,137,66,9,SS_NOPREFIX + EDITTEXT IDC_LANGLOCALE,75,137,207,12,ES_READONLY | NOT WS_BORDER + /* RTEXT "Not included:",IDC_LANGNOTINCLUDEDLABEL,5,150,66,10, + SS_NOPREFIX + LISTBOX IDC_LANGNOTINCLUDED,75,150,219,33,NOT LBS_NOTIFY | + LBS_SORT | LBS_HASSTRINGS | LBS_USETABSTOPS | + LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | NOT + WS_BORDER | WS_VSCROLL | WS_TABSTOP,WS_EX_TRANSPARENT*/ + CONTROL "Download more Language Packs",IDC_MORELANG,"Hyperlink", + WS_GROUP | WS_TABSTOP | 0x1,2,189,299,10 + CTEXT "Please restart Miranda IM for your changes to take effect.", + IDC_RESTART,5,200,296,9,SS_NOPREFIX | NOT WS_VISIBLE + /* CONTROL "Check for new &versions of Language Packs periodically", + IDC_ENABLEAUTOUPDATES,"Button",BS_AUTOCHECKBOX | + WS_GROUP | WS_TABSTOP,2,214,209,10 + PUSHBUTTON "&Download Language",IDC_DOWNLOADLANG,213,213,86,14, + WS_GROUP*/ +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO MOVEABLE PURE +BEGIN + /* IDD_UPDATENOTIFY, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 252 + VERTGUIDE, 74 + TOPMARGIN, 7 + END + + IDD_DOWNLOADLANG, DIALOG + BEGIN + VERTGUIDE, 5 + VERTGUIDE, 46 + VERTGUIDE, 194 + HORZGUIDE, 106 + HORZGUIDE, 121 + END*/ + + IDD_OPT_LANG, DIALOG + BEGIN + VERTGUIDE, 2 + VERTGUIDE, 70 + VERTGUIDE, 75 + VERTGUIDE, 282 + VERTGUIDE, 294 + HORZGUIDE, 160 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Englisch (GB) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#include "version.rc" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/plugins/LangMan/utils.c b/plugins/LangMan/utils.c new file mode 100644 index 0000000000..e727df2427 --- /dev/null +++ b/plugins/LangMan/utils.c @@ -0,0 +1,69 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "common.h" + +/************************* Error Output ***************************/ + +static void MessageBoxIndirectFree(MSGBOXPARAMSA *mbp) +{ + MessageBoxIndirectA(mbp); + mir_free((char*)mbp->lpszCaption); /* does NULL check */ + mir_free((char*)mbp->lpszText); /* does NULL check */ + mir_free(mbp); +} + +void ShowInfoMessage(BYTE flags,const char *pszTitle,const char *pszTextFmt,...) +{ + char szText[256]; /* max for systray */ + MSGBOXPARAMSA *mbp; + + va_list va; + va_start(va,pszTextFmt); + mir_vsnprintf(szText,SIZEOF(szText),pszTextFmt,va); + va_end(va); + + if(ServiceExists(MS_CLIST_SYSTRAY_NOTIFY)) { + MIRANDASYSTRAYNOTIFY msn; + msn.cbSize=sizeof(msn); + msn.szProto=NULL; + msn.szInfoTitle=(char*)pszTitle; + msn.szInfo=(char*)szText; + msn.uTimeout=30000; /* max timeout */ + msn.dwInfoFlags=flags; + if(!CallServiceSync(MS_CLIST_SYSTRAY_NOTIFY,0,(LPARAM)&msn)) + return; /* success */ + } + + mbp=(MSGBOXPARAMSA*)mir_calloc(sizeof(*mbp)); + if(mbp==NULL) return; + mbp->cbSize=sizeof(*mbp); + mbp->lpszCaption=mir_strdup(pszTitle); + mbp->lpszText=mir_strdup(szText); + mbp->dwStyle=MB_OK|MB_SETFOREGROUND|MB_TASKMODAL; + mbp->dwLanguageId=LANGIDFROMLCID((LCID)CallService(MS_LANGPACK_GETLOCALE,0,0)); + switch(flags&NIIF_ICON_MASK) { + case NIIF_INFO: mbp->dwStyle|=MB_ICONINFORMATION; break; + case NIIF_WARNING: mbp->dwStyle|=MB_ICONWARNING; break; + case NIIF_ERROR: mbp->dwStyle|=MB_ICONERROR; + } + mir_forkthread(MessageBoxIndirectFree,mbp); +} diff --git a/plugins/LangMan/utils.h b/plugins/LangMan/utils.h new file mode 100644 index 0000000000..259947ecf9 --- /dev/null +++ b/plugins/LangMan/utils.h @@ -0,0 +1,23 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* Error Output */ +void ShowInfoMessage(BYTE flags,const char *pszTitle,const char *pszTextFmt,...); diff --git a/plugins/LangMan/version.h b/plugins/LangMan/version.h new file mode 100644 index 0000000000..c6731dc051 --- /dev/null +++ b/plugins/LangMan/version.h @@ -0,0 +1,42 @@ +/* + +'Language Pack Manager'-Plugin for Miranda IM + +Copyright (C) 2005-2007 H. Herkenrath + +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 (LangMan-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#define NEEDED_MIRANDA_VERSION PLUGIN_MAKE_VERSION(0,6,0,0) +#define NEEDED_MIRANDA_VERSION_STR "0.6" +#define PLUGIN_VERSION PLUGIN_MAKE_VERSION(1,0,2,3) +#define FILE_VERSION 1,0,2,3 + +#if defined(_DEBUG) + #define FILE_VERSION_STR "1.0.2.3 alpha" + #define USERAGENT_VERSION "1.0.2.3 (alpha)" +#else + #define FILE_VERSION_STR "1.0.2.3" + #define USERAGENT_VERSION "1.0.2.3" +#endif + +#define PLUGIN_EMAIL "hrathh users.sourceforge.net" +#define PLUGIN_EMAIL_ATT_POS 7 /* position of the @-sign in the email adress above */ + +#if defined(_UNICODE) + #define PLUGIN_WEBSITE "http://addons.miranda-im.org/details.php?action=viewfile&id=3003" +#else + #define PLUGIN_WEBSITE "http://addons.miranda-im.org/details.php?action=viewfile&id=3002" +#endif diff --git a/plugins/LangMan/version.rc b/plugins/LangMan/version.rc new file mode 100644 index 0000000000..23c6d4dcd8 --- /dev/null +++ b/plugins/LangMan/version.rc @@ -0,0 +1,51 @@ +#ifndef _MAC + +#include "version.h" + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION FILE_VERSION + PRODUCTVERSION FILE_VERSION + FILEFLAGSMASK 0x0L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "Licensed under the terms of the GNU General Public License" + VALUE "FileDescription", "Language Pack Manager Plugin for Miranda IM" + VALUE "FileVersion", FILE_VERSION_STR +#ifdef _UNICODE + VALUE "InternalName", "LangMan (Unicode)" +#else + VALUE "InternalName", "LangMan" +#endif + VALUE "LegalCopyright", "Copyright © 2005-2010 H. Herkenrath" + VALUE "OriginalFilename", "langman.dll" + VALUE "ProductName", "Language Pack Manager" + VALUE "ProductVersion", FILE_VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + + + + -- cgit v1.2.3