diff --git a/.gitignore b/.gitignore index 69ab50e..af561f2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,11 @@ /test *.elf *.pyc +.project +.pydevproject *.sh *.sh~ *.bat *.bak *.dll +*.cmd \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 4ddfe2e..0000000 --- a/LICENSE +++ /dev/null @@ -1 +0,0 @@ -public domain \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d2c23f2 --- /dev/null +++ b/README.md @@ -0,0 +1,176 @@ +GUIMiner - a graphical interface for mining Bitcoins +==================================================== + +by Chris 'Kiv' MacLeod +based on: +- "poclbm" by m0mchil +- 'rpcminer' by puddinpop +- bitcoin-miner by ufasoft + +What is it? +----------- + +GUIMiner is a graphical front end for mining Bitcoins. It provides a more +convenient way to operate Bitcoin miners without having to use the command +line. It supports both NVIDIA and ATI GPUs, as well as CPU mining. It +supports both pooled mining and solo mining, with a wide list of pool +servers pre-set with the program. + +What is it not? +--------------- + +GUIMiner does not replace the standard Bitcoin client from bitcoin.org - you +still need that program to view your account balance and send transactions. +It is not a server, so it has to connect either to a mining pool, or to your +computer's 'bitcoin.exe' if mining solo. + +The Latest Version +------------------ + +You can get the latest version on the project page at GitHub: + + https://github.com/Kiv/poclbm + +Features +-------- + +- Supports multiple miners in a tabbed interface. +- Remembers your login info between sessions. +- Supports both solo and pooled mining. +- Supports OpenCL, CUDA, and CPU mining. +- Minimizes to tray. Hover on tray icon to see status. +- Displays your accepted and stale/invalid shares over time. +- View your account balance with a pool and/or withdraw funds from + the GUI, at participating pools. + +Requirements +------------ + +- To mine using an ATI GPU, you need an OpenCL compatible card with a +working version of OpenCL installed. If you are unsure whether your GPU +supports OpenCL, try the GPU Caps Viewer: + + http://www.ozone3d.net/gpu_caps_viewer/ + +For AMD/ATI cards, to get a version of OpenCL you need the Stream SDK which is +available here: + http://developer.amd.com/tools/heterogeneous-computing/amd-accelerated-parallel-processing-app-sdk/ + +For NVIDIA cards, you can also install OpenCL and mine that way, or you can +install CUDA and use rpcminer-CUDA which may provide slightly higher performance +since it is optimized specifically for NVIDIA cards. + +For CPU mining, you don't need anything special; you can mine using rpcminer-cpu +or rpcminer-4way; try both to see which has better performance on your CPU. + +Instructions for Pooled Mining +------------------------------ + +Pooled mining is recommended for most users, since it gives steadier payouts +than solo mining. Several pool servers are supported out of the box; you can +select one from the "Server" dropdown menu. Different servers have different +fees and features; you can visit the website for each one to learn more. Also, +the official Bitcoin forums are a good source for information: + + http://www.bitcoin.org/smf/ + +Most servers require (free) registration; to register go to the server website +and follow their instructions. + +Once you've registered, you can enter your login information in the fields of +the GUI. The "Extra flags" field is optional and can be used to fine-tune GPU +performance. + +Click "Start mining!" to connect to the server. The miner should connect and start +showing your hash rate. This is the number of attempts per second to solve the +current block. After a while the miner will also show "shares" accepted +by the pool. The more shares you have, the larger your share will be of +the 50 Bitcoins when the block is solved. + +To see if your hashing rate is comparable to others, you can look up your GPU on +this chart: + + http://pastebin.com/AvymGnMJ + +You can save your login info for next time by using File -> Save. Next time +you open the GUI your login will be remembered. + +You can run multiple CPUs/GPUs in separate tabs by using File -> New and entering +the new miner's login info. Remember to save your login info after it's entered. + +Solo Mining +----------- + +Solo mining is recommended for users with a lot of computing power available, +or if you can't find or connect to any pools. It doesn't give any award at +all unless you find a block (which takes weeks to months), at which point you +get 50 BTC all at once. + +For solo mining, instead of connecting to a pool server you connect to your own +local machine's copy of 'bitcoin.exe'. Instead of registering with the pool +server, you put your login info in a special file called 'bitcoin.conf'. + +GUIMiner has utilities to help with these tasks. To create the bitcoin.conf, +choose "Solo utilities -> Create solo password..." and create a user and +password. It should show a message saying that it was successful. + +To launch bitcoin.exe in server mode, you might need to point GUIMiner to +the location of bitcoin.exe. If you installed Bitcoin in the regular location +of Program Files/Bitcoin, you can skip this step. Otherwise choose "Solo +utilities -> Set Bitcoin client path". + +Then make sure bitcoin.exe is not running already and choose "Solo +utilities -> Launch Bitcoin client". This should bring up the official +Bitcoin client. You will need to leave this open while you are solo mining. + +You will need to be connected to the Bitcoin network before you can mine; +in the official client this is shown in the status bar as "6 connections" +or similar. + +If this is the first time you've launched the official Bitcoin client, you +will also need to wait while the block chain is downloaded. This can take +a long time on slower computers. + +Now you can enter your information in the text boxes. Make sure the "Host" +option reads "localhost" since the server is on your own machine. Put your +username and password that you chose earlier. Then press "Start mining!" to +connect and start mining. + +Useful OpenCL flags +------------------- + +These flags can be entered in the Extra Flags field when using the OpenCL +miner to tweak the miner settings: + +-v Enable vectors, which is faster on some cards. +-f30 Set priority to the specified number (default 30). + A higher number is lower priority. Increase this to reduce desktop + lag or to make a miner yield GPU control to other miners or games. +-s0.01 Sleep for the specified number of seconds between iterations (default 0). + Increase this to reduce hashing performance if your temperatures are + too high. + +These are the most useful flags; for a complete list, see here: + http://forum.bitcoin.org/?topic=4122.0 + + +Running From Source +------------------- + +Running GUIMiner from source requires: + - Python 2.6 or higher (Python 3 not supported) + - wxPython + +Mining using OpenCL with poclbm also requires: + - PyOpenCL + - numpy + +Once these are installed run "guiminer.py" to start. + +Bug Reporting +------------- + +This is very early software, so any bug reports are appreciated. Issues and +forks can be created at: + + https://github.com/Kiv/poclbm diff --git a/defaults.ini b/defaults.ini new file mode 100644 index 0000000..9ae93c8 --- /dev/null +++ b/defaults.ini @@ -0,0 +1,5 @@ +{ + "default_server": "slush's pool", + "default_username": "username", + "default_password": "pass" +} \ No newline at end of file diff --git a/guiminer.py b/guiminer.py new file mode 100644 index 0000000..9837891 --- /dev/null +++ b/guiminer.py @@ -0,0 +1,2487 @@ +#!/usr/bin/python + +"""GUIMiner - graphical frontend to Bitcoin miners. + +Currently supports: +- m0mchil's "poclbm" +- puddinpop's "rpcminer" +- ufasoft's "bitcoin-miner" + +Copyright 2011-2012 Chris MacLeod +This program is released under the GNU GPL. See LICENSE.txt for details. +""" +import sys, os, subprocess, errno, re, threading, logging, time, httplib, urllib +print sys.path +import wx +import json +import collections + +try: + import win32api, win32con, win32process +except ImportError: + pass + +from wx.lib.agw import flatnotebook as fnb +from wx.lib.agw import hyperlink +from wx.lib.newevent import NewEvent + +__version__ = '2012-12-03' + +def get_module_path(): + """Return the folder containing this script (or its .exe).""" + module_name = sys.executable if hasattr(sys, 'frozen') else __file__ + abs_path = os.path.abspath(module_name) + return os.path.dirname(abs_path) + +USE_MOCK = '--mock' in sys.argv +# Set up localization; requires the app to be created +app = wx.PySimpleApp(0) +wx.InitAllImageHandlers() + +_ = wx.GetTranslation + +LANGUAGES = { + "Chinese Simplified": wx.LANGUAGE_CHINESE_SIMPLIFIED, + "Dutch": wx.LANGUAGE_DUTCH, + "English": wx.LANGUAGE_ENGLISH, + "Esperanto": wx.LANGUAGE_ESPERANTO, + "French": wx.LANGUAGE_FRENCH, + "German": wx.LANGUAGE_GERMAN, + "Hungarian": wx.LANGUAGE_HUNGARIAN, + "Italian": wx.LANGUAGE_ITALIAN, + "Portuguese": wx.LANGUAGE_PORTUGUESE, + "Russian": wx.LANGUAGE_RUSSIAN, + "Spanish": wx.LANGUAGE_SPANISH, +} +LANGUAGES_REVERSE = dict((v, k) for (k, v) in LANGUAGES.items()) + +DONATION_ADDRESS = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" +locale = None +language = None +def update_language(new_language): + global locale, language + language = new_language + if locale: + del locale + + locale = wx.Locale(language) + if locale.IsOk(): + locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) + locale.AddCatalog("guiminer") + else: + locale = None + +def load_language(): + language_config = os.path.join(get_module_path(), 'default_language.ini') + language_data = dict() + if os.path.exists(language_config): + with open(language_config) as f: + language_data.update(json.load(f)) + language_str = language_data.get('language', "English") + update_language(LANGUAGES.get(language_str, wx.LANGUAGE_ENGLISH)) + +def save_language(): + language_config = os.path.join(get_module_path(), 'default_language.ini') + language_str = LANGUAGES_REVERSE.get(language) + with open(language_config, 'w') as f: + json.dump(dict(language=language_str), f) + +load_language() + +ABOUT_TEXT = _( +"""GUIMiner + +Version: %(version)s + +GUI by Chris 'Kiv' MacLeod +Original poclbm miner by m0mchil +Original rpcminer by puddinpop + +Get the source code or file issues at GitHub: + https://github.com/Kiv/poclbm + +If you enjoyed this software, support its development +by donating to: + +%(address)s + +Even a single Bitcoin is appreciated and helps motivate +further work on this software. +""") + +# Translatable strings that are used repeatedly +STR_NOT_STARTED = _("Not started") +STR_STARTING = _("Starting...") +STR_STOPPED = _("Stopped") +STR_PAUSED = _("Paused") +STR_START_MINING = _("Start mining!") +STR_STOP_MINING = _("Stop mining") +STR_REFRESH_BALANCE = _("Refresh balance") +STR_CONNECTION_ERROR = _("Connection error") +STR_USERNAME = _("Username:") +STR_PASSWORD = _("Password:") +STR_QUIT = _("Quit this program") +STR_ABOUT = _("Show about dialog") + +# Alternate backends that we know how to call +SUPPORTED_BACKENDS = [ + "rpcminer-4way.exe", + "rpcminer-cpu.exe", + "rpcminer-cuda.exe", + "rpcminer-opencl.exe", +# "phoenix.py", +# "phoenix.exe", + "bitcoin-miner.exe" +] + +USER_AGENT = "guiminer/" + __version__ + +# Time constants +SAMPLE_TIME_SECS = 3600 +REFRESH_RATE_MILLIS = 2000 + +# Layout constants +LBL_STYLE = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL +BTN_STYLE = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL + +# Events sent from the worker threads +(UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() +(UpdateAcceptedEvent, EVT_UPDATE_ACCEPTED) = NewEvent() +(UpdateSoloCheckEvent, EVT_UPDATE_SOLOCHECK) = NewEvent() +(UpdateStatusEvent, EVT_UPDATE_STATUS) = NewEvent() + +# Utility functions +def merge_whitespace(s): + """Combine multiple whitespace characters found in s into one.""" + s = re.sub(r"( +)|\t+", " ", s) + return s.strip() + +def get_opencl_devices(): + """Return a list of available OpenCL devices. + + Raises ImportError if OpenCL is not found. + Raises IOError if no OpenCL devices are found. + """ + import pyopencl + device_strings = [] + platforms = pyopencl.get_platforms() #@UndefinedVariable + for i, platform in enumerate(platforms): + devices = platform.get_devices() + for j, device in enumerate(devices): + device_strings.append('[%d-%d] %s' % + (i, j, merge_whitespace(device.name)[:25])) + if len(device_strings) == 0: + raise IOError + return device_strings + +def get_icon_bundle(): + """Return the Bitcoin program icon bundle.""" + return wx.IconBundleFromFile(os.path.join(get_module_path(), "logo.ico"), wx.BITMAP_TYPE_ICO) + +def get_taskbar_icon(): + """Return the taskbar icon. + + This works around Window's annoying behavior of ignoring the 16x16 image + and using nearest neighbour downsampling on the 32x32 image instead.""" + ib = get_icon_bundle() + return ib.GetIcon((16, 16)) + +def mkdir_p(path): + """If the directory 'path' doesn't exist, create it. Same as mkdir -p.""" + try: + os.makedirs(path) + except OSError as exc: + if exc.errno != errno.EEXIST: + raise + +def add_tooltip(widget, text): + """Add a tooltip to widget with the specified text.""" + tooltip = wx.ToolTip(text) + widget.SetToolTip(tooltip) + +def format_khash(rate): + """Format rate for display. A rate of 0 means just connected.""" + if rate > 10 ** 6: + return _("%.3f Ghash/s") % (rate / 1000000.) + if rate > 10 ** 3: + return _("%.1f Mhash/s") % (rate / 1000.) + elif rate == 0: + return _("Connecting...") + else: + return _("%d khash/s") % rate + +def format_balance(amount): + """Format a quantity of Bitcoins in BTC.""" + return "%.3f BTC" % float(amount) + +def init_logger(): + """Set up and return the logging object and custom formatter.""" + logger = logging.getLogger("poclbm-gui") + logger.setLevel(logging.DEBUG) + file_handler = logging.FileHandler( + os.path.join(get_module_path(), 'guiminer.log'), 'w') + formatter = logging.Formatter("%(asctime)s: %(message)s", + "%Y-%m-%d %H:%M:%S") + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + return logger, formatter + +logger, formatter = init_logger() + +def http_request(hostname, *args, **kwargs): + """Do a HTTP request and return the response data.""" + conn_cls = httplib.HTTPSConnection if kwargs.get('use_https') else httplib.HTTPConnection + conn = conn_cls(hostname) + try: + logger.debug(_("Requesting balance: %(request)s"), dict(request=args)) + conn.request(*args) + response = conn.getresponse() + data = response.read() + logger.debug(_("Server replied: %(status)s, %(data)s"), + dict(status=str(response.status), data=data)) + return response, data + finally: + conn.close() + +def get_process_affinity(pid): + """Return the affinity mask for the specified process.""" + flags = win32con.PROCESS_QUERY_INFORMATION + handle = win32api.OpenProcess(flags, 0, pid) + return win32process.GetProcessAffinityMask(handle)[0] + +def set_process_affinity(pid, mask): + """Set the affinity for process to mask.""" + flags = win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_SET_INFORMATION + handle = win32api.OpenProcess(flags, 0, pid) + win32process.SetProcessAffinityMask(handle, mask) + +def find_nth(haystack, needle, n): + """Return the index of the nth occurrence of needle in haystack.""" + start = haystack.find(needle) + while start >= 0 and n > 1: + start = haystack.find(needle, start + len(needle)) + n -= 1 + return start + +class ConsolePanel(wx.Panel): + """Panel that displays logging events. + + Uses with a StreamHandler to log events to a TextCtrl. Thread-safe. + """ + def __init__(self, parent, n_max_lines): + wx.Panel.__init__(self, parent, -1) + self.parent = parent + self.n_max_lines = n_max_lines + + vbox = wx.BoxSizer(wx.VERTICAL) + style = wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL + self.text = wx.TextCtrl(self, -1, "", style=style) + vbox.Add(self.text, 1, wx.EXPAND) + self.SetSizer(vbox) + + self.handler = logging.StreamHandler(self) + + formatter = logging.Formatter("%(asctime)s: %(message)s", + "%Y-%m-%d %H:%M:%S") + self.handler.setFormatter(formatter) + logger.addHandler(self.handler) + + def on_focus(self): + """On focus, clear the status bar.""" + self.parent.statusbar.SetStatusText("", 0) + self.parent.statusbar.SetStatusText("", 1) + + def on_close(self): + """On closing, stop handling logging events.""" + logger.removeHandler(self.handler) + + def append_text(self, text): + self.text.AppendText(text) + lines_to_cut = self.text.GetNumberOfLines() - self.n_max_lines + if lines_to_cut > 0: + contents = self.text.GetValue() + position = find_nth(contents, '\n', lines_to_cut) + self.text.ChangeValue(contents[position + 1:]) + + def write(self, text): + """Forward logging events to our TextCtrl.""" + wx.CallAfter(self.append_text, text) + + +class SummaryPanel(wx.Panel): + """Panel that displays a summary of all miners.""" + + def __init__(self, parent): + wx.Panel.__init__(self, parent, -1) + self.parent = parent + self.timer = wx.Timer(self) + self.timer.Start(REFRESH_RATE_MILLIS) + self.Bind(wx.EVT_TIMER, self.on_timer) + + flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL + border = 5 + self.column_headers = [ + (wx.StaticText(self, -1, _("Miner")), 0, flags, border), + (wx.StaticText(self, -1, _("Speed")), 0, flags, border), + (wx.StaticText(self, -1, _("Accepted")), 0, flags, border), + (wx.StaticText(self, -1, _("Stale")), 0, flags, border), + (wx.StaticText(self, -1, _("Start/Stop")), 0, flags, border), + (wx.StaticText(self, -1, _("Autostart")), 0, flags, border), + ] + font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) + font.SetUnderlined(True) + for st in self.column_headers: + st[0].SetFont(font) + + self.grid = wx.FlexGridSizer(0, len(self.column_headers), 2, 2) + + self.grid.AddMany(self.column_headers) + self.add_miners_to_grid() + + self.grid.AddGrowableCol(0) + self.grid.AddGrowableCol(1) + self.grid.AddGrowableCol(2) + self.grid.AddGrowableCol(3) + self.SetSizer(self.grid) + + def add_miners_to_grid(self): + """Add a summary row for each miner to the summary grid.""" + + # Remove any existing widgets except the column headers. + for i in reversed(range(len(self.column_headers), len(self.grid.GetChildren()))): + self.grid.Hide(i) + self.grid.Remove(i) + + for p in self.parent.profile_panels: + p.clear_summary_widgets() + self.grid.AddMany(p.get_summary_widgets(self)) + + self.grid.Layout() + + def on_close(self): + self.timer.Stop() + + def on_timer(self, event=None): + """Whenever the timer goes off, fefresh the summary data.""" + if self.parent.nb.GetSelection() != self.parent.nb.GetPageIndex(self): + return + + for p in self.parent.profile_panels: + p.update_summary() + + self.parent.statusbar.SetStatusText("", 0) # TODO: show something + total_rate = sum(p.last_rate for p in self.parent.profile_panels + if p.is_mining) + if any(p.is_mining for p in self.parent.profile_panels): + self.parent.statusbar.SetStatusText(format_khash(total_rate), 1) + else: + self.parent.statusbar.SetStatusText("", 1) + + def on_focus(self): + """On focus, show the statusbar text.""" + self.on_timer() + +class GUIMinerTaskBarIcon(wx.TaskBarIcon): + """Taskbar icon for the GUI. + + Shows status messages on hover and opens on click. + """ + TBMENU_RESTORE = wx.NewId() + TBMENU_PAUSE = wx.NewId() + TBMENU_CLOSE = wx.NewId() + TBMENU_CHANGE = wx.NewId() + TBMENU_REMOVE = wx.NewId() + + def __init__(self, frame): + wx.TaskBarIcon.__init__(self) + self.frame = frame + self.icon = get_taskbar_icon() + self.timer = wx.Timer(self) + self.timer.Start(REFRESH_RATE_MILLIS) + self.is_paused = False + self.SetIcon(self.icon, "GUIMiner") + self.imgidx = 1 + self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_taskbar_activate) + self.Bind(wx.EVT_MENU, self.on_taskbar_activate, id=self.TBMENU_RESTORE) + self.Bind(wx.EVT_MENU, self.on_taskbar_close, id=self.TBMENU_CLOSE) + self.Bind(wx.EVT_MENU, self.on_pause, id=self.TBMENU_PAUSE) + self.Bind(wx.EVT_TIMER, self.on_timer) + + def CreatePopupMenu(self): + """Override from wx.TaskBarIcon. Creates the right-click menu.""" + menu = wx.Menu() + menu.AppendCheckItem(self.TBMENU_PAUSE, _("Pause all")) + menu.Check(self.TBMENU_PAUSE, self.is_paused) + menu.Append(self.TBMENU_RESTORE, _("Restore")) + menu.Append(self.TBMENU_CLOSE, _("Close")) + return menu + + def on_taskbar_activate(self, evt): + if self.frame.IsIconized(): + self.frame.Iconize(False) + if not self.frame.IsShown(): + self.frame.Show(True) + self.frame.Raise() + + def on_taskbar_close(self, evt): + wx.CallAfter(self.frame.Close, force=True) + + def on_timer(self, event): + """Refresh the taskbar icon's status message.""" + objs = self.frame.profile_panels + if objs: + text = '\n'.join(p.get_taskbar_text() for p in objs) + self.SetIcon(self.icon, text) + + def on_pause(self, event): + """Pause or resume the currently running miners.""" + self.is_paused = event.Checked() + for miner in self.frame.profile_panels: + if self.is_paused: + miner.pause() + else: + miner.resume() + + +class MinerListenerThread(threading.Thread): + LINES = [ + (r"Target =|average rate|Sending to server|found hash|connected to|Setting server", + lambda _: None), # Just ignore lines like these + (r"accepted|\"result\":\s*true", + lambda _: UpdateAcceptedEvent(accepted=True)), + (r"invalid|stale|rejected", lambda _: + UpdateAcceptedEvent(accepted=False)), + (r"(\d+)\s*khash/s", lambda match: + UpdateHashRateEvent(rate=int(match.group(1)))), + (r"(\d+\.\d+)\s*MH/s", lambda match: + UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), + (r"(\d+\.\d+)\s*Mhash/s", lambda match: + UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), + (r"(\d+)\s*Mhash/s", lambda match: + UpdateHashRateEvent(rate=int(match.group(1)) * 1000)), + (r"checking (\d+)", lambda _: + UpdateSoloCheckEvent()), + ] + + def __init__(self, parent, miner): + threading.Thread.__init__(self) + self.shutdown_event = threading.Event() + self.parent = parent + self.parent_name = parent.name + self.miner = miner + + def run(self): + logger.info(_('Listener for "%s" started') % self.parent_name) + while not self.shutdown_event.is_set(): + line = self.miner.stdout.readline().strip() + #logger.debug("Line: %s", line) + if not line: continue + for s, event_func in self.LINES: # Use self to allow subclassing + match = re.search(s, line, flags=re.I) + if match is not None: + event = event_func(match) + if event is not None: + wx.PostEvent(self.parent, event) + break + else: + # Possible error or new message, just pipe it through + event = UpdateStatusEvent(text=line) + logger.info(_('Listener for "%(name)s": %(line)s'), + dict(name=self.parent_name, line=line)) + wx.PostEvent(self.parent, event) + logger.info(_('Listener for "%s" shutting down'), self.parent_name) + +class PhoenixListenerThread(MinerListenerThread): + LINES = [ + (r"Result: .* accepted", + lambda _: UpdateAcceptedEvent(accepted=True)), + (r"Result: .* rejected", lambda _: + UpdateAcceptedEvent(accepted=False)), + (r"(\d+)\.?(\d*) Khash/sec", lambda match: + UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)))), + (r"(\d+)\.?(\d*) Mhash/sec", lambda match: + UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)) * 1000)), + (r"Currently on block", + lambda _: None), # Just ignore lines like these + ] + +class CgListenerThread(MinerListenerThread): + LINES = [ + (r"Accepted .* GPU \d+ thread \d+", + lambda _: UpdateAcceptedEvent(accepted=True)), + (r"Rejected .* GPU \d+ thread \d+", + lambda _: UpdateAcceptedEvent(accepted=False)), + (r"\(avg\):(\d+)\.?(\d*)Mh/s", lambda match: + UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)) * 1000)), + (r"^GPU\s*\d+", + lambda _: None), # Just ignore lines like these + ] + + +class MinerTab(wx.Panel): + """A tab in the GUI representing a miner instance. + + Each MinerTab has these responsibilities: + - Persist its data to and from the config file + - Launch a backend subprocess and monitor its progress + by creating a MinerListenerThread. + - Post updates to the GUI's statusbar & summary panel; the format depends + whether the backend is working solo or in a pool. + """ + def __init__(self, parent, id, devices, servers, defaults, statusbar, data): + wx.Panel.__init__(self, parent, id) + self.parent = parent + self.servers = servers + self.defaults = defaults + self.statusbar = statusbar + self.is_mining = False + self.is_paused = False + self.is_possible_error = False + self.miner = None # subprocess.Popen instance when mining + self.miner_listener = None # MinerListenerThread when mining + self.solo_blocks_found = 0 + self.accepted_shares = 0 # shares for pool, diff1 hashes for solo + self.accepted_times = collections.deque() + self.invalid_shares = 0 + self.invalid_times = collections.deque() + self.last_rate = 0 # units of khash/s + self.autostart = False + self.num_processors = int(os.getenv('NUMBER_OF_PROCESSORS', 1)) + self.affinity_mask = 0 + self.server_lbl = wx.StaticText(self, -1, _("Server:")) + self.summary_panel = None # SummaryPanel instance if summary open + self.server = wx.ComboBox(self, -1, + choices=[s['name'] for s in servers], + style=wx.CB_READONLY) + self.website_lbl = wx.StaticText(self, -1, _("Website:")) + self.website = hyperlink.HyperLinkCtrl(self, -1, "") + self.external_lbl = wx.StaticText(self, -1, _("Ext. Path:")) + self.txt_external = wx.TextCtrl(self, -1, "") + self.host_lbl = wx.StaticText(self, -1, _("Host:")) + self.txt_host = wx.TextCtrl(self, -1, "") + self.port_lbl = wx.StaticText(self, -1, _("Port:")) + self.txt_port = wx.TextCtrl(self, -1, "") + self.user_lbl = wx.StaticText(self, -1, STR_USERNAME) + self.txt_username = wx.TextCtrl(self, -1, "") + self.pass_lbl = wx.StaticText(self, -1, STR_PASSWORD) + self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) + self.device_lbl = wx.StaticText(self, -1, _("Device:")) + self.device_listbox = wx.ComboBox(self, -1, choices=devices or [_("No OpenCL devices")], style=wx.CB_READONLY) + self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) + self.txt_flags = wx.TextCtrl(self, -1, "") + self.extra_info = wx.StaticText(self, -1, "") + self.affinity_lbl = wx.StaticText(self, -1, _("CPU Affinity:")) + self.affinity_chks = [wx.CheckBox(self, label='%d ' % i) + for i in range(self.num_processors)] + self.balance_lbl = wx.StaticText(self, -1, _("Balance:")) + self.balance_amt = wx.StaticText(self, -1, "0") + self.balance_refresh = wx.Button(self, -1, STR_REFRESH_BALANCE) + self.balance_refresh_timer = wx.Timer() + self.withdraw = wx.Button(self, -1, _("Withdraw")) + self.balance_cooldown_seconds = 0 + self.balance_auth_token = "" + + self.labels = [self.server_lbl, self.website_lbl, + self.host_lbl, self.port_lbl, + self.user_lbl, self.pass_lbl, + + self.device_lbl, self.flags_lbl, + self.balance_lbl] + self.txts = [self.txt_host, self.txt_port, + self.txt_username, self.txt_pass, + self.txt_flags] + self.all_widgets = [self.server, self.website, + self.device_listbox, + self.balance_amt, + self.balance_refresh, + self.withdraw] + self.labels + self.txts + self.affinity_chks + self.hidden_widgets = [self.extra_info, + self.txt_external, + self.external_lbl] + + self.start = wx.Button(self, -1, STR_START_MINING) + + self.device_listbox.SetSelection(0) + self.server.SetStringSelection(self.defaults.get('default_server')) + + self.set_data(data) + + for txt in self.txts: + txt.Bind(wx.EVT_KEY_UP, self.check_if_modified) + self.device_listbox.Bind(wx.EVT_COMBOBOX, self.check_if_modified) + + self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.server.Bind(wx.EVT_COMBOBOX, self.on_select_server) + self.balance_refresh_timer.Bind(wx.EVT_TIMER, self.on_balance_cooldown_tick) + self.balance_refresh.Bind(wx.EVT_BUTTON, self.on_balance_refresh) + self.withdraw.Bind(wx.EVT_BUTTON, self.on_withdraw) + for chk in self.affinity_chks: + chk.Bind(wx.EVT_CHECKBOX, self.on_affinity_check) + self.Bind(EVT_UPDATE_HASHRATE, lambda event: self.update_khash(event.rate)) + self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) + self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) + self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) + self.update_statusbar() + self.clear_summary_widgets() + + @property + def last_update_time(self): + """Return the local time of the last accepted share.""" + if self.accepted_times: + return time.localtime(self.accepted_times[-1]) + return None + + @property + def server_config(self): + hostname = self.txt_host.GetValue() + return self.get_server_by_field(hostname, 'host') + + @property + def is_solo(self): + """Return True if this miner is configured for solo mining.""" + return self.server.GetStringSelection() == "solo" + + @property + def is_modified(self): + """Return True if this miner has unsaved changes pending.""" + return self.last_data != self.get_data() + + @property + def external_path(self): + """Return the path to an external miner, or "" if none is present.""" + return self.txt_external.GetValue() + + @property + def is_external_miner(self): + """Return True if this miner has an external path configured.""" + return self.txt_external.GetValue() != "" + + @property + def host_with_http_prefix(self): + """Return the host address, with http:// prepended if needed.""" + host = self.txt_host.GetValue() + if not host.startswith("http://"): + host = "http://" + host + return host + + @property + def host_without_http_prefix(self): + """Return the host address, with http:// stripped off if needed.""" + host = self.txt_host.GetValue() + if host.startswith("http://"): + return host[len('http://'):] + return host + + @property + def device_index(self): + """Return the index of the currently selected OpenCL device.""" + s = self.device_listbox.GetStringSelection() + match = re.search(r'\[(\d+)-(\d+)\]', s) + try: return int(match.group(2)) + except: return 0 + + @property + def platform_index(self): + """Return the index of the currently selected OpenCL platform.""" + s = self.device_listbox.GetStringSelection() + match = re.search(r'\[(\d+)-(\d+)\]', s) + try: return int(match.group(1)) + except: return 0 + + @property + def is_device_visible(self): + """Return True if we are using a backend with device selection.""" + NO_DEVICE_SELECTION = ['rpcminer', 'bitcoin-miner'] + return not any(d in self.external_path for d in NO_DEVICE_SELECTION) + + def on_affinity_check(self, event): + """Set the affinity mask to the selected value.""" + self.affinity_mask = 0 + for i in range(self.num_processors): + is_checked = self.affinity_chks[i].GetValue() + self.affinity_mask += (is_checked << i) + if self.is_mining: + try: + set_process_affinity(self.miner.pid, self.affinity_mask) + except: + pass # TODO: test on Linux + + def pause(self): + """Pause the miner if we are mining, otherwise do nothing.""" + if self.is_mining: + self.stop_mining() + self.is_paused = True + + def resume(self): + """Resume the miner if we are paused, otherwise do nothing.""" + if self.is_paused: + self.start_mining() + self.is_paused = False + + def get_data(self): + """Return a dict of our profile data.""" + return dict(name=self.name, + hostname=self.txt_host.GetValue(), + port=self.txt_port.GetValue(), + username=self.txt_username.GetValue(), + password=self.txt_pass.GetValue(), + device=self.device_listbox.GetSelection(), + flags=self.txt_flags.GetValue(), + autostart=self.autostart, + affinity_mask=self.affinity_mask, + balance_auth_token=self.balance_auth_token, + external_path=self.external_path) + + def set_data(self, data): + """Set our profile data to the information in data. See get_data().""" + self.last_data = data + default_server_config = self.get_server_by_field( + self.defaults['default_server'], 'name') + self.name = (data.get('name') or _('Default')) + + # Backwards compatibility: hostname key used to be called server. + # We only save out hostname now but accept server from old INI files. + hostname = (data.get('hostname') or + data.get('server') or + default_server_config['host']) + self.txt_host.SetValue(hostname) + + self.server.SetStringSelection(self.server_config.get('name', "Other")) + + self.txt_username.SetValue( + data.get('username') or + self.defaults.get('default_username', '')) + + self.txt_pass.SetValue( + data.get('password') or + self.defaults.get('default_password', '')) + + self.txt_port.SetValue(str( + data.get('port') or + self.server_config.get('port', 8332))) + + self.txt_flags.SetValue(data.get('flags', '')) + self.autostart = data.get('autostart', False) + self.affinity_mask = data.get('affinity_mask', 1) + for i in range(self.num_processors): + self.affinity_chks[i].SetValue((self.affinity_mask >> i) & 1) + + self.txt_external.SetValue(data.get('external_path', '')) + + # Handle case where they removed devices since last run. + device_index = data.get('device', None) + if device_index is not None and device_index < self.device_listbox.GetCount(): + self.device_listbox.SetSelection(device_index) + + self.change_server(self.server_config) + + self.balance_auth_token = data.get('balance_auth_token', '') + + def clear_summary_widgets(self): + """Release all our summary widgets.""" + self.summary_name = None + self.summary_status = None + self.summary_shares_accepted = None + self.summary_shares_stale = None + self.summary_start = None + self.summary_autostart = None + + def get_start_stop_state(self): + """Return appropriate text for the start/stop button.""" + return _("Stop") if self.is_mining else _("Start") + + def get_start_label(self): + return STR_STOP_MINING if self.is_mining else STR_START_MINING + + def update_summary(self): + """Update our summary fields if possible.""" + if not self.summary_panel: + return + + self.summary_name.SetLabel(self.name) + if self.is_paused: + text = STR_PAUSED + elif not self.is_mining: + text = STR_STOPPED + elif self.is_possible_error: + text = _("Connection problems") + else: + text = format_khash(self.last_rate) + self.summary_status.SetLabel(text) + + self.summary_shares_accepted.SetLabel("%d (%d)" % + (self.accepted_shares, len(self.accepted_times))) + + if self.is_solo: + self.summary_shares_invalid.SetLabel("-") + else: + self.summary_shares_invalid.SetLabel("%d (%d)" % + (self.invalid_shares, len(self.invalid_times))) + + self.summary_start.SetLabel(self.get_start_stop_state()) + self.summary_autostart.SetValue(self.autostart) + self.summary_panel.grid.Layout() + + def get_summary_widgets(self, summary_panel): + """Return a list of summary widgets suitable for sizer.AddMany.""" + self.summary_panel = summary_panel + self.summary_name = wx.StaticText(summary_panel, -1, self.name) + self.summary_name.Bind(wx.EVT_LEFT_UP, self.show_this_panel) + + self.summary_status = wx.StaticText(summary_panel, -1, STR_STOPPED) + self.summary_shares_accepted = wx.StaticText(summary_panel, -1, "0") + self.summary_shares_invalid = wx.StaticText(summary_panel, -1, "0") + self.summary_start = wx.Button(summary_panel, -1, self.get_start_stop_state(), style=wx.BU_EXACTFIT) + self.summary_start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.summary_autostart = wx.CheckBox(summary_panel, -1) + self.summary_autostart.Bind(wx.EVT_CHECKBOX, self.toggle_autostart) + self.summary_autostart.SetValue(self.autostart) + return [ + (self.summary_name, 0, wx.ALIGN_CENTER_HORIZONTAL), + (self.summary_status, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), + (self.summary_shares_accepted, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), + (self.summary_shares_invalid, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), + (self.summary_start, 0, wx.ALIGN_CENTER, 0), + (self.summary_autostart, 0, wx.ALIGN_CENTER, 0) + ] + + def show_this_panel(self, event): + """Set focus to this panel.""" + self.parent.SetSelection(self.parent.GetPageIndex(self)) + + def toggle_autostart(self, event): + self.autostart = event.IsChecked() + + def toggle_mining(self, event): + """Stop or start the miner.""" + if self.is_mining: + self.stop_mining() + else: + self.start_mining() + self.update_summary() + + ############################# + # Begin backend specific code + def configure_subprocess_poclbm(self): + """Set up the command line for poclbm.""" + folder = get_module_path() + if USE_MOCK: + executable = "python mockBitcoinMiner.py" + else: + if hasattr(sys, 'frozen'): + executable = "poclbm.exe" + else: + executable = "python poclbm.py" + cmd = "%s %s:%s@%s:%s --device=%d --platform=%d --verbose -r1 %s" % ( + executable, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.txt_host.GetValue(), + self.txt_port.GetValue(), + self.device_index, + self.platform_index, + self.txt_flags.GetValue() + ) + return cmd, folder + + def configure_subprocess_rpcminer(self): + """Set up the command line for rpcminer. + + The hostname must start with http:// for these miners. + """ + cmd = "%s -user=%s -password=%s -url=%s:%s %s" % ( + self.external_path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.host_with_http_prefix, + self.txt_port.GetValue(), + self.txt_flags.GetValue() + ) + return cmd, os.path.dirname(self.external_path) + + def configure_subprocess_ufasoft(self): + """Set up the command line for ufasoft's SSE2 miner. + + The hostname must start with http:// for these miners. + """ + cmd = "%s -u %s -p %s -o %s:%s %s" % ( + self.external_path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.host_with_http_prefix, + self.txt_port.GetValue(), + self.txt_flags.GetValue()) + return cmd, os.path.dirname(self.external_path) + + def configure_subprocess_phoenix(self): + """Set up the command line for phoenix miner.""" + path = self.external_path + if path.endswith('.py'): + path = "python " + path + + cmd = "%s -u http://%s:%s@%s:%s PLATFORM=%d DEVICE=%d %s" % ( + path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.host_without_http_prefix, + self.txt_port.GetValue(), + self.platform_index, + self.device_index, + self.txt_flags.GetValue()) + return cmd, os.path.dirname(self.external_path) + + def configure_subprocess_cgminer(self): + """Set up the command line for cgminer.""" + path = self.external_path + if path.endswith('.py'): + path = "python " + path + + # Command line arguments for cgminer here: + # -u + # -p + # -o + # -d + # -l + # -T + cmd = "%s -u %s -p %s -o http://%s:%s -d %s -l 1 -T %s" % ( + path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.host_without_http_prefix, + self.txt_port.GetValue(), + self.device_index, + self.txt_flags.GetValue()) + return cmd, os.path.dirname(self.external_path) + + # End backend specific code + ########################### + + def start_mining(self): + """Launch a miner subprocess and attach a MinerListenerThread.""" + self.is_paused = False + + # Avoid showing a console window when frozen + try: import win32process + except ImportError: flags = 0 + else: flags = win32process.CREATE_NO_WINDOW + + # Determine what command line arguments to use + + listener_cls = MinerListenerThread + if not self.is_external_miner: + conf_func = self.configure_subprocess_poclbm + elif "rpcminer" in self.external_path: + conf_func = self.configure_subprocess_rpcminer + elif "bitcoin-miner" in self.external_path: + conf_func = self.configure_subprocess_ufasoft + elif "phoenix" in self.external_path: + conf_func = self.configure_subprocess_phoenix + listener_cls = PhoenixListenerThread + elif "cgminer" in self.external_path: + conf_func = self.configure_subprocess_cgminer + listener_cls = CgListenerThread + + else: + raise ValueError # TODO: handle unrecognized miner + cmd, cwd = conf_func() + + # for ufasoft: + # redirect stderr to stdout + # use universal_newlines to catch the \r output on Mhash/s lines + try: + logger.debug(_('Running command: ') + cmd) + # for cgminer: + # We need only the STDOUT for meaningful messages. + if conf_func == self.configure_subprocess_cgminer: + self.miner = subprocess.Popen(cmd, cwd=cwd, + stdout=subprocess.PIPE, + stderr=None, + universal_newlines=True, + creationflags=flags, + shell=(sys.platform != 'win32')) + else: + self.miner = subprocess.Popen(cmd, cwd=cwd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, + creationflags=flags, + shell=(sys.platform != 'win32')) + + except OSError: + raise #TODO: the folder or exe could not exist + self.miner_listener = listener_cls(self, self.miner) + self.miner_listener.daemon = True + self.miner_listener.start() + self.is_mining = True + self.set_status(STR_STARTING, 1) + self.start.SetLabel(self.get_start_label()) + + try: + set_process_affinity(self.miner.pid, self.affinity_mask) + except: + pass # TODO: test on Linux + + def on_close(self): + """Prepare to close gracefully.""" + self.stop_mining() + self.balance_refresh_timer.Stop() + + def stop_mining(self): + """Terminate the poclbm process if able and its associated listener.""" + if self.miner is not None: + if self.miner.returncode is None: + # It didn't return yet so it's still running. + try: + self.miner.terminate() + except OSError: + pass # TODO: Guess it wasn't still running? + self.miner = None + if self.miner_listener is not None: + self.miner_listener.shutdown_event.set() + self.miner_listener = None + self.is_mining = False + self.is_paused = False + self.set_status(STR_STOPPED, 1) + self.start.SetLabel(self.get_start_label()) + + def update_khash(self, rate): + """Update our rate according to a report from the listener thread. + + If we are receiving rate messages then it means poclbm is no longer + reporting errors. + """ + self.last_rate = rate + self.set_status(format_khash(rate), 1) + if self.is_possible_error: + self.update_statusbar() + self.is_possible_error = False + + def update_statusbar(self): + """Show the shares or equivalent on the statusbar.""" + if self.is_solo: + text = _("Difficulty 1 hashes: %(nhashes)d %(update_time)s") % \ + dict(nhashes=self.accepted_shares, + update_time=self.format_last_update_time()) + if self.solo_blocks_found > 0: + block_text = _("Blocks: %d, ") % self.solo_blocks_found + text = block_text + text + else: + text = _("Shares: %d accepted") % self.accepted_shares + if self.invalid_shares > 0: + text += _(", %d stale/invalid") % self.invalid_shares + text += " %s" % self.format_last_update_time() + self.set_status(text, 0) + + def update_last_time(self, accepted): + """Set the last update time to now (in local time).""" + + now = time.time() + if accepted: + self.accepted_times.append(now) + while now - self.accepted_times[0] > SAMPLE_TIME_SECS: + self.accepted_times.popleft() + else: + self.invalid_times.append(now) + while now - self.invalid_times[0] > SAMPLE_TIME_SECS: + self.invalid_times.popleft() + + def format_last_update_time(self): + """Format last update time for display.""" + time_fmt = '%I:%M:%S%p' + if self.last_update_time is None: + return "" + return _("- last at %s") % time.strftime(time_fmt, self.last_update_time) + + def update_shares(self, accepted): + """Update our shares with a report from the listener thread.""" + if self.is_solo and accepted: + self.solo_blocks_found += 1 + elif accepted: + self.accepted_shares += 1 + else: + self.invalid_shares += 1 + self.update_last_time(accepted) + self.update_statusbar() + + def update_status(self, msg): + """Update our status with a report from the listener thread. + + If we receive a message from poclbm we don't know how to interpret, + it's probably some kind of error state - in this case the best + thing to do is just show it to the user on the status bar. + """ + self.set_status(msg) + self.is_possible_error = True + + def set_status(self, msg, index=0): + """Set the current statusbar text, but only if we have focus.""" + if self.parent.GetSelection() == self.parent.GetPageIndex(self): + self.statusbar.SetStatusText(msg, index) + + def on_focus(self): + """When we receive focus, update our status. + + This ensures that when switching tabs, the statusbar always + shows the current tab's status. + """ + self.update_statusbar() + if self.is_mining: + self.update_khash(self.last_rate) + else: + self.set_status(STR_STOPPED, 1) + + def get_taskbar_text(self): + """Return text for the hover state of the taskbar.""" + rate = format_khash(self.last_rate) if self.is_mining else STR_STOPPED + return "%s: %s" % (self.name, rate) + + def update_solo(self): + """Update our easy hashes with a report from the listener thread.""" + self.accepted_shares += 1 + self.update_last_time(True) + self.update_statusbar() + + def on_select_server(self, event): + """Update our info in response to a new server choice.""" + new_server_name = self.server.GetValue() + new_server = self.get_server_by_field(new_server_name, 'name') + self.change_server(new_server) + + def get_server_by_field(self, target_val, field): + """Return the first server dict with the specified val, or {}.""" + for s in self.servers: + if s.get(field) == target_val: + return s + return {} + + def set_widgets_visible(self, widgets, show=False): + """Show or hide each widget in widgets according to the show flag.""" + for w in widgets: + if show: + w.Show() + else: + w.Hide() + + def set_tooltips(self): + add_tooltip(self.server, _("Server to connect to. Different servers have different fees and features.\nCheck their websites for full information.")) + add_tooltip(self.website, _("Website of the currently selected server. Click to visit.")) + add_tooltip(self.device_listbox, _("Available OpenCL devices on your system.")) + add_tooltip(self.txt_host, _("Host address, without http:// prefix.")) + add_tooltip(self.txt_port, _("Server port. This is usually 8332.")) + add_tooltip(self.txt_username, _("The miner's username.\nMay be different than your account username.\nExample: Kiv.GPU")) + add_tooltip(self.txt_pass, _("The miner's password.\nMay be different than your account password.")) + add_tooltip(self.txt_flags, _("""Extra flags to pass to the miner. +For poclbm use -v -w 128 for dedicated mining, append -f 60 for desktop usage. +For cgminer use -I 8 or -I 9. Without any params for desktop usage.""")) + for chk in self.affinity_chks: + add_tooltip(chk, _("CPU cores used for mining.\nUnchecking some cores can reduce high CPU usage in some systems.")) + + def reset_statistics(self): + """Reset our share statistics to zero.""" + self.solo_blocks_found = 0 + self.accepted_shares = 0 + self.accepted_times.clear() + self.invalid_shares = 0 + self.invalid_times.clear() + self.update_statusbar() + + def change_server(self, new_server): + """Change the server to new_server, updating fields as needed.""" + self.reset_statistics() + + # Set defaults before we do server specific code + self.set_tooltips() + self.set_widgets_visible(self.all_widgets, True) + self.withdraw.Disable() + + url = new_server.get('url', 'n/a') + self.website.SetLabel(url) + self.website.SetURL(url) + + # Invalidate any previous auth token since it won't be valid for the + # new server. + self.balance_auth_token = "" + + if 'host' in new_server: + self.txt_host.SetValue(new_server['host']) + if 'port' in new_server: + self.txt_port.SetValue(str(new_server['port'])) + + + # Call server specific code. + host = new_server.get('host', "").lower() + if host == "api2.bitcoin.cz" or host == "mtred.com": self.layout_slush() + if "eligius.st" in host: self.layout_eligius() + elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() + elif host == "pit.deepbit.net": self.layout_deepbit() + elif host == "btcmine.com": self.layout_btcmine() + elif host == "rr.btcmp.com": self.layout_btcmp() + elif "btcguild.com" in host: self.layout_btcguild() + elif host == "bitcoin-server.de": self.layout_bitcoinserver + elif host == "pit.x8s.de": self.layout_x8s() + else: self.layout_default() + + self.Layout() + + self.update_tab_name() + + def on_balance_cooldown_tick(self, event=None): + """Each second, decrement the cooldown for refreshing balance.""" + self.balance_cooldown_seconds -= 1 + self.balance_refresh.SetLabel("%d..." % self.balance_cooldown_seconds) + if self.balance_cooldown_seconds <= 0: + self.balance_refresh_timer.Stop() + self.balance_refresh.Enable() + self.balance_refresh.SetLabel(STR_REFRESH_BALANCE) + + def require_auth_token(self): + """Prompt the user for an auth token if they don't have one already. + + Set the result to self.balance_auth_token and return None. + """ + if self.balance_auth_token: + return + url = self.server_config.get('balance_token_url') + dialog = BalanceAuthRequest(self, url) + dialog.txt_token.SetFocus() + result = dialog.ShowModal() + dialog.Destroy() + if result == wx.ID_CANCEL: + return + self.balance_auth_token = dialog.get_value() # TODO: validate token? + + def is_auth_token_rejected(self, response): + """If the server rejected our token, reset auth_token and return True. + + Otherwise, return False. + """ + if response.status in [401, 403]: # 401 Unauthorized or 403 Forbidden + # Token rejected by the server - reset their token so they'll be + # prompted again + self.balance_auth_token = "" + return True + return False + + def request_balance_get(self, balance_auth_token, use_https=False): + """Request our balance from the server via HTTP GET and auth token. + + This method should be run in its own thread. + """ + response, data = http_request( + self.server_config['balance_host'], + "GET", + self.server_config["balance_url"] % balance_auth_token, + use_https=use_https + ) + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: + data = STR_CONNECTION_ERROR + else: + try: + info = json.loads(data) + confirmed = (info.get('confirmed_reward') or + info.get('confirmed') or + info.get('balance') or + info.get('user', {}).get('confirmed_rewards') or + 0) + unconfirmed = (info.get('unconfirmed_reward') or + info.get('unconfirmed') or + info.get('user', {}).get('unconfirmed_rewards') or + 0) + if self.server_config.get('host') == "pit.deepbit.net": + ipa = info.get('ipa', False) + self.withdraw.Enable(ipa) + + if self.server_config.get('host') == "rr.btcmp.com": + ipa = info.get('can_payout', False) + self.withdraw.Enable(ipa) + + data = _("%s confirmed") % format_balance(confirmed) + if unconfirmed > 0: + data += _(", %s unconfirmed") % format_balance(unconfirmed) + except: # TODO: what exception here? + data = _("Bad response from server.") + + wx.CallAfter(self.balance_amt.SetLabel, data) + + def on_withdraw(self, event): + self.withdraw.Disable() + host = self.server_config.get('host') + if host == 'bitpenny.dyndns.biz': + self.withdraw_bitpenny() + elif host == 'pit.deepbit.net': + self.withdraw_deepbit() + elif host == 'rr.btcmp.com': + self.withdraw_btcmp() + + def requires_auth_token(self, host): + """Return True if the specified host requires an auth token for balance update.""" + HOSTS_REQUIRING_AUTH_TOKEN = ["api2.bitcoin.cz", + "btcmine.com", + "pit.deepbit.net", + "pit.x8s.de", + "mtred.com", + "rr.btcmp.com", + "bitcoin-server.de"] + if host in HOSTS_REQUIRING_AUTH_TOKEN: return True + if "btcguild" in host: return True + return False + + def requires_https(self, host): + """Return True if the specified host requires HTTPs for balance update.""" + HOSTS = ["mtred.com", "api2.bitcoin.cz"] + if host in HOSTS: return True + if "btcguild" in host: return True + return False + + def on_balance_refresh(self, event=None): + """Refresh the miner's balance from the server.""" + host = self.server_config.get("host") + if self.requires_auth_token(host): + self.require_auth_token() + if not self.balance_auth_token: # They cancelled the dialog + return + try: + self.balance_auth_token.decode('ascii') + except UnicodeDecodeError: + return # Invalid characters in auth token + self.http_thread = threading.Thread( + target=self.request_balance_get, + args=(self.balance_auth_token,), + kwargs=dict(use_https=self.requires_https(host))) + self.http_thread.start() + elif host == 'bitpenny.dyndns.biz': + self.http_thread = threading.Thread( + target=self.request_payout_bitpenny, args=(False,)) + self.http_thread.start() + elif 'eligius.st' in host: + self.http_thread = threading.Thread( + target=self.request_balance_eligius + ) + self.http_thread.start() + + self.balance_refresh.Disable() + self.balance_cooldown_seconds = 10 + self.balance_refresh_timer.Start(1000) + + ################################# + # Begin server specific HTTP code + + def withdraw_btcmp(self): + """Launch a thread to withdraw from deepbit.""" + self.require_auth_token() + if not self.balance_auth_token: # User refused to provide token + return + self.http_thread = threading.Thread( + target=self.request_payout_btcmp, + args=(self.balance_auth_token,)) + self.http_thread.start() + + def withdraw_deepbit(self): + """Launch a thread to withdraw from deepbit.""" + self.require_auth_token() + if not self.balance_auth_token: # User refused to provide token + return + self.http_thread = threading.Thread( + target=self.request_payout_deepbit, + args=(self.balance_auth_token,)) + self.http_thread.start() + + def withdraw_bitpenny(self): + self.http_thread = threading.Thread( + target=self.request_payout_bitpenny, args=(True,)) + self.http_thread.start() # TODO: look at aliasing of this variable + + def request_payout_btcmp(self, balance_auth_token): + """Request payout from btcmp's server via HTTP POST.""" + response, data = http_request( + self.server_config['balance_host'], + "GET", + self.server_config["payout_url"] % balance_auth_token, + use_https=False + ) + + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: + data = STR_CONNECTION_ERROR + else: + data = _("Withdraw OK") + wx.CallAfter(self.on_balance_received, data) + + def request_payout_deepbit(self, balance_auth_token): + """Request payout from deepbit's server via HTTP POST.""" + post_params = dict(id=1, + method="request_payout") + response, data = http_request( + self.server_config['balance_host'], + "POST", + self.server_config['balance_url'] % balance_auth_token, + json.dumps(post_params), + {"Content-type": "application/json; charset=utf-8", + "User-Agent": USER_AGENT} + ) + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: + data = STR_CONNECTION_ERROR + else: + data = _("Withdraw OK") + wx.CallAfter(self.on_balance_received, data) + + def request_payout_bitpenny(self, withdraw): + """Request our balance from BitPenny via HTTP POST. + + If withdraw is True, also request a withdrawal. + """ + post_params = dict(a=self.txt_username.GetValue(), w=int(withdraw)) + response, data = http_request( + self.server_config['balance_host'], + "POST", + self.server_config['balance_url'], + urllib.urlencode(post_params), + {"Content-type": "application/x-www-form-urlencoded"} + ) + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: + data = STR_CONNECTION_ERROR + elif withdraw: + data = _("Withdraw OK") + wx.CallAfter(self.on_balance_received, data) + + def request_balance_eligius(self): + """Request our balance from Eligius + """ + response, data = http_request( + self.server_config['balance_host'], + "POST", + self.server_config['balance_url'] % (self.txt_username.GetValue(),), + ) + if not data: + data = STR_CONNECTION_ERROR + try: + data = json.loads(data) + data = data['expected'] / 1e8 + except BaseException as e: + data = str(e) + wx.CallAfter(self.on_balance_received, data) + + def on_balance_received(self, balance): + """Set the balance in the GUI.""" + try: + amt = float(balance) + except ValueError: # Response was some kind of error + self.balance_amt.SetLabel(balance) + else: + if amt > 0.1: + self.withdraw.Enable() + amt_str = format_balance(amt) + self.balance_amt.SetLabel(amt_str) + self.Layout() + + # End server specific HTTP code + ############################### + + def set_name(self, name): + """Set the label on this miner's tab to name.""" + self.name = name + if self.summary_name: + self.summary_name.SetLabel(self.name) + self.update_tab_name() + + def update_tab_name(self): + """Update the tab name to reflect modified status.""" + name = self.name + if self.is_modified: + name += "*" + page = self.parent.GetPageIndex(self) + if page != -1: + self.parent.SetPageText(page, name) + + def check_if_modified(self, event): + """Update the title of the tab to have an asterisk if we are modified.""" + self.update_tab_name() + event.Skip() + + def on_saved(self): + """Update our last data after a save.""" + self.last_data = self.get_data() + self.update_tab_name() + + def layout_init(self): + """Create the sizers for this frame and set up the external text. + + Return the lowest row that is available. + """ + self.frame_sizer = wx.BoxSizer(wx.VERTICAL) + self.frame_sizer.Add((20, 10), 0, wx.EXPAND, 0) + self.inner_sizer = wx.GridBagSizer(10, 5) + self.button_sizer = wx.BoxSizer(wx.HORIZONTAL) + row = 0 + if self.is_external_miner: + self.inner_sizer.Add(self.external_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_external, (row, 1), span=(1, 3), flag=wx.EXPAND) + row += 1 + return row + + def layout_server_and_website(self, row): + """Lay out the server and website widgets in the specified row.""" + self.inner_sizer.Add(self.server_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.server, (row, 1), flag=wx.EXPAND) + self.inner_sizer.Add(self.website_lbl, (row, 2), flag=LBL_STYLE) + self.inner_sizer.Add(self.website, (row, 3), flag=wx.ALIGN_CENTER_VERTICAL) + + def layout_host_and_port(self, row): + """Lay out the host and port widgets in the specified row.""" + self.inner_sizer.Add(self.host_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_host, (row, 1), flag=wx.EXPAND) + self.inner_sizer.Add(self.port_lbl, (row, 2), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_port, (row, 3), flag=wx.EXPAND) + + def layout_user_and_pass(self, row): + """Lay out the user and pass widgets in the specified row.""" + self.inner_sizer.Add(self.user_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row, 1), flag=wx.EXPAND) + self.inner_sizer.Add(self.pass_lbl, (row, 2), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_pass, (row, 3), flag=wx.EXPAND) + + def layout_device_and_flags(self, row): + """Lay out the device and flags widgets in the specified row. + + Hide the device dropdown if RPCMiner is present since it doesn't use it. + """ + device_visible = self.is_device_visible + self.set_widgets_visible([self.device_lbl, self.device_listbox], device_visible) + if device_visible: + self.inner_sizer.Add(self.device_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.device_listbox, (row, 1), flag=wx.EXPAND) + col = 2 * (device_visible) + self.inner_sizer.Add(self.flags_lbl, (row, col), flag=LBL_STYLE) + span = (1, 1) if device_visible else (1, 4) + self.inner_sizer.Add(self.txt_flags, (row, col + 1), span=span, flag=wx.EXPAND) + + def layout_affinity(self, row): + """Lay out the affinity checkboxes in the specified row.""" + self.inner_sizer.Add(self.affinity_lbl, (row, 0)) + + affinity_sizer = wx.BoxSizer(wx.HORIZONTAL) + for chk in self.affinity_chks: + affinity_sizer.Add(chk) + self.inner_sizer.Add(affinity_sizer, (row, 1)) + + def layout_balance(self, row): + """Lay out the balance widgets in the specified row.""" + self.inner_sizer.Add(self.balance_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.balance_amt, (row, 1)) + + def layout_finish(self): + """Lay out the buttons and fit the sizer to the window.""" + self.frame_sizer.Add(self.inner_sizer, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) + self.frame_sizer.Add(self.button_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL) + self.inner_sizer.AddGrowableCol(1) + self.inner_sizer.AddGrowableCol(3) + for btn in [self.start, self.balance_refresh, self.withdraw]: + self.button_sizer.Add(btn, 0, BTN_STYLE, 5) + + self.set_widgets_visible([self.external_lbl, self.txt_external], + self.is_external_miner) + self.SetSizerAndFit(self.frame_sizer) + + def layout_default(self): + """Lay out a default miner with no custom changes.""" + self.user_lbl.SetLabel(STR_USERNAME) + + self.set_widgets_visible(self.hidden_widgets, False) + self.set_widgets_visible([self.balance_lbl, + self.balance_amt, + self.balance_refresh, + self.withdraw], False) + row = self.layout_init() + self.layout_server_and_website(row=row) + customs = ["other", "solo"] + is_custom = self.server.GetStringSelection().lower() in customs + if is_custom: + self.layout_host_and_port(row=row + 1) + else: + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port], False) + + self.layout_user_and_pass(row=row + 1 + int(is_custom)) + self.layout_device_and_flags(row=row + 2 + int(is_custom)) + self.layout_affinity(row=row + 3 + int(is_custom)) + self.layout_finish() + + ############################ + # Begin server specific code + def layout_bitpenny(self): + """BitPenny doesn't require registration or a password. + + The username is just their receiving address. + """ + invisible = [self.txt_pass, self.txt_host, self.txt_port, + self.pass_lbl, self.host_lbl, self.port_lbl] + self.set_widgets_visible(invisible, False) + self.set_widgets_visible([self.extra_info], True) + + row = self.layout_init() + self.layout_server_and_website(row=row) + self.inner_sizer.Add(self.user_lbl, (row + 1, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row + 1, 1), span=(1, 3), flag=wx.EXPAND) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.inner_sizer.Add(self.extra_info, (row + 5, 0), span=(1, 4), flag=wx.ALIGN_CENTER_HORIZONTAL) + self.layout_finish() + + self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) + self.txt_pass.SetValue('poclbm-gui') + self.user_lbl.SetLabel(_("Address:")) + add_tooltip(self.txt_username, + _("Your receiving address for Bitcoins.\nE.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc")) + + def layout_slush(self): + """Slush's pool uses a separate username for each miner.""" + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.withdraw, self.extra_info], False) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.layout_finish() + + add_tooltip(self.txt_username, + _("Your miner username (not your account username).\nExample: Kiv.GPU")) + add_tooltip(self.txt_pass, + _("Your miner password (not your account password).")) + + def layout_eligius(self): + """Eligius doesn't require registration or a password. + + The username is just their receiving address. + """ + invisible = [self.txt_pass, self.txt_host, self.txt_port, + self.withdraw, + self.pass_lbl, self.host_lbl, self.port_lbl] + self.set_widgets_visible(invisible, False) + self.set_widgets_visible([self.extra_info], True) + + row = self.layout_init() + self.layout_server_and_website(row=row) + self.inner_sizer.Add(self.user_lbl, (row + 1, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row + 1, 1), span=(1, 3), flag=wx.EXPAND) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.inner_sizer.Add(self.extra_info, (row + 5, 0), span=(1, 4), flag=wx.ALIGN_CENTER_HORIZONTAL) + self.layout_finish() + + self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) + self.txt_pass.SetValue('x') + self.user_lbl.SetLabel(_("Address:")) + add_tooltip(self.txt_username, + _("Your receiving address for Bitcoins.\nE.g.: 1JMfKKJqtkDPbRRsFSLjX1Cs2dqmjKiwj8")) + + def layout_btcguild(self): + """BTC Guild has the same layout as slush for now.""" + self.layout_slush() + + def layout_bitcoinserver(self): + """Bitcoin-Server.de has the same layout as slush for now.""" + self.layout_slush() + + def layout_btcmine(self): + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.withdraw, self.extra_info], False) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.layout_finish() + + add_tooltip(self.txt_username, + _("Your miner username. \nExample: kiv123@kiv123")) + add_tooltip(self.txt_pass, + _("Your miner password (not your account password).")) + + def layout_deepbit(self): + """Deepbit uses an email address for a username.""" + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.extra_info], False) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.layout_finish() + add_tooltip(self.txt_username, + _("The e-mail address you registered with.")) + self.user_lbl.SetLabel(_("Email:")) + + def layout_btcmp(self): + """Deepbit uses an email address for a username.""" + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.extra_info], False) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.layout_finish() + add_tooltip(self.txt_username, + _("Your worker name. Is something in the form of username.workername")) + self.user_lbl.SetLabel(_("Workername:")) + + def layout_x8s(self): + """x8s has the same layout as slush for now.""" + self.layout_slush() + # End server specific code + ########################## + + +class GUIMiner(wx.Frame): + def __init__(self, *args, **kwds): + wx.Frame.__init__(self, *args, **kwds) + style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_HIDE_ON_SINGLE_TAB + self.nb = fnb.FlatNotebook(self, -1, style=style) + + # Set up notebook context menu + notebook_menu = wx.Menu() + ID_RENAME, ID_DUPLICATE = wx.NewId(), wx.NewId() + notebook_menu.Append(ID_RENAME, _("&Rename..."), _("Rename this miner")) + notebook_menu.Append(ID_DUPLICATE, _("&Duplicate...", _("Duplicate this miner"))) + self.nb.SetRightClickMenu(notebook_menu) + self.Bind(wx.EVT_MENU, self.rename_miner, id=ID_RENAME) + self.Bind(wx.EVT_MENU, self.duplicate_miner, id=ID_DUPLICATE) + + self.console_panel = None + self.summary_panel = None + + # Servers and defaults are required, it's a fatal error not to have + # them. + server_config_path = os.path.join(get_module_path(), 'servers.ini') + with open(server_config_path) as f: + data = json.load(f) + self.servers = data.get('servers') + + defaults_config_path = os.path.join(get_module_path(), 'defaults.ini') + with open(defaults_config_path) as f: + self.defaults = json.load(f) + + self.parse_config() + self.do_show_opencl_warning = self.config_data.get('show_opencl_warning', True) + self.console_max_lines = self.config_data.get('console_max_lines', 5000) + + ID_NEW_EXTERNAL, ID_NEW_PHOENIX, ID_NEW_CGMINER, ID_NEW_CUDA, ID_NEW_UFASOFT = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() + self.menubar = wx.MenuBar() + file_menu = wx.Menu() + new_menu = wx.Menu() + new_menu.Append(wx.ID_NEW, _("&New OpenCL miner..."), _("Create a new OpenCL miner (default for ATI cards)"), wx.ITEM_NORMAL) + #new_menu.Append(ID_NEW_PHOENIX, _("New Phoenix miner..."), _("Create a new Phoenix miner (for some ATI cards)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_CGMINER, _("New CG miner..."), _("Create a new CGMiner (for some ATI cards)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_CUDA, _("New CUDA miner..."), _("Create a new CUDA miner (for NVIDIA cards)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_UFASOFT, _("New Ufasoft CPU miner..."), _("Create a new Ufasoft miner (for CPUs)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a new custom miner (requires external program)"), wx.ITEM_NORMAL) + file_menu.AppendMenu(wx.NewId(), _('&New miner'), new_menu) + file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) + file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) + file_menu.Append(wx.ID_EXIT, _("Quit"), STR_QUIT, wx.ITEM_NORMAL) + self.menubar.Append(file_menu, _("&File")) + + ID_SUMMARY, ID_CONSOLE = wx.NewId(), wx.NewId() + view_menu = wx.Menu() + view_menu.Append(ID_SUMMARY, _("Show summary"), _("Show summary of all miners"), wx.ITEM_NORMAL) + view_menu.Append(ID_CONSOLE, _("Show console"), _("Show console logs"), wx.ITEM_NORMAL) + self.menubar.Append(view_menu, _("&View")) + + ID_SOLO, ID_PATHS, ID_BLOCKCHAIN_PATH, ID_LAUNCH = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() + solo_menu = wx.Menu() + solo_menu.Append(ID_SOLO, _("&Create solo password..."), _("Configure a user/pass for solo mining"), wx.ITEM_NORMAL) + solo_menu.Append(ID_PATHS, _("&Set Bitcoin client path..."), _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) + solo_menu.Append(ID_BLOCKCHAIN_PATH, _("&Set Bitcoin data directory..."), _("Set the location of the bitcoin data directory containing the blockchain and wallet"), wx.ITEM_NORMAL) + solo_menu.Append(ID_LAUNCH, _("&Launch Bitcoin client as server"), _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) + self.menubar.Append(solo_menu, _("&Solo utilities")) + + ID_START_MINIMIZED = wx.NewId() + self.options_menu = wx.Menu() + self.start_minimized_chk = self.options_menu.Append(ID_START_MINIMIZED, _("Start &minimized"), _("Start the GUI minimized to the tray."), wx.ITEM_CHECK) + self.options_menu.Check(ID_START_MINIMIZED, self.config_data.get('start_minimized', False)) + self.menubar.Append(self.options_menu, _("&Options")) + + ID_CHANGE_LANGUAGE = wx.NewId() + lang_menu = wx.Menu() + lang_menu.Append(ID_CHANGE_LANGUAGE, _("&Change language..."), "", wx.ITEM_NORMAL) + self.menubar.Append(lang_menu, _("Language")) + + ID_DONATE_SMALL = wx.NewId() + donate_menu = wx.Menu() + donate_menu.Append(ID_DONATE_SMALL, _("&Donate..."), _("Donate Bitcoins to support GUIMiner development")) + self.menubar.Append(donate_menu, _("&Donate")) + + help_menu = wx.Menu() + help_menu.Append(wx.ID_ABOUT, _("&About..."), STR_ABOUT, wx.ITEM_NORMAL) + + self.menubar.Append(help_menu, _("&Help")) + self.SetMenuBar(self.menubar) + self.statusbar = self.CreateStatusBar(2, 0) + + try: + self.bitcoin_executable = os.path.join(os.getenv("PROGRAMFILES"), "Bitcoin", "bitcoin-qt.exe") + except: + self.bitcoin_executable = "" # TODO: where would Bitcoin probably be on Linux/Mac? + + try: + self.blockchain_directory = os.path.join(os.getenv("APPDATA"), "Bitcoin") + except: + self.blockchain_directory = "" + + + try: + self.tbicon = GUIMinerTaskBarIcon(self) + except: + logging.error(_("Failed to load taskbar icon; continuing.")) + + self.set_properties() + + try: + self.devices = get_opencl_devices() + except: + self.devices = [] + file_menu.Enable(wx.ID_NEW, False) + file_menu.SetHelpString(wx.ID_NEW, _("OpenCL not found - can't add a OpenCL miner")) + + if self.do_show_opencl_warning: + dialog = OpenCLWarningDialog(self) + dialog.ShowModal() + self.do_show_opencl_warning = not dialog.is_box_checked() + + self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) + #self.Bind(wx.EVT_MENU, self.new_phoenix_profile, id=ID_NEW_PHOENIX) + self.Bind(wx.EVT_MENU, self.new_cgminer_profile, id=ID_NEW_CGMINER) + self.Bind(wx.EVT_MENU, self.new_ufasoft_profile, id=ID_NEW_UFASOFT) + self.Bind(wx.EVT_MENU, self.new_cuda_profile, id=ID_NEW_CUDA) + self.Bind(wx.EVT_MENU, self.new_external_profile, id=ID_NEW_EXTERNAL) + self.Bind(wx.EVT_MENU, self.save_config, id=wx.ID_SAVE) + self.Bind(wx.EVT_MENU, self.load_config, id=wx.ID_OPEN) + self.Bind(wx.EVT_MENU, self.on_menu_exit, id=wx.ID_EXIT) + self.Bind(wx.EVT_MENU, self.set_official_client_path, id=ID_PATHS) + self.Bind(wx.EVT_MENU, self.set_blockchain_directory, id=ID_BLOCKCHAIN_PATH) + self.Bind(wx.EVT_MENU, self.show_console, id=ID_CONSOLE) + self.Bind(wx.EVT_MENU, self.show_summary, id=ID_SUMMARY) + self.Bind(wx.EVT_MENU, self.show_about_dialog, id=wx.ID_ABOUT) + self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) + self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) + self.Bind(wx.EVT_MENU, self.on_change_language, id=ID_CHANGE_LANGUAGE) + self.Bind(wx.EVT_MENU, self.on_donate, id=ID_DONATE_SMALL) + self.Bind(wx.EVT_CLOSE, self.on_close) + self.Bind(wx.EVT_ICONIZE, self.on_iconize) + self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) + self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSED, self.on_page_closed) + self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) + + self.load_config() + self.do_layout() + + if not self.start_minimized_chk.IsChecked(): + self.Show() + + def on_iconize(self, event): + if event.Iconized() and sys.platform == 'win32': + self.Hide() # On minimize, hide from taskbar. + else: + self.Show() + + def set_properties(self): + self.SetIcons(get_icon_bundle()) + self.SetTitle(_("GUIMiner - v%s") % __version__) + self.statusbar.SetStatusWidths([-1, 125]) + statusbar_fields = ["", STR_NOT_STARTED] + for i in range(len(statusbar_fields)): + self.statusbar.SetStatusText(statusbar_fields[i], i) + + def do_layout(self): + self.vertical_sizer = wx.BoxSizer(wx.VERTICAL) + self.vertical_sizer.Add(self.nb, 1, wx.EXPAND, 20) + self.SetSizer(self.vertical_sizer) + self.vertical_sizer.SetSizeHints(self) + self.SetSizerAndFit(self.vertical_sizer) + self.Layout() + + @property + def profile_panels(self): + """Return a list of currently available MinerTab.""" + pages = [self.nb.GetPage(i) for i in range(self.nb.GetPageCount())] + return [p for p in pages if + p != self.console_panel and p != self.summary_panel] + + def add_profile(self, data={}): + """Add a new MinerTab to the list of tabs.""" + panel = MinerTab(self.nb, -1, self.devices, self.servers, + self.defaults, self.statusbar, data) + self.nb.AddPage(panel, panel.name) + # The newly created profile should have focus. + self.nb.EnsureVisible(self.nb.GetPageCount() - 1) + + if self.summary_panel is not None: + self.summary_panel.add_miners_to_grid() # Show new entry on summary + return panel + + def message(self, *args, **kwargs): + """Utility method to show a message dialog and return their choice.""" + dialog = wx.MessageDialog(self, *args, **kwargs) + retval = dialog.ShowModal() + dialog.Destroy() + return retval + + def name_new_profile(self, event=None, extra_profile_data={}): + """Prompt for the new miner's name.""" + dialog = wx.TextEntryDialog(self, _("Name this miner:"), _("New miner")) + if dialog.ShowModal() == wx.ID_OK: + name = dialog.GetValue().strip() + if not name: name = _("Untitled") + data = extra_profile_data.copy() + data['name'] = name + self.add_profile(data) + + def new_external_profile(self, event): + """Prompt for an external miner path, then create a miner. + + On Windows we validate against legal miners; on Linux they can pick + whatever they want. + """ + wildcard = _('External miner (*.exe)|*.exe|(*.py)|*.py') if sys.platform == 'win32' else '*.*' + dialog = wx.FileDialog(self, + _("Select external miner:"), + defaultDir=os.path.join(get_module_path(), 'miners'), + defaultFile="", + wildcard=wildcard, + style=wx.OPEN) + if dialog.ShowModal() != wx.ID_OK: + return + + if sys.platform == 'win32' and dialog.GetFilename() not in SUPPORTED_BACKENDS: + self.message( + _("Unsupported external miner %(filename)s. Supported are: %(supported)s") % \ + dict(filename=dialog.GetFilename(), supported='\n'.join(SUPPORTED_BACKENDS)), + _("Miner not supported"), wx.OK | wx.ICON_ERROR) + return + path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) + dialog.Destroy() + self.name_new_profile(extra_profile_data=dict(external_path=path)) + + def new_phoenix_profile(self, event): + """Create a new miner using the Phoenix OpenCL miner backend.""" + path = os.path.join(get_module_path(), 'phoenix.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + + def new_cgminer_profile(self, event): + """Create a new miner using the Cgminer OpenCL miner backend.""" + path = os.path.join(get_module_path(), 'cgminer.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + + def new_ufasoft_profile(self, event): + """Create a new miner using the Ufasoft CPU miner backend.""" + path = os.path.join(get_module_path(), 'miners', 'ufasoft', 'bitcoin-miner.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + + def new_cuda_profile(self, event): + """Create a new miner using the CUDA GPU miner backend.""" + path = os.path.join(get_module_path(), 'miners', 'puddinpop', 'rpcminer-cuda.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + + def get_storage_location(self): + """Get the folder and filename to store our JSON config.""" + if sys.platform == 'win32': + folder = os.path.join(os.environ['AppData'], 'poclbm') + config_filename = os.path.join(folder, 'poclbm.ini') + else: # Assume linux? TODO test + folder = os.environ['HOME'] + config_filename = os.path.join(folder, '.poclbm') + return folder, config_filename + + def on_close(self, event): + """Minimize to tray if they click "close" but exit otherwise. + + On closing, stop any miners that are currently working. + """ + if event.CanVeto(): + self.Hide() + event.Veto() + else: + if any(p.is_modified for p in self.profile_panels): + dialog = wx.MessageDialog(self, _('Do you want to save changes?'), _('Save'), + wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) + retval = dialog.ShowModal() + dialog.Destroy() + if retval == wx.ID_YES: + self.save_config() + + if self.console_panel is not None: + self.console_panel.on_close() + if self.summary_panel is not None: + self.summary_panel.on_close() + for p in self.profile_panels: + p.on_close() + if self.tbicon is not None: + self.tbicon.RemoveIcon() + self.tbicon.timer.Stop() + self.tbicon.Destroy() + event.Skip() + + def save_config(self, event=None): + """Save the current miner profiles to our config file in JSON format.""" + folder, config_filename = self.get_storage_location() + mkdir_p(folder) + profile_data = [p.get_data() for p in self.profile_panels] + config_data = dict(show_console=self.is_console_visible(), + show_summary=self.is_summary_visible(), + profiles=profile_data, + bitcoin_executable=self.bitcoin_executable, + blockchain_directory=self.blockchain_directory, + show_opencl_warning=self.do_show_opencl_warning, + start_minimized=self.start_minimized_chk.IsChecked(), + console_max_lines=self.console_max_lines, + window_position=list(self.GetRect())) + logger.debug(_('Saving: ') + json.dumps(config_data)) + try: + with open(config_filename, 'w') as f: + json.dump(config_data, f, indent=4) + except IOError: + self.message( + _("Couldn't write save file %s.\nCheck the location is writable.") % config_filename, + _("Save unsuccessful"), wx.OK | wx.ICON_ERROR) + else: + self.message(_("Profiles saved OK to %s.") % config_filename, + _("Save successful"), wx.OK | wx.ICON_INFORMATION) + for p in self.profile_panels: + p.on_saved() + + def parse_config(self): + """Set self.config_data to a dictionary of config values.""" + self.config_data = {} + + try: + config_filename = self.get_storage_location()[1] + if os.path.exists(config_filename): + with open(config_filename) as f: + self.config_data.update(json.load(f)) + logger.debug(_('Loaded: %s') % json.dumps(self.config_data)) + except ValueError: + self.message( + _("Your settings saved at:\n %s\nare corrupt or could not be read.\nDeleting this file or saving over it may solve the problem." % config_filename), + _("Error"), wx.ICON_ERROR) + + def load_config(self, event=None): + """Load JSON profile info from the config file.""" + self.parse_config() + + config_data = self.config_data + executable = config_data.get('bitcoin_executable', None) + if executable is not None: + self.bitcoin_executable = executable + + blockchain_directory = config_data.get('blockchain_directory', None) + if blockchain_directory is not None: + self.blockchain_directory = blockchain_directory + + # Shut down any existing miners before they get clobbered + if(any(p.is_mining for p in self.profile_panels)): + result = self.message( + _("Loading profiles will stop any currently running miners. Continue?"), + _("Load profile"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) + if result == wx.ID_NO: + return + for p in reversed(self.profile_panels): + p.on_close() + self.nb.DeletePage(self.nb.GetPageIndex(p)) + + # If present, summary should be the leftmost tab on startup. + if config_data.get('show_summary', False): + self.show_summary() + + profile_data = config_data.get('profiles', []) + for d in profile_data: + self.add_profile(d) + + if not any(profile_data): + self.add_profile() # Create a default one using defaults.ini + + if config_data.get('show_console', False): + self.show_console() + + window_position = config_data.get('window_position') + if window_position: + self.SetRect(window_position) + + for p in self.profile_panels: + if p.autostart: + p.start_mining() + + def set_official_client_path(self, event): + """Set the path to the official Bitcoin client.""" + wildcard = "*.exe" if sys.platform == 'win32' else '*.*' + dialog = wx.FileDialog(self, + _("Select path to Bitcoin.exe"), + defaultFile="bitcoin-qt.exe", + wildcard=wildcard, + style=wx.OPEN) + if dialog.ShowModal() == wx.ID_OK: + path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) + if os.path.exists(path): + self.bitcoin_executable = path + dialog.Destroy() + + def set_blockchain_directory(self, event): + """Set the path to the blockchain data directory.""" + defaultPath = os.path.join(os.getenv("APPDATA"), "Bitcoin") + dialog = wx.DirDialog(self, + _("Select path to blockchain"), + defaultPath=defaultPath, + style=wx.DD_DIR_MUST_EXIST) + if dialog.ShowModal() == wx.ID_OK: + path = dialog.GetPath() + if os.path.exists(path): + self.blockchain_directory = path + dialog.Destroy() + + def show_about_dialog(self, event): + """Show the 'about' dialog.""" + dialog = AboutGuiminer(self, -1, _('About')) + dialog.ShowModal() + dialog.Destroy() + + def on_page_closing(self, event): + """Handle a tab closing event. + + If they are closing a special panel, we have to shut it down. + If the tab has a miner running in it, we have to stop the miner + before letting the tab be removed. + """ + p = self.nb.GetPage(event.GetSelection()) + + if p == self.console_panel: + self.console_panel.on_close() + self.console_panel = None + event.Skip() + return + if p == self.summary_panel: + self.summary_panel.on_close() + self.summary_panel = None + event.Skip() + return + + if p.is_mining: + result = self.message( + _("Closing this miner will stop it. Continue?"), + _("Close miner"), + wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) + if result == wx.ID_NO: + event.Veto() + return + p.on_close() + event.Skip() # OK to close the tab now + + def on_page_closed(self, event): + if self.summary_panel is not None: + self.summary_panel.add_miners_to_grid() # Remove miner summary + + def on_page_changed(self, event): + """Handle a tab change event. + + Ensures the status bar shows the status of the tab that has focus. + """ + p = self.nb.GetPage(event.GetSelection()) + p.on_focus() + + def launch_solo_server(self, event): + """Launch the official bitcoin client in server mode. + + This allows poclbm to connect to it for mining solo. + """ + if self.blockchain_directory and os.path.exists(self.blockchain_directory): + datadir = " -datadir=\"%s\"" % self.blockchain_directory + else: + datadir = "" + try: + subprocess.Popen(self.bitcoin_executable + " -server" + datadir) + except OSError: + self.message( + _("Couldn't find Bitcoin at %s. Is your path set correctly?") % self.bitcoin_executable, + _("Launch failed"), wx.ICON_ERROR | wx.OK) + return + self.message( + _("The Bitcoin client will now launch in server mode.\nOnce it connects to the network and downloads the block chain, you can start a miner in 'solo' mode."), + _("Launched ok."), + wx.OK) + + def create_solo_password(self, event): + """Prompt the user for login credentials to the bitcoin client. + + These are required to connect to the client over JSON-RPC and are + stored in 'bitcoin.conf'. + """ + if sys.platform == 'win32': + filename = os.path.join(os.getenv("APPDATA"), "Bitcoin", "bitcoin.conf") + else: # Assume Linux for now TODO test + filename = os.path.join(os.getenv('HOME'), ".bitcoin") + if os.path.exists(filename): + result = self.message( + _("%s already exists. Overwrite?") % filename, + _("bitcoin.conf already exists."), + wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) + if result == wx.ID_NO: + return + + dialog = SoloPasswordRequest(self, _('Enter password')) + result = dialog.ShowModal() + dialog.Destroy() + if result == wx.ID_CANCEL: + return + + with open(filename, "w") as f: + f.write('\nrpcuser=%s\nrpcpassword=%s\nrpcallowip=*' % dialog.get_value()) + f.close() + + self.message(_("Wrote bitcoin config ok."), _("Success"), wx.OK) + + def is_console_visible(self): + """Return True if the console is visible.""" + return self.nb.GetPageIndex(self.console_panel) != -1 + + def show_console(self, event=None): + """Show the console log in its own tab.""" + if self.is_console_visible(): + return # Console already shown + self.console_panel = ConsolePanel(self, self.console_max_lines) + self.nb.AddPage(self.console_panel, _("Console")) + self.nb.EnsureVisible(self.nb.GetPageCount() - 1) + + def is_summary_visible(self): + """Return True if the summary is visible.""" + return self.nb.GetPageIndex(self.summary_panel) != -1 + + def show_summary(self, event=None): + """Show the summary window in its own tab.""" + if self.is_summary_visible(): + return + self.summary_panel = SummaryPanel(self) + self.nb.AddPage(self.summary_panel, _("Summary")) + index = self.nb.GetPageIndex(self.summary_panel) + self.nb.SetSelection(index) + + def on_menu_exit(self, event): + self.Close(force=True) + + def rename_miner(self, event): + """Change the name of a miner as displayed on the tab.""" + p = self.nb.GetPage(self.nb.GetSelection()) + if p not in self.profile_panels: + return + + dialog = wx.TextEntryDialog(self, _("Rename to:"), _("Rename miner")) + if dialog.ShowModal() == wx.ID_OK: + p.set_name(dialog.GetValue().strip()) + + def duplicate_miner(self, event): + """Duplicate the current miner to another miner.""" + p = self.nb.GetPage(self.nb.GetSelection()) + if p not in self.profile_panels: + return + self.name_new_profile(event=None, extra_profile_data=p.get_data()) + + def on_change_language(self, event): + dialog = ChangeLanguageDialog(self, _('Change language'), language) + result = dialog.ShowModal() + dialog.Destroy() + if result == wx.ID_CANCEL: + return + + language_name = dialog.get_value() + update_language(LANGUAGES[language_name]) + save_language() + + def on_donate(self, event): + dialog = DonateDialog(self, -1, _('Donate')) + dialog.ShowModal() + dialog.Destroy() + +class DonateDialog(wx.Dialog): + """About dialog for the app with a donation address.""" + DONATE_TEXT = "If this software helped you, please consider contributing to its development." \ + "\nSend donations to: %(address)s" + def __init__(self, parent, id, title): + wx.Dialog.__init__(self, parent, id, title) + vbox = wx.BoxSizer(wx.VERTICAL) + + text = DonateDialog.DONATE_TEXT % dict(address=DONATION_ADDRESS) + self.about_text = wx.StaticText(self, -1, text) + self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) + vbox.Add(self.about_text, 0, wx.ALL, 10) + vbox.Add(self.copy_btn, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10) + self.SetSizerAndFit(vbox) + + self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) + + def on_copy(self, event): + """Copy the donation address to the clipboard.""" + if wx.TheClipboard.Open(): + data = wx.TextDataObject() + data.SetText(DONATION_ADDRESS) + wx.TheClipboard.SetData(data) + wx.TheClipboard.Close() + + +class ChangeLanguageDialog(wx.Dialog): + """Dialog prompting the user to change languages.""" + def __init__(self, parent, title, current_language): + style = wx.DEFAULT_DIALOG_STYLE + vbox = wx.BoxSizer(wx.VERTICAL) + wx.Dialog.__init__(self, parent, -1, title, style=style) + self.lbl = wx.StaticText(self, -1, + _("Choose language (requires restart to take full effect)")) + vbox.Add(self.lbl, 0, wx.ALL, 10) + self.language_choices = wx.ComboBox(self, -1, + choices=sorted(LANGUAGES.keys()), + style=wx.CB_READONLY) + + self.language_choices.SetStringSelection(LANGUAGES_REVERSE[current_language]) + + vbox.Add(self.language_choices, 0, wx.ALL, 10) + buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) + vbox.Add(buttons, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10) + self.SetSizerAndFit(vbox) + + def get_value(self): + return self.language_choices.GetStringSelection() + + +class SoloPasswordRequest(wx.Dialog): + """Dialog prompting user for login credentials for solo mining.""" + def __init__(self, parent, title): + style = wx.DEFAULT_DIALOG_STYLE + vbox = wx.BoxSizer(wx.VERTICAL) + wx.Dialog.__init__(self, parent, -1, title, style=style) + self.user_lbl = wx.StaticText(self, -1, STR_USERNAME) + self.txt_username = wx.TextCtrl(self, -1, "") + self.pass_lbl = wx.StaticText(self, -1, STR_PASSWORD) + self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) + grid_sizer_1 = wx.FlexGridSizer(2, 2, 5, 5) + grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_username, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_pass, 0, wx.EXPAND, 0) + buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) + vbox.Add(grid_sizer_1, wx.EXPAND | wx.ALL, 10) + vbox.Add(buttons) + self.SetSizerAndFit(vbox) + + def get_value(self): + """Return the (username, password) supplied by the user.""" + return self.txt_username.GetValue(), self.txt_pass.GetValue() + + +class BalanceAuthRequest(wx.Dialog): + """Dialog prompting user for an auth token to refresh their balance.""" + instructions = \ +_("""Click the link below to log in to the pool and get a special token. +This token lets you securely check your balance. +To remember this token for the future, save your miner settings.""") + def __init__(self, parent, url): + style = wx.DEFAULT_DIALOG_STYLE + vbox = wx.BoxSizer(wx.VERTICAL) + wx.Dialog.__init__(self, parent, -1, STR_REFRESH_BALANCE, style=style) + self.instructions = wx.StaticText(self, -1, BalanceAuthRequest.instructions) + self.website = hyperlink.HyperLinkCtrl(self, -1, url) + self.txt_token = wx.TextCtrl(self, -1, _("(Paste token here)")) + buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) + + vbox.AddMany([ + (self.instructions, 0, wx.ALL, 10), + (self.website, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10), + (self.txt_token, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 10), + (buttons, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10) + ]) + self.SetSizerAndFit(vbox) + + def get_value(self): + """Return the auth token supplied by the user.""" + return self.txt_token.GetValue() + + +class AboutGuiminer(wx.Dialog): + """About dialog for the app with a donation address.""" + + def __init__(self, parent, id, title): + wx.Dialog.__init__(self, parent, id, title) + vbox = wx.BoxSizer(wx.VERTICAL) + + text = ABOUT_TEXT % dict(version=__version__, + address=DONATION_ADDRESS) + self.about_text = wx.StaticText(self, -1, text) + self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) + vbox.Add(self.about_text) + vbox.Add(self.copy_btn, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) + self.SetSizerAndFit(vbox) + + self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) + + def on_copy(self, event): + """Copy the donation address to the clipboard.""" + if wx.TheClipboard.Open(): + data = wx.TextDataObject() + data.SetText(DONATION_ADDRESS) + wx.TheClipboard.SetData(data) + wx.TheClipboard.Close() + + +class OpenCLWarningDialog(wx.Dialog): + """Warning dialog when a user does not have OpenCL installed.""" + def __init__(self, parent): + wx.Dialog.__init__(self, parent, -1, _("No OpenCL devices found.")) + vbox = wx.BoxSizer(wx.VERTICAL) + self.message = wx.StaticText(self, -1, + _("""No OpenCL devices were found. + If you only want to mine using CPU or CUDA, you can ignore this message. + If you want to mine on ATI graphics cards, you may need to install the ATI Stream + SDK, or your GPU may not support OpenCL.""")) + vbox.Add(self.message, 0, wx.ALL, 10) + + hbox = wx.BoxSizer(wx.HORIZONTAL) + + self.no_show_chk = wx.CheckBox(self, -1) + hbox.Add(self.no_show_chk) + self.no_show_txt = wx.StaticText(self, -1, _("Don't show this message again")) + hbox.Add((5, 0)) + hbox.Add(self.no_show_txt) + vbox.Add(hbox, 0, wx.ALL, 10) + buttons = self.CreateButtonSizer(wx.OK) + vbox.Add(buttons, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) + self.SetSizerAndFit(vbox) + + def is_box_checked(self): + return self.no_show_chk.GetValue() + + +def run(): + try: + frame_1 = GUIMiner(None, -1, "") + app.SetTopWindow(frame_1) + app.MainLoop() + except: + logging.exception("Exception:") + raise + + +if __name__ == "__main__": + run() diff --git a/guiminer_de.po b/guiminer_de.po new file mode 100644 index 0000000..c4db417 --- /dev/null +++ b/guiminer_de.po @@ -0,0 +1,775 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" +"PO-Revision-Date: 2011-05-20 00:00-0000\n" +"Last-Translator: Dataminer \n" +"Language-Team: Deutsch\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner: Version %(version)s\n" +"\n" +"GUI erstellt von Chris 'Kiv' MacLeod\n" +"Original poclbm Miner von m0mchil\n" +"Original rpcminer von puddinpop\n" +"\n" +"Sourcecode und weitere Infos auf GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"Sollte dir die Software gefallen, unterstütze die\n" +"Weiterentwicklung durch eine freiwillige Spende an:\n" +"\n" +"%(address)s\n" +"\n" +"Jeder Bitcoin wird gewürdigt und hebt die Motivation\n" +"zur Weiterarbeit an diesem Projekt.\n" +"\n" +"\n" +"Deutsche Übersetzung durch:\n" +"Dataminer (datenmine@yahoo.de)\n" +"\n" +"Spende an Dataminer:\n" +"1ErifSXRFPdzcPLEajnndt6VWqVcqspDvQ\n" +"\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Nicht gestartet" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Starte..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Angehalten" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Pausiert" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Start!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Stopp" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Kontostand" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Verbindungsfehler" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Benutzer:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Passwort:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Beenden" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Über..." + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Verbinde..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Fordere Kontostand: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Server antwortet: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Miner" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Tempo" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Akzeptiert" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Abgelaufen" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Start/Stopp" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Autostart" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Alle anhalten" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Wiederherstellen" + +#: guiminer.py:396 +msgid "Close" +msgstr "Schließen" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Miner \"%s\" gestartet" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Miner \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Miner \"%s\" fährt herunter" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Server:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Website:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Ext. Pfad:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Host:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Gerät:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Kein OpenCL-Gerät" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Optionen:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Kontostand:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Auszahlen" + +#: guiminer.py:705 +msgid "Default" +msgstr "Standard" + +#: guiminer.py:756 +msgid "Start" +msgstr "Start" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Stopp" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Verbindungfehler" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Befehl: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Schwierigkeit 1 Hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blöcke: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Shares: %d akzepiert" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d abgelaufen/ungültig" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- letzte: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Server zum Verbinden. Server haben unterschiedliche Konditionen und " +"Features.\n" +"Informiere dich auf der Anbieter-Website." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Website des derzeit ausgewählen Servers. Klicken um Seite aufzurufen." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Erkannte OpenCL-Geräte." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Host-Adresse, ohne http:// Angabe." + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Server-Port. Standard ist 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Dein Benutzername.\n" +"Kann sich von deinem Accountnamen unterscheiden.\n" +"Beispiel: BitcoinsWallet.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Dein Passwort.\n" +"Kann sich von deinem Accountpasswort unterscheiden.\n" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Extra-Optionen und Feintuning:\n" +"Optimal für Radeon HD 5xxx: -v -w128.\n" +"Einstellungen für andere Karten findest du unter http://forum.bitcoin.org/." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Auth Token wurde vom Server abgelehnt." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s Bestätigt" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s Unbestätigt" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Anfrage vom Server abgelehnt." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Auszahlung OK" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"Keine Registrierung nötig - Einfach Adresse angeben und Start klicken." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Adresse:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Deine Bitcoins Empfangsadresse.\n" +"Beispiel: 1ErifSXRFPdzcPLEajnndt6VWqVcqspDvQ" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Dein Miner-Benutzername (NICHT Account-Benutzername).\n" +"Beispiel: BitcoinsWallet.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Dein Miner-Passwort (NICHT dein Account-Paswort).\n" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Dein Benutzername. \n" +"Beispiel: kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "Deine E-Mailadresse mit der du dich registriert hast." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "E-Mail:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Umbenennen..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Diesen Miner umbenennen..." + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Neu (Standard OpenCL Miner)..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "" + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "" + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Neu (&Anderer miner)..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "Einstellungen &speichern" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Deine Einstellungen speichern" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "Einstellungen &laden" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Gespeicherte Einstellungen laden" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Beenden" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Datei" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Übersicht anzeigen" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Übersicht aller Miner anzeigen" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Konsole anzeigen" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Konsolen-Logs anzeigen" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Ansicht" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Erstelle Solo-Passwort..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Erstellt einen Solo-Benutzernamen und -Passwort" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Pfad zu bitcoin.exe festlegen..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Dateipfad zum offiziellen Bitcoin Client festlegen." + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "Bitcoin-Client als &Server starten" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Starte den offiziellen Bitcoin Client als Server um 'solo' zu minen" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Solo-Tools" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Sprache ändern..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Sprache" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Hilfe" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Taskbar-Icon konnte nicht geladen werden; Fahre fort." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL nicht gefunden. OpenCL kann nicht hinzugefügt werden" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Name für diesen Miner:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Neuer Miner" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Unbenannt" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Wähle einen externen Miner:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" +"Nicht unterstützter Miner %(filename)s. Unterstützt werden: %(supported)" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Miner wird nicht unterstützt" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Änderungen speichern?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Speichern" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Speichere: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"%s konnte nicht gespeichert werden.\n" +"Bitte Schreibrechte überprüfen!" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Speichern fehlgeschlagen" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profile erfolgreich gespeichert in %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Sicherung erfolgreich" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Geladen: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Das Laden von Profilen stoppt alle aktiven Miner. Weiter?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Profil laden..." + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Pfad zu Bitcoin.exe wählen" + +#: guiminer.py:1905 +msgid "About" +msgstr "Über" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Schließen stoppt diesen Miner. Weiter?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Miner schließen" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Bitcoin konnte nicht gefunden werden. Pfad korrekt?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Start fehlgeschlagen" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Start erfolgreich." + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "" +"%s \n" +" existiert bereits. Überschreiben?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf existiert bereits." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Passwort eingeben" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Erfolgreich" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf wurde erfolgreich geschrieben." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Konsole" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Übersicht" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Miner umbenennen" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Umbenennen zu:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Sprache wechseln" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Sprache wählen (Neustart erforderlich)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Token einfügen)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Adresse in Zwischenablage kopieren" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Kein OpenCL Gerät vorhanden." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Keine OpenCL-Geräte vorhanden.\n" +"Wenn du nur durch CPU oder CUDA minen möchtest ignoriere diese Nachricht.\n" +"Wenn du eine ATI-Grafikkarte verwenden möchtest solltest du u.U. die ATI " +"Stream SDK installieren\n" +"oder deine GPU wird möglicherweise kein OpenCL unterstützen.\n" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Nachrichtnicht wieder anzeigen" diff --git a/guiminer_eo.po b/guiminer_eo.po new file mode 100644 index 0000000..60cd33d --- /dev/null +++ b/guiminer_eo.po @@ -0,0 +1,766 @@ +# Esperanto translation for GUIMiner +# Copyright (C) 2012 Colin Dean +# This file is distributed under the same license as the GUIMiner package. +# Colin Dean (Kaŭlen DIN) , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: GUIMiner\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 23:10-0300\n" +"PO-Revision-Date: 2012-09-04 10:36-0500\n" +"Last-Translator: Colin Dean \n" +"Language-Team: Esperanto \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Esperanto\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMinder\n" +"\n" +"Versio: %(version)s\n" +"\n" +"Grafika interfaco de Chris 'Kiv' MACLEOD\n" +"Originala poclbm minilo de m0mchil\n" +"Originalo rpcminer de puddinpop\b\bAkiru la fontkodo aŭ enarkivigi atentindaĵojn ĉe Github:\n" +" https://github.com/Kib/poclbm\n" +"\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Ne komencita" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Komencanta..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Haltita" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Paŭzigita" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Komenci minadon!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Halti minadon" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Aktualigi bilancon" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Konekta eraro" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Uzantnomo:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Pasvorto:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Forlasi" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Montri pridialogujon" + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghak/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr " %.1f Mhak/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Konekanta..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khak/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Petanta bilancon: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Servilo respondita: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Minilo" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Rapido" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Akceptita" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Malfreŝa" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Eki/Halti" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Memlanĉo" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Paŭzigi ĉia" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Restaŭri" + +#: guiminer.py:396 +msgid "Close" +msgstr "Fermi" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Aŭskultanto por \"%s\" komencita" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Aŭskultanto por \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Aŭskultanto por \"%s\" malŝaltanta" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Servil" + +#: guiminer.py:521 +msgid "Website:" +msgstr "TTT-ejo:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Ekst. vojo:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Gastiga komputilo:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Pordo:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Aparato:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Ne OpenCL-aj aparatoj" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Kroma flagoj:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "CPU-a afineco:" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Bilanco:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Repreni" + +#: guiminer.py:705 +msgid "Default" +msgstr "Defaŭlta" + +#: guiminer.py:756 +msgid "Start" +msgstr "Komenci" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Halti" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Konektaj problemoj" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Plenumanta komando:" + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Malfacileco 1 haketoj: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blokoj: %d," + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Partoj: %d akceptita" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d malfreŝa/malvalida" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- lasta ĉe %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Servilo konektiĝi. Diferencaj serviloj havas diferencaj honorarioj kaj trajtoj.\n" +"Konsilu ilin TTT-ejojn por plu informo." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "TTT-ejo de la nuna elektita servilo. Klaku viziti." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Disponeblaj OpenCL-aj aparatoj en via sistemo." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Gastiga adreso, sen \"http://\" prefikso." + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Servpordo. Estas kutime 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"La uzantnomo de la minilo.\n" +"Povas esti diferenca ol via konta uzantnomo.\n" +"Ekz.: Kiv.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"La pasvorto de la minilo.\n" +"Povas esti diferenca ol via kontpasvorto." + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Eksteraj flagoj transdoni al la minilo.\bPor Radeon HD 5xxx serio, uzu '-v -w 128' por plej bonaj rezultoj.\n" +"Por aliaj kartaj, konsilu la forumon." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" +"Ĉefprocesoraj kernoj uzita por minado.\n" +"Malselektado de iuj kernoj povas redukti alta ĉefprocesora uzado en iuj sistemoj." + +#: guiminer.py:1197 +#: guiminer.py:1291 +#: guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Servilo rifuzis aŭtentokontrolan ĵetonon." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s konfirmita" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s nekonfirmira" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Servilo sendis malbonan respondon." + +#: guiminer.py:1295 +#: guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Repreni okej" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "Registrado ne estas postulata - enigu adreson kaj klaku \"Komenci\"." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Adreso:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Via ricevanta adreso por bitmonoj.\n" +"E.g.: 1Q9nXGeq1y1Xfc4JMdPJKGikLY44UGC9LU" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Uzantnomo por la minilo (ne via konta uzantnomo).\n" +"Ekz.: Kiv.GPU" + +#: guiminer.py:1508 +#: guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Pasvorto por la minilo (ne via konta pasvorto)." + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Via uzantnomo por la minilo. \n" +"Ekz. kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "La retadreso uzita registri." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Retpoŝtadreso:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Renomi..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Renomi tiun minilon" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Nova OpenCL-an minilo..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Krei novan OpenCL-an minilon (defaŭlta por ATI-aj vidkartoj)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Krei novan Phoenix-an minilon (por iuj ATI-aj vidkartoj)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Nova Phoenix minilo..." + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Krei novan CUDA-an minilon (por NVIDIA-aj vidkartoj)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Nova CUDA minilo..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Krei novan Ufasoft-an minilon (por ĉefprocesoroj)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Nova Ufasoft-a ĉefprocesora minilo..." + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "Krei novan tajloritan minilon (postulas eksteran programon)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "N&ova alia minilo..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "&Nova minilo" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Savi agorgojn" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "&Savi viajn agorgojn" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Ŝargi agordojn" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Ŝargi savitajn agordojn" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Forlasi" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Dosiero" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Montri resumon" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Montri resumon de ĉiaj miniloj" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Montri konzolon" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Montri konzolajn protokolajn dosierojn" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Vido" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Krei pasvorton por solaminado..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Konfiguri uzantnomon/pasvorton por solaminado" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Agordi vojon al bitmona kliento..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "&Agordi lokon de la oficiala bitmona kliento..." + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Lanĉi bitmonan klienton kiel servilo" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "&Lanĉi oficiala bitmonan klienton kiel servilo por sola minado" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Solaminada utilaĵo" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Startigi plej&etigita" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Startigi grafikan interfacon plej&etigite al la taskopleto" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Agordoj..." + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Ŝanĝi lingvon..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Lingvo" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&Doni 99-aj cendoj..." + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "Doni $0.99 USD en Bitmono subteni programado de GUIMiner" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Doni" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Pri..." + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Helpi" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Fiaskis ŝargi taskopleta bildsimbolo; kontinuanta." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL-a ne trovita - malpovas aldoni OpenCL-an minilon" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Nomu tiun minilon:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Nova minilo" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Sentitola" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Ekstera minilo (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Elektu eksteran minilon:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Malsubtenata ekstera minilo %(filename)s. Subtenata estas: %(supported)s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Minilo malsubtenata" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Ĉu vi volas savi ŝanĝojn?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Savi" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Savanta:" + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Nepovas skribi savdosiero %s.\n" +"Certigu ke, loko estas skribebla." + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Savita malsukcese" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profiloj savis sukcese al %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Savita sukcese" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Ŝargita: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Ŝargado de profiloj haltos ajnaj nunaj funkciantaj miniloj. Daŭrigi?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Ŝargi profilon" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Elekti vojon al Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "Pri" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Fermi tiun minilo ĉesos ĝin. Kontinuu?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Malfermi minilon" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Ne povas trovi Bitcoin.exe ĉe %s. Certigu ke, ĝia vojo estas ĝusta." + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Lanĉo fiaskita" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." +msgstr "" +"La bitmona kliento lanĉos nun en servila reĝimo.\n" +"Unufoje ĝi konektas al via reto kaj elŝutas via blokĉeno, vi povas startigi minilon in 'sola' reĝimo." + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Lanĉo sukcese" + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s ekzistas jam. Anstataŭigu?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf ekzistas jam." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Tajpu pasvorton" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Sukcesa" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "Skribis bitmona agordo sukcese." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Konzolo" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Resumo" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Renomi minolon" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Renomu kiel:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Ŝanĝi lingvon" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Agordi lingvon (postulas restarton efektiviĝi)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "Klaku ligilon malsupre ensaluti la grupon kaj akiri apartan ĵetonon." + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Algluu ĵetono ĉi)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Kopii adreso al tondejo" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Ne OpenCL-aj aparatoj trovitaj." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Ne OpenCL-aj aparatoj trovitaj.\n" +"Se vi deziras sole mini de uzado ĉefprocezoro aŭ CUDA, ignoru tiun mesaĝon.\n" +"Se vi deziras mini de uzado ATI-aj vidkartoj, vi eblas ke, vi bezonos instali la \n" +"\"ATI Stream SDK\", aŭ eblas ke, via vidkarto ne subtenas OpenCL-on." + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Ne remontru tiun mesaĝon. " + diff --git a/guiminer_es.po b/guiminer_es.po new file mode 100644 index 0000000..fe7c643 --- /dev/null +++ b/guiminer_es.po @@ -0,0 +1,764 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:51-0300\n" +"PO-Revision-Date: 2011-05-20 00:00-0000\n" +"Last-Translator: Bitcoins Wallet \n" +"Language-Team: Español\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner versión: %(version)s\n" +"\n" +"GUI por: Chris 'Kiv' MacLeod\n" +"Minero poclbm original por: m0mchil\n" +"Minero rpcminer original por: puddinpop\n" +"Traducción al español por: http://www.BitcoinsWallet.com\n" +"\n" +"Código fuente o errores en GitHub: https://github.com/Kiv/poclbm\n" +"\n" +"Si has disfrutado con este software, apoya a su desarrollo donando a:\n" +"%(address)s\n" +"\n" +"Incluso una sóla Bitcoin se aprecia y ayuda a motivar\n" +"a los desarrolladores en el trabajo futuro.\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "No iniciado" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Empezando..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Detenido" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Pausado" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Iniciar la minería" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Parar la minería" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Actualizar saldo" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Error de conexión" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Usuario:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Contraseña:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Salir del programa" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Acerca de..." + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Conectando..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Solicitando saldo: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Contestación del Servidor: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Minero" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Velocidad" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Aceptado" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Caducado" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Iniciar/Parar" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Inicio auto." + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Pausar todos" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Restaurar" + +#: guiminer.py:396 +msgid "Close" +msgstr "Cerrar" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Minero \"%s\" iniciado" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Minero \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Minero \"%s\" cerrando" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Grupo:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Sitio web:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Ruta externa" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Servidor:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Puerto:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Dispositivo:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "No hay dispositivos OpenCL" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Opciones extra:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Saldo:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Retirar saldo" + +#: guiminer.py:705 +msgid "Default" +msgstr "Por defecto" + +#: guiminer.py:756 +msgid "Start" +msgstr "Iniciar" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Parar" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Problemas de conexión" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Ejecutando comando: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Dificultad 1 hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Bloques: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Tareas: %d aceptadas" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d caducada/inválida" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- última: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Grupo donde conectar. Cada grupo tiene diferentes tasas y características.\n" +"Ver sus páginas web para obtener toda la información." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Página web del grupo seleccionado actualmente. Clic para visitar" + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Dispositivos OpenCL disponibles en tu sistema" + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Dirección del Servidor, sin el prefijo http://." + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Puerto del servidor. Generalmente 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"El usuario del minero.\n" +"Puede ser diferente al usuario de la cuenta.\n" +"Ejemplo: BitcoinsWallet.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Contraseña del minero.\n" +"Puede ser diferente a la contraseña de la cuenta.\n" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Opciones extra para utilizar con el minero.\n" +"Para obtener mejores resultados con las Radeon HD 5xxx utiliza -v -w128.\n" +"Para otras tarjetas, consultar el foro: http://forum.bitcoin.org/." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Código de autorización rechazado por el servidor" + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s confirmado" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s sin confirmar" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Respuesta incorrecta del servidor." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Retirada de saldo correcta" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"No es necesario el registro - sólo introduce una dirección y presiona " +"Iniciar." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Dirección:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Tu cuenta para recibir Bitcoins.\n" +"Ejemplo: 1LSEcWhBwvQ6r5wWC6ZfHRtDrTmybqXbLk" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Tu usuario del minero, (no el usuario de la cuenta).\n" +"Ejemplo: BitcoinsWallet.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Contraseña del minero (no la contraseña de la cuenta).\n" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"El usuario del minero. \n" +"Ejemplo: BitcoinsWallet@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "El correo electrónico con el que te registraste." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Correo electrónico:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Renombrar..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Renombrar este minero" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Nuevo minero OpenCL..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Nuevo minero Phoenix" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Nuevo minero CUDA..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Nuevo minero Ufasoft CPU" + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Nuevo minero diferente..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Guardar opciones" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Guardar tus opciones" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Cargar opciones" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Cargar las opciones guardadas" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Salir" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Archivo" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Mostrar sumario" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Mostrar sumario de todos los mineros" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Mostrar consola" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Mostrar los registros de la consola" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Ver" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Crear usuario/contraseña..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Configurar un usuario/contraseña para la minería en modo 'solo'" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Configurar la ruta del cliente Bitcoin..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Configurar la ruta del cliente oficial Bitcoin." + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Ejecutar el cliente Bitcoin como servidor" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "" +"Ejecutar el cliente Bitcoin como servidor para la minería en modo 'solo'" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Minería en modo 'solo'" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Cambiar idioma..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Idioma" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Donaciones" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Acerca de" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Ayuda" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Error al cargar el icono de bandeja del sistema; continunando...." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL no encontrado. No se puede añadir un minero OpenCL" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Nombre para este minero:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Nuevo minero" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Sin nombre" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Minero externo (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Seleccionar un minero externo:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" +"Minero externo %(filename)s no compatible. Los compatibles son: %(supported)" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Minero no compatible" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "¿Quieres guardar los cambios?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Guardar" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Guardando: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"No se puede guardar el archivo %s.\n" +"Comprueba que la ubicación permite la escritura" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Error al guardar" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Los perfiles se han guardado correctamente en %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Guardado correcto" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Cargado: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Cargar los perfiles parará los mineros que trabajen ahora. Продолжить?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Cargar perfil" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Seleccionar ruta para Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "Acerca de" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Cerrar este minero lo parará. ¿Continuar?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Cerrar minero" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "No se puede encontrar Bitcoin en %s. ¿La ruta es correcta?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Fallo al iniciar" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Ejecutado correctamente." + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s ya existe. ¿Sobreescribir?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf ya existe." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Introducir contraseña" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Correcto" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf escrito correctamente." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Consola" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Sumario" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Renombrar minero" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Renombrar a:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Cambiar idioma" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Elegir idioma (se necesita reiniciar para completar)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Pegar el código aquí)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Copiar dirección al portapapeles" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "No se han encontrado dispositivos OpenCL." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"No se han encontrado dispositivos OpenCL.\n" +"Si sólo quieres minar utilizando CPU or CUDA, puedes ignorar este mensaje.\n" +"Si quieres minar con tarjetas gráficas ATI, podrías necesitar instalar el " +"SDK del ATI Stream\n" +"o tu GPU podría no aceptar OpenCL.\n" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "No volver a mostrar este mensaje" diff --git a/guiminer_fr.po b/guiminer_fr.po new file mode 100644 index 0000000..e8948fa --- /dev/null +++ b/guiminer_fr.po @@ -0,0 +1,793 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" +"PO-Revision-Date: 2011-06-14 23:00-0400\n" +"Last-Translator: Chris MacLeod \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +" \n" +"\n" +" GUIMiner\n" +" \n" +" Version: %(version)s\n" +" \n" +" Interface par Chris 'Kiv' MacLeod\n" +" Miner poclbm original par m0mchil\n" +" Rrpcminer original par puddinpop\n" +" \n" +" Trouvez le code source sur GitHub:\n" +" https://github.com/Kiv/poclbm\n" +" \n" +" Si ce logiciel vous plaît aidez à son développement\n" +" en donnant à :\n" +" \n" +" %(address)s\n" +" \n" +" Chaque Bitcoin donné compte et nous motive\n" +" pour continuer le travail sur ce logiciel.\n" +" \n" +" Traduction par Florian Cramoisan. \n" +" Signalez toute erreur de traduction à florian.cramoisan@gmail.com.\n" +"\n" +"\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Non démarré" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Démarrage..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Arrêté" + +#: guiminer.py:114 +msgid "Paused" +msgstr "En pause" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Commencer le minage!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Arrêter de miner!" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Raffraîchir la répartition" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Erreur de connection" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Nom d'utilisateur:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Mot de passe:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Quitter le programme" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Afficher la boîte de dialogue À Propos" + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Connexion en cours..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Requête de répartition : %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Réponse du serveur: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Miner" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Vitesse" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Accepté" + +# Pas totalement sur pour stale, donc si quelqu'un a une idée... +# Je suis ouvert à toute correction vous pouvez me joindre à l'adresse florian.cramoisan@gmail.com +# Cordialement Florian Cramoisan +#: guiminer.py:307 +msgid "Stale" +msgstr "Périmé (Stale)" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Démarrer/Arrêter" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Démarrage auto" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Mettre tout en pause" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Restaurer" + +#: guiminer.py:396 +msgid "Close" +msgstr "Fermer" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Démarrage de l'écoute de \"%s\" " + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Écouteur pour \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Arrêt de l'écoute de \"%s\" " + +#: guiminer.py:516 +msgid "Server:" +msgstr "Serveur:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Site Web:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Chemin :" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Hôte:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Périphérique:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Aucun périphérique OpenCL" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Paramètres supplémentaires:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Répartition: " + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Se retirer" + +#: guiminer.py:705 +msgid "Default" +msgstr "Défaut" + +#: guiminer.py:756 +msgid "Start" +msgstr "Démarrer" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Arrêter" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Problème lors de la connexion" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Execution de la commande: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Difficulté 1 hash: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blocs: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Partages: %d accepté" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d est invalide" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "Dernière modification le %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Serveur auquel se connecter. Chaque serveur à des différentes taxes et options.\n" +"Regardez leur site pour plus d'informations." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Site web du serveur selectionné. Cliquez pour le visiter" + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Périphériques OpenCL Disponibles." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Adresse de l'hôte, sans le préfixe http://." + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Port du serveur. Habituellement 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Nom d'uilisateur du miner.\n" +"Peut différer du nom d'utilisateur de votre compte.\n" +"Exemple: Kiv.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Mot de passe du miner.\n" +"Peut différer du mot de passe de votre compte." + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Paramètres supplémentaires à passer au miner.\n" +"Pour les ATI Radéon HD série 5xxx utiliser -v -w128 afin d'optimiser le rendement.\n" +"Pour les autres cartes, consultez le forum." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 +#: guiminer.py:1291 +#: guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "" + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s confirmé" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s n'a pas été confirmé" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Mauvaise réponse du serveur." + +#: guiminer.py:1295 +#: guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Retiré" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "Aucun enregistrement requis, entrez seulement une adresse et cliquez sur Démarrer" + +#: guiminer.py:1488 +msgid "Address:" +msgstr "&Adresse électronique :" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Votre adresse de réception des bitcoins.\n" +"Example: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Votre nom d'utilisateur de miner (pas celui de votre compte). \n" +"Example:kiv.GPU" + +#: guiminer.py:1508 +#: guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Votre mot de passe de miner (pas celui de votre compte)." + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Votre nom d'utilisateur de miner. \n" +"Example:kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "L'adresse mail avec laquelle vous vous êtes enregistré." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Email:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Renommer..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Renommer le miner" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Nouveau miner OpenCL..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "" + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "" + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "N&ouveau miner..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "Nouveau miner" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Sauver les paramètres" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Sauver vos paramètres" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Charger les paramètres" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Charger des paramètres enregistrés" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Quitter" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Fichier" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Afficher le résumé" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Afficher le résumé pour tous les miners" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Afficher la console" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Afficher les logs de la console" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Affichage" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Créer un mot de passe solo..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Veuillez fournir un utilisateur/mot de passe pour le mining en solo" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Changer le chemin vers le client Bitcoin..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Chemin du Bitcoin officiel" + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Lancer le client bitcoin en tant que serveur" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Lancer le client Bitcoin officiel pour un minage solo." + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Outils solo" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Changer de langue..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Langue" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "Faire un Don" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "A propos" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Aide" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Erreur du chargement de l'icone de notification. L'exécution continue." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "Impossible de trouver OpenCL : impossible d'ajouter un miner OpenCL" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Nom du miner:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Nouveau miner" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Sans titre" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Miner externe (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Choisissez un miner externe:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Miner externe non supporté %(filename)s. Les miners actuellement supportés sont: %(supported)s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Miner non supporté" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Voulez-vous sauvegarder les modifications ?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Sauvegarder" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Sauvegarde: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Impossible d'écrire la sauvegarde dans le fichier %s.\n" +"Vérifiez l'emplacement." + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Echec de la sauvegarde" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profil sauvé vers %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Sauvegarde effectuée" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Chargé: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Charger des profils arrêtera les miners en cours. Continuer ?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Charger un profil" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Choisir le chemin vers Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "&A propos" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Fermer le miner l'arrêtera. Continuer ?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Fermer le miner" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Impossible de trouver bitcoin au chemin %s. Vérifiez que le chemin a bien été paramétré." + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Erreur de lancement" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." +msgstr "" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Lancement réussi." + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s Existe déjà. L'écraser ?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf existe déjà." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Entrez le mot de passe" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Succès" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "Écriture de la configuration bitcoin réussie." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Console" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Résumé" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Renommer le miner" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Renommer :" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Changer de langue" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Choisissez une langue (Requiert un redémarrage)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Coller le jeton ici)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Copier l'adresse dans le presse-papier" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Aucun périphérique OpenCL touvé." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Aucun périphérique OpenCL n'a été trouvé.\n" +" Si vous souhaitez seulement miner avec CPU ou CUDA, ignorez ce message.\n" +" Si vous souhaitez miner avec une carte ATI, vous devez installer ATI Stream\n" +" SDK (2.1 de préférence), sinon il se peut que votre GPU ne supporte pas OpenCL." + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "" + +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Cliquez sur le lien ci-dessous pour vous connecter et obtenir un jeton " +#~ "(API token). \n" +#~ "Ce jeton vous permettra de vérifier votre répartition de manière " +#~ "sécurisée.\n" +#~ "Pour se souvenir de ce jeton, sauvegardez les paramètres." + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Client lancé. Vous pouvez maintenant lancer un miner sur le serveur " +#~ "'solo'." diff --git a/guiminer_hu.po b/guiminer_hu.po new file mode 100644 index 0000000..5c3f61f --- /dev/null +++ b/guiminer_hu.po @@ -0,0 +1,785 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 23:10-0300\n" +"PO-Revision-Date: 2011-06-04 18:34+0100\n" +"Last-Translator: Underyx \n" +"Language-Team: Español\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"verzió: %(version)s\n" +"\n" +"GUI készítője: Chris 'Kiv' MacLeod\n" +"Eredeti poclbm bányászprogram készítője: m0mchil\n" +"Eredeti rpcminer bányászprogram készítője: puddinpop\n" +"\n" +"A forráskód elérhető GitHubon: https://github.com/Kiv/poclbm\n" +"\n" +"Ha hasznosnak találtad a programot, kérlek, adományozz a készítőnek:\n" +"%(address)s\n" +"\n" +"Egyetlen bitcoin is nagy motiváció a program továbbfejlesztésére.\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Nincs elindítva" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Indítás..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Leállítva" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Leállítva" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Bányászat indítása" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Bányászat leállítása" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Egyenleg frissítése" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Kapcsolódási hiba" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Felhasználónév:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Jelszó:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Kilépés a programból" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Névjegy megjelenítése..." + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Kapcsolódás..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Egyenleg lekérése: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "A szerver válasza: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Bányász" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Sebesség" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Elfogadva" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Érvénytelen" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Indítás/Leállítás" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Automatikus indítás" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Mind leállítása" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Visszaállítás" + +#: guiminer.py:396 +msgid "Close" +msgstr "Bezárás" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "\"%s\" elindult" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Üzenet - \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "\"%s\" leállt" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Szerver:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Weboldal:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Külső útvonal:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Szerver:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Eszköz:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Nincs OpenCL eszközöd" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Extra beállítások:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Egyenleg:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Visszavonás" + +#: guiminer.py:705 +msgid "Default" +msgstr "Alapértelmezett" + +#: guiminer.py:756 +msgid "Start" +msgstr "Indítás" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Leállítás" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Kapcsolódási problémák" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Futtatási parancs: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Nehézség 1 hash-ek: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blokkok: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Részblokkok: %d elfogadva" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d érvénytelen" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- legutóbbi ekkor: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"A használandó szerver. Különböző szervereknek különböző díjaik és funkcióik " +"vannak.\n" +"További információért nézd meg a weboldalukat." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "A kiválasztott szerver weboldala." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "A rendszered elérhető OpenCL eszközei." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Szerver címe, a http:// nélkül." + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "A szerver portja. Ez általában 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"A bányász felhasználóneve.\n" +"Lehet, hogy különbözik a fiókod felhasználónevétől.\n" +"Például: Kiv.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"A bányász jelszava.\n" +"Lehet, hogy különbözik a fiókod jelszavától.\n" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"A bányászprogramnak küldött extra beállítások.\n" +"Radeon HD 5xxx-es videokártyáknál használd azt, hogy -v -w128.\n" +"Más videokártyáknál nézz utána a fórumban (forum.bitcoin.org)." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Azonosítási kód visszautasítva a szerver által." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s visszaigazolt" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s nincs visszaigazolva" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Hibás válasz a szervertől." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Sikeres visszavonás" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"Nem kell regisztrálni - csak írd be a címed és nyomj az Indítás gombra." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Cím:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"A Bitcoin címed, amire a pénz érkezzen.\n" +"Például: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"A bányász felhasználóneve (nem a fiók felhasználóneve).\n" +"Például: Kiv.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "A bányász jelszava (nem a fiók jelszava)." + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"A bányász felhasználóneve. \n" +"Például: kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "Az e-mail cím, amivel regisztráltál" + +#: guiminer.py:1545 +msgid "Email:" +msgstr "E-mail cím:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Átnevezés..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Bányász átnevezése" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Új OpenCL bányász..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "" + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "" + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Új külső bányász..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Beállítások mentése" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Beállítások mentése" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Beállítások betöltése" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Elmentett beállítások betöltése" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Kilépés" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Fájl" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Összegzés megjelenítése" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Minden bányász összegsésének megjelenítése" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Konzol megjelenítése..." + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Konzolnaplók megjelenítése..." + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Nézet" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Szóló jelszó készítése..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Felhasználónév és jelszó beállítása szóló bányászathoz" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Bitcoin kliens helyének megadása..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Add meg a hivatalos Bitcoin kliens helyét" + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Bitcoin kliens indítása szerverként" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "" +"Szóló bányászathoz indítsd el a hivatalos Bitcoin bányászprogramot " +"szerverként" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Szóló eszközök" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Nyelv változtatása..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Nyelv" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "Adományok" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Névjegy" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Segítség" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Tálcaikon betöltése sikertelen; folytatás..." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "Az OpenCL nem található - nem lehet OpenCL bányászt indítani" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Bányász neve:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Új bányász" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Névtelen" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Külső bányászprogram (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Válaszd ki a külső bányászprogramot:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "A bányászprogram nem támogatott" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Elmented a változtatásokat?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Mentés" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Mentés:" + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Nem sikerült ide menteni: %s.\n" +"Ellenőrizd le hogy írható-e a mappa!" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Sikertelen mentés" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profil sikeresen elmentve ide: %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Sikeres mentés" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Betöltve: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "" +"Egy profil betöltése le fogja állítani a jelenleg futó bányászokat. Biztos " +"ezt akarod?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Profil betöltve" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Válaszd ki a Bitcoin.exe programfájlt" + +#: guiminer.py:1905 +msgid "About" +msgstr "Névjegy" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "A bányász bezárásával leállítod azt. Biztos bezárod?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Bányász bezárása" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "A Bitcoin nem található itt: %s. Biztos ez a helyes útvonal?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Indítás sikertelen" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Sikeres indítás" + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s már létezik. Felülírja?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "A bitcoin.conf fájl már létezik." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Írd be a jelszavad" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Sikerült" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "Bitcoin konfiguráció sikeresen megírva." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Konzol" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Összegzés" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Bányász átnevezése" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Átnevezés erre:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Nyelv változtatása" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Válassz nyelvet (a beállítás a program újraindításakor lép érvénybe)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Írd be ide a kódot)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Cím másolása vágólapra" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Nem található OpenCL eszköz." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Nem található OpenCL eszköz.\n" +"Ha csak CPU-val vagy CUDA-val akarsz bányászni, hagyd figyelmen kívül ezt az " +"üzenetet.\n" +"Ha ATI videokártyával akarsz bányászni, lehet, hogy fel kell telepítened az " +"ATI Stream SDK-t,\n" +"vagy pedig a videokártyád nem támogatja az OpenCL-t.\n" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Ne mutasd ezt többször" + +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Kattints a lenti linkre hogy a bányászcsapat oldalán kapj egy kódot.\n" +#~ "Ez a kód fogja lehetővé tenni, hogy a program lekérdezhesse az " +#~ "egyenleged.\n" +#~ "Mentsd el a program beállításait majd, hogy ne kelljen később újra " +#~ "beírnod a kódot." + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "A kliens sikeresen elindult. Most már elkezdhetsz bányászni úgy, hogy a " +#~ "szerver \"Szóló\"-ra van állítva." diff --git a/guiminer_it.po b/guiminer_it.po new file mode 100644 index 0000000..3862a00 --- /dev/null +++ b/guiminer_it.po @@ -0,0 +1,803 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:51-0300\n" +"PO-Revision-Date: 2011-05-20 00:00-0000\n" +"Last-Translator: MasterHunterHD \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"Versione GUIMiner: %(version)s\n" +"\n" +"GUI fatto da: Chris 'Kiv' MacLeod\n" +"Minatore poclbm originale fatto da: m0mchil\n" +"Minatore rpcminer originale fatto da: puddinpop\n" +"Traduzione In italiano fatta da: MasterHunterHD - Dovessero esserci " +"errori di traduzione, per favore inviatemi un PM. \n" +"\n" +"Codice originale & problemi disponibili su GitHub: https://github.com/Kiv/" +"poclbm\n" +"\n" +"Se ti è piacuto questo programma, per favore, aiuta lo sviluppo di questo " +"programma effetuando una donazione:\n" +"%(address)s\n" +"\n" +"Anche un solo BitCoin è apprezzato, e aiuta la motivazione\n" +"al lavoro e a lo sviluppo di nuove funzionalità.\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Non in funzione" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Inizializzando" + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Fermo" + +#: guiminer.py:114 +msgid "Paused" +msgstr "In Pausa" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Inizia lo scavo!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Ferma lo scavo" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Aggiorna il saldo" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Errore di connessione" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Username:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Password:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Chiudi il programma" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Informazioni" + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Connettendo..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Aggiornando il saldo: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Il server ha risposto: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Minatore" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Velocità" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Accettato" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Inutilizzabile" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Inizia/Ferma" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Autoinizializzazione" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Pausa tutto" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Ripristina" + +#: guiminer.py:396 +msgid "Close" +msgstr "Chiudi" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Ascolto per \"%s\" iniziato" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Ascolto per \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Fermando ascolto per \"%s\" " + +#: guiminer.py:516 +msgid "Server:" +msgstr "Server:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Sito Internet:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Localizzazone est. :" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Host:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Porta:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Dispositivo:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Nessun dispositivo OpenCL" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Opzioni (facoltativo):" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Saldo:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Ritirare dal saldo" + +#: guiminer.py:705 +msgid "Default" +msgstr "Opzione Standard" + +#: guiminer.py:756 +msgid "Start" +msgstr "Inizia" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Ferma" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Problemi di Connessione" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Iniziando il commando: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Difficoltà 1 parte: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blocchi: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Scambi: %d aceptadas" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d inutilizzabile/invalidi" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- ultimo: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Il server a la quale connettersi. Le rate ed i vantaggi variano a secondo " +"dei server .\n" +"Verifica il loro sito internet per più informazioni." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Sito internet del server in cui sei connesso. Clicca per visitarlo." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Dispositivi OpenCL disponibili sul sistema." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Sito internet del server, senza il prefisso http://" + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "La porta del Server. Normalmente 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Il username dell'lavoratore.\n" +"Puo essere diverso dal username del conto.\n" +"Esempio: Kiv.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"La password dell'lavoratore\n" +"Puo essere diverso dalla password del conto." + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Opzioni extra da trasmettere al minatore.\n" +"Per le Radeon HD 5xxx series usa: -v -w128 per migliori risultati.\n" +"Per altre cartine grafiche, consultare il forum. (forum.bicoin.org)" + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Codice di autenticazione rifiutato dal server." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s confermato" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s non confermato" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "" + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Retirada de saldo correcta" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"Nessuna registratione necessaria - Inserire solo un indirizzo BitCoin e " +"cliccare su Inizia." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Indirizzo:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"L'indirizzo per ricevere i BitCoin.\n" +"Esempio: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "la password dell'lavoratore (non la password dell'conto).\n" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Il username dell'lavoratore. \n" +"Esempio: kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "L'indirizzo e-mail con la quale ti sei registrato" + +#: guiminer.py:1545 +msgid "Email:" +msgstr "E-mail:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Rinomina" + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Rinomina questo minatore" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Nuovo minatore OpenCL" + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Creare un nuovo minatore OpenCL (Opzione Standard per cartine ATI)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Creare un nuovo minatore Phoenix (per qualche cartine ATI)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Nuovo minatore Phoenix..." + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Creare un nuovo minatore CUDA (per cartine NVIDIA)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Nuovo minatore CUDA..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Creare un nuovo minatore Ufasoft (per processori)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Nuovo minatore Ufasoft CPU..." + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" +"Creare un nuovo minatore personalizzato (richiede un programma esterno)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Nuovo minatore di altro &tipo" + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Salva impostazioni" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Save le tue impostazioni" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Carica impostazioni" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Carica impostazioni salvate" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Chiudi" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&File" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Mostra Riassunto" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Mostra riassunto di tutti i minatori" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Mostra console" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Mostra il registro della console" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Visualizzazione" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Creare password per minare in solo" + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Configurare una username/password per minare in solo" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Imposta localizzazione dell'cliente BitCoinÉ" + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Imposta la localizzazione dell'cliente ufficiale BitCoin" + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Inizializza il cliente BitCoin in modo server" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "" +"Inizializza il cliente BitCoin official in modo server, per permettere di " +"minare in modo solo" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Utilità Solo" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Inizia &minimizzato" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Esegui il programma minimizzato." + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Opzioni" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Cambia la lingua" + +#: guiminer.py:1618 +msgid "Language" +msgstr "Linguaggio" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&Dona 99 centesimi" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" +"Dona l'equivalente di $0.99 USD in BitCoins per aiutare lo sviluppo di " +"GUIMiner." + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Dona" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Informazioni" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Aiuto" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Impossibile caricare l'icona della taskbar; continuando." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "" +"OpenCL non  stato trovato - Impossibile aggiungere un minatore di tio OpenCL" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Nomina questo minatore:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Nuovo minatore" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Senza nome" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Minatore Esterno (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Seleziona minatore esterno:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" +"Minatore esterno non supportato %(filename)s. Quelli supportati sono: %" +"(supported)s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Minatore non supportato" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Salvare i cambiamenti?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Salva" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Salvando: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Impossibile modificare il file %s.\n" +"Verificare che il file pu˜ essere modificato." + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Impossibile Salvare" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "I Profili sono stati salvati con successo a %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Salvato con successo" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Caricato: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Caricare un profilo, non fermerˆ nessun minatore. Continuare?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Carica profilo" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Imposta la locazione di Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "Informazioni" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Chiudendo questo minatore, il suo scavo sarà fermato. Continuare?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Chiudi minatore" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "" +"Impossibile trovare Bitcoin aa %s. La localizzazione del file è coretta ?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Inizializzazione fallita" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Inizializzato con successo." + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s esiste di già. Rimpiazzare?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf esiste di già." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Inserire password" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Successo" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "BitCoin.conf impostato con successo." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Console" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Riassunto" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Rinomina minatore" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Rinomina a:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Cambia lingua" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "" +"Impostare la lingua (un riavvio dell'programma è necessario per potere fare " +"effetto.)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Inserici il codice API qui)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Copiare l'indirizzo" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Nessun dispositivo OpenCL trovato." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Nessun dispositivo OpenCL trovato.\n" +" Per minare solo con CUDA o con il processore, ignorare questo messagio. Per " +"minare con una cartina grafica AT,  necessario installare il ATI Stream\n" +" SDK, o la cartina forse non supporta OpenCL." + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Non fare più vedere questo messagio" + +#~ msgid "Bad response from servon confeer." +#~ msgstr "Risposta invalida dall'server." + +#~ msgid "Your miner username (not your account username).cExample: Kiv.GPU" +#~ msgstr "" +#~ "Il username dell'lavoratore (non il username dell'conto).\n" +#~ "Esempio: Kiv.GPU" + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Il client BitCoin  stato iniziato con successo. è possibile adesso, " +#~ "inizializzare un minatore 'solo'." + +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Clicca sul link qui sotto, per potere effettuare un login sulla miniera " +#~ "Bitcoin e poi ottenere un codice speicale. \n" +#~ "Questo codice API permette di vedere il saldo, in completa sicurezza.\n" +#~ "Per salvare questo codice API,  necessario salvare le impostazioni del " +#~ "minatore." + +#~ msgid "%s mining!" +#~ msgstr "%s scavando!" diff --git a/guiminer_nl.po b/guiminer_nl.po new file mode 100644 index 0000000..0904411 --- /dev/null +++ b/guiminer_nl.po @@ -0,0 +1,779 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-11-01\n" +"PO-Revision-Date: 2011-13-13 00:00-0000\n" +"Last-Translator: Blauwbek \n" +"Language-Team: Nederlands\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"Versie: %(version)s\n" +"\n" +"GUI gemaakt door Chris 'Kiv' MacLeod\n" +"Oorspronkelijke poclbm Miner door m0mchil\n" +"Oorspronkelijke rpcminer door puddinpop\n" +"\n" +"Voor de broncode en verdere hulp, zie GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"Overweeg een donatie als dit programma je geholpen heeft\n" +"Deze kan je naar volgend adres sturen:\n" +"\n" +"%(address)s\n" +"\n" +"Elke bitcoin wordt gewaardeerd en motiveert\n" +"tot verdere ontwikkeling.\n" +"\n" +"\n" +"Nederlandse vertaling door:\n" +"Blauwbek (nl-guiminer@hotmail.com)\n" +"\n" +"Steun Blauwbek:\n" +"1KtyDeGanGyH6ze5FUxxAevNWhGKqsmxoS\n" +"\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Niet gestart" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Wordt gestart..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Gestopt" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Gepauzeerd" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Start minen!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Stop met minen" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Vraag saldo op" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Verbindingsprobleem" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Gebruikersnaam:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Wachtwoord:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Programma afsluiten" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Over..." + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Aan het verbinden..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Opvraagt saldo op: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Server reageerde met: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Miner" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Snelheid" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Geaccepteerd" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Verlopen" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Start/Stop" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Autostart" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Alles pauzeren" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Herstel" + +#: guiminer.py:396 +msgid "Close" +msgstr "Sluiten" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Miner \"%s\" gestart" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Miner \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Miner \"%s\" sluit af" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Server:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Website:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Ext. Pad:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Host:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Apparaat:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Geen OpenCL onderdelen" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Extra commando's:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "CPU's In gebruik" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Saldo:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Intrekken" + +#: guiminer.py:705 +msgid "Default" +msgstr "Standaard" + +#: guiminer.py:756 +msgid "Start" +msgstr "Start" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Stop" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Verbindingsproblemen" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Voert uit: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Moeilijkheid 1 hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blokken: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Shares: %d geaccepteerd" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d verlopen/ongeldig" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- recentste: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Server om mee te verbinden. Kosten en mogelijkheden verschillen per server.\n" +"Kijk op de bijbehorende website voor de volledige informatie" + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Website van de geselecteerde server. Klik om er naar toe te gaan" + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Beschikbare OpenCL apparaten." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Host adres, zonder het http:// voorvoegsel" + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Serverport. Dit is normaal gesproken 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Miner's gebruikersnaam.\n" +"Kan verschillen van uw accountnaam.\n" +"Bijvoorbeeld: Blauwbek.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Miner's wachtwoord.\n" +"Kan verschillen van uw account's wachtwoord.\n" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Extra commando's voor de miner:\n" +"Radeon HD 5xxx gebruikers gebruik: -v -w128. voor optimale resultaten\n" +"Kijk voor andere videokaarten op het forum" + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" +"Aantal cores gebruikt voor minen. \n" +"Het uitvinken van enkele cores kan het processorgebruik verminderen." + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Authenticatie afgewezen door de server." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s bevestigd" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s onbevestigd" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Onverwachte reactie van de server." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Intrekken OK" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"Geen registratie nodig - typ een adres en klik op start." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Adres:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Je ontvangadres voor Bitcoins\n" +"Bijvoorbeeld: 1FVYXH5xuP9w4656hMVdXJvZBSLsQtbxKT" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Je miner's gebruikersnaam (niet je accountnaam).\n" +"Bijvoorbeeld: Blauwbek.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Je miner's wachtwoord (niet je account's wachtwoord).\n" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Je miner's gebruikersnaam. \n" +"Bijvoorbeeld: kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "Het emailadres waarmee je geregistreerd bent." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Email:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Hernoemen..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Hernoem deze miner..." + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Nieuwe OpenCL miner..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Creer een nieuwe OpenCL miner (standaard voor ATI/AMD kaarten)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Creer een nieuwe Phonix miner (voor sommige ATI/AMD kaarten)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Nieuwe Phoenix miner..." + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Creer een nieuwe CUDA miner (voor nVidia kaarten)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Nieuwe CUDA miner..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Creer een nieuwe Ufasoft miner (voor CPUs)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Nieuwe Ufasoft CPU miner..." + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "Creer een nieuwe eigen miner (extern programma nodig)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Nieuwe andere miner..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "&Nieuwe miner" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Sla instellingen op" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Instellingen opslaan" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Laad instellingen" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Laad opgeslagen instellingen" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Sluiten" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Bestand" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Weergeef overzicht" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Weergeef overzicht van alle miners" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Console weergeven" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Console log's weergeven" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Weergeef" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Creer een solo wachtwoord..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Creer een gebruiker/wachtwoord voor solo minen" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Stel Bitcoin client locatie in..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Stel locatie officile Bitcoin client in" + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Start Bitcoin client als server" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Start de officiele Bitcoin client als een server voor solo mining" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Solo functies" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Start &geminimaliseerd" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Start de GUI geminimaliseerd in de startbalk" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Opties" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Verander taal..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Taal" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&Doneer 99cent..." + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "Doneer $0.99 USD aan Bitcoins om de ontwikkeling van GUIMiner te ondersteunen" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Doneer" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Over..." + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Help" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Taakbalk pictogram laden mislukt; gaat door" + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL niet gevonden, kan geen OpenCL miner toevoegen" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Naam voor deze miner:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Nieuwe Miner" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Naamloos" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Externe miner (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Selecteer externe miner:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Niet ondersteunde miner %(filename)s. Ondersteund zijn: %(supported)s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Miner is niet ondersteund" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Veranderingen opslaan?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Opslaan" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Slaat op: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"%s kon niet worden opgeslagen.\n" +"Controleer of de lokatie niet op alleen lezen staat!" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Opslaan mislukt" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profielen opgeslagen in %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Opslaan gelukt" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Geladen: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Das Laden von Profilen stoppt alle aktiven Miner. Weiter?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Laad profiel" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Pad naar Bitcoin.exe selecteren" + +#: guiminer.py:1905 +msgid "About" +msgstr "Over" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "De miner stopt bij het sluiten. Doorgaan?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Sluit miner" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Kon Bitcoin niet vinden in %s. Klopt deze locatie?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Opstarten mislukt" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "Bitcoin zal nu starten als server.\n" +"Als deze alle voorbereidingen heeft gedaan zal je kunnen starten in solo modus" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Opstarten gelukt" + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "" +"%s bestaat al. Overschrijven?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf bestaat al." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Wachtwoord invoeren" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Succes" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "Bitcoin instellingen succesvol opgeslagen" + +#: guiminer.py:2008 +msgid "Console" +msgstr "Console" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Overzicht" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Miner hernoemen" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Hernoem naar:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Verander taal" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Verander taal (herstart nodig voor volledig effect)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "Klik op onderstaande link om in te loggen in de pool en je code te krijgen.\n" +"Deze code laat je veilig je saldo controleren.\n" +"Sla deze code op in je minerinstellingen om hem in het vervolg te onthouden" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Plak code hier)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Kopier adres naar het plakbord" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Geen OpenCL onderdelen gevonden" + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Geen OpenCL onderdelen gevonden.\n" +"Als je wilt minen met je CPU of met CUDA kan je dit bericht nergeren.\n" +"Als je wilt minen met ATI/AMD kaarten kan het zijn dat je de ATI Stream\n" +" SDK moet installeren.\n" +"anders zal je kaart OpenCL niet ondersteunen.\n" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Laat dit bericht niet nog een keer zien" \ No newline at end of file diff --git a/guiminer_pt.po b/guiminer_pt.po new file mode 100644 index 0000000..2ec3a55 --- /dev/null +++ b/guiminer_pt.po @@ -0,0 +1,772 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:51-0300\n" +"PO-Revision-Date: 2012-11-28 19:35-0300\n" +"Last-Translator: Matheus Macabu \n" +"Language-Team: Portuguese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"Versão: %(version)s\n" +"\n" +"GUI por Chris 'Kiv' MacLeod\n" +"Minerador poclbm original por m0mchil\n" +"Minerador rpcminer original por puddinpop\n" +"\n" +"Obtenha o código-fonte ou reporte erros em GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"Se tiveres apreciado este software, suporte seu desenvolvimento\n" +"através de doações para:\n" +"\n" +"%(address)s\n" +"\n" +"Até mesmo um único Bitcoin é apreciado e ajuda a motivar\n" +"em trabalhos futuros neste software.\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Não iniciado" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Iniciando..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Parado" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Pausado" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Iniciar mineração!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Parar mineração" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Atualizar saldo" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Erro de conexão" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Usuário:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Senha:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Sair do programa" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Sobre..." + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Conectando..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Solicitando saldo: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Servidor respondeu: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Minerador" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Velocidade" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Aceite" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Expirado" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Iniciar/Parar" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Início auto." + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Pausar todos" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Restaurar" + +#: guiminer.py:396 +msgid "Close" +msgstr "Fechar" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Minerador para \"%s\" iniciado" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Minerador para \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Minerador para \"%s\" encerrando" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Servidor:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Sítio web:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Caminho Externo:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Servidor:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Porta:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Dispositivo:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Não há dispositivos OpenCL" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Opções extras:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "Afinidade da CPU:" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Saldo:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Retirar saldo" + +#: guiminer.py:705 +msgid "Default" +msgstr "Padrão" + +#: guiminer.py:756 +msgid "Start" +msgstr "Iniciar" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Parar" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Problemas de conexão" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Executando comando: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Dificuldade 1 hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blocos: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Tarefas: %d aceitadas" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d expirada/inválida" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- última: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Servidor a se conectar. Diferentes servidores possuem diferentes taxas e funcionalidades.\n" +"Visite seus sítios para mais informações." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Sítio do servidor selecionado atualmente. Clique para visitar." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Dispositivos OpenCL disponíveis em seu sistema." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Endereço do servidor, sem o prefixo http://" + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Porta do servidor. Geralmente 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"O nome do minerador.\n" +"Pode ser diferente do nome de sua conta.\n" +"Exemplo: MeuMineradorBitCoin.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"A senha do minerador.\n" +"Pode ser diferente da senha de sua conta.\n" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Opções extras a serem passadas ao minerador.\n" +"Para a série Radeon HD 5xxx utilize -v -w128 para melhores resultados.\n" +"Para outras placas de vídeo consulte o fórum." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" +"Núcleos da CPU usados para mineração.\n" +"Desmarcar alguns núcleos pode reduzir alto uso de CPU em alguns sistemas." + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Código de autenticação rejeitado pelo servidor." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s confirmado" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s não confirmado" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Resposta incorreta do servidor." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Retirada de Saldo OK" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "Registrar-se não é obrigatório - apenas entre com um endereço e pressione Iniciar." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Endereço:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Sua conta para recebimento de Bitcoins.\n" +"Exemplo: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Usuário do minerador, (não é o usuário da sua conta).\n" +"Exemplo: CarteiraBitCoins.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Senha do minerador (não é a senha da sua conta).\n" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"O usuário do minerador. \n" +"Exemplo: CarteiraBitcoins@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "O e-mail no qual você registrou-se." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "E-mail:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Renomear..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Renomear este minerador" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Novo minerador OpenCL..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Criar um novo minerador OpenCL (placas gráficas AMD)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Criar um novo minerador Phoenix (algumas placas gráficas AMD)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Novo minerador Phoenix" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Criar um novo minerador CUDA (placas gráficas NVIDIA)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Novo minerador CUDA..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Criar um novo minerador Ufasoft (para CPUs)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Novo minerador Ufasoft CPU" + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "Criar um novo minerador personalizado (para programas externos)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Novo minerad&or diferente..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "&Novo minerador" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Salvar configurações" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Salve suas configurações" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Carregar configurações" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Carregar configurações salvas" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Sair" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Arquivo" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Exibir sumário" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Exibir sumário de todos os mineradores" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Exibir console" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Exibir registros do console" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Visualizar" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Criar usuário/senha..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Configurar um usuário/senha para mineração em modo 'solo'" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Configurar diretório do cliente Bitcoin..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Configurar o local do cliente official de Bitcoin." + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Executar o client Bitcoin como servidor" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Executar o client Bitcoin como servidor para mineração em modo 'solo'" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Utilidades do Modo Solo" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Iniciar &minimizado" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Iniciar a interface minimizada na bandeja." + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Opções" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "Modifi&car idioma..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Idioma" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&Doar 99 centavos..." + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "Doar $0.99 USD de Bitcoins para apoiar o desenvolvimento do GUIMiner" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Doações" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Sobre" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Ajuda" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Erro ao carregar o ícone na barra de ferramentas; continuando." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL não encontrado - não é possível adicionar um minerador OpenCL" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Nome deste minerador:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Novo minerador" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Sem nome" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Minerador externo (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Selecionar um minerador externo:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Minerador externo %(filename)s não é compatível. Modelos compatíveis: %(supported)" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Mineirador não compatível" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Salvar todas as mudanças?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Salvar" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Salvando: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Não foi possível salvar o arquivo %s.\n" +"Verifique se a localização permite escritura no arquivo." + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Erro ao salvar" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Perfis salvos em %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Salvo com sucesso" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Carregado: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Carregar os perfis parará todos os mineradores. Prosseguir?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Carregar perfil" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Selecionar caminho para Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "Sobre" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Fechar este minerador fará pará-lo. Prosseguir?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Fechar minerador" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Não foi possível encontrar Bitcoin em %s. O caminho está correto?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Falha ao iniciar" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" +"O client Bitcoin irá agora inicar em modo servidor.\n" +"Uma vez que conectada a rede e descarregada a cadeia de blocos, você pode iniciar " +"um minerado no modo 'solo'." + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Executado com sucesso." + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s já existe. Sobrescrever?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf já existe." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Introduza a senha" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Sucesso" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf escrito corretamente." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Console" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Sumário" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Renomear minerador" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Renomear para:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Moidificar idioma" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Escolher idioma (é necessário reiniciar para que as ações tomem efeito)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"Clique no link abaixo para logar no pool e receber seu token especial.\n" +"Este token permite checar seu saldo de maneira segura.\n" +"Para lembrar este token para depois, salve as configurações de seu minerador." + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Colar autenticação/token aqui)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Copiar endereço para área de transferência" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Não foram encontrados dispositivos OpenCL." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Não foram encontrados dispositivos OpenCL.\n" +" Se você deseja minerar usando CPU ou CUDA, você pode ignorar esta mensagem.\n" +" Se você deseja minerar usando placa gráfica AMD, você deve instalar o ATI " +"Stream\n" +" SDK, ou sua GPU provavelmente não irá suportar OpenCL." + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Não mostrar esta mensagem novamente" diff --git a/guiminer_ru.po b/guiminer_ru.po new file mode 100644 index 0000000..a8514d1 --- /dev/null +++ b/guiminer_ru.po @@ -0,0 +1,793 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" +"PO-Revision-Date: 2011-06-10 12:42-0400\n" +"Last-Translator: Chris MacLeod \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"Версия: %(version)s\n" +"\n" +"Автор GUI: Chris 'Kiv' MacLeod\n" +"Автор poclbm miner: m0mchil\n" +"Автор rpcminer: puddinpop\n" +"\n" +"Исходники и файлы доступны на GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"Если вам понравилась программа - поддержите её развитие\n" +"переведите деньги на:\n" +"\n" +"%(address)s\n" +"\n" +"Даже один битцент полезен, и помогает мотивировать\n" +"дальнейшую работу над этой программой.\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Не запущен" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Запускается..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Остановлен" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Пауза" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Старт!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Стоп!" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Проверить баланс" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Ошибка связи" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Логин:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Пароль:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Выход из программы" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Показать информацию о программе" + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Соединяемся..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Запрашивается баланс: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Ответ сервера: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Генератор" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Скорость" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Принято" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Сбой" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Старт/Стоп" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Автостарт" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Приостановить все" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Восстановить" + +#: guiminer.py:396 +msgid "Close" +msgstr "Закрыть" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Прослушивание \"%s\" начато" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Прослушивание \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Прослушивание \"%s\" завершается" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Сервер:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Вэбсайт:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Вншн. путь:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Хост:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Порт:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Устройство:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Нет OpenCL устройств" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Доп. параметры:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Баланс:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Снять деньги" + +#: guiminer.py:705 +msgid "Default" +msgstr "По умолчанию" + +#: guiminer.py:756 +msgid "Start" +msgstr "Старт" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Стоп" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Сбой связи" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Выполняется команда: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Хэши сложности 1: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Блоки: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Доли: %d приняты" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d дубли/сбойные" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- последняя в %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый " +"процент.\n" +"Подробней смотрите на их сайтах." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Вэбсайт выбранного сервера. Нажмите чтобы открыть." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "OpenCL устройства, доступные на вашей системе." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Адрес Хоста, без http:// префикса." + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Порт сервера. Обычно 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Логин генератора (miner username).\n" +"Может отличаться от логина вашего аккаунта.\n" +"Пример: Kiv.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Пароль генератора (miner password).\n" +"Может отличаться от пароля вашего аккаунта." + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Доп. параметры передаваемые генератору.\n" +"Для лучших результатов на Радеонах HD 5xxx серий, под OpenCL, используйте -v " +"-w128.\n" +"По поводу других видеокарт - проверьте форум." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Код авторизации не принят сервером" + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s подтверждено" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s не подтверждено" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Неправильный ответ сервера." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Выплата произведена" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "Регистрации не требуется - введите ваш адрес и нажмите Старт." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Адрес:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Ваш счет для получения Биткоинов.\n" +"Пример: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Логин генератора (miner username), может отличаться от логина аккаунта.\n" +"Пример: Kiv.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Пароль генератора, может отличаться от пароля аккаунта ." + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Логин генератора. \n" +"Например: kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "Эл. почта под которой вы зарегистрировались." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Эмэйл:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Переименовать..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Переименовать этот генератор" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Создать OpenCL генератор..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Создать новый OpenCL генератор (по умолчанию для карт ATI)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Создать новый Phoenix генератор (для некоторых ATI карт)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Создать Phoenix генератор..." + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Создать CUDA генератор (для карт NVIDIA)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Создать CUDA генератор..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Создать Ufasoft генератор (для CPU)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Создать Ufasoft генератор..." + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" +"Создать генератор использующий другой движок (требуется дополнительный софт)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Создать &другой генератор..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "&Новый генератор" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Сохранить настройки" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Сохранить текущие настройки генераторов" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Загрузить настройки" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Загрузить сохраненные настройки генераторов" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Выход" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Файл" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Показать итоги" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Показать таблицу со всеми генераторами" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Показать консоль" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Показать лог консоли" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Вид" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Создать соло пароль..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Настроить логин/пароль для генерирования в одиночку (без пула)" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Путь к клиенту Bitcoin..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Указать путь к официальному клиенту Bitcoin." + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Запустить Bitcoin клиент как сервер" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "" +"Запустить официальный Bitcoin клиент в режиме сервера для одиночного " +"генерирования" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Соло режим" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Запускать в трее" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Запускает GUI свернутым в трей" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Настройки" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Изменить язык..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Язык" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&99 центов автору" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" +"Пожертвовать автору сумму BTC, равную по курсу 0,99$, чтобы поддержать " +"развитие GUIminer" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Помочь" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&О программе" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Помощь" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Не удалось загрузить иконку таскбара; продолжаю...." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL не обнаружен - нельзя добавить OpenCL генератор" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Назовите генератор:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "&Новый генератор" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Без имени" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Внешний генератор (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Выберите внешний генератор:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" +"Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)" +"s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Генератор не поддерживается" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Сохранить настройки?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Сохранить" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Сохранение: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Не могу записать файл %s.\n" +"Проверьте, не указан ли для целевой папки параметр \"только для чтения" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Сохранение не удалось" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Профили успешно сохранены в %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Сохранение успешно" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Загружено: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Загрузка настроек остановит все текущие генераторы. Продолжить?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Загрузить настройки" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Указать расположение Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "О программе" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Закрытие генератора остановит его. Продолжить?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Закрыть генератор" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Не могу найти Bitcoin в %s. Путь указан правильно?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Сбой запуска" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Успешно запущено." + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s Уже существует. Перезаписать?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf уже существует." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Введите пароль" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Успешно" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf успешно записан." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Консоль" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Итог" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Переименовать генератор" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Переименовать в:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Изменить язык" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Выбрать другой язык (требуется перезапуск программы)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Копируйте код сюда)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Копировать адрес в буфер обмена" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Не обнаружено OpenCL устройств." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Не обнаружено OpenCL устройств.\n" +"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это " +"сообщение.\n" +"Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" +"SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Больше не показывать это сообщение." + +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API " +#~ "token). \n" +#~ "Этот код позволяет проверять состояние баланса.\n" +#~ "При сохранении настроек, код сохраняется." + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" " +#~ "сервер." + +#~ msgid "%s mining!" +#~ msgstr "%s генерации" diff --git a/guiminer_zh.po b/guiminer_zh.po new file mode 100644 index 0000000..9a60f73 --- /dev/null +++ b/guiminer_zh.po @@ -0,0 +1,788 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" +"PO-Revision-Date: \n" +"Last-Translator: Dean Lee \n" +"Language-Team: Chinese Simp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Basepath: /\n" +"X-Poedit-Language: Chinese\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"版本: %(version)s\n" +"\n" +"GUI 作者 Chris 'Kiv' MacLeod\n" +"原 poclbm miner 作者 m0mchil\n" +"原 rpcminer 作者 puddinpop\n" +"\n" +"可在 GitHub 获取源码或提交问题:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"如果您喜欢本软件,请支持其开发\n" +"捐助请发往:\n" +"\n" +"%(address)s\n" +"\n" +"每一分 Bitcoin 都欢迎,\n" +"它们将推动本软件的进一步开发。\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "未启动" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "正在启动..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "已停止" + +#: guiminer.py:114 +msgid "Paused" +msgstr "已暂停" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "开始采矿!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "停止采矿" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "刷新余额" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "连接错误" + +#: guiminer.py:119 +msgid "Username:" +msgstr "用户名:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "密码:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "退出本程序" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "显示关于窗口" + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "正在连接..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "正在请求余额: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "服务器回复: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "采矿器" + +#: guiminer.py:305 +msgid "Speed" +msgstr "速度" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "已接受" + +#: guiminer.py:307 +msgid "Stale" +msgstr "过时" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "启动/停止" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "自动启动" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "全部暂停" + +#: guiminer.py:395 +msgid "Restore" +msgstr "恢复" + +#: guiminer.py:396 +msgid "Close" +msgstr "关闭" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "\"%s\" 监听器已启动" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "\"%(name)s\" 监听器已启动: %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "\"%s\" 监听器正在关闭" + +#: guiminer.py:516 +msgid "Server:" +msgstr "服务器:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "网站:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "外部路径:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "主机:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "端口:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "设备:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "无 OpenCL 设备" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "附加参数:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "CPU 关联:" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "余额:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "取款" + +#: guiminer.py:705 +msgid "Default" +msgstr "默认" + +#: guiminer.py:756 +msgid "Start" +msgstr "启动" + +#: guiminer.py:756 +msgid "Stop" +msgstr "停止" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "连接问题" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "正在运行命令: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "难度为 1 的 hash: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "块: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "贡献: %d 已接受" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d 过时/无效" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- 更新于 %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"要连接到的服务器。不同的服务器有不同的费用与功能。\n" +"完整信息请查看其网站。" + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "当前所选服务器的网站。点击可访问。" + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "您系统中可用的 OpenCL 设备。" + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "主机地址,无需 http:// 前缀。" + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "服务器端口。通常为 8332。" + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"采矿器的用户名。\n" +"可以与账号用户名不同。\n" +"示例: Kiv.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"采矿器的密码。\n" +"可以与账号密码不同。" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"要传送给采矿器的附加参数。\n" +"Radeon HD 5xxx 系列可使用 -v -w128 获取最佳效果。\n" +"其他显卡的参数参见论坛。" + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" +"用于采矿的 CPU 核心。\n" +"取消选中部分核心可降低部分系统的高额 CPU 使用。" + +#: guiminer.py:1197 +#: guiminer.py:1291 +#: guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "身份认证令牌被服务器拒绝。" + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s 已确认" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s 未确认" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "服务器响应错误。" + +#: guiminer.py:1295 +#: guiminer.py:1316 +msgid "Withdraw OK" +msgstr "取款成功" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "无需注册 - 只需输入地址并按“启动”。" + +#: guiminer.py:1488 +msgid "Address:" +msgstr "地址:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"您接收 Bitcoins 的地址。\n" +"例如: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"您的采矿器用户名 (不是账号用户名)。\n" +"示例: Kiv.GPU" + +#: guiminer.py:1508 +#: guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "您的采矿器密码 (不是账号密码)。" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"您的采矿器用户名。\n" +"示例: kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "您注册时使用的 e-mail 地址。" + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Email:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "重命名(&R)..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "重命名该采矿器" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "新建 OpenCL 采矿器(&N)..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "创建一个新的 OpenCL 采矿器 (默认为 ATI 显卡)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "创建一个新的 Phoenix 采矿器 (部分 ATI 显卡)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "新建 Phoenix 采矿器..." + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "创建一个新的 CUDA 采矿器 (NVIDIA 显卡)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "新建 CUDA 采矿器..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "创建一个新的 Ufasoft 采矿器 (CPU)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "新建 Ufasoft CPU 采矿器..." + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "创建一个新的自定义采矿器 (需要外部程序)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "新建其他采矿器(&O)..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "新建采矿器(&N)" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "保存设置(&S)" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "保存您的设置" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "加载设置(&L)" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "加载已储存的设置" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "退出" + +#: guiminer.py:1594 +msgid "&File" +msgstr "文件(&F)" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "显示概览" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "显示全部采矿器的概览" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "显示终端" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "显示终端日志" + +#: guiminer.py:1600 +msgid "&View" +msgstr "查看(&V)" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "创建独自采矿密码(&C)..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "配置独自采矿的用户名/密码" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "设置 Bitcoin 客户端路径(&S)..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "设置官方 Bitcoin 客户端的位置" + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "将 Bitcoin 客户端作为服务器启动(&L)" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "将官方 Bitcoin 客户端作为独自采矿的服务器启动" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "独自采矿(&S)" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "启动时最小化(&M)" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "启动 GUI 时最小化到托盘区。" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "选项(&O)" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "更改语言(&C)..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "语言" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "捐助 99 美分(&D)..." + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "捐助 $0.99 美元的 Bitcoins 以支持 GUIMiner 的开发" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "捐助(&D)" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "关于(&A)..." + +#: guiminer.py:1628 +msgid "&Help" +msgstr "帮助(&H)" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "无法加载任务栏图标; 正在继续。" + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "未找到 OpenCL - 无法添加 OpenCL 采矿器" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "为该采矿器命名:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "新建采矿器" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "无标题" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "外部采矿器 (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "选择外部采矿器:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "不支持的外部采矿器 %(filename)s。支持: %(supported)s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "采矿器不支持" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "是否希望保存变更?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "保存" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "正在保存: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"无法写入保存文件 %s。\n" +"检查其位置是否可写。" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "保存失败" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "配置文件成功保存于 %s。" + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "保存成功" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "已加载: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "加载配置文件将停止当前正在运行的全部采矿器。是否继续?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "加载配置文件" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "选择 Bitcoin.exe 的路径" + +#: guiminer.py:1905 +msgid "About" +msgstr "关于" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "关闭该采矿器将停止其采矿。是否继续?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "关闭采矿器" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "无法在 %s 找到 Bitcoin。您的路径设置是否正确?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "启动失败" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." +msgstr "" +"Bitcoin 客户端将以服务器模式启动。\n" +"让它连接到网络并下载块链,您就可以以“独自采矿”模式启动采矿器了。" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "启动成功。" + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s 已存在。是否覆写?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf 已存在。" + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "输入密码" + +#: guiminer.py:1997 +msgid "Success" +msgstr "成功" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "写入 bitcoin 配置成功。" + +#: guiminer.py:2008 +msgid "Console" +msgstr "终端" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "概览" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "重命名采矿器" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "重命名为:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "更改语言" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "选择语言 (需要重新启动方可完全生效)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"点击下面的链接登录矿场获取特别的令牌。\n" +"该令牌允许您获取检测余额。\n" +"要记住该令牌供日后使用,请保存您的采矿器设置。" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(在此粘贴令牌)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "复制地址到剪贴板" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "未找到 OpenCL 设备。" + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"未找到 OpenCL 设备。\n" +" 如果您只想使用 CPU 或 CUDA 采矿,可忽略本信息。\n" +" 如果您想用 ATI 显卡采矿,可能需要安装 ATI Stream SDK,\n" +" 若已安装,可能您的 GPU 不支持 OpenCL。" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "不要再次显示本信息" + +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "点击下面的连接并登录矿场获取特别的 token。\n" +#~ "该 token 允许您安全地检查余额。\n" +#~ "要记住该 token 供日后使用,请保存采矿器设置。" + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000..8da1566 Binary files /dev/null and b/logo.ico differ diff --git a/messages.pot b/messages.pot new file mode 100644 index 0000000..6441ffb --- /dev/null +++ b/messages.pot @@ -0,0 +1,727 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 23:10-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" + +#: guiminer.py:111 +msgid "Not started" +msgstr "" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "" + +#: guiminer.py:113 +msgid "Stopped" +msgstr "" + +#: guiminer.py:114 +msgid "Paused" +msgstr "" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "" + +#: guiminer.py:119 +msgid "Username:" +msgstr "" + +#: guiminer.py:120 +msgid "Password:" +msgstr "" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "" + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "" + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "" + +#: guiminer.py:304 +msgid "Miner" +msgstr "" + +#: guiminer.py:305 +msgid "Speed" +msgstr "" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "" + +#: guiminer.py:307 +msgid "Stale" +msgstr "" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "" + +#: guiminer.py:395 +msgid "Restore" +msgstr "" + +#: guiminer.py:396 +msgid "Close" +msgstr "" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "" + +#: guiminer.py:516 +msgid "Server:" +msgstr "" + +#: guiminer.py:521 +msgid "Website:" +msgstr "" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "" + +#: guiminer.py:525 +msgid "Host:" +msgstr "" + +#: guiminer.py:527 +msgid "Port:" +msgstr "" + +#: guiminer.py:533 +msgid "Device:" +msgstr "" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "" + +#: guiminer.py:705 +msgid "Default" +msgstr "" + +#: guiminer.py:756 +msgid "Start" +msgstr "" + +#: guiminer.py:756 +msgid "Stop" +msgstr "" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "" + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "" + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr "" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "" + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "" + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "" + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "" + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "" + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr "" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "" + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" + +#: guiminer.py:1488 +msgid "Address:" +msgstr "" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "" + +#: guiminer.py:1545 +msgid "Email:" +msgstr "" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "" + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "" + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "" + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "" + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "" + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "" + +#: guiminer.py:1594 +msgid "&File" +msgstr "" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "" + +#: guiminer.py:1600 +msgid "&View" +msgstr "" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "" + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "" + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "" + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "" + +#: guiminer.py:1618 +msgid "Language" +msgstr "" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "" + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "" + +#: guiminer.py:1797 +msgid "Save" +msgstr "" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "" + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "" + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "" + +#: guiminer.py:1905 +msgid "About" +msgstr "" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." +msgstr "" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "" + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "" + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "" + +#: guiminer.py:1997 +msgid "Success" +msgstr "" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "" + +#: guiminer.py:2008 +msgid "Console" +msgstr "" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "" + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "" diff --git a/mockBitcoinMiner.py b/mockBitcoinMiner.py new file mode 100644 index 0000000..f4df85c --- /dev/null +++ b/mockBitcoinMiner.py @@ -0,0 +1,76 @@ +import threading +import time +import random +import sys +import Queue +import datetime +import struct + +OUTPUT_SIZE = 0x100 +TIME_FORMAT = '%d/%m/%Y %H:%M:%S' + +def if_else(condition, trueVal, falseVal): + if condition: + return trueVal + else: + return falseVal + +class MockBitcoinMiner(threading.Thread): + """Mock version of class BitcoinMiner. + + Can be used to test the GUI without actually consuming any resources + or requiring PyOpenCL to be installed. + """ + def __init__(self, *args, **kwargs): + threading.Thread.__init__(self) + self.workQueue = Queue.Queue() + self.verbose = True + + def say(self, format, args=()): + print '%s,' % datetime.datetime.now().strftime(TIME_FORMAT), format % args + sys.stdout.flush() + + def sayLine(self, format, args=()): + format = '%s, %s\n' % (datetime.datetime.now().strftime(TIME_FORMAT), format) + self.say(format, args) + + def hashrate(self, rate): + self.say('%s khash/s', rate) + + def blockFound(self, hash, accepted): + if random.randint(0,1): + self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'invalid or stale'))) + else: + self.sayLine('checking %d' % random.randint(10000,100000)) + + def mine(self): + self.start() + try: + while True: + time.sleep(random.randint(3, 5)) + hash = random.randint(0, 0xffffffff) + accepted = (random.random() < 0.9) + self.blockFound(struct.pack('I', long(hash)).encode('hex'), accepted) + except KeyboardInterrupt: + self.workQueue.put('stop') + time.sleep(1.1) + + def run(self): + """Report the hashrate every second with a plausible value.""" + while True: + if not self.workQueue.empty(): + try: + work = self.workQueue.get(True, 1) + except Queue.Empty: + continue + else: + if work == 'stop': + return + time.sleep(1) + self.hashrate(random.randint(150000, 170000)) + +if __name__ == "__main__": + miner = MockBitcoinMiner() + miner.mine() + + diff --git a/po_to_mo.py b/po_to_mo.py new file mode 100644 index 0000000..7b6a9b1 --- /dev/null +++ b/po_to_mo.py @@ -0,0 +1,48 @@ +import os, sys, re, errno + +import polib + +def get_module_path(): + """Return the folder containing this script (or its .exe).""" + module_name = sys.executable if hasattr(sys, 'frozen') else __file__ + abs_path = os.path.abspath(module_name) + return os.path.dirname(abs_path) + + +def print_usage(): + """Print usage message and exit.""" + print 'Usage: po_to_mo (or drag pofile onto executable icon).' + raw_input() + sys.exit(1) + +if len(sys.argv) < 2: + print len(sys.argv) + print_usage() + +po_filename = sys.argv[1] +print 'Got filename', po_filename + +match = re.search(r'guiminer_(.*).po', po_filename) +if match is None: + print_usage() +else: + language_code = match.group(1) + +po = polib.pofile(po_filename) + +folder = os.path.join(get_module_path(), 'locale', language_code, 'LC_MESSAGES') +try: + os.makedirs(folder) +except OSError as exc: + if exc.errno != errno.EEXIST: + raise + +path = os.path.join(folder, 'guiminer.mo') +try: + po.save_as_mofile(path) +except: + print "Couldn't save file" + raise +else: + print "Save OK. Press any key to continue." + raw_input() diff --git a/poclbm.py b/poclbm.py index cc87f78..2677a5b 100755 --- a/poclbm.py +++ b/poclbm.py @@ -60,7 +60,7 @@ def socketwrap(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): log.verbose = options.verbose log.quiet = options.quiet -options.rate = if_else(options.verbose, max(options.rate, 60), max(options.rate, 0.1)) +options.rate = if_else(options.verbose, options.rate, max(options.rate, 0.1)) options.version = VERSION diff --git a/screenshots/poclbm-gui-cpu.png b/screenshots/poclbm-gui-cpu.png new file mode 100644 index 0000000..feb2905 Binary files /dev/null and b/screenshots/poclbm-gui-cpu.png differ diff --git a/screenshots/poclbm-gui-gpu.png b/screenshots/poclbm-gui-gpu.png new file mode 100644 index 0000000..033232c Binary files /dev/null and b/screenshots/poclbm-gui-gpu.png differ diff --git a/servers.ini b/servers.ini new file mode 100644 index 0000000..16e5544 --- /dev/null +++ b/servers.ini @@ -0,0 +1,301 @@ +{ + "servers": [ + { + "balance_host": "eligius.st", + "balance_url": "/~luke-jr/balance.php?addr=%s", + "host": "mining.eligius.st", + "name": "Eligius", + "port": 8337, + "url": "http://eligius.st" + }, + + { + "balance_host": "mining.bitcoin.cz", + "balance_token_url": "http://mining.bitcoin.cz/accounts/token-manage/", + "balance_url": "/accounts/profile/json/%s", + "host": "api2.bitcoin.cz", + "name": "slush's pool", + "port": 8332, + "url": "http://mining.bitcoin.cz" + }, + + { + "balance_host": "www.bitcoin-server.de", + "balance_token_url": "http://www.bitcoin-server.de/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "bitcoin-server.de", + "name": "Bitcoin-Server.de", + "url": "http://www.bitcoin-server.de", + "port": 8347 + }, + + { + "balance_host": "deepbit.net", + "balance_token_url": "http://deepbit.net/settings/", + "balance_url": "/api/%s", + "host": "pit.deepbit.net", + "name": "deepbit", + "port": 8332, + "url": "http://deepbit.net" + }, + + { + "balance_host": "50btc.com", + "balance_token_url": "https://50btc.com/account/api", + "balance_url": "/api/%s", + "host": "pool.50btc.com", + "name": "50btc.com", + "port": 8332, + "url": "https://50btc.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "btcguild.com", + "name": "BTC Guild (any)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "useast.btcguild.com", + "name": "BTC Guild (Florida, USA)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "uscentral.btcguild.com", + "name": "BTC Guild (Texas, USA)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "uswest.btcguild.com", + "name": "BTC Guild (California, USA)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "de.btcguild.com", + "name": "BTC Guild (Germany)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "nl.btcguild.com", + "name": "BTC Guild (The Netherlands)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "bitpenny.com", + "balance_url": "/gui.php", + "host": "bitpenny.dyndns.biz", + "name": "BitPenny", + "port": 8332, + "url": "http://bitpenny.com" + }, + { + "host": "bitcoinpool.com", + "name": "bitcoinpool", + "port": 8334, + "url": "http://bitcoinpool.com" + }, + { + "balance_host": "btcmine.com", + "balance_token_url": "http://btcmine.com/user/profile/", + "balance_url": "/api/getbalance/%s/", + "host": "btcmine.com", + "name": "BTCMine", + "port": 8332, + "url": "http://btcmine.com" + }, + { + "balance_host": "bitclockers.com", + "balance_token_url": "http://bitclockers.com/dashboard/", + "balance_url": "/api/%s/", + "host": "pool.bitclockers.com", + "name": "BitClockers (Denver, US)", + "port": 2082, + "url": "http://bitclockers.com" + }, + { + "balance_host": "bitclockers.com", + "balance_token_url": "https://bitclockers.com/dashboard/", + "balance_url": "/api/%s/", + "host": "pool2.bitclockers.com", + "name": "BitClockers (Chicago, US)", + "port": 2082, + "url": "http://bitclockers.com" + }, + { + "balance_host": "bitclockers.com", + "balance_token_url": "https://bitclockers.com/dashboard/", + "balance_url": "/api/%s/", + "host": "pool3.bitclockers.com", + "name": "BitClockers (Zlin, EU)", + "port": 2082, + "url": "http://bitclockers.com" + }, + { + "host": "pool.bitlc.net", + "name": "Bitlc.net", + "port": 80, + "url": "http://www.bitlc.net" + }, + { + "balance_host": "www.btcmp.com", + "balance_token_url": "http://www.btcmp.com/", + "balance_url": "/api_get_stats?key=%s", + "payout_url": "/api_payout?key=%s", + "host": "rr.btcmp.com", + "name": "BTCMP", + "port": 8332, + "url": "http://www.btcmp.com" + }, + { + "balance_host": "btc.x8s.de", + "balance_token_url": "http://btc.x8s.de/account/profile", + "balance_url": "/api/getbalance/%s/", + "host": "pit.x8s.de", + "name": "x8s", + "port": 8337, + "url": "http://btc.x8s.de" + }, + { + "balance_host": "mtred.com", + "balance_token_url": "https://mtred.com/user/profile/edit.html", + "balance_url": "/api/user/key/%s/", + "host": "mine.mtred.com", + "name": "MTRed", + "port": 8337, + "url": "https://mtred.com/" + }, + { + "host": "arsbitcoin.com", + "name": "ArsBitcoin", + "port": 8344, + "url": "http://arsbitcoin.com/" + }, + { + "balance_host": "simplecoin.us", + "balance_token_url": "simplecoin.us/accountdetails.php", + "balance_url": "/api.php?api_key=%s", + "host": "pool.simplecoin.us", + "name": "Simplecoin.us", + "port": 8337, + "url": "https://simplecoin.us/" + }, + { + "host": "pool.ABCPool.co", + "name": "ABCPool", + "port": 8332, + "url": "http://abcpool.co/" + }, + { + "host": "pool.betcoin.co", + "name": "Betcoin.co", + "port": 8337, + "url": "http://pool.betcoin.co/" + }, + { + "host": "localhost", + "name": "solo", + "port": 8332, + "url": "n/a" + }, + { + "host": "eu.triplemining.com", + "name": "Triplemining", + "port": 8344, + "url": "https://www.triplemining.com" + }, + { + "balance_host": "eclipsemc.com", + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_url": "/api.key?key=%s&action=getbalance", + "host": "us.eclipsemc.com", + "name": "Eclipse US", + "port": 3333, + "url": "https://eclipsemc.com" + }, + { + "balance_host": "eclipsemc.com", + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_url": "/api.key?key=%s&action=getbalance", + "host": "eu.eclipsemc.com", + "name": "Eclipse EU", + "port": 3333, + "url": "https://eclipsemc.com" + }, + { + "balance_host": "eclipsemc.com", + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_url": "/api.key?key=%s&action=getbalance", + "host": "pacrim.eclipsemc.com", + "name": "Eclipse AU / Asia", + "port": 3333, + "url": "https://eclipsemc.com" + }, + { + "host": "bithasher.com", + "name": "Bithasher", + "port": 8332, + "url": "http://www.bithasher.com" + }, + { + "host": "pool.rfcpool.com", + "name": "rfcpool", + "port": 8332, + "url": "https://www.rfcpool.com" + }, + { + "host": "mine.ninjacoin.com", + "name": "NinjaCoin", + "port": 8332, + "url": "https://www.ninjacoin.com" + }, + { + "host": "btc.digbtc.net", + "name": "DigBtc", + "port": 8332, + "url": "http://digbtc.net" + }, + { + "host": "bitcoinmonkey.com", + "name": "BitcoinMonkey", + "port": 8332, + "url": "https://www.bitcoinmonkey.com" + }, + { + "balance_host": "www.unitedminers.com", + "balance_token_url": "http://www.unitedminers.com/?action=myapi", + "balance_url": "/?action=api&cmd=%s", + "host": "pool.unitedminers.com", + "name": "United Miners", + "port": 8332, + "url": "http://www.unitedminers.com" + }, + { + "host": "", + "name": "Other", + "port": 8332, + "url": "n/a" + } + ] +} diff --git a/setup.py b/setup.py index be456d2..bad7d4d 100644 --- a/setup.py +++ b/setup.py @@ -1,46 +1,23 @@ -#!/usr/bin/env python - -from detect import LINUX -from distribute_setup import use_setuptools -from setuptools import setup -from version import VERSION -use_setuptools() - - -try: - import py2exe -except ImportError: - py2exe = None - - -args = { - 'name': 'poclbm', - 'version': VERSION, - 'description': 'Bitcoin miner in python', - 'author': 'Momchil Georgiev', - 'author_email': 'pishtov@gmail.com', - 'url': 'https://github.com/m0mchil/poclbm/', - 'install_requires': ['numpy', 'pyserial>=2.6'], - 'scripts': ['poclbm.py'], -} - -if LINUX: - args['install_requires'].append('pyudev>=0.16') - -if py2exe: - args.update({ - # py2exe options - 'options': {'py2exe': - {'optimize': 2, - 'bundle_files': 2, - 'compressed': True, - 'dll_excludes': ['OpenCL.dll', 'w9xpopen.exe', 'boost_python-vc90-mt-1_39.dll'], - 'excludes': ["Tkconstants", "Tkinter", "tcl", "curses", "_ssl", "pyexpat", "unicodedata", "bz2"], - }, - }, - 'console': ['poclbm.py'], - 'data_files': ['phatk.cl'], - 'zipfile': None, - }) - -setup(**args) +from distutils.core import setup +import py2exe + +setup(windows=[ + {'script': 'guiminer.py', + 'icon_resources': [(0, "logo.ico")] + } + ], + console=['poclbm.py', 'po_to_mo.py'], + # OpenCL.dll is vendor specific + options=dict(py2exe=dict( + dll_excludes=['OpenCL.dll', 'w9xpopen.exe'], + compressed=True, + optimize=2, + excludes = ["Tkconstants", "Tkinter", "tcl", "curses", "_ssl", "pyexpat", "unicodedata", "bz2"], + )), + data_files = ['msvcp90.dll', + 'phatk.cl', + 'logo.ico', + 'LICENSE.txt', + 'servers.ini', + 'README.txt', + 'defaults.ini']) \ No newline at end of file