diff --git a/applications/json_packager/deploywin/COPYING.GPL.txt b/applications/json_packager/deploywin/COPYING.GPL.txt new file mode 100644 index 000000000..c79e32906 --- /dev/null +++ b/applications/json_packager/deploywin/COPYING.GPL.txt @@ -0,0 +1,340 @@ + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: 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) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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/applications/json_packager/deploywin/json_packager.iss b/applications/json_packager/deploywin/json_packager.iss new file mode 100644 index 000000000..676f3c85e --- /dev/null +++ b/applications/json_packager/deploywin/json_packager.iss @@ -0,0 +1,52 @@ +[Setup] +AppName=External OPM JSON package Editor +AppVersion=0.1.8.0 +DefaultDirName={pf}\OPMUtilities +DefaultGroupName=OPM +UninstallDisplayIcon={app}\jsoneditor.exe +Compression=lzma2 +SolidCompression=yes +OutputDir=. +; "ArchitecturesInstallIn64BitMode=x64" requests that the install be +; done in "64-bit mode" on x64, meaning it should use the native +; 64-bit Program Files directory and the 64-bit view of the registry. +; On all other architectures it will install in "32-bit mode". +ArchitecturesInstallIn64BitMode=x64 +; Note: We don't set ProcessorsAllowed because we want this +; installation to run on all architectures (including Itanium, +; since it's capable of running 32-bit code too). +LicenseFile=COPYING.GPL.txt +SetupIconFile=.\jsonpackage.ico +MinVersion=0,5.01 +AppComments="Source code for this app is available on request" +AppContact="lainz or minesadorada at http://forum.lazarus.freepascal.org/" +AppCopyright="(c)2016 lainz and minesadorada" +OutputBaseFilename=setup_jsoneditor +AppPublisher="Open source software" +AlwaysShowDirOnReadyPage=yes +UsePreviousAppDir=no +InfoBeforeFile="readmepreinstall.txt" +InfoAfterFile="readme.txt" + +[Files] +; Install MyProg-x64.exe if running in 64-bit mode (x64; see above), +; MyProg.exe otherwise. +; Place all x64 files here +Source: "jsoneditor64.exe"; DestDir: "{app}"; DestName: "jsoneditor.exe"; Check: Is64BitInstallMode +; Place all x86 files here, first one should be marked 'solidbreak' +Source: "jsoneditor.exe"; DestDir: "{app}"; Check: not Is64BitInstallMode; Flags: solidbreak +; Place all common files here, first one should be marked 'solidbreak' +; Source: "readmepreinstall.txt"; DestDir: "{app}"; Flags: isreadme +; Source: "readme.txt"; DestDir: "{app}"; Flags: isreadme +Source: ".\locale\jsoneditor.en.po"; DestDir: "{app}\locale"; Flags: solidbreak +Source: ".\locale\jsoneditor.es.po"; DestDir: "{app}\locale"; + +[Icons] +Name: "{group}\External OPM JSON package Editor"; Filename: "{app}\jsoneditor.exe" +Name: "{group}\{cm:UninstallProgram, External OPM JSON package Editor}"; Filename: "{uninstallexe}" + +[Run] +Filename: "{app}\jsoneditor.exe"; WorkingDir: "{app}"; Flags: postinstall runascurrentuser; Description: "Start the JSON Editor now"; StatusMsg: "Start the JSON Editor now" + +[Dirs] +Name: "{app}\locale" diff --git a/applications/json_packager/deploywin/jsonpackage.ico b/applications/json_packager/deploywin/jsonpackage.ico new file mode 100644 index 000000000..44718deee Binary files /dev/null and b/applications/json_packager/deploywin/jsonpackage.ico differ diff --git a/applications/json_packager/deploywin/locale/jsoneditor.en.po b/applications/json_packager/deploywin/locale/jsoneditor.en.po new file mode 100644 index 000000000..3b88fdd17 --- /dev/null +++ b/applications/json_packager/deploywin/locale/jsoneditor.en.po @@ -0,0 +1,347 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"X-Generator: Poedit 1.8.8\n" + +#: tfrmmain.btnadd.caption +msgid "Add" +msgstr "Add" + +#: tfrmmain.btnadd.hint +msgid "" +"Add Package File:\n" +"The update zip can contain more than one lpk file\n" +"deployed to the same place.\n" +msgstr "" +"Add Package File:\n" +"The update zip can contain more than one lpk file\n" +"deployed to the same place.\n" + +#: tfrmmain.btnremove.caption +msgid "Remove" +msgstr "Remove" + +#: tfrmmain.btnremove.hint +msgid "" +"Remove Package File:\n" +"Deletes the last entry from the list\n" +msgstr "" +"Remove Package File:\n" +"Deletes the last entry from the list\n" + +#: tfrmmain.cbforceupdate.caption +msgid "Force Update" +msgstr "Force Update" + +#: tfrmmain.cbforceupdate.hint +msgid "" +"Force Update check box:\n" +"If this is checked the OPM user will be notified\n" +"of your update. Only check this if the update is important.\n" +msgstr "" +"Force Update check box:\n" +"If this is checked the OPM user will be notified\n" +"of your update. Only check this if the update is important.\n" + +#: tfrmmain.cmd_close.caption +msgid "&Close" +msgstr "&Close" + +#: tfrmmain.cmd_save.caption +msgid "&Save" +msgstr "&Save" + +#: tfrmmain.cmd_save.hint +msgid "" +"Save the current configuration to disk\n" +"as a JSON update file\n" +msgstr "" +"Save the current configuration to disk\n" +"as a JSON update file\n" + +#: tfrmmain.editdownloadurl.hint +msgid "" +"Download URL:\n" +"Include the FULL url needed to download the package Zip file\n" +msgstr "" +"Download URL:\n" +"Include the FULL url needed to download the package Zip file\n" + +#: tfrmmain.editname.hint +msgid "" +"Update Zip Name:\n" +"This is just the filename (not including the path)\n" +"of your update zip. Type, or click the [...]\n" +msgstr "" +"Update Zip Name:\n" +"This is just the filename (not including the path)\n" +"of your update zip. Type, or click the [...]\n" + +#: tfrmmain.filemenu.caption +msgid "File" +msgstr "File" + +#: tfrmmain.fileopen1.caption +msgid "&Open ..." +msgstr "&Open ..." + +#: tfrmmain.fileopen1.hint +msgid "Open" +msgstr "Open" + +#: tfrmmain.filesaveas1.caption +msgid "&Save As ..." +msgstr "&Save As ..." + +#: tfrmmain.filesaveas1.hint +msgid "Save As" +msgstr "Save As" + +#: tfrmmain.lbldownloadurl.caption +msgid "Download URL:" +msgstr "Download URL:" + +#: tfrmmain.lblname.caption +msgid "Update Zip Name:" +msgstr "Update Zip Name:" + +#: tfrmmain.lblpackagefiles.caption +msgid "Package Files:" +msgstr "Package Files:" + +#: tfrmmain.loaditem.caption +msgid "Load..." +msgstr "Load..." + +#: tfrmmain.mnu_filenew.caption +msgid "New" +msgstr "" + +#: tfrmmain.mnu_filesave.caption +msgid "Save" +msgstr "Save" + +#: tfrmmain.mnu_help.caption +msgid "&Help" +msgstr "&Help" + +#: tfrmmain.mnu_helpabout.caption +msgid "About.." +msgstr "About.." + +#: tfrmmain.mnu_helpdisablewarnings.caption +msgid "Disable warnings" +msgstr "Disable warnings" + +#: tfrmmain.mnu_helpshowhints.caption +msgid "Show Popup Hints" +msgstr "Show Popup Hints" + +#: tfrmmain.mnu_lang.caption +msgid "Languages.." +msgstr "Languages.." + +#: tfrmmain.mnu_lang_en.caption +msgid "English" +msgstr "English" + +#: tfrmmain.mnu_lang_es.caption +#, fuzzy +msgid "Español" +msgstr "" +"Español\n" +"Spanish\n" + +#: tfrmmain.saveasitem.caption +msgid "Save As..." +msgstr "Save As..." + +#: tfrmmain.sb_editname.caption +msgid "..." +msgstr "..." + +#: tfrmmain.sb_editname.hint +msgid "" +"Update Zip Name:\n" +"Click this to browse your system to find\n" +" an existing Update Zip\n" +msgstr "" +"Update Zip Name:\n" +"Click this to browse your system to find\n" +" an existing Update Zip\n" + +#: tfrmmain.spd_checkurl.caption +msgid "Check URL" +msgstr "Check URL" + +#: tfrmmain.spd_checkurl.hint +msgid "Attempting to Open URL" +msgstr "Attempting to Open URL" + +#: tfrmmain.stringpackagefiles.hint +#, fuzzy +#| msgid "" +#| "Package Files:\n" +#| "[Add]: to make a new entry\n" +#| "[Remove]: Remove selected entry\n" +#| "lpk filename: i.e. mycontrol.lpk\n" +#| "Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" +msgid "" +"Package Files:\n" +"[Add]: to make a new entry\n" +"[Remove]: Remove last entry\n" +"lpk filename: i.e. mycontrol.lpk\n" +"Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" +msgstr "" +"Package Files:\n" +"[Add]: to make a new entry\n" +"[Remove]: Remove last entry\n" +"lpk filename: i.e. mycontrol.lpk\n" +"Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" + +#: umain.rsabout +msgid "About" +msgstr "About" + +#: umain.rscompiledwith2 +msgid "Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s - %s platform%s%s" +msgstr "Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s - %s platform%s%s" + +#: umain.rsdownloadurld +msgid "- Download URL does not contain the zipfile name" +msgstr "- Download URL does not contain the zipfile name" + +#: umain.rsdownloadurli +msgid "- Download URL is too short or missing" +msgstr "- Download URL is too short or missing" + +#: umain.rsdownloadurli2 +msgid "- Download URL is incomplete" +msgstr "- Download URL is incomplete" + +#: umain.rsdownloadurls +msgid "- Download URL should start with \"http\"" +msgstr "- Download URL should start with \"http\"" + +#: umain.rsfilemaybeuns +msgid "JSON may be unsaved. Are you sure you want to quit?" +msgstr "JSON may be unsaved. Are you sure you want to quit?" + +#: umain.rsfixthentryag +msgid "Fix, then try again." +msgstr "Fix, then try again." + +#: umain.rshelpandinfor +msgid "Help and Information" +msgstr "Help and Information" + +#: umain.rshttpwwwupdat +msgid "http://www.updatesite.com/myupdate/mypackagename.zip" +msgstr "http://www.updatesite.com/myupdate/mypackagename.zip" + +#: umain.rslanguagechan +msgid "Language changed to \"%s\"." +msgstr "Language changed to \"%s\"." + +#: umain.rslpkfilename +msgid "lpk FileName" +msgstr "lpk FileName" + +#: umain.rsmypackagenam +msgid "mypackagename.zip" +msgstr "mypackagename.zip" + +#: umain.rsoneofthereq1 +msgid "One of the required fields is missing or wrong." +msgstr "One of the required fields is missing or wrong." + +#: umain.rsoneofthereqn +msgid "One or more of the required fields are missing or wrong." +msgstr "One or more of the required fields are missing or wrong." + +#: umain.rsoverwrite +msgid "Overwrite" +msgstr "Overwrite" + +#: umain.rssavedok +msgid "Saved OK" +msgstr "Saved OK" + +#: umain.rssaveunsucces +msgid "Save unsuccessful" +msgstr "Save unsuccessful" + +#: umain.rssorrycopyope +msgid "Sorry - copy operation was unsuccessful" +msgstr "Sorry - copy operation was unsuccessful" + +#: umain.rssorrythislan +msgid "Sorry, this language is unavailable at this time." +msgstr "Sorry, this language is unavailable at this time." + +#: umain.rsswassuccessf +msgid "%s was successfully copied to the %s folder" +msgstr "%s was successfully copied to the %s folder" + +#: umain.rsthelpkentryd +msgid "The .lpk entry #%d is missing the .lpk extension" +msgstr "The .lpk entry #%d is missing the .lpk extension" + +#: umain.rsthelpkentryd2 +msgid "The .lpk entry #%d is is absent" +msgstr "The .lpk entry #%d is is absent" + +#: umain.rstherearenolp +msgid "- There are no .lpk files in the list yet" +msgstr "- There are no .lpk files in the list yet" + +#: umain.rsthisoptionsh +msgid "This option should only be used for crucial updates or bug-fixed packages. Are you OK with that?" +msgstr "" + +#: umain.rsturnhintsoff +msgid "(You can toggle these hints on/off in the Help menu)" +msgstr "(You can toggle these hints on/off in the Help menu)" + +#: umain.rsupdate +msgid "Update" +msgstr "Update" + +#: umain.rsupdatezipnam +msgid "- Update zip name is too short or missing" +msgstr "- Update zip name is too short or missing" + +#: umain.rsupdatezipnam2 +msgid "- Update zip name missing extension \".zip\"" +msgstr "- Update zip name missing extension \".zip\"" + +#: umain.rsversion0000 +msgid "Version (n.n.n.n)" +msgstr "Version (n.n.n.n)" + +#: umain.rsversionentry +msgid "Version Entry #%d is absent" +msgstr "Version Entry #%d is absent" + +#: umain.rsversionentry2 +msgid "Version entry #%d needs to be of the form n.n.n.n" +msgstr "Version entry #%d needs to be of the form n.n.n.n" + +#: umain.rswouldyoulike +msgid "Would you like to copy %s to the %s folder?" +msgstr "" +"Would you like to copy %s to the %s\n" +"folder?\n" + +#: umain.rsyoumayneedto +msgid "(You may need to restart the app to see the change)" +msgstr "(You may need to restart the app to see the change)" + diff --git a/applications/json_packager/deploywin/locale/jsoneditor.es.po b/applications/json_packager/deploywin/locale/jsoneditor.es.po new file mode 100644 index 000000000..f7d125b3f --- /dev/null +++ b/applications/json_packager/deploywin/locale/jsoneditor.es.po @@ -0,0 +1,332 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"X-Generator: Poedit 1.8.8\n" + +#: tfrmmain.btnadd.caption +msgid "Add" +msgstr "Agregar" + +#: tfrmmain.btnadd.hint +msgid "" +"Add Package File:\n" +"The update zip can contain more than one lpk file\n" +"deployed to the same place.\n" +msgstr "" +"Agregar Archivo de Paquete:\n" +"El zip de actualización puede contener mas de un archivo lpk\n" +"desplegado en el mismo lugar.\n" + +#: tfrmmain.btnremove.caption +msgid "Remove" +msgstr "Quitar" + +#: tfrmmain.btnremove.hint +msgid "" +"Remove Package File:\n" +"Deletes the last entry from the list\n" +msgstr "" +"Quitar Archivo de Paquete:\n" +"Elimina la última entrada de la lista\n" + +#: tfrmmain.cbforceupdate.caption +msgid "Force Update" +msgstr "Forzar Actualización" + +#: tfrmmain.cbforceupdate.hint +msgid "" +"Force Update check box:\n" +"If this is checked the OPM user will be notified\n" +"of your update. Only check this if the update is important.\n" +msgstr "" +"Forzar Actualizaciones casilla de verificación:\n" +"Si está chequeada el usuario de OPM será notificado\n" +"de tu actualización. Solo activa esto si la actualización es importante.\n" + +#: tfrmmain.cmd_close.caption +msgctxt "tfrmmain.cmd_close.caption" +msgid "&Close" +msgstr "&Cerrar" + +#: tfrmmain.cmd_save.caption +msgid "&Save" +msgstr "&Guardar" + +#: tfrmmain.cmd_save.hint +msgid "" +"Save the current configuration to disk\n" +"as a JSON update file\n" +msgstr "" +"Guardar la configuración actual al disco\n" +"como un archivo JSON de actualización\n" + +#: tfrmmain.editdownloadurl.hint +msgid "" +"Download URL:\n" +"Include the FULL url needed to download the package Zip file\n" +msgstr "" +"URL de Descarga:\n" +"Incluye la URL completa necesaria para descargar el archivo de paquete zip\n" + +#: tfrmmain.editname.hint +msgid "" +"Update Zip Name:\n" +"This is just the filename (not including the path)\n" +"of your update zip. Type, or click the [...]\n" +msgstr "" +"Nombre de Zip Actualizador:\n" +"Este es solo el nombre del archivo (no incluye la ruta)\n" +"de tu zip actualizador. Escribe o haz clic en [...]\n" + +#: tfrmmain.filemenu.caption +msgid "File" +msgstr "Archivo" + +#: tfrmmain.fileopen1.caption +msgid "&Open ..." +msgstr "&Abrir ..." + +#: tfrmmain.fileopen1.hint +msgid "Open" +msgstr "Abrir" + +#: tfrmmain.filesaveas1.caption +msgid "&Save As ..." +msgstr "&Guardar Como ..." + +#: tfrmmain.filesaveas1.hint +msgid "Save As" +msgstr "Guardar Como" + +#: tfrmmain.lbldownloadurl.caption +msgid "Download URL:" +msgstr "URL de Descarga" + +#: tfrmmain.lblname.caption +msgid "Update Zip Name:" +msgstr "Nombre de Zip Actualizador" + +#: tfrmmain.lblpackagefiles.caption +msgid "Package Files:" +msgstr "Archivos del Paquete" + +#: tfrmmain.loaditem.caption +msgid "Load..." +msgstr "Cargar..." + +#: tfrmmain.mnu_filesave.caption +msgid "Save" +msgstr "Guardar" + +#: tfrmmain.mnu_help.caption +msgid "&Help" +msgstr "&Ayuda" + +#: tfrmmain.mnu_helpabout.caption +msgid "About.." +msgstr "Acerca de..." + +#: tfrmmain.mnu_helpdisablewarnings.caption +msgid "Disable warnings" +msgstr "Disable warnings" + +#: tfrmmain.mnu_helpshowhints.caption +msgid "Show Popup Hints" +msgstr "Mostrar Consejos" + +#: tfrmmain.mnu_lang.caption +msgid "Languages.." +msgstr "Idiomas..." + +#: tfrmmain.mnu_lang_en.caption +msgid "English" +msgstr "Inglés" + +#: tfrmmain.mnu_lang_es.caption +msgid "Español" +msgstr "Español" + +#: tfrmmain.saveasitem.caption +msgid "Save As..." +msgstr "Guardar Como..." + +#: tfrmmain.sb_editname.caption +msgid "..." +msgstr "..." + +#: tfrmmain.sb_editname.hint +msgid "" +"Update Zip Name:\n" +"Click this to browse your system to find\n" +" an existing Update Zip\n" +msgstr "" +"Nombre de Zip Actualizador:\n" +"Clic en esto para explorar tu sistema\n" +" en búsqueda de un Zip Actualizador existente\n" + +#: tfrmmain.spd_checkurl.caption +msgid "Check URL" +msgstr "Verificar URL" + +#: tfrmmain.spd_checkurl.hint +msgid "Attempting to Open URL" +msgstr "Intento de Abrir URL" + +#: tfrmmain.stringpackagefiles.hint +msgid "" +"Package Files:\n" +"[Add]: to make a new entry\n" +"[Remove]: Remove last entry\n" +"lpk filename: i.e. mycontrol.lpk\n" +"Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" +msgstr "" +"Archivos de Paquete:\n" +"[Agregar]: para hacer una nueva entrada\n" +"[Quitar]: quita la última entrada\n" +"Archivo lpk: ejemplo micontrol.lpk\n" +"Versión: La versión completa (ejemplo: no 1.0 pero si 1.0.0.0)\n" + +#: umain.rsabout +msgid "About" +msgstr "Acerca de" + +#: umain.rscompiledwith2 +msgid "Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s - %s platform%s%s" +msgstr "Compilado con FPC V:%s y Lazarus V:%d.%d%s para la plataforma %s - %s %s%s" + +#: umain.rsdownloadurld +msgid "- Download URL does not contain the zipfile name" +msgstr "- URL de descarga no contiene el nombre del zip" + +#: umain.rsdownloadurli +msgid "- Download URL is too short or missing" +msgstr "- URL de descarga es muy corta o está vacía" + +#: umain.rsdownloadurli2 +msgid "- Download URL is incomplete" +msgstr "- URL de descarga incompleta" + +#: umain.rsdownloadurls +msgid "- Download URL should start with \"http\"" +msgstr "- URL de descarga debe empezar con \"http\"" + +#: umain.rsfilemaybeuns +msgid "JSON may be unsaved. Are you sure you want to quit?" +msgstr "JSON puede estar sin guardar. ¿Está seguro que desea salir?" + +#: umain.rsfixthentryag +msgid "Fix, then try again." +msgstr "Arréglalo, luego intenta de nuevo." + +#: umain.rshelpandinfor +msgid "Help and Information" +msgstr "Ayuda e Información" + +#: umain.rshttpwwwupdat +msgid "http://www.updatesite.com/myupdate/mypackagename.zip" +msgstr "http://www.sitioactualizacion.com/miactualizacion/nombredemipaquete.zip" + +#: umain.rslanguagechan +msgid "Language changed to \"%s\"." +msgstr "Idioma cambiado a \"%s\"." + +#: umain.rslpkfilename +msgid "lpk FileName" +msgstr "Archivo lpk" + +#: umain.rsmypackagenam +msgid "mypackagename.zip" +msgstr "nombredemipaquete.zip" + +#: umain.rsoneofthereq1 +msgid "One of the required fields is missing or wrong." +msgstr "Uno de los campos requeridos esta vacío o mal." + +#: umain.rsoneofthereqn +msgctxt "umain.rsoneofthereqn" +msgid "One or more of the required fields are missing or wrong." +msgstr "Uno de los campos requeridos esta vacío o mal. Arréglalo, luego intenta de nuevo." + +#: umain.rsoverwrite +msgid "Overwrite" +msgstr "Sobreescribir" + +#: umain.rssavedok +msgid "Saved OK" +msgstr "Guardado OK" + +#: umain.rssaveunsucces +msgid "Save unsuccessful" +msgstr "Guardado no satisfactorio" + +#: umain.rssorrycopyope +msgid "Sorry - copy operation was unsuccessful" +msgstr "Lo siento, operación de copia insatisfactoria" + +#: umain.rssorrythislan +msgid "Sorry, this language is unavailable at this time." +msgstr "Lo siento, este idioma no está disponible en este momento." + +#: umain.rsswassuccessf +msgid "%s was successfully copied to the %s folder" +msgstr "%s fue satisfactoriamente copiado a la carpeta %s" + +#: umain.rsthelpkentryd +msgid "The .lpk entry #%d is missing the .lpk extension" +msgstr "La entrada .lpk #%d no tiene la extensión .lpk" + +#: umain.rsthelpkentryd2 +msgid "The .lpk entry #%d is is absent" +msgstr "La entrada .lpk #%d está ausente" + +#: umain.rstherearenolp +msgid "- There are no .lpk files in the list yet" +msgstr "- No hay ningún archivo .lpk en la lista todavía" + +#: umain.rsthisoptionsh +msgid "This option should only be used for crucial updates or bug-fixed packages. Are you OK with that?" +msgstr "Esta opción debe ser usada solamente para actualizaciones cruciales o paquetes con arreglos de bugs. ¿Estás de acuerdo con esto?" + +#: umain.rsturnhintsoff +msgid "(You can toggle these hints on/off in the Help menu)" +msgstr "(Puedes cambiar estos consejos en el menú Ayuda)" + +#: umain.rsupdate +msgid "Update" +msgstr "Actualización" + +#: umain.rsupdatezipnam +msgid "- Update zip name is too short or missing" +msgstr "- El nombre del zip es muy corto o está vacío" + +#: umain.rsupdatezipnam2 +msgid "- Update zip name missing extension \".zip\"" +msgstr "- El nombre del zip no tiene la extensión \".zip\"" + +#: umain.rsversion0000 +msgid "Version (n.n.n.n)" +msgstr "Versión (n.n.n.n)" + +#: umain.rsversionentry +msgid "Version Entry #%d is absent" +msgstr "Entrada de versión #%d está ausente" + +#: umain.rsversionentry2 +msgid "Version entry #%d needs to be of the form n.n.n.n" +msgstr "Entrada de versión #%d necesita ser de la forma n.n.n.n" + +#: umain.rswouldyoulike +msgid "Would you like to copy %s to the %s folder?" +msgstr "¿Quieres copiar %s a la carpeta %s?" + +#: umain.rsyoumayneedto +msgid "(You may need to restart the app to see the change)" +msgstr "(Quizás necesites reiniciar la aplicación para ver los cambios)" diff --git a/applications/json_packager/deploywin/readme.txt b/applications/json_packager/deploywin/readme.txt new file mode 100644 index 000000000..67ddd7523 --- /dev/null +++ b/applications/json_packager/deploywin/readme.txt @@ -0,0 +1,16 @@ +README FOR External OPM JSON package Editor +=========================================== + +* This application is for component writers who wish to publish updates for the Online Package Manager. + +* The update is packaged in a ZIP file, and uploaded along with a configuration file in json format. + +* The json file can be manually edited, but this GUI application can make and edit the JSON file so that it is always correct for OPM. + +* On startup it will create an \updates folder which can be used as your deployment folder for the updated app. + +* By default, it will start up in either Spanish or English (depending on your setup) and this can be changed via the Help menu item "Languages" + +* On first run only, it will show tooltips to help you understand how to fill out the entries. They can be re-enabled at any time in the Help menu. + +:Dec 2016 diff --git a/applications/json_packager/deploywin/readmepreinstall.txt b/applications/json_packager/deploywin/readmepreinstall.txt new file mode 100644 index 000000000..0053ccba6 --- /dev/null +++ b/applications/json_packager/deploywin/readmepreinstall.txt @@ -0,0 +1,6 @@ +Choosing an installation folder +=============================== + +* By default, this app will install into your Program Files folder. + +* A better place to install it is in your development folder - where you have your component code \ No newline at end of file diff --git a/applications/json_packager/jsonpackage.ico b/applications/json_packager/jsonpackage.ico new file mode 100644 index 000000000..44718deee Binary files /dev/null and b/applications/json_packager/jsonpackage.ico differ diff --git a/applications/json_packager/jsonpackage.lpi b/applications/json_packager/jsonpackage.lpi new file mode 100644 index 000000000..be1a8b27b --- /dev/null +++ b/applications/json_packager/jsonpackage.lpi @@ -0,0 +1,240 @@ + + + + + + + + + + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + <XPManifest> + <DpiAware Value="True"/> + <TextName Value="CompanyName.ProductName.AppName"/> + <TextDesc Value="Your application description."/> + </XPManifest> + <Icon Value="0"/> + </General> + <i18n> + <EnableI18N Value="True"/> + <OutDir Value="locale"/> + </i18n> + <VersionInfo> + <UseVersionInfo Value="True"/> + <AutoIncrementBuild Value="True"/> + <MinorVersionNr Value="1"/> + <RevisionNr Value="8"/> + <StringTable Comments="Buld configured for Win Linux and Darwin" FileDescription="An editor for OnlinePackageManager update JSON files" InternalName="jsoneditor" LegalCopyright="(c)2016 usernames lainz and minesadorada @ forum.lazarus.freepascal.org" LegalTrademarks="GPL code" OriginalFilename="jsoneditor" ProductName="Lazarus and Freepascal" ProductVersion="1.x and 3.x"/> + </VersionInfo> + <BuildModes Count="5"> + <Item1 Name="Win32" Default="True"/> + <Item2 Name="Win64"> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="compiled\win64\jsoneditor"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <TargetCPU Value="x86_64"/> + <TargetOS Value="win64"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + </Debugging> + <LinkSmart Value="True"/> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CustomOptions Value="-FcUTF8"/> + </Other> + </CompilerOptions> + </Item2> + <Item3 Name="Linux32"> + <MacroValues Count="1"> + <Macro2 Name="LCLWidgetType" Value="gtk2"/> + </MacroValues> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="compiled\linux32\jsoneditor"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <TargetCPU Value="i386"/> + <TargetOS Value="linux"/> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <DebugInfoType Value="dsDwarf2Set"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + </Item3> + <Item4 Name="Linux64"> + <MacroValues Count="1"> + <Macro2 Name="LCLWidgetType" Value="gtk2"/> + </MacroValues> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="compiled\linux64\jsoneditor"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <TargetCPU Value="x86_64"/> + <TargetOS Value="linux"/> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <DebugInfoType Value="dsDwarf2Set"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + </Item4> + <Item5 Name="Darwin32"> + <MacroValues Count="1"> + <Macro1 Name="LCLWidgetType" Value="carbon"/> + </MacroValues> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="compiled\darwin32\jsoneditor"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <TargetCPU Value="i386"/> + <TargetOS Value="darwin"/> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <DebugInfoType Value="dsDwarf2Set"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + </Item5> + <SharedMatrixOptions Count="2"> + <Item1 ID="547331342457" Modes="Darwin32" Type="IDEMacro" MacroName="LCLWidgetType" Value="carbon"/> + <Item2 ID="825864852453" Modes="Linux64,Linux32" Type="IDEMacro" MacroName="LCLWidgetType" Value="gtk2"/> + </SharedMatrixOptions> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + <CommandLineParams Value="--lang es"/> + </local> + </RunParams> + <RequiredPackages Count="1"> + <Item1> + <PackageName Value="LCL"/> + </Item1> + </RequiredPackages> + <Units Count="3"> + <Unit0> + <Filename Value="jsonpackage.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="umain.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + </Unit1> + <Unit2> + <Filename Value="ugenericcollection.pas"/> + <IsPartOfProject Value="True"/> + </Unit2> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="compiled\win32\jsoneditor"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <TargetCPU Value="i386"/> + <TargetOS Value="win32"/> + </CodeGeneration> + <Linking> + <Debugging> + <GenerateDebugInfo Value="False"/> + <DebugInfoType Value="dsDwarf2Set"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/applications/json_packager/jsonpackage.lpr b/applications/json_packager/jsonpackage.lpr new file mode 100644 index 000000000..dbad6d1bb --- /dev/null +++ b/applications/json_packager/jsonpackage.lpr @@ -0,0 +1,31 @@ +program jsonpackage; +{$ifdef Linux} + {$ifdef FPC_CROSSCOMPILING} + {$ifdef CPUARM} + //if GUI, then uncomment + //{$linklib GLESv2} + {$endif} + {$linklib libc_nonshared.a} + {$endif} +{$endif} + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, umain + { you can add units after this }; + +{$R *.res} + +begin + Application.Title:='External OPM JSON package Editor'; + RequireDerivedFormResource:=True; + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. + diff --git a/applications/json_packager/jsonpackage.lps b/applications/json_packager/jsonpackage.lps new file mode 100644 index 000000000..2300e8416 --- /dev/null +++ b/applications/json_packager/jsonpackage.lps @@ -0,0 +1,223 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="10"/> + <BuildModes Active="Linux64"/> + <Units Count="11"> + <Unit0> + <Filename Value="jsonpackage.lpr"/> + <IsPartOfProject Value="True"/> + <EditorIndex Value="1"/> + <CursorPos Y="30"/> + <UsageCount Value="53"/> + <Loaded Value="True"/> + </Unit0> + <Unit1> + <Filename Value="umain.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmMain"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <IsVisibleTab Value="True"/> + <TopLine Value="348"/> + <CursorPos X="18" Y="369"/> + <UsageCount Value="53"/> + <Bookmarks Count="1"> + <Item0 Y="459"/> + </Bookmarks> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + </Unit1> + <Unit2> + <Filename Value="ugenericcollection.pas"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="53"/> + </Unit2> + <Unit3> + <Filename Value="D:\Lazarusprojects\golfml\egacalculator\source\umainform.pas"/> + <ComponentName Value="mainform"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <TopLine Value="541"/> + <CursorPos X="3" Y="544"/> + <UsageCount Value="13"/> + </Unit3> + <Unit4> + <Filename Value="D:\Lazarusprojects\MDSUM\CryptINI\trunk\cryptinilpk\cryptini.pas"/> + <EditorIndex Value="-1"/> + <UsageCount Value="10"/> + </Unit4> + <Unit5> + <Filename Value="D:\Lazarusprojects\MDSUM\CryptINI\trunk\latest_stable\cryptinilpk\ucryptini.pas"/> + <EditorIndex Value="-1"/> + <TopLine Value="1376"/> + <CursorPos X="55" Y="1411"/> + <UsageCount Value="15"/> + </Unit5> + <Unit6> + <Filename Value="..\..\lazarus\lcl\defaulttranslator.pas"/> + <UnitName Value="DefaultTranslator"/> + <EditorIndex Value="-1"/> + <CursorPos X="53" Y="29"/> + <UsageCount Value="14"/> + </Unit6> + <Unit7> + <Filename Value="..\..\lazarus\lcl\lcltranslator.pas"/> + <UnitName Value="LCLTranslator"/> + <EditorIndex Value="-1"/> + <TopLine Value="517"/> + <UsageCount Value="14"/> + </Unit7> + <Unit8> + <Filename Value="..\..\NewPascal\lazarus\packager\registration\registerfcl.pas"/> + <UnitName Value="RegisterFCL"/> + <EditorIndex Value="-1"/> + <TopLine Value="24"/> + <CursorPos X="42" Y="37"/> + <UsageCount Value="10"/> + </Unit8> + <Unit9> + <Filename Value="D:\lazarustrunk\common_components\onlinepackagemanager\onlinepackagemanager\opkman_mainfrm.pas"/> + <HasResources Value="True"/> + <EditorIndex Value="-1"/> + <TopLine Value="22"/> + <CursorPos X="12" Y="23"/> + <UsageCount Value="10"/> + </Unit9> + <Unit10> + <Filename Value="D:\lazarustrunk\common_components\onlinepackagemanager\onlinepackagemanager\opkman_mainfrm.lfm"/> + <ComponentName Value="MainFrm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <EditorIndex Value="-1"/> + <CursorPos X="6"/> + <UsageCount Value="10"/> + <DefaultSyntaxHighlighter Value="LFM"/> + </Unit10> + </Units> + <JumpHistory Count="30" HistoryIndex="29"> + <Position1> + <Filename Value="umain.pas"/> + <Caret Line="365" Column="83" TopLine="342"/> + </Position1> + <Position2> + <Filename Value="umain.pas"/> + <Caret Line="319" TopLine="316"/> + </Position2> + <Position3> + <Filename Value="umain.pas"/> + <Caret Line="471" Column="52" TopLine="467"/> + </Position3> + <Position4> + <Filename Value="umain.pas"/> + <Caret Line="319" Column="3" TopLine="317"/> + </Position4> + <Position5> + <Filename Value="umain.pas"/> + <Caret Line="331" Column="39" TopLine="328"/> + </Position5> + <Position6> + <Filename Value="umain.pas"/> + <Caret Line="431" Column="3" TopLine="429"/> + </Position6> + <Position7> + <Filename Value="umain.pas"/> + <Caret Line="315" Column="33" TopLine="305"/> + </Position7> + <Position8> + <Filename Value="umain.pas"/> + <Caret Line="712" Column="30" TopLine="677"/> + </Position8> + <Position9> + <Filename Value="umain.pas"/> + <Caret Line="463" TopLine="440"/> + </Position9> + <Position10> + <Filename Value="umain.pas"/> + <Caret Line="140" Column="70" TopLine="122"/> + </Position10> + <Position11> + <Filename Value="umain.pas"/> + <Caret Line="25" Column="13"/> + </Position11> + <Position12> + <Filename Value="umain.pas"/> + <Caret Line="306" Column="3" TopLine="271"/> + </Position12> + <Position13> + <Filename Value="umain.pas"/> + <Caret Line="35" Column="35" TopLine="13"/> + </Position13> + <Position14> + <Filename Value="umain.pas"/> + <Caret Line="371" Column="25" TopLine="353"/> + </Position14> + <Position15> + <Filename Value="umain.pas"/> + <Caret Line="380" Column="44" TopLine="360"/> + </Position15> + <Position16> + <Filename Value="umain.pas"/> + <Caret Line="386" Column="2" TopLine="359"/> + </Position16> + <Position17> + <Filename Value="umain.pas"/> + <Caret Line="2" Column="28"/> + </Position17> + <Position18> + <Filename Value="umain.pas"/> + <Caret Line="140" Column="44" TopLine="114"/> + </Position18> + <Position19> + <Filename Value="umain.pas"/> + <Caret Line="362" Column="58" TopLine="357"/> + </Position19> + <Position20> + <Filename Value="umain.pas"/> + <Caret Line="360" Column="121" TopLine="337"/> + </Position20> + <Position21> + <Filename Value="umain.pas"/> + <Caret Line="361" Column="39" TopLine="349"/> + </Position21> + <Position22> + <Filename Value="umain.pas"/> + <Caret Line="360" Column="70" TopLine="337"/> + </Position22> + <Position23> + <Filename Value="umain.pas"/> + <Caret Line="361" Column="58" TopLine="337"/> + </Position23> + <Position24> + <Filename Value="umain.pas"/> + <Caret Line="33" Column="22" TopLine="20"/> + </Position24> + <Position25> + <Filename Value="umain.pas"/> + <Caret Line="658" Column="77" TopLine="634"/> + </Position25> + <Position26> + <Filename Value="umain.pas"/> + <Caret Line="659" Column="77" TopLine="491"/> + </Position26> + <Position27> + <Filename Value="umain.pas"/> + <Caret Line="388" TopLine="357"/> + </Position27> + <Position28> + <Filename Value="umain.pas"/> + <Caret Line="145" TopLine="137"/> + </Position28> + <Position29> + <Filename Value="umain.pas"/> + <Caret Line="465" Column="23" TopLine="461"/> + </Position29> + <Position30> + <Filename Value="umain.pas"/> + <Caret Line="311" TopLine="303"/> + </Position30> + </JumpHistory> + </ProjectSession> +</CONFIG> diff --git a/applications/json_packager/jsonpackage.res b/applications/json_packager/jsonpackage.res new file mode 100644 index 000000000..68d1a6b58 Binary files /dev/null and b/applications/json_packager/jsonpackage.res differ diff --git a/applications/json_packager/locale/jsoneditor.en.po b/applications/json_packager/locale/jsoneditor.en.po new file mode 100644 index 000000000..3b88fdd17 --- /dev/null +++ b/applications/json_packager/locale/jsoneditor.en.po @@ -0,0 +1,347 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"X-Generator: Poedit 1.8.8\n" + +#: tfrmmain.btnadd.caption +msgid "Add" +msgstr "Add" + +#: tfrmmain.btnadd.hint +msgid "" +"Add Package File:\n" +"The update zip can contain more than one lpk file\n" +"deployed to the same place.\n" +msgstr "" +"Add Package File:\n" +"The update zip can contain more than one lpk file\n" +"deployed to the same place.\n" + +#: tfrmmain.btnremove.caption +msgid "Remove" +msgstr "Remove" + +#: tfrmmain.btnremove.hint +msgid "" +"Remove Package File:\n" +"Deletes the last entry from the list\n" +msgstr "" +"Remove Package File:\n" +"Deletes the last entry from the list\n" + +#: tfrmmain.cbforceupdate.caption +msgid "Force Update" +msgstr "Force Update" + +#: tfrmmain.cbforceupdate.hint +msgid "" +"Force Update check box:\n" +"If this is checked the OPM user will be notified\n" +"of your update. Only check this if the update is important.\n" +msgstr "" +"Force Update check box:\n" +"If this is checked the OPM user will be notified\n" +"of your update. Only check this if the update is important.\n" + +#: tfrmmain.cmd_close.caption +msgid "&Close" +msgstr "&Close" + +#: tfrmmain.cmd_save.caption +msgid "&Save" +msgstr "&Save" + +#: tfrmmain.cmd_save.hint +msgid "" +"Save the current configuration to disk\n" +"as a JSON update file\n" +msgstr "" +"Save the current configuration to disk\n" +"as a JSON update file\n" + +#: tfrmmain.editdownloadurl.hint +msgid "" +"Download URL:\n" +"Include the FULL url needed to download the package Zip file\n" +msgstr "" +"Download URL:\n" +"Include the FULL url needed to download the package Zip file\n" + +#: tfrmmain.editname.hint +msgid "" +"Update Zip Name:\n" +"This is just the filename (not including the path)\n" +"of your update zip. Type, or click the [...]\n" +msgstr "" +"Update Zip Name:\n" +"This is just the filename (not including the path)\n" +"of your update zip. Type, or click the [...]\n" + +#: tfrmmain.filemenu.caption +msgid "File" +msgstr "File" + +#: tfrmmain.fileopen1.caption +msgid "&Open ..." +msgstr "&Open ..." + +#: tfrmmain.fileopen1.hint +msgid "Open" +msgstr "Open" + +#: tfrmmain.filesaveas1.caption +msgid "&Save As ..." +msgstr "&Save As ..." + +#: tfrmmain.filesaveas1.hint +msgid "Save As" +msgstr "Save As" + +#: tfrmmain.lbldownloadurl.caption +msgid "Download URL:" +msgstr "Download URL:" + +#: tfrmmain.lblname.caption +msgid "Update Zip Name:" +msgstr "Update Zip Name:" + +#: tfrmmain.lblpackagefiles.caption +msgid "Package Files:" +msgstr "Package Files:" + +#: tfrmmain.loaditem.caption +msgid "Load..." +msgstr "Load..." + +#: tfrmmain.mnu_filenew.caption +msgid "New" +msgstr "" + +#: tfrmmain.mnu_filesave.caption +msgid "Save" +msgstr "Save" + +#: tfrmmain.mnu_help.caption +msgid "&Help" +msgstr "&Help" + +#: tfrmmain.mnu_helpabout.caption +msgid "About.." +msgstr "About.." + +#: tfrmmain.mnu_helpdisablewarnings.caption +msgid "Disable warnings" +msgstr "Disable warnings" + +#: tfrmmain.mnu_helpshowhints.caption +msgid "Show Popup Hints" +msgstr "Show Popup Hints" + +#: tfrmmain.mnu_lang.caption +msgid "Languages.." +msgstr "Languages.." + +#: tfrmmain.mnu_lang_en.caption +msgid "English" +msgstr "English" + +#: tfrmmain.mnu_lang_es.caption +#, fuzzy +msgid "Español" +msgstr "" +"Español\n" +"Spanish\n" + +#: tfrmmain.saveasitem.caption +msgid "Save As..." +msgstr "Save As..." + +#: tfrmmain.sb_editname.caption +msgid "..." +msgstr "..." + +#: tfrmmain.sb_editname.hint +msgid "" +"Update Zip Name:\n" +"Click this to browse your system to find\n" +" an existing Update Zip\n" +msgstr "" +"Update Zip Name:\n" +"Click this to browse your system to find\n" +" an existing Update Zip\n" + +#: tfrmmain.spd_checkurl.caption +msgid "Check URL" +msgstr "Check URL" + +#: tfrmmain.spd_checkurl.hint +msgid "Attempting to Open URL" +msgstr "Attempting to Open URL" + +#: tfrmmain.stringpackagefiles.hint +#, fuzzy +#| msgid "" +#| "Package Files:\n" +#| "[Add]: to make a new entry\n" +#| "[Remove]: Remove selected entry\n" +#| "lpk filename: i.e. mycontrol.lpk\n" +#| "Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" +msgid "" +"Package Files:\n" +"[Add]: to make a new entry\n" +"[Remove]: Remove last entry\n" +"lpk filename: i.e. mycontrol.lpk\n" +"Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" +msgstr "" +"Package Files:\n" +"[Add]: to make a new entry\n" +"[Remove]: Remove last entry\n" +"lpk filename: i.e. mycontrol.lpk\n" +"Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" + +#: umain.rsabout +msgid "About" +msgstr "About" + +#: umain.rscompiledwith2 +msgid "Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s - %s platform%s%s" +msgstr "Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s - %s platform%s%s" + +#: umain.rsdownloadurld +msgid "- Download URL does not contain the zipfile name" +msgstr "- Download URL does not contain the zipfile name" + +#: umain.rsdownloadurli +msgid "- Download URL is too short or missing" +msgstr "- Download URL is too short or missing" + +#: umain.rsdownloadurli2 +msgid "- Download URL is incomplete" +msgstr "- Download URL is incomplete" + +#: umain.rsdownloadurls +msgid "- Download URL should start with \"http\"" +msgstr "- Download URL should start with \"http\"" + +#: umain.rsfilemaybeuns +msgid "JSON may be unsaved. Are you sure you want to quit?" +msgstr "JSON may be unsaved. Are you sure you want to quit?" + +#: umain.rsfixthentryag +msgid "Fix, then try again." +msgstr "Fix, then try again." + +#: umain.rshelpandinfor +msgid "Help and Information" +msgstr "Help and Information" + +#: umain.rshttpwwwupdat +msgid "http://www.updatesite.com/myupdate/mypackagename.zip" +msgstr "http://www.updatesite.com/myupdate/mypackagename.zip" + +#: umain.rslanguagechan +msgid "Language changed to \"%s\"." +msgstr "Language changed to \"%s\"." + +#: umain.rslpkfilename +msgid "lpk FileName" +msgstr "lpk FileName" + +#: umain.rsmypackagenam +msgid "mypackagename.zip" +msgstr "mypackagename.zip" + +#: umain.rsoneofthereq1 +msgid "One of the required fields is missing or wrong." +msgstr "One of the required fields is missing or wrong." + +#: umain.rsoneofthereqn +msgid "One or more of the required fields are missing or wrong." +msgstr "One or more of the required fields are missing or wrong." + +#: umain.rsoverwrite +msgid "Overwrite" +msgstr "Overwrite" + +#: umain.rssavedok +msgid "Saved OK" +msgstr "Saved OK" + +#: umain.rssaveunsucces +msgid "Save unsuccessful" +msgstr "Save unsuccessful" + +#: umain.rssorrycopyope +msgid "Sorry - copy operation was unsuccessful" +msgstr "Sorry - copy operation was unsuccessful" + +#: umain.rssorrythislan +msgid "Sorry, this language is unavailable at this time." +msgstr "Sorry, this language is unavailable at this time." + +#: umain.rsswassuccessf +msgid "%s was successfully copied to the %s folder" +msgstr "%s was successfully copied to the %s folder" + +#: umain.rsthelpkentryd +msgid "The .lpk entry #%d is missing the .lpk extension" +msgstr "The .lpk entry #%d is missing the .lpk extension" + +#: umain.rsthelpkentryd2 +msgid "The .lpk entry #%d is is absent" +msgstr "The .lpk entry #%d is is absent" + +#: umain.rstherearenolp +msgid "- There are no .lpk files in the list yet" +msgstr "- There are no .lpk files in the list yet" + +#: umain.rsthisoptionsh +msgid "This option should only be used for crucial updates or bug-fixed packages. Are you OK with that?" +msgstr "" + +#: umain.rsturnhintsoff +msgid "(You can toggle these hints on/off in the Help menu)" +msgstr "(You can toggle these hints on/off in the Help menu)" + +#: umain.rsupdate +msgid "Update" +msgstr "Update" + +#: umain.rsupdatezipnam +msgid "- Update zip name is too short or missing" +msgstr "- Update zip name is too short or missing" + +#: umain.rsupdatezipnam2 +msgid "- Update zip name missing extension \".zip\"" +msgstr "- Update zip name missing extension \".zip\"" + +#: umain.rsversion0000 +msgid "Version (n.n.n.n)" +msgstr "Version (n.n.n.n)" + +#: umain.rsversionentry +msgid "Version Entry #%d is absent" +msgstr "Version Entry #%d is absent" + +#: umain.rsversionentry2 +msgid "Version entry #%d needs to be of the form n.n.n.n" +msgstr "Version entry #%d needs to be of the form n.n.n.n" + +#: umain.rswouldyoulike +msgid "Would you like to copy %s to the %s folder?" +msgstr "" +"Would you like to copy %s to the %s\n" +"folder?\n" + +#: umain.rsyoumayneedto +msgid "(You may need to restart the app to see the change)" +msgstr "(You may need to restart the app to see the change)" + diff --git a/applications/json_packager/locale/jsoneditor.es.po b/applications/json_packager/locale/jsoneditor.es.po new file mode 100644 index 000000000..f7d125b3f --- /dev/null +++ b/applications/json_packager/locale/jsoneditor.es.po @@ -0,0 +1,332 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"X-Generator: Poedit 1.8.8\n" + +#: tfrmmain.btnadd.caption +msgid "Add" +msgstr "Agregar" + +#: tfrmmain.btnadd.hint +msgid "" +"Add Package File:\n" +"The update zip can contain more than one lpk file\n" +"deployed to the same place.\n" +msgstr "" +"Agregar Archivo de Paquete:\n" +"El zip de actualización puede contener mas de un archivo lpk\n" +"desplegado en el mismo lugar.\n" + +#: tfrmmain.btnremove.caption +msgid "Remove" +msgstr "Quitar" + +#: tfrmmain.btnremove.hint +msgid "" +"Remove Package File:\n" +"Deletes the last entry from the list\n" +msgstr "" +"Quitar Archivo de Paquete:\n" +"Elimina la última entrada de la lista\n" + +#: tfrmmain.cbforceupdate.caption +msgid "Force Update" +msgstr "Forzar Actualización" + +#: tfrmmain.cbforceupdate.hint +msgid "" +"Force Update check box:\n" +"If this is checked the OPM user will be notified\n" +"of your update. Only check this if the update is important.\n" +msgstr "" +"Forzar Actualizaciones casilla de verificación:\n" +"Si está chequeada el usuario de OPM será notificado\n" +"de tu actualización. Solo activa esto si la actualización es importante.\n" + +#: tfrmmain.cmd_close.caption +msgctxt "tfrmmain.cmd_close.caption" +msgid "&Close" +msgstr "&Cerrar" + +#: tfrmmain.cmd_save.caption +msgid "&Save" +msgstr "&Guardar" + +#: tfrmmain.cmd_save.hint +msgid "" +"Save the current configuration to disk\n" +"as a JSON update file\n" +msgstr "" +"Guardar la configuración actual al disco\n" +"como un archivo JSON de actualización\n" + +#: tfrmmain.editdownloadurl.hint +msgid "" +"Download URL:\n" +"Include the FULL url needed to download the package Zip file\n" +msgstr "" +"URL de Descarga:\n" +"Incluye la URL completa necesaria para descargar el archivo de paquete zip\n" + +#: tfrmmain.editname.hint +msgid "" +"Update Zip Name:\n" +"This is just the filename (not including the path)\n" +"of your update zip. Type, or click the [...]\n" +msgstr "" +"Nombre de Zip Actualizador:\n" +"Este es solo el nombre del archivo (no incluye la ruta)\n" +"de tu zip actualizador. Escribe o haz clic en [...]\n" + +#: tfrmmain.filemenu.caption +msgid "File" +msgstr "Archivo" + +#: tfrmmain.fileopen1.caption +msgid "&Open ..." +msgstr "&Abrir ..." + +#: tfrmmain.fileopen1.hint +msgid "Open" +msgstr "Abrir" + +#: tfrmmain.filesaveas1.caption +msgid "&Save As ..." +msgstr "&Guardar Como ..." + +#: tfrmmain.filesaveas1.hint +msgid "Save As" +msgstr "Guardar Como" + +#: tfrmmain.lbldownloadurl.caption +msgid "Download URL:" +msgstr "URL de Descarga" + +#: tfrmmain.lblname.caption +msgid "Update Zip Name:" +msgstr "Nombre de Zip Actualizador" + +#: tfrmmain.lblpackagefiles.caption +msgid "Package Files:" +msgstr "Archivos del Paquete" + +#: tfrmmain.loaditem.caption +msgid "Load..." +msgstr "Cargar..." + +#: tfrmmain.mnu_filesave.caption +msgid "Save" +msgstr "Guardar" + +#: tfrmmain.mnu_help.caption +msgid "&Help" +msgstr "&Ayuda" + +#: tfrmmain.mnu_helpabout.caption +msgid "About.." +msgstr "Acerca de..." + +#: tfrmmain.mnu_helpdisablewarnings.caption +msgid "Disable warnings" +msgstr "Disable warnings" + +#: tfrmmain.mnu_helpshowhints.caption +msgid "Show Popup Hints" +msgstr "Mostrar Consejos" + +#: tfrmmain.mnu_lang.caption +msgid "Languages.." +msgstr "Idiomas..." + +#: tfrmmain.mnu_lang_en.caption +msgid "English" +msgstr "Inglés" + +#: tfrmmain.mnu_lang_es.caption +msgid "Español" +msgstr "Español" + +#: tfrmmain.saveasitem.caption +msgid "Save As..." +msgstr "Guardar Como..." + +#: tfrmmain.sb_editname.caption +msgid "..." +msgstr "..." + +#: tfrmmain.sb_editname.hint +msgid "" +"Update Zip Name:\n" +"Click this to browse your system to find\n" +" an existing Update Zip\n" +msgstr "" +"Nombre de Zip Actualizador:\n" +"Clic en esto para explorar tu sistema\n" +" en búsqueda de un Zip Actualizador existente\n" + +#: tfrmmain.spd_checkurl.caption +msgid "Check URL" +msgstr "Verificar URL" + +#: tfrmmain.spd_checkurl.hint +msgid "Attempting to Open URL" +msgstr "Intento de Abrir URL" + +#: tfrmmain.stringpackagefiles.hint +msgid "" +"Package Files:\n" +"[Add]: to make a new entry\n" +"[Remove]: Remove last entry\n" +"lpk filename: i.e. mycontrol.lpk\n" +"Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" +msgstr "" +"Archivos de Paquete:\n" +"[Agregar]: para hacer una nueva entrada\n" +"[Quitar]: quita la última entrada\n" +"Archivo lpk: ejemplo micontrol.lpk\n" +"Versión: La versión completa (ejemplo: no 1.0 pero si 1.0.0.0)\n" + +#: umain.rsabout +msgid "About" +msgstr "Acerca de" + +#: umain.rscompiledwith2 +msgid "Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s - %s platform%s%s" +msgstr "Compilado con FPC V:%s y Lazarus V:%d.%d%s para la plataforma %s - %s %s%s" + +#: umain.rsdownloadurld +msgid "- Download URL does not contain the zipfile name" +msgstr "- URL de descarga no contiene el nombre del zip" + +#: umain.rsdownloadurli +msgid "- Download URL is too short or missing" +msgstr "- URL de descarga es muy corta o está vacía" + +#: umain.rsdownloadurli2 +msgid "- Download URL is incomplete" +msgstr "- URL de descarga incompleta" + +#: umain.rsdownloadurls +msgid "- Download URL should start with \"http\"" +msgstr "- URL de descarga debe empezar con \"http\"" + +#: umain.rsfilemaybeuns +msgid "JSON may be unsaved. Are you sure you want to quit?" +msgstr "JSON puede estar sin guardar. ¿Está seguro que desea salir?" + +#: umain.rsfixthentryag +msgid "Fix, then try again." +msgstr "Arréglalo, luego intenta de nuevo." + +#: umain.rshelpandinfor +msgid "Help and Information" +msgstr "Ayuda e Información" + +#: umain.rshttpwwwupdat +msgid "http://www.updatesite.com/myupdate/mypackagename.zip" +msgstr "http://www.sitioactualizacion.com/miactualizacion/nombredemipaquete.zip" + +#: umain.rslanguagechan +msgid "Language changed to \"%s\"." +msgstr "Idioma cambiado a \"%s\"." + +#: umain.rslpkfilename +msgid "lpk FileName" +msgstr "Archivo lpk" + +#: umain.rsmypackagenam +msgid "mypackagename.zip" +msgstr "nombredemipaquete.zip" + +#: umain.rsoneofthereq1 +msgid "One of the required fields is missing or wrong." +msgstr "Uno de los campos requeridos esta vacío o mal." + +#: umain.rsoneofthereqn +msgctxt "umain.rsoneofthereqn" +msgid "One or more of the required fields are missing or wrong." +msgstr "Uno de los campos requeridos esta vacío o mal. Arréglalo, luego intenta de nuevo." + +#: umain.rsoverwrite +msgid "Overwrite" +msgstr "Sobreescribir" + +#: umain.rssavedok +msgid "Saved OK" +msgstr "Guardado OK" + +#: umain.rssaveunsucces +msgid "Save unsuccessful" +msgstr "Guardado no satisfactorio" + +#: umain.rssorrycopyope +msgid "Sorry - copy operation was unsuccessful" +msgstr "Lo siento, operación de copia insatisfactoria" + +#: umain.rssorrythislan +msgid "Sorry, this language is unavailable at this time." +msgstr "Lo siento, este idioma no está disponible en este momento." + +#: umain.rsswassuccessf +msgid "%s was successfully copied to the %s folder" +msgstr "%s fue satisfactoriamente copiado a la carpeta %s" + +#: umain.rsthelpkentryd +msgid "The .lpk entry #%d is missing the .lpk extension" +msgstr "La entrada .lpk #%d no tiene la extensión .lpk" + +#: umain.rsthelpkentryd2 +msgid "The .lpk entry #%d is is absent" +msgstr "La entrada .lpk #%d está ausente" + +#: umain.rstherearenolp +msgid "- There are no .lpk files in the list yet" +msgstr "- No hay ningún archivo .lpk en la lista todavía" + +#: umain.rsthisoptionsh +msgid "This option should only be used for crucial updates or bug-fixed packages. Are you OK with that?" +msgstr "Esta opción debe ser usada solamente para actualizaciones cruciales o paquetes con arreglos de bugs. ¿Estás de acuerdo con esto?" + +#: umain.rsturnhintsoff +msgid "(You can toggle these hints on/off in the Help menu)" +msgstr "(Puedes cambiar estos consejos en el menú Ayuda)" + +#: umain.rsupdate +msgid "Update" +msgstr "Actualización" + +#: umain.rsupdatezipnam +msgid "- Update zip name is too short or missing" +msgstr "- El nombre del zip es muy corto o está vacío" + +#: umain.rsupdatezipnam2 +msgid "- Update zip name missing extension \".zip\"" +msgstr "- El nombre del zip no tiene la extensión \".zip\"" + +#: umain.rsversion0000 +msgid "Version (n.n.n.n)" +msgstr "Versión (n.n.n.n)" + +#: umain.rsversionentry +msgid "Version Entry #%d is absent" +msgstr "Entrada de versión #%d está ausente" + +#: umain.rsversionentry2 +msgid "Version entry #%d needs to be of the form n.n.n.n" +msgstr "Entrada de versión #%d necesita ser de la forma n.n.n.n" + +#: umain.rswouldyoulike +msgid "Would you like to copy %s to the %s folder?" +msgstr "¿Quieres copiar %s a la carpeta %s?" + +#: umain.rsyoumayneedto +msgid "(You may need to restart the app to see the change)" +msgstr "(Quizás necesites reiniciar la aplicación para ver los cambios)" diff --git a/applications/json_packager/locale/jsoneditor.po b/applications/json_packager/locale/jsoneditor.po new file mode 100644 index 000000000..9d2e51b30 --- /dev/null +++ b/applications/json_packager/locale/jsoneditor.po @@ -0,0 +1,302 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +#: tfrmmain.btnadd.caption +msgid "Add" +msgstr "" + +#: tfrmmain.btnadd.hint +msgid "" +"Add Package File:\n" +"The update zip can contain more than one lpk file\n" +"deployed to the same place.\n" +msgstr "" + +#: tfrmmain.btnremove.caption +msgid "Remove" +msgstr "" + +#: tfrmmain.btnremove.hint +msgid "" +"Remove Package File:\n" +"Deletes the last entry from the list\n" +msgstr "" + +#: tfrmmain.cbforceupdate.caption +msgid "Force Update" +msgstr "" + +#: tfrmmain.cbforceupdate.hint +msgid "" +"Force Update check box:\n" +"If this is checked the OPM user will be notified\n" +"of your update. Only check this if the update is important.\n" +msgstr "" + +#: tfrmmain.cmd_close.caption +msgid "&Close" +msgstr "" + +#: tfrmmain.cmd_save.caption +msgid "&Save" +msgstr "" + +#: tfrmmain.cmd_save.hint +msgid "" +"Save the current configuration to disk\n" +"as a JSON update file\n" +msgstr "" + +#: tfrmmain.editdownloadurl.hint +msgid "" +"Download URL:\n" +"Include the FULL url needed to download the package Zip file\n" +msgstr "" + +#: tfrmmain.editname.hint +msgid "" +"Update Zip Name:\n" +"This is just the filename (not including the path)\n" +"of your update zip. Type, or click the [...]\n" +msgstr "" + +#: tfrmmain.filemenu.caption +msgid "File" +msgstr "" + +#: tfrmmain.fileopen1.caption +msgid "&Open ..." +msgstr "" + +#: tfrmmain.fileopen1.hint +msgid "Open" +msgstr "" + +#: tfrmmain.filesaveas1.caption +msgid "&Save As ..." +msgstr "" + +#: tfrmmain.filesaveas1.hint +msgid "Save As" +msgstr "" + +#: tfrmmain.lbldownloadurl.caption +msgid "Download URL:" +msgstr "" + +#: tfrmmain.lblname.caption +msgid "Update Zip Name:" +msgstr "" + +#: tfrmmain.lblpackagefiles.caption +msgid "Package Files:" +msgstr "" + +#: tfrmmain.loaditem.caption +msgid "Load..." +msgstr "" + +#: tfrmmain.mnu_filenew.caption +msgid "New" +msgstr "" + +#: tfrmmain.mnu_filesave.caption +msgid "Save" +msgstr "" + +#: tfrmmain.mnu_help.caption +msgid "&Help" +msgstr "" + +#: tfrmmain.mnu_helpabout.caption +msgid "About.." +msgstr "" + +#: tfrmmain.mnu_helpdisablewarnings.caption +msgid "Disable warnings" +msgstr "Desactivar Advertencias" + +#: tfrmmain.mnu_helpshowhints.caption +msgid "Show Popup Hints" +msgstr "" + +#: tfrmmain.mnu_lang.caption +msgid "Languages.." +msgstr "" + +#: tfrmmain.mnu_lang_en.caption +msgid "English" +msgstr "" + +#: tfrmmain.mnu_lang_es.caption +msgid "Español" +msgstr "" + +#: tfrmmain.saveasitem.caption +msgid "Save As..." +msgstr "" + +#: tfrmmain.sb_editname.caption +msgid "..." +msgstr "" + +#: tfrmmain.sb_editname.hint +msgid "" +"Update Zip Name:\n" +"Click this to browse your system to find\n" +" an existing Update Zip\n" +msgstr "" + +#: tfrmmain.spd_checkurl.caption +msgid "Check URL" +msgstr "" + +#: tfrmmain.spd_checkurl.hint +msgid "Attempting to Open URL" +msgstr "" + +#: tfrmmain.stringpackagefiles.hint +msgid "" +"Package Files:\n" +"[Add]: to make a new entry\n" +"[Remove]: Remove last entry\n" +"lpk filename: i.e. mycontrol.lpk\n" +"Version: The FULL version (i.e. not 1.0 but 1.0.0.0)\n" +msgstr "" + +#: umain.rsabout +msgid "About" +msgstr "" + +#: umain.rscompiledwith2 +msgid "Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s - %s platform%s%s" +msgstr "" + +#: umain.rsdownloadurld +msgid "- Download URL does not contain the zipfile name" +msgstr "" + +#: umain.rsdownloadurli +msgid "- Download URL is too short or missing" +msgstr "" + +#: umain.rsdownloadurli2 +msgid "- Download URL is incomplete" +msgstr "" + +#: umain.rsdownloadurls +msgid "- Download URL should start with \"http\"" +msgstr "" + +#: umain.rsfilemaybeuns +msgid "JSON may be unsaved. Are you sure you want to quit?" +msgstr "" + +#: umain.rsfixthentryag +msgid "Fix, then try again." +msgstr "" + +#: umain.rshelpandinfor +msgid "Help and Information" +msgstr "" + +#: umain.rshttpwwwupdat +msgid "http://www.updatesite.com/myupdate/mypackagename.zip" +msgstr "" + +#: umain.rslanguagechan +msgid "Language changed to \"%s\"." +msgstr "" + +#: umain.rslpkfilename +msgid "lpk FileName" +msgstr "" + +#: umain.rsmypackagenam +msgid "mypackagename.zip" +msgstr "" + +#: umain.rsoneofthereq1 +msgid "One of the required fields is missing or wrong." +msgstr "" + +#: umain.rsoneofthereqn +msgid "One or more of the required fields are missing or wrong." +msgstr "" + +#: umain.rsoverwrite +msgid "Overwrite" +msgstr "" + +#: umain.rssavedok +msgid "Saved OK" +msgstr "" + +#: umain.rssaveunsucces +msgid "Save unsuccessful" +msgstr "" + +#: umain.rssorrycopyope +msgid "Sorry - copy operation was unsuccessful" +msgstr "" + +#: umain.rssorrythislan +msgid "Sorry, this language is unavailable at this time." +msgstr "" + +#: umain.rsswassuccessf +msgid "%s was successfully copied to the %s folder" +msgstr "" + +#: umain.rsthelpkentryd +msgid "The .lpk entry #%d is missing the .lpk extension" +msgstr "" + +#: umain.rsthelpkentryd2 +msgid "The .lpk entry #%d is is absent" +msgstr "" + +#: umain.rstherearenolp +msgid "- There are no .lpk files in the list yet" +msgstr "" + +#: umain.rsthisoptionsh +msgid "This option should only be used for crucial updates or bug-fixed packages. Are you OK with that?" +msgstr "" + +#: umain.rsturnhintsoff +msgid "(You can toggle these hints on/off in the Help menu)" +msgstr "" + +#: umain.rsupdate +msgid "Update" +msgstr "" + +#: umain.rsupdatezipnam +msgid "- Update zip name is too short or missing" +msgstr "" + +#: umain.rsupdatezipnam2 +msgid "- Update zip name missing extension \".zip\"" +msgstr "" + +#: umain.rsversion0000 +msgid "Version (n.n.n.n)" +msgstr "" + +#: umain.rsversionentry +msgid "Version Entry #%d is absent" +msgstr "" + +#: umain.rsversionentry2 +msgid "Version entry #%d needs to be of the form n.n.n.n" +msgstr "" + +#: umain.rswouldyoulike +msgid "Would you like to copy %s to the %s folder?" +msgstr "" + +#: umain.rsyoumayneedto +msgid "(You may need to restart the app to see the change)" +msgstr "" + diff --git a/applications/json_packager/ugenericcollection.pas b/applications/json_packager/ugenericcollection.pas new file mode 100644 index 000000000..4d9655516 --- /dev/null +++ b/applications/json_packager/ugenericcollection.pas @@ -0,0 +1,50 @@ +unit ugenericcollection; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils; + +type + + { TGenericCollection } + + generic TGenericCollection<T> = class(TCollection) + private + function GetItems(Index: integer): T; + procedure SetItems(Index: integer; AValue: T); + public + constructor Create; + public + function Add: T; + public + property Items[Index: integer]: T read GetItems write SetItems; default; + end; + +implementation + +{ TGenericCollection } + +function TGenericCollection.GetItems(Index: integer): T; +begin + Result := T(inherited Items[Index]); +end; + +procedure TGenericCollection.SetItems(Index: integer; AValue: T); +begin + Items[Index].Assign(AValue); +end; + +constructor TGenericCollection.Create; +begin + inherited Create(T); +end; + +function TGenericCollection.Add: T; +begin + Result := T(inherited Add); +end; + +end. diff --git a/applications/json_packager/umain.lfm b/applications/json_packager/umain.lfm new file mode 100644 index 000000000..29432c7c3 --- /dev/null +++ b/applications/json_packager/umain.lfm @@ -0,0 +1,284 @@ +object frmMain: TfrmMain + Left = 526 + Height = 420 + Top = 226 + Width = 320 + BorderIcons = [biSystemMenu] + BorderStyle = bsSingle + ClientHeight = 400 + ClientWidth = 320 + DefaultMonitor = dmPrimary + Menu = MainMenu1 + OnClick = mnu_fileSaveClick + OnClose = FormClose + OnCloseQuery = FormCloseQuery + OnCreate = FormCreate + OnShow = FormShow + Position = poScreenCenter + LCLVersion = '1.7' + object lblName: TLabel + Left = 8 + Height = 15 + Top = 8 + Width = 96 + Caption = 'Update Zip Name:' + ParentColor = False + end + object editName: TEdit + Left = 8 + Height = 23 + Hint = 'Update Zip Name:'#13#10'This is just the filename (not including the path)'#13#10'of your update zip. Type, or click the [...]' + Top = 31 + Width = 264 + Anchors = [akTop, akLeft, akRight] + Color = clWindow + TabOrder = 0 + end + object cbForceUpdate: TCheckBox + Left = 8 + Height = 19 + Hint = 'Force Update check box:'#13#10'If this is checked the OPM user will be notified'#13#10'of your update. Only check this if the update is important.' + Top = 72 + Width = 90 + Caption = 'Force Update' + Color = clWindow + OnChange = cbForceUpdateChange + OnMouseUp = cbForceUpdateMouseUp + ParentColor = False + TabOrder = 1 + end + object lblDownloadURL: TLabel + Left = 8 + Height = 15 + Top = 104 + Width = 81 + Caption = 'Download URL:' + ParentColor = False + end + object editDownloadURL: TEdit + Left = 8 + Height = 28 + Hint = 'Download URL:'#13#10'Include the FULL url needed to download the package Zip file' + Top = 128 + Width = 304 + Anchors = [akTop, akLeft, akRight] + AutoSize = False + Color = clWindow + TabOrder = 2 + end + object lblPackageFiles: TLabel + Left = 8 + Height = 15 + Top = 163 + Width = 73 + Caption = 'Package Files:' + ParentColor = False + end + object stringPackageFiles: TStringGrid + Left = 8 + Height = 144 + Hint = 'Package Files:'#13#10'[Add]: to make a new entry'#13#10'[Remove]: Remove last entry'#13#10'lpk filename: i.e. mycontrol.lpk'#13#10'Version: The FULL version (i.e. not 1.0 but 1.0.0.0)' + Top = 192 + Width = 304 + AutoFillColumns = True + ColCount = 2 + Columns = < + item + Title.Caption = '' + Width = 150 + end + item + Title.Caption = '' + Width = 150 + end> + FixedCols = 0 + Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing, goThumbTracking, goSmoothScroll] + RowCount = 1 + TabOrder = 3 + TitleStyle = tsNative + ColWidths = ( + 150 + 150 + ) + end + object btnAdd: TButton + Left = 160 + Height = 25 + Hint = 'Add Package File:'#13#10'The update zip can contain more than one lpk file'#13#10'deployed to the same place.' + Top = 163 + Width = 75 + Caption = 'Add' + OnClick = btnAddClick + TabOrder = 4 + end + object btnRemove: TButton + Left = 237 + Height = 25 + Hint = 'Remove Package File:'#13#10'Deletes the last entry from the list' + Top = 163 + Width = 75 + Caption = 'Remove' + OnClick = btnRemoveClick + TabOrder = 5 + end + object cmd_Close: TBitBtn + Left = 237 + Height = 30 + Top = 352 + Width = 75 + Cancel = True + Caption = '&Close' + Kind = bkClose + ModalResult = 11 + OnClick = cmd_CloseClick + TabOrder = 6 + end + object cmd_save: TBitBtn + Left = 123 + Height = 30 + Hint = 'Save the current configuration to disk'#13#10'as a JSON update file' + Top = 352 + Width = 75 + Caption = '&Save' + Default = True + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 00000000000000000000FFFFFF0046986FFF379064FF0B774240FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000 + 000000000000FFFFFF0054A07AFF78BCA1FF7DB99EFF368F63FF0B774240FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF + FF00FFFFFF0054A07AFF7BBEA4FF39A681FF55B191FF7AB698FF399166FF0B77 + 4240FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0054A0 + 7A0054A07AFF7CC0A6FF3CA985FF76BDA1FF7FBBA0FF4FB592FF7BBEA2FF54A0 + 7AFF0B77424054A07A0054A07A00FFFFFF00FFFFFF00FFFFFF0054A07A0054A0 + 7AFF7DC1A7FF4DB391FF7FBB9FFF4D9C75FF3E946AFF7BC5A9FF40B18BFF7BBE + A2FF54A07AFF0B77424054A07A0054A07A00FFFFFF00FFFFFF0054A07AFF7FC3 + A8FF5FBB9BFF7FBBA0FF3A9166FF0B7742600B7742404D9C75FF7BC5A9FF4EBC + 97FF7BBEA2FF54A07AFF0B7742400B77421054A07A00FFFFFF000B7742303A91 + 66FC7FBBA0FF3A9166FC0B77423000000000000000000B77426054A07AFF7BC5 + A9FF4EBE99FF5CC2A0FF54A07AFF0B77423F0B77421054A07A00000000000B77 + 42203A9166F60B774220000000000000000000000000FFFFFF000B77424054A0 + 7AFF7CCAAEFF52C39DFF81BDA2FF54A07AFF0B77423F54A07A00000000000000 + 0000000000000000000000000000000000000000000000000000000000000B77 + 424054A07AFF6DC9A8FF57C7A2FF7BCCAFFF54A07AFF0B774239000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF000B77424C54A07AFF7BCCAFFF81CBAFFF54A07AFF0B77423F000000000000 + 000000000000000000000000000000000000000000000000000000000000FFFF + FF00FFFFFF000B77423D54A07AFF54A07AFF0B774247FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF000B77423F0B77423FFFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + OnClick = mnu_fileSaveClick + TabOrder = 7 + end + object sb_editName: TSpeedButton + Left = 280 + Height = 22 + Hint = 'Update Zip Name:'#13#10'Click this to browse your system to find'#13#10' an existing Update Zip' + Top = 31 + Width = 24 + Caption = '...' + OnClick = sb_editNameClick + end + object spd_CheckURL: TSpeedButton + Left = 104 + Height = 19 + Hint = 'Attempting to Open URL' + Top = 102 + Width = 61 + AutoSize = True + Caption = 'Check URL' + OnClick = spd_CheckURLClick + end + object MainMenu1: TMainMenu + Left = 200 + object FileMenu: TMenuItem + Caption = 'File' + object mnu_fileNew: TMenuItem + Caption = 'New' + OnClick = mnu_fileNewClick + end + object LoadItem: TMenuItem + Caption = 'Load...' + OnClick = LoadItemClick + end + object mnu_fileSave: TMenuItem + Caption = 'Save' + OnClick = mnu_fileSaveClick + end + object SaveAsItem: TMenuItem + Caption = 'Save As...' + OnClick = SaveAsItemClick + end + end + object mnu_help: TMenuItem + Caption = '&Help' + object mnu_helpShowHints: TMenuItem + AutoCheck = True + Caption = 'Show Popup Hints' + Checked = True + GroupIndex = 1 + OnClick = mnu_helpShowHintsClick + end + object mnu_helpDisableWarnings: TMenuItem + AutoCheck = True + Caption = 'Disable warnings' + OnClick = mnu_helpDisableWarningsClick + end + object mnu_lang: TMenuItem + Caption = 'Languages..' + object mnu_lang_en: TMenuItem + Caption = 'English' + GroupIndex = 2 + RadioItem = True + OnClick = mnu_lang_enClick + end + object mnu_lang_es: TMenuItem + Caption = 'Español' + GroupIndex = 2 + RadioItem = True + OnClick = mnu_lang_esClick + end + end + object mnu_helpAbout: TMenuItem + Caption = 'About..' + OnClick = mnu_helpAboutClick + end + end + end + object ActionList1: TActionList + Left = 136 + object FileSaveAs1: TFileSaveAs + Category = 'File' + Caption = '&Save As ...' + Dialog.Filter = 'JSON|*.json' + Hint = 'Save As' + end + object FileOpen1: TFileOpen + Category = 'File' + Caption = '&Open ...' + Dialog.Filter = 'JSON|*.json' + Hint = 'Open' + ShortCut = 16463 + end + end + object mypopup: TPopupNotifier + Color = 14483455 + Icon.Data = { + 07544269746D617000000000 + } + Text = 'Text' + Title = 'Caption' + Visible = False + Left = 168 + end +end diff --git a/applications/json_packager/umain.lrj b/applications/json_packager/umain.lrj new file mode 100644 index 000000000..093c11bf0 --- /dev/null +++ b/applications/json_packager/umain.lrj @@ -0,0 +1,39 @@ +{"version":1,"strings":[ +{"hash":183952426,"name":"tfrmmain.lblname.caption","sourcebytes":[85,112,100,97,116,101,32,90,105,112,32,78,97,109,101,58],"value":"Update Zip Name:"}, +{"hash":260482813,"name":"tfrmmain.editname.hint","sourcebytes":[85,112,100,97,116,101,32,90,105,112,32,78,97,109,101,58,13,10,84,104,105,115,32,105,115,32,106,117,115,116,32,116,104,101,32,102,105,108,101,110,97,109,101,32,40,110,111,116,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,112,97,116,104,41,13,10,111,102,32,121,111,117,114,32,117,112,100,97,116,101,32,122,105,112,46,32,84,121,112,101,44,32,111,114,32,99,108,105,99,107,32,116,104,101,32,91,46,46,46,93],"value":"Update Zip Name:\r\nThis is just the filename (not including the path)\r\nof your update zip. Type, or click the [...]"}, +{"hash":190949342,"name":"tfrmmain.cbforceupdate.hint","sourcebytes":[70,111,114,99,101,32,85,112,100,97,116,101,32,99,104,101,99,107,32,98,111,120,58,13,10,73,102,32,116,104,105,115,32,105,115,32,99,104,101,99,107,101,100,32,116,104,101,32,79,80,77,32,117,115,101,114,32,119,105,108,108,32,98,101,32,110,111,116,105,102,105,101,100,13,10,111,102,32,121,111,117,114,32,117,112,100,97,116,101,46,32,32,79,110,108,121,32,99,104,101,99,107,32,116,104,105,115,32,105,102,32,116,104,101,32,117,112,100,97,116,101,32,105,115,32,105,109,112,111,114,116,97,110,116,46],"value":"Force Update check box:\r\nIf this is checked the OPM user will be notified\r\nof your update. Only check this if the update is important."}, +{"hash":17834453,"name":"tfrmmain.cbforceupdate.caption","sourcebytes":[70,111,114,99,101,32,85,112,100,97,116,101],"value":"Force Update"}, +{"hash":202110442,"name":"tfrmmain.lbldownloadurl.caption","sourcebytes":[68,111,119,110,108,111,97,100,32,85,82,76,58],"value":"Download URL:"}, +{"hash":265021141,"name":"tfrmmain.editdownloadurl.hint","sourcebytes":[68,111,119,110,108,111,97,100,32,85,82,76,58,13,10,73,110,99,108,117,100,101,32,116,104,101,32,70,85,76,76,32,117,114,108,32,110,101,101,100,101,100,32,116,111,32,100,111,119,110,108,111,97,100,32,116,104,101,32,112,97,99,107,97,103,101,32,90,105,112,32,102,105,108,101],"value":"Download URL:\r\nInclude the FULL url needed to download the package Zip file"}, +{"hash":57627770,"name":"tfrmmain.lblpackagefiles.caption","sourcebytes":[80,97,99,107,97,103,101,32,70,105,108,101,115,58],"value":"Package Files:"}, +{"hash":168058793,"name":"tfrmmain.stringpackagefiles.hint","sourcebytes":[80,97,99,107,97,103,101,32,70,105,108,101,115,58,13,10,91,65,100,100,93,58,32,32,116,111,32,109,97,107,101,32,97,32,110,101,119,32,101,110,116,114,121,13,10,91,82,101,109,111,118,101,93,58,32,82,101,109,111,118,101,32,108,97,115,116,32,101,110,116,114,121,13,10,108,112,107,32,102,105,108,101,110,97,109,101,58,32,105,46,101,46,32,109,121,99,111,110,116,114,111,108,46,108,112,107,13,10,86,101,114,115,105,111,110,58,32,84,104,101,32,70,85,76,76,32,118,101,114,115,105,111,110,32,40,105,46,101,46,32,110,111,116,32,49,46,48,32,98,117,116,32,49,46,48,46,48,46,48,41],"value":"Package Files:\r\n[Add]: to make a new entry\r\n[Remove]: Remove last entry\r\nlpk filename: i.e. mycontrol.lpk\r\nVersion: The FULL version (i.e. not 1.0 but 1.0.0.0)"}, +{"hash":4294967295,"name":"tfrmmain.stringpackagefiles.columns[0].title.caption","sourcebytes":[],"value":""}, +{"hash":4294967295,"name":"tfrmmain.stringpackagefiles.columns[1].title.caption","sourcebytes":[],"value":""}, +{"hash":61051198,"name":"tfrmmain.btnadd.hint","sourcebytes":[65,100,100,32,80,97,99,107,97,103,101,32,70,105,108,101,58,13,10,84,104,101,32,117,112,100,97,116,101,32,122,105,112,32,99,97,110,32,99,111,110,116,97,105,110,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,108,112,107,32,102,105,108,101,13,10,100,101,112,108,111,121,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,112,108,97,99,101,46],"value":"Add Package File:\r\nThe update zip can contain more than one lpk file\r\ndeployed to the same place."}, +{"hash":18340,"name":"tfrmmain.btnadd.caption","sourcebytes":[65,100,100],"value":"Add"}, +{"hash":3931908,"name":"tfrmmain.btnremove.hint","sourcebytes":[82,101,109,111,118,101,32,80,97,99,107,97,103,101,32,70,105,108,101,58,13,10,68,101,108,101,116,101,115,32,116,104,101,32,108,97,115,116,32,101,110,116,114,121,32,102,114,111,109,32,116,104,101,32,108,105,115,116],"value":"Remove Package File:\r\nDeletes the last entry from the list"}, +{"hash":93079237,"name":"tfrmmain.btnremove.caption","sourcebytes":[82,101,109,111,118,101],"value":"Remove"}, +{"hash":44709525,"name":"tfrmmain.cmd_close.caption","sourcebytes":[38,67,108,111,115,101],"value":"&Close"}, +{"hash":29947669,"name":"tfrmmain.cmd_save.hint","sourcebytes":[83,97,118,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,116,111,32,100,105,115,107,13,10,97,115,32,97,32,74,83,79,78,32,117,112,100,97,116,101,32,102,105,108,101],"value":"Save the current configuration to disk\r\nas a JSON update file"}, +{"hash":2857157,"name":"tfrmmain.cmd_save.caption","sourcebytes":[38,83,97,118,101],"value":"&Save"}, +{"hash":244237216,"name":"tfrmmain.sb_editname.hint","sourcebytes":[85,112,100,97,116,101,32,90,105,112,32,78,97,109,101,58,13,10,67,108,105,99,107,32,116,104,105,115,32,116,111,32,98,114,111,119,115,101,32,121,111,117,114,32,115,121,115,116,101,109,32,116,111,32,102,105,110,100,13,10,32,97,110,32,101,120,105,115,116,105,110,103,32,85,112,100,97,116,101,32,90,105,112],"value":"Update Zip Name:\r\nClick this to browse your system to find\r\n an existing Update Zip"}, +{"hash":12558,"name":"tfrmmain.sb_editname.caption","sourcebytes":[46,46,46],"value":"..."}, +{"hash":60451052,"name":"tfrmmain.spd_checkurl.hint","sourcebytes":[65,116,116,101,109,112,116,105,110,103,32,116,111,32,79,112,101,110,32,85,82,76],"value":"Attempting to Open URL"}, +{"hash":194843532,"name":"tfrmmain.spd_checkurl.caption","sourcebytes":[67,104,101,99,107,32,85,82,76],"value":"Check URL"}, +{"hash":315429,"name":"tfrmmain.filemenu.caption","sourcebytes":[70,105,108,101],"value":"File"}, +{"hash":21703,"name":"tfrmmain.mnu_filenew.caption","sourcebytes":[78,101,119],"value":"New"}, +{"hash":56062302,"name":"tfrmmain.loaditem.caption","sourcebytes":[76,111,97,100,46,46,46],"value":"Load..."}, +{"hash":366789,"name":"tfrmmain.mnu_filesave.caption","sourcebytes":[83,97,118,101],"value":"Save"}, +{"hash":122542542,"name":"tfrmmain.saveasitem.caption","sourcebytes":[83,97,118,101,32,65,115,46,46,46],"value":"Save As..."}, +{"hash":2812976,"name":"tfrmmain.mnu_help.caption","sourcebytes":[38,72,101,108,112],"value":"&Help"}, +{"hash":186260755,"name":"tfrmmain.mnu_helpshowhints.caption","sourcebytes":[83,104,111,119,32,80,111,112,117,112,32,72,105,110,116,115],"value":"Show Popup Hints"}, +{"hash":253903779,"name":"tfrmmain.mnu_helpdisablewarnings.caption","sourcebytes":[68,105,115,97,98,108,101,32,119,97,114,110,105,110,103,115],"value":"Disable warnings"}, +{"hash":187646702,"name":"tfrmmain.mnu_lang.caption","sourcebytes":[76,97,110,103,117,97,103,101,115,46,46],"value":"Languages.."}, +{"hash":206450904,"name":"tfrmmain.mnu_lang_en.caption","sourcebytes":[69,110,103,108,105,115,104],"value":"English"}, +{"hash":174974108,"name":"tfrmmain.mnu_lang_es.caption","sourcebytes":[69,115,112,97,195,177,111,108],"value":"Espa\u00F1ol"}, +{"hash":127321934,"name":"tfrmmain.mnu_helpabout.caption","sourcebytes":[65,98,111,117,116,46,46],"value":"About.."}, +{"hash":104643966,"name":"tfrmmain.filesaveas1.caption","sourcebytes":[38,83,97,118,101,32,65,115,32,46,46,46],"value":"&Save As ..."}, +{"hash":160199891,"name":"tfrmmain.filesaveas1.hint","sourcebytes":[83,97,118,101,32,65,115],"value":"Save As"}, +{"hash":113253486,"name":"tfrmmain.fileopen1.caption","sourcebytes":[38,79,112,101,110,32,46,46,46],"value":"&Open ..."}, +{"hash":353982,"name":"tfrmmain.fileopen1.hint","sourcebytes":[79,112,101,110],"value":"Open"} +]} diff --git a/applications/json_packager/umain.pas b/applications/json_packager/umain.pas new file mode 100644 index 000000000..43d3c4727 --- /dev/null +++ b/applications/json_packager/umain.pas @@ -0,0 +1,800 @@ +unit umain; + + { OnlinePackageManager Update JSON Editor + + Copyright (C)2016 usernames lainz, minesadorada @ http://forum.lazarus.freepascal.org/index.php + + This source 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 code 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. + + A copy of the GNU General Public License is available on the World Wide Web + at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing + to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + Version History + =============== + 0.0.0.0 Original code by lainz + ..to 0.1.6.0 Refactored and updated by minesadorada + 0.1.7.0: Bugfix by lainz + 0.1.8.0: Config file change by minesadorada + } +{$mode objfpc}{$H+} + +interface + +{DefaultTranslator} +uses + Classes, Forms, Controls, StdCtrls, Menus, ActnList, StdActns, Grids, + Graphics, Buttons, fileutil, LazFileUtils, fileinfo, ugenericcollection, fpjsonrtti, + Dialogs, StrUtils, LCLTranslator, PopupNotifier, SysUtils, inifiles, + lclintf, lclVersion; + +type + + { TPackage } + + { TPackageFiles } + + TPackageFiles = class(TCollectionItem) + private + FName: string; + FVersion: string; + published + property Name: string read FName write FName; + property Version: string read FVersion write FVersion; + end; + + TPackageFilesList = specialize TGenericCollection<TPackageFiles>; + + { TPackageData } + + TPackageData = class(TPersistent) + private + FDownloadURL: string; + FForceUpdate: boolean; + FName: string; + public + constructor Create; + published + property Name: string read FName write FName; + property ForceUpdate: boolean read FForceUpdate write FForceUpdate; + property DownloadURL: string read FDownloadURL write FDownloadURL; + end; + + TPackage = class(TPersistent) + private + FPackage: TPackageData; + FPackageFiles: TPackageFilesList; + public + constructor Create; + destructor Destroy; override; + procedure LoadFromFile(AFileName: string); + function SaveToFile(AFileName: string): boolean; + published + property Package: TPackageData read FPackage write FPackage; + property PackageFiles: TPackageFilesList read FPackageFiles write FPackageFiles; + end; + + { TfrmMain } + + TfrmMain = class(TForm) + ActionList1: TActionList; + cmd_Close: TBitBtn; + cmd_save: TBitBtn; + btnAdd: TButton; + btnRemove: TButton; + cbForceUpdate: TCheckBox; + editName: TEdit; + editDownloadURL: TEdit; + FileOpen1: TFileOpen; + FileSaveAs1: TFileSaveAs; + lblPackageFiles: TLabel; + lblName: TLabel; + lblDownloadURL: TLabel; + MainMenu1: TMainMenu; + FileMenu: TMenuItem; + LoadItem: TMenuItem; + mnu_fileNew: TMenuItem; + mnu_helpDisableWarnings: TMenuItem; + mnu_lang_es: TMenuItem; + mnu_lang_en: TMenuItem; + mnu_lang: TMenuItem; + mnu_helpAbout: TMenuItem; + mnu_helpShowHints: TMenuItem; + mnu_help: TMenuItem; + mnu_fileSave: TMenuItem; + mypopup: TPopupNotifier; + SaveAsItem: TMenuItem; + sb_editName: TSpeedButton; + spd_CheckURL: TSpeedButton; + stringPackageFiles: TStringGrid; + procedure btnAddClick(Sender: TObject); + procedure btnRemoveClick(Sender: TObject); + procedure cbForceUpdateChange(Sender: TObject); + procedure cbForceUpdateMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); + procedure cmd_CloseClick(Sender: TObject); + procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); + procedure FormCloseQuery(Sender: TObject; var CanClose: boolean); + procedure FormCreate(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure LoadItemClick(Sender: TObject); + procedure mnu_fileNewClick(Sender: TObject); + procedure mnu_fileSaveClick(Sender: TObject); + procedure mnu_helpAboutClick(Sender: TObject); + procedure mnu_helpDisableWarningsClick(Sender: TObject); + procedure mnu_helpShowHintsClick(Sender: TObject); + procedure mnu_lang_enClick(Sender: TObject); + procedure mnu_lang_esClick(Sender: TObject); + procedure SaveAsItemClick(Sender: TObject); + procedure sb_editNameClick(Sender: TObject); + procedure spd_CheckURLClick(Sender: TObject); + private + { private declarations } + JSONPackage: TPackage; + bForceSaveAs, bShowPopupHints, bDisableWarnings, bDirty,bIsVirgin: boolean; + sJSONFilePath: string; + sUpdateDirectory, sZipDirectory: string; + CFG: TIniFile; + slErrorList: TStrings; + function ValidationFailed: boolean; + procedure CtrlShowPopup(Sender: TObject); + procedure CtrlHidePopup(Sender: TObject); + procedure CtrlSetUpPopupHandlers; + procedure CtrlMakeDirty(Sender: TObject); + public + { public declarations } + end; + +var + frmMain: TfrmMain; + +implementation + +{$R *.lfm} +resourcestring + rsOneOfTheReq1 = + 'One of the required fields is missing or wrong.'; + rsOneOfTheReqn = + 'One or more of the required fields are missing or wrong.'; + rsSavedOK = 'Saved OK'; + rsSaveUnsucces = 'Save unsuccessful'; + rsOverwrite = 'Overwrite'; + rsTurnHintsOff = '(You can toggle these hints on/off in the Help menu)'; + rsHelpAndInfor = 'Help and Information'; + rsAbout = 'About'; + rsUpdate = 'Update'; + rsFileMayBeUns = 'JSON may be unsaved. Are you sure you want to quit?'; + rsMypackagenam = 'mypackagename.zip'; + rsHttpWwwUpdat = 'http://www.updatesite.com/myupdate/mypackagename.zip'; + rsLpkFileName = 'lpk FileName'; + rsVersion0000 = 'Version (n.n.n.n)'; + rsFixThenTryAg = 'Fix, then try again.'; + rsUpdateZipNam = '- Update zip name is too short or missing'; + rsDownloadURLI = '- Download URL is too short or missing'; + rsThereAreNoLp = '- There are no .lpk files in the list yet'; + rsUpdateZipNam2 = '- Update zip name missing extension ".zip"'; + rsDownloadURLI2 = '- Download URL is incomplete'; + rsDownloadURLS = '- Download URL should start with "http"'; + rsDownloadURLD = '- Download URL does not contain the zipfile name'; + rsWouldYouLike = 'Would you like to copy %s to the %s folder?'; + rsSWasSuccessf = '%s was successfully copied to the %s folder'; + rsSorryCopyOpe = 'Sorry - copy operation was unsuccessful'; + rsCompiledWith2 = 'Compiled with FPC V:%s and Lazarus V:%d.%d%s for the %s -' + + ' %s platform%s%s'; + rsVersionEntry = 'Version Entry #%d is absent'; + rsVersionEntry2 = 'Version entry #%d needs to be of the form n.n.n.n'; + rsTheLpkEntryD = 'The .lpk entry #%d is missing the .lpk extension'; + rsTheLpkEntryD2 = 'The .lpk entry #%d is is absent'; + rsThisOptionSh = + 'This option should only be used for crucial updates or bug-fixed packages. Are you OK with that?'; + rsLanguageChan = 'Language changed to "%s".'; + rsSorryThisLan = 'Sorry, this language is unavailable at this time.'; + rsYouMayNeedTo = '(You may need to restart the app to see the change)'; + +{ TPackageData } + +constructor TPackageData.Create; +begin + FName := ''; + FForceUpdate := False; + FDownloadURL := ''; +end; + +{ TfrmMain } +procedure TfrmMain.CtrlMakeDirty(Sender: TObject); +begin + bDirty := True; +end; + +procedure TfrmMain.CtrlHidePopup(Sender: TObject); +// Get rid of highlighting +begin + mypopup.Hide; + slErrorList.Clear; + if Sender.ClassName <> 'TLabel' then + TControl(Sender).Color := clWindow; +end; + +procedure TfrmMain.CtrlShowPopup(Sender: TObject); +// Use the control's Hint property to populate the popup text +begin + if not bShowPopupHints then + exit; + MyPopup.Text := ''; + MyPopup.Title := ''; + If (Sender.InheritsFrom(TControl) = FALSE) then exit; + + myPopup.Text := TControl(Sender).Hint; + if (MyPopup.Text <> '') then + begin + mypopup.Title := rsHelpAndInfor; + mypopup.Text := mypopup.Text; + if bIsVirgin then mypopup.Text:=mypopup.Text + LineEnding + rsTurnHintsOff; + mypopup.showatpos(Mouse.CursorPos.X, Mouse.CursorPos.Y); + end; +end; + +procedure TfrmMain.CtrlSetUpPopupHandlers; +// Use different handlers for some controls +var + iCount: integer; +begin + with frmMain do + begin + for iCount := 0 to Pred(ControlCount) do + begin + If (Controls[iCount].InheritsFrom(TControl) = FALSE) then continue; + if (Controls[iCount] is TEdit) then + begin + TEdit(Controls[iCount]).OnMouseEnter := @CtrlShowPopup; + TEdit(Controls[iCount]).OnMouseLeave := @CtrlHidePopup; + TEdit(Controls[iCount]).OnClick := @CtrlHidePopup; + TEdit(Controls[iCount]).OnEditingDone := @CtrlMakeDirty; + end; + if (Controls[iCount] is TCheckBox) then + begin + TCheckBox(Controls[iCount]).OnMouseEnter := @CtrlShowPopup; + TCheckBox(Controls[iCount]).OnMouseLeave := @CtrlHidePopup; + TCheckBox(Controls[iCount]).OnClick := @CtrlHidePopup; + TCheckBox(Controls[iCount]).OnEditingDone := @CtrlMakeDirty; + end; + if (Controls[iCount] is TStringGrid) then + begin + TStringGrid(Controls[iCount]).OnMouseEnter := @CtrlShowPopup; + TStringGrid(Controls[iCount]).OnMouseLeave := @CtrlHidePopup; + TStringGrid(Controls[iCount]).OnClick := @CtrlHidePopup; + TStringGrid(Controls[iCount]).OnEditingDone := @CtrlMakeDirty; + end; + if (Controls[iCount] is TLabel) then + begin + TLabel(Controls[iCount]).OnMouseEnter := @CtrlShowPopup; + TLabel(Controls[iCount]).OnMouseLeave := @CtrlHidePopup; + TLabel(Controls[iCount]).OnClick := @CtrlHidePopup; + end; + if (Controls[iCount] is TButton) then + begin + TButton(Controls[iCount]).OnMouseEnter := @CtrlShowPopup; + TButton(Controls[iCount]).OnMouseLeave := @CtrlHidePopup; + end; + if (Controls[iCount] is TSpeedButton) then + begin + TSpeedButton(Controls[iCount]).OnMouseEnter := @CtrlShowPopup; + TSpeedButton(Controls[iCount]).OnMouseLeave := @CtrlHidePopup; + end; + if (Controls[iCount] is TBitBtn) then + begin + TBitBtn(Controls[iCount]).OnMouseEnter := @CtrlShowPopup; + TBitBtn(Controls[iCount]).OnMouseLeave := @CtrlHidePopup; + end; + end; + end; +end; + + +procedure TfrmMain.btnAddClick(Sender: TObject); +begin + stringPackageFiles.RowCount := stringPackageFiles.RowCount + 1; +end; + +procedure TfrmMain.btnRemoveClick(Sender: TObject); +begin + if stringPackageFiles.RowCount > 1 then + stringPackageFiles.RowCount := stringPackageFiles.RowCount - 1; +end; + +procedure TfrmMain.cbForceUpdateChange(Sender: TObject); +begin + +end; + +procedure TfrmMain.cbForceUpdateMouseUp(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: integer); +var + s: string; +begin + if bDisableWarnings then + exit; + if cbForceUpdate.Checked then + begin + s := rsThisOptionSh; + if MessageDlg(s, mtConfirmation, [mbOK, mbAbort], 0, mbAbort) = mrAbort then + cbForceUpdate.Checked := False; + end; +end; + +procedure TfrmMain.cmd_CloseClick(Sender: TObject); +begin + +end; + +procedure TfrmMain.FormClose(Sender: TObject; var CloseAction: TCloseAction); +begin + CFG.WriteBool('Options', 'Virgin', False); + CFG.WriteBool('Options', 'DiableWarnings', bDisableWarnings); +end; + +procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: boolean); +begin + CanClose := True; + if bDisableWarnings = TRUE then + exit; + if bDirty = True then + begin + if MessageDlg(rsFileMayBeUns, mtConfirmation, [mbYes, mbNo], 0, mbNo) = mrNo then + CanClose := False; + end; +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +var + sLang,INIFilePath: string; + +procedure CreateUniqueINI(aCount:Integer); +// Recursively loop until correct INI found, or new one created +begin + INIFilePath:=GetAppConfigFile(False) + IntToStr(aCount); + CFG := TIniFile.Create(INIFilePath); + If CFG.ReadString('Options','AppPath',ProgramDirectory) <> ProgramDirectory then + Begin + CFG.Free; // Ditch the old one + inc(aCount); + CreateUniqueINI(aCount); // Make a new one + end; +end; + +begin + Self.AutoAdjustLayout(lapAutoAdjustForDPI, Self.DesignTimeDPI, + Screen.PixelsPerInch, Self.Width, ScaleX(Self.Width, Self.DesignTimeDPI)); + // Enable AutoSize again to get correct Height + editName.AutoSize := True; + editDownloadURL.AutoSize := True; + // Furniture + Caption := Application.Title; + Icon := Application.Icon; + MyPopup.Icon := TPicture(Application.Icon); + editname.Text := rsMypackagenam; + editDownloadURL.Text := rsHttpWwwUpdat; + stringPackageFiles.Columns[0].Title.Caption := rsLpkFileName; + stringPackageFiles.Columns[1].Title.Caption := rsVersion0000; + // Defaults + bForceSaveAs := True; + bShowPopupHints := True; + slErrorList := TStringList.Create; + // Encourage the user to maintain an updates folder + sUpdateDirectory := ProgramDirectory + 'updates'; + if not FileExistsUTF8(sUpdateDirectory) then + if not ForceDirectoriesUTF8(ProgramDirectory + 'updates') then + sUpdateDirectory := ProgramDirectory; + // Enable options persistence + // If program location is different, create a new CFG file + // Because each component's location might be different + CreateUniqueINI(0); + CFG.WriteString('Options','AppPath',ProgramDirectory); + + // Pop-up hints (show on first run, then not again unless the user chooses) + bIsVirgin:=CFG.ReadBool('Options', 'Virgin', True); + bShowPopupHints := bIsVirgin; + mnu_helpShowHints.Checked := bShowPopupHints; + // Override here if the user has re-enabled them + bShowPopupHints := CFG.ReadBool('Options', 'ShowPopupHints', bShowPopupHints); + mnu_helpShowHints.Checked := bShowPopupHints; + bDisableWarnings := CFG.ReadBool('Options', 'DiableWarnings', False); + mnu_helpDisableWarnings.Checked := bDisableWarnings; + CtrlSetUpPopupHandlers; // Set the Hint property of various controls to show a Popup + // Language translation + sLang := CFG.ReadString('Options', 'Language', 'en'); // First default is English + SetDefaultLang(sLang, 'locale', True); + // Add more translations here + if sLang = 'en' then + mnu_lang_en.Checked := True; + if sLang = 'es' then + mnu_lang_es.Checked := True; + + bDirty := False; // No effect :( +end; + +procedure TfrmMain.FormShow(Sender: TObject); +begin + bDirty := False; +end; + +procedure TfrmMain.LoadItemClick(Sender: TObject); +var + i: integer; +begin + FileOpen1.Dialog.InitialDir := + CFG.ReadString('Options', 'LastLoadedJSONPath', sUpdateDirectory); + FileOpen1.Dialog.Filter := 'JSON|*.json'; + if FileOpen1.Dialog.Execute then + begin + sJSONFilePath := FileOpen1.Dialog.Filename; + CFG.WriteString('Options', 'LastLoadedJSONPath', ExtractFileDir(sJSONFilePath)); + JSONPackage := TPackage.Create; + JSONPackage.LoadFromFile(FileOpen1.Dialog.FileName); + + editName.Text := JSONPackage.Package.Name; + editDownloadURL.Text := JSONPackage.Package.DownloadURL; + cbForceUpdate.Checked := JSONPackage.Package.ForceUpdate; + + stringPackageFiles.RowCount := JSONPackage.PackageFiles.Count + 1; + for i := 0 to JSONPackage.PackageFiles.Count - 1 do + begin + stringPackageFiles.Cells[0, i + 1] := JSONPackage.PackageFiles.Items[i].Name; + stringPackageFiles.Cells[1, i + 1] := JSONPackage.PackageFiles.Items[i].Version; + end; + + JSONPackage.Free; + end; +end; + +procedure TfrmMain.mnu_fileNewClick(Sender: TObject); +begin + editname.Text := rsMypackagenam; + editDownloadURL.Text := rsHttpWwwUpdat; + cbForceUpdate.Checked:=False; + stringPackageFiles.RowCount:=1; + sJSONFilePath:=''; + sZipDirectory:=''; +end; + +procedure TfrmMain.mnu_fileSaveClick(Sender: TObject); +begin + bForceSaveAs := False; + SaveAsItem.Click; + bForceSaveAs := True; +end; + +procedure TfrmMain.mnu_helpAboutClick(Sender: TObject); +var + s: string; + Quad: TVersionQuad; + VInfo: TFileVersionInfo; + EqualsPos: integer; +begin + s := Application.Title + LineEnding; + if GetProgramVersion(Quad) then + s += 'Version: ' + VersionQuadToStr(Quad) + LineEnding; + Vinfo := TFileVersionInfo.Create(Application); + try + Vinfo.Filter.Add('LegalCopyright'); // Set In Project/Options/Version Info + Vinfo.Filter.Add('FileDescription'); // Set In Project/Options/Version Info + Vinfo.ReadFileInfo; + if VInfo.VersionStrings.Count > 0 then + begin + EqualsPos := Pos('=', VInfo.VersionStrings[1]); // Copyright + if (EqualsPos > 0) then + s += RightStr(VInfo.VersionStrings[1], Length(VInfo.VersionStrings[1]) - + EqualsPos) + LineEnding; + end; + s+=Format(rsCompiledWith2, + [{$I %FPCVERSION%},lcl_major,lcl_minor,LineEnding,{$I %FPCTARGETCPU%},{$I %FPCTARGETOS%},LineEnding,LineEnding]); + if VInfo.VersionStrings.Count > 1 then + begin + EqualsPos := Pos('=', VInfo.VersionStrings[0]); // File Deswcription + if (EqualsPos > 0) then + s += RightStr(VInfo.VersionStrings[0], Length(VInfo.VersionStrings[0]) - + EqualsPos) + LineEnding; + + end; + finally + Vinfo.Free; + end; + MessageDlg(rsAbout + ' ' + Application.Title, s, mtInformation, [mbOK], 0); +end; + +procedure TfrmMain.mnu_helpDisableWarningsClick(Sender: TObject); +begin + bDisableWarnings := not bDisableWarnings; + mnu_helpDisableWarnings.Checked := bDisableWarnings; + CFG.WriteBool('Options', 'DiableWarnings', bDisableWarnings); +end; + +procedure TfrmMain.mnu_helpShowHintsClick(Sender: TObject); +begin + bShowPopupHints := mnu_helpShowHints.Checked; + CFG.WriteBool('Options', 'ShowPopupHints', bShowPopupHints); +end; + +procedure TfrmMain.mnu_lang_enClick(Sender: TObject); +begin + SetDefaultLang('en', 'locale', True); + if Length(GetDefaultLang) > 0 then + begin + ShowMessageFmt(rsLanguageChan, [GetDefaultLang]); + CFG.WriteString('Options', 'Language', GetDefaultLang); + mnu_lang_en.Checked := True; + end + else + begin + mnu_lang_en.Checked := False; + ShowMessage(rsSorryThisLan + LineEnding + rsYouMayNeedTo); + end; +end; + +procedure TfrmMain.mnu_lang_esClick(Sender: TObject); +begin + SetDefaultLang('es', 'locale', True); + if Length(GetDefaultLang) > 0 then + begin + ShowMessageFmt(rsLanguageChan, [GetDefaultLang]); + CFG.WriteString('Options', 'Language', GetDefaultLang); + mnu_lang_es.Checked := True; + end + else + begin + mnu_lang_es.Checked := False; + ShowMessage(rsSorryThisLan); + end; +end; + +function TfrmMain.ValidationFailed: boolean; + // Add checks as needed here +var + iCount: integer; + Quad: TVersionQuad; // fileinfo unit +begin + Result := False; + // Check Zipname and URL http:// length + if (Length(editName.Text) < 5) then + begin + editName.Color := clYellow; + slErrorList.Add(rsUpdateZipNam); + Result := True; + end; + // URL implausable? + if (Length(editDownloadURL.Text) < 10) then + begin + slErrorList.Add(rsDownloadURLI); + editDownloadURL.Color := clYellow; + Result := True; + end; + // No lpk file? + if (stringPackageFiles.RowCount = 1) then + begin + slErrorList.Add(rsThereAreNoLp); + stringPackageFiles.Color := clYellow; + Result := True; + end; + // Remembered to type 'zip'? + if (Length(editName.Text) > 4) then + if (RightStr(LowerCase(editName.Text), 4) <> '.zip') then + begin + slErrorList.Add(rsUpdateZipNam2); + editName.Color := clYellow; + Result := True; + end; + // A full URL? + if ((Length(editDownloadURL.Text) > 0) and (RightStr(editDownloadURL.Text, 1) = '/')) + then + begin + slErrorList.Add(rsDownloadURLI2); + editDownloadURL.Color := clYellow; + Result := True; + end; + + if ((Length(editDownloadURL.Text) > 4) and + (LeftStr(LowerCase(editDownloadURL.Text), 4) <> 'http')) then + begin + slErrorList.Add(rsDownloadURLS); + editDownloadURL.Color := clYellow; + Result := True; + end; + + if (Pos(Lowercase(editName.Text), Lowercase(editDownloadURL.Text)) = 0) then + begin + slErrorList.Add(rsDownloadURLD); + editDownloadURL.Color := clYellow; + Result := True; + end; + + // Check package files entries + if (stringPackageFiles.RowCount > 1) then + for iCount := 1 to stringPackageFiles.RowCount - 1 do + begin + if (Length(stringPackageFiles.Cells[0, iCount]) = 0) then + begin + slErrorList.Add(Format(rsTheLpkEntryD2, [iCount])); + stringPackageFiles.Color := clYellow; + Result := True; + end; + if (Length(stringPackageFiles.Cells[1, iCount]) = 0) then + begin + slErrorList.Add(Format(rsVersionEntry, [iCount])); + stringPackageFiles.Color := clYellow; + Result := True; + end; + if (TryStrToVersionQuad(stringPackageFiles.Cells[1, iCount], Quad) = False) then + begin + slErrorList.Add(Format(rsVersionEntry2, [iCount])); + stringPackageFiles.Color := clYellow; + Result := True; + end; + if (RightStr(LowerCase(stringPackageFiles.Cells[0, iCount]), 4) <> '.lpk') then + begin + slErrorList.Add(Format(rsTheLpkEntryD, [iCount])); + stringPackageFiles.Color := clYellow; + Result := True; + end; + end; +end; + +procedure TfrmMain.SaveAsItemClick(Sender: TObject); +var + i: integer; + s: string; +begin + if ValidationFailed then + begin + if (slErrorList.Count > 1) then + ShowMessage(rsOneOfTheReqn + LineEnding + slErrorList.Text + + LineEnding + rsFixThenTryAg) + else + ShowMessage(rsOneOfTheReq1 + LineEnding + slErrorList.Text + + LineEnding + rsFixThenTryAg); + Exit; + end; + if bForceSaveAs or (sJSONFilePath = '') then + begin + FileSaveAs1.Dialog.InitialDir := sUpdateDirectory; + FileSaveAs1.Dialog.FileName:='update_' + ExtractFilenameOnly(editName.text); + if FileSaveAs1.Dialog.Execute then + sJSONFilePath := FileSaveAs1.Dialog.FileName + else + Exit; + end; + + JSONPackage := TPackage.Create; + try + JSONPackage.Package.Name := editName.Text; + JSONPackage.Package.DownloadURL := editDownloadURL.Text; + JSONPackage.Package.ForceUpdate := cbForceUpdate.Checked; + + for i := 1 to stringPackageFiles.RowCount - 1 do + begin + with JSONPackage.PackageFiles.Add do + begin + Name := stringPackageFiles.Cells[0, i]; + Version := stringPackageFiles.Cells[1, i]; + end; + end; + if FileExistsUTF8(sJSONFilePath) AND (bDisableWarnings=FALSE) then + begin + if MessageDlg(rsOverwrite + ' ' + sJSONFilePath + '?', mtConfirmation, + [mbYes, mbNo], 0, mbYes) = mrYes then + if JSONPackage.SaveToFile(sJSONFilePath) then + ShowMessage(sJSONFilePath + ' ' + rsSavedOK); + end + else + if JSONPackage.SaveToFile(sJSONFilePath) then + ShowMessage(sJSONFilePath + rsSavedOK); + bDirty := False; + finally + JSONPackage.Free; + end; +end; + +procedure TfrmMain.sb_editNameClick(Sender: TObject); +var + s: string; +begin + FileOpen1.Dialog.InitialDir := + CFG.ReadString('Options', 'LastLoadedZipPath', sZipDirectory); + FileOpen1.Dialog.Filter := rsUpdate + ' ZIP|*.zip'; + if FileOpen1.Dialog.Execute then + begin + // Offer to copy to /updates? + sZipDirectory := ExtractFileDir(FileOpen1.Dialog.Filename); + CFG.WriteString('Options', 'LastLoadedZipPath', sZipDirectory); + s := ExtractFileName(FileOpen1.Dialog.Filename); + editName.Text := s; + if MessageDlg(Format(rsWouldYouLike, [s, sUpdateDirectory]), + mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then + begin + if CopyFile(FileOpen1.Dialog.Filename, sUpdateDirectory + + DirectorySeparator + s) then + ShowMessageFmt(rsSWasSuccessf, [s, sUpdateDirectory]) + else + ShowMessage(rsSorryCopyOpe); + end; + end; +end; + +procedure TfrmMain.spd_CheckURLClick(Sender: TObject); +// Show a popup notification because it takes time to open a browser window +var + bTemp: boolean; +begin + if OpenURL(editDownloadURL.Text) then + begin + bTemp := bShowPopupHints; + bShowPopupHints := True; + CtrlShowPopup(spd_CheckURL); + bShowPopupHints := bTemp; + end; +end; + +{ TPackage } + +constructor TPackage.Create; +begin + FPackage := TPackageData.Create; + FPackageFiles := TPackageFilesList.Create; +end; + +destructor TPackage.Destroy; +var + c: TCollectionItem; +begin + FPackage.Free; + for c in FPackageFiles do + c.Free; + FPackageFiles.Free; + inherited Destroy; +end; + +procedure TPackage.LoadFromFile(AFileName: string); +var + DeStreamer: TJSONDeStreamer; + s: TStringList; +begin + s := TStringList.Create; + s.LoadFromFile(AFileName); + DeStreamer := TJSONDeStreamer.Create(nil); + DeStreamer.JSONToObject(s.Text, Self); + DeStreamer.Free; + s.Free; +end; + +function TPackage.SaveToFile(AFileName: string): boolean; +var + Streamer: TJSONStreamer; + s: TStringList; +begin + Result := False; + s := TStringList.Create; + try + Streamer := TJSONStreamer.Create(nil); + Streamer.Options := Streamer.Options + [jsoUseFormatString]; + s.AddText(Streamer.ObjectToJSONString(Self)); + try + s.SaveToFile(AFileName); + Result := True; + except + ShowMessage(rsSaveUnsucces); + end; + finally + Streamer.Free; + s.Free; + end; +end; + +end.