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