pax_global_header00006660000000000000000000000064143105733560014521gustar00rootroot0000000000000052 comment=b1a1547ae943c309cf2a82b03cb335b5a1cde47b gnome-keysign-1.3.0/000077500000000000000000000000001431057335600142765ustar00rootroot00000000000000gnome-keysign-1.3.0/.gitignore000066400000000000000000000003031431057335600162620ustar00rootroot00000000000000*.mo *.pot .eggs/ *.swp *.pyc *.bak /build /dist /gnome_keysign.egg-info **.flatpak-builder/ .flatpak-builder/ /.coverage /.noseids .tox/ cover/ /coverage/ .idea/ *.ui~ /flatpak/fpbuilder /venv/ gnome-keysign-1.3.0/COPYING000066400000000000000000001045131431057335600153350ustar00rootroot00000000000000 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 . gnome-keysign-1.3.0/MANIFEST.in000066400000000000000000000006571431057335600160440ustar00rootroot00000000000000# Apparently, package_data is bundled for bdists but not for sdists # For sdists, this MANIFEST.in seems to be used. # http://stackoverflow.com/a/14159430/2015768 recursive-include keysign/locale *.po #recursive-include keysign/locale *.mo # include keysign/locale/*/*/*.mo include data/org.gnome.Keysign.desktop data/org.gnome.Keysign.svg data/org.gnome.Keysign.appdata.xml include keysign/*.ui include COPYING include README.rst gnome-keysign-1.3.0/Makefile000066400000000000000000000002211431057335600157310ustar00rootroot00000000000000requirements.txt: setup.py pip-compile --generate-hashes | tee $@ # Use pip-compile --upgrade to update the packages clean: rm -f *.pyc gnome-keysign-1.3.0/README.rst000066400000000000000000000175431431057335600157770ustar00rootroot00000000000000GNOME Keysign ============= A tool for signing OpenPGP keys. Its purpose is to ease signing other peoples' keys. It is similar to caff, PIUS, or monkeysign. In fact, it is influenced a lot by these tools and either re-implements ideas or reuses code. Consider either of the above mentioned tools when you need a much more mature codebase. In contrast to caff or monkeysign, this tool enables you to sign a key without contacting a key server. It downloads an authenticated copy of the key from the other party. For now, the key is authenticated by a Message Authentication Code which is securely transferred via a QR code. Alternatively, the user may type the fingerprint manually, assuming that it has been transferred securely via the audible channel. After having obtained an authentic copy of the key, its UIDs are signed. The signatures are then separately encrypted and sent via email to each UID. xdg-email is used to pop up a pre-filled email composer window of the mail client the user has already configured to use. This greatly reduces complexity as no SMTP configuration needs to be obtained and gives the user a well known interface. The list of features includes: * Modern GTK3 GUI * Avahi-based discovery of peers in the local network * alternatively: Key transfer via Bluetooth * Cryptographically authenticated key exchange * No (unauthenticated) connection to the Internet * display of scanned QR code to prevent a maliciously injected frame * alternatively manual fingerprint verification of the key * signatures for each UID separately signed, encrypted, and sent * no SMTP setup needed due to use of desktop portals or xdg-email * runs in a Flatpak sandbox to isolate the app from the rest of the system Installation ============= Before you can install GNOME Keysign, you need to have a few dependencies installed. The list of dependencies includes: * avahi with python bindings * dbus with python bindings * GStreamer with the good and bad plugins * GTK and Cairo * gobject introspection for those libraries * Magic Wormhole * PyBluez (optional) openSUSE installation --------------------- openSUSE has `packaged the application `_ so it should be easy for you to install it. Arch Linux installation ----------------------- On Arch Linux you can find GNOME Keysign in the `AUR `_. For example you can install it with: .. code:: yay -S gnome-keysign Debian and Ubuntu dependencies ------------------------------ Some versions of Debian/Ubuntu have `packaged the application `_ so it should be easy for you to install it. If your version is older than that, this list of packages seems to make it work: python python-babelgladeextractor avahi-daemon python-gi gir1.2-glib-2.0 gir1.2-gtk-3.0 python-dbus gir1.2-gstreamer-1.0 gir1.2-gst-plugins-base-1.0 gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-gtk3 python-gi-cairo python-gpg python-twisted python-future Magic Wormhole can be installed with pip: .. code:: pip install magic-wormhole In Ubuntu, the package gstreamer1.0-plugins-bad provides the zbar element and in versions older than 18.04 the gtksink element. In newer versions of Ubuntu, the gtksink elment is provided by the gstreamer1.0-gtk3 packages. gstreamer1.0-plugins-good provides the autovideosrc element. These packages should be optional: python-requests python-qrcode python-bluez Fedora dependencies -------------------- Eventually an up to date version is in Fedora's `COPR `_. If that does not work or is not recent enough, then you may try an OpenSuSE package as mentioned above or install the dependencies yourself. The following has worked at least once for getting the application running, assuming that pip and git are already installed: .. code:: sudo dnf install -y python-babel-BabelGladeExtractor python-gobject dbus-python gstreamer1-plugins-bad-free-gtk gstreamer1-plugins-good gnupg python-gnupg python-twisted pip install magic-wormhole As optional: .. code:: sudo dnf install -y pybluez Installation with pip ----------------------- You may try the following in order to install the program to your user's home directory. .. code:: pip install --user 'git+https://github.com/GNOME-Keysign/gnome-keysign.git#egg=gnome-keysign' You should find a script in ~/.local/bin/gnome-keysign as well as a .desktop launcher in ~/.local/share/applications/. As a flatpak ------------- GNOME Keysign is available as a Flatpak on Flathub. You will need to have the xdg-desktop-portals installed in order to send email. You also need a pinentry to does not require access to the X window. A pinentry-gnome3 as of 1.0.0 works. A note to Arch users: `This Pipewire bug `_ is preventing gstreamer from running correctly. From git --------- If you intend to hack on the software (*yay*!), you may want to clone the repository and install from there. .. code:: git clone --recursive https://github.com/gnome-keysign/gnome-keysign.git cd gnome-keysign virtualenv --system-site-packages --python=python3 /tmp/keysign /tmp/keysign/bin/pip install . Note that this installs the application in the virtual environment, so you run the program from there, e.g. /tmp/keysign/bin/gnome-keysign. Starting ========= If you have installed the application with pip, a .desktop file should have been deployed such that you should be able to run the program from your desktop shell. Search for "Keysign". If you want to run the program from the command line, you can add ~/.local/bin to your PATH. The installation should have put an executable named keysign in that directory. If you haven't installed via pip or not to your user's home directory (i.e. with --user), you can start the program from your environment's ./bin/ directory. Running ======= Server side ----------- This describes running the application's server mode in order to allow you to have your key signed by others running the application in client mode. Once you've fired up the application, you can see a list of your private keys. Select one and the application will advance to the next stage. You will see the details of the key you've selected. If you are happy with the key you have selected, click "Next". This will cause the key's availability to be published on the local network. Also, a HTTP server will be spawned in order to enable others to download your key. In order for others to find you, the app displays both a string identifying your key and a bar code. Either share the string or the bar code with someone who wants to sign your key. Client side ----------- Here, the client side is described. This is to sign someone's key. You are presented with feed of your camera and an entry field to type in a string. If you meet someone who has the server side of the application running, you can scan the bar code present at the other party. After you either typed a fingerprint or scanned a bar code, the program will look for the relevant key on your local network. Note that you've transmitted the fingerprint securely, i.e. via a visual channel in form of a bar code or the displayed fingerprint. This data allows to find the correct key. In fact, the client tries to find the correct key by comparing the fingerprint of the keys available on the local network. After the correct key has been found, you see details of the key to be signed. If you are happy with what you see, i.e. because you have checked the names on the key to be correct, you can click next. This will cause the program to sign the key and open your mail program with the encrypted signature preloaded as attachment. gnome-keysign-1.3.0/data/000077500000000000000000000000001431057335600152075ustar00rootroot00000000000000gnome-keysign-1.3.0/data/gnome-keysign-sign-key.man.rst000066400000000000000000000015221431057335600230130ustar00rootroot00000000000000 ============== GNOME-Keysign ============== ---------------------------------------------------- Sign another person's key easily and securely ---------------------------------------------------- :Date: 2018-11-15 :Manual group: GNOME Keysign Manual :Manual section: 1 :Version: 1 SYNOPSIS ======== **gnome-keysign-sign-key** DESCRIPTION =========== **gnome-keysign-sign-key** is a tool for signing OpenPGP keys easily and securely without the need for a graphical user interface. It assumes that you have obtained an authentic copy of the key to be certified. It will perform the steps that **gnome-keysign** performs. OPTIONS ======= You have to provide the names of the files containing one OpenPGP key each. ENVIRONMENT =========== See **gnome-keysign** FILES ===== See **gnome-keysign** SEE ALSO ======== gpg(1) gnome-keysign(1) gnome-keysign-1.3.0/data/gnome-keysign-split-uids.man.rst000066400000000000000000000013401431057335600233600ustar00rootroot00000000000000 ============== GNOME-Keysign ============== ---------------------------------------------------- Split an OpenPGP key up into various files each having one UID ---------------------------------------------------- :Date: 2019-12-12 :Manual group: GNOME Keysign Manual :Manual section: 1 :Version: 1 SYNOPSIS ======== **gnome-keysign-split-uids** DESCRIPTION =========== **gnome-keysign-split-uids** is a tool for splitting an OpenPGP into separate files such that each file contains one UID. OPTIONS ======= You have to provide the name of the files which contains the key you want to have split up ENVIRONMENT =========== See **gnome-keysign** FILES ===== See **gnome-keysign** SEE ALSO ======== gpg(1) gnome-keysign(1) gnome-keysign-1.3.0/data/gnome-keysign.man.rst000066400000000000000000000034751431057335600213000ustar00rootroot00000000000000 ============== GNOME-Keysign ============== ---------------------------------------------------- Sign another person's key easily and securely ---------------------------------------------------- :Date: 2018-06-08 :Manual group: GNOME Keysign Manual :Manual section: 1 :Version: 1 SYNOPSIS ======== **gnome-keysign** DESCRIPTION =========== **gnome-keysign** is a tool for signing OpenPGP keys easily and securely. It attempts to follow best practices similar to PIUS or caff. In fact, it is influenced a lot by these tools and either re-implements ideas or reuses code. Consider either of the above mentioned tools when you need a much more mature codebase. **gnome-keysign** will transfer the OpenPGP key secure between two machines and create encrypted signatures for each UID on the received key. The UID is then sent to each email address via the MUA the user has configured in their desktop environment (cf. xdg-email). OPTIONS ======= none ENVIRONMENT =========== GNUPGHOME Not really an environment variable GNOME Keysign cares about, but the underlying calls to GnuPG respect that variable. You can use this variable if you want to run two instances of GNOME Keysign on the same machine to experiment around. FILES ===== ~/.gnupg/gpg.conf Not something GNOME Keysign itself cares about, but it greatly affects its working. Please refer to **gnupg** for details. Receiving an encrypted signature ================================== If you receive an email with an encrypted signature, you need to decrypt the attachment and import the result. Maybe like so:: cat '~/.cache/.../gnome-keysign-QtqXDj.asc' | gpg --decrypt | gpg --import You can probably drag and drop the email from your MUA into a terminal to get the path. Otherwise you need to save the attachment first somewhere. SEE ALSO ======== gpg(1) gnome-keysign-1.3.0/data/org.gnome.Keysign-symbolic.svg000066400000000000000000000040241431057335600230520ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme gnome-keysign-1.3.0/data/org.gnome.Keysign.raw.appdata.xml000066400000000000000000000126341431057335600234430ustar00rootroot00000000000000 org.gnome.Keysign CC0 GPL-3.0+ Keysign OpenPGP Keysigning helper

GNOME Keysign allows signing OpenPGP keys comfortably and securely via the local network or Bluetooth.

It can scan another key's barcode and transfer the key securely, allowing for casual two-party key signing sessions. It follows best practises by sending the encrypted signatures to the UIDs of a key using the Email client the user configured to use.

org.gnome.Keysign.desktop https://wiki.gnome.org/Apps/Keysign?action=AttachFile&do=get&target=send.png https://wiki.gnome.org/Apps/Keysign?action=AttachFile&do=get&target=receive.png HiDpiIcon ModernToolkit https://wiki.gnome.org/Apps/Keysign https://github.com/gnome-keysign/gnome-keysign/issues GNOME

* Fix error stemming from removing the crashing gpgme detection * build: Unvendorise babel-glade python module * change email message to facilitate usage of certifications

* Allow to drag and drop an email or its attachment into the app * show options to save produced certification as a file * Added a tooltip to the Internet button * Change logo to a wax seal * select usable private keys for signing, only * made appdata file validate under stricter requirements

* fixed up appdata * Cater for newer wormhole close() semantics

* Run with python3 from the desktop file * Removed monkeysign support * Stop installing gks-qrcode * Increased Python2 support in the tests * Fixed stopping wormhole discovery * Ship a new icon for the app * Removed gpgmh wrapper module

Transfer keys via the Internet through Magic Wormhole

Check for Bluetooth in a separate thread, detect powered off Bluetooth device, do not show offline keys

Made Appdata go into right places

Add Bluetooth support

Default to gpgme

tobiasmue@gnome.org gnome-keysign none none none none none none none none none none none none none none none none none intense none none
gnome-keysign-1.3.0/data/org.gnome.Keysign.raw.desktop000066400000000000000000000004221431057335600226730ustar00rootroot00000000000000[Desktop Entry] Name=Keysign Comment=A keysigning helper to enable you to comfortably exchange OpenPGP keys with a friend Keywords=python;gpg;gnupg;key;openpgp; Type=Application Exec=python3 -m keysign Icon=org.gnome.Keysign Categories=GTK;GNOME;Utility; StartupNotify=true gnome-keysign-1.3.0/data/org.gnome.Keysign.svg000066400000000000000000000164351431057335600212440ustar00rootroot00000000000000 Adwaita Icon Template image/svg+xml GNOME Design Team Adwaita Icon Template gnome-keysign-1.3.0/gnome-keysign.doap000066400000000000000000000026171431057335600177250ustar00rootroot00000000000000 gnome-keysign An OpenPGP Keysigning helper GNOME Keysign is a tool for signing OpenPGP keys. It exchanges a key directly between two instances of the app and follows best practices when producing and sending the signatures. Python Tobias Mueller tobiasmue Ludovico de Nittis denittis gnome-keysign-1.3.0/gnome-keysign.py000077500000000000000000000005351431057335600174320ustar00rootroot00000000000000#!/usr/bin/env python3 import logging, os, sys, signal logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') thisdir = os.path.dirname(os.path.realpath(__file__)) sys.path.insert(0, thisdir) sys.path.insert(0, os.sep.join((thisdir, 'monkeysign'))) from keysign import main sys.exit(main()) gnome-keysign-1.3.0/keysign/000077500000000000000000000000001431057335600157475ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/GPGQRCode.py000077500000000000000000000053261431057335600200050ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . """This is a very simple QR Code generator which scans your GnuPG keyring for keys and selects the one matching your input """ import logging import os import sys import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .gpgmeh import get_usable_keys if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .QRCode import QRImage def main(): import sys key = sys.argv[1] # Heh, we take the first key here. Maybe we should raise a warning # or so, when there is more than one key. key = list(get_usable_keys(pattern=key))[0] fpr = key.fingerprint data = 'OPENPGP4FPR:' + fpr w = Gtk.Window() w.connect("delete-event", Gtk.main_quit) w.set_default_size(100,100) v = Gtk.VBox() label = Gtk.Label(data) qr = QRImage(data) v.add(label) v.add(qr) w.add(v) w.show_all() Gtk.main() if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') main() gnome-keysign-1.3.0/keysign/GtkKeyserver.py000077500000000000000000000066141431057335600207600ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # Copyright 2014 Andrei Macavei # Copyright 2014 Srdjan Grubor # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . '''This is an exercise to see how we can combine Python threads with the Gtk mainloop ''' import logging import os import sys from threading import Thread from gi.repository import GLib from gi.repository import Gtk from dbus.mainloop.glib import DBusGMainLoop if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from . import Keyserver class ServerWindow(Gtk.Window): def __init__(self): self.log = logging.getLogger(__name__) Gtk.Window.__init__(self, title="Gtk and Python threads") self.set_border_width(10) self.connect("delete-event", Gtk.main_quit) hBox = Gtk.HBox() self.button = Gtk.ToggleButton('Start') hBox.pack_start(self.button, False, False, 0) self.add(hBox) self.button.connect('toggled', self.on_button_toggled) #GLib.idle_add(self.setup_server) def on_button_toggled(self, button): self.log.debug('toggled button') if button.get_active(): self.log.debug("I am being switched on") self.setup_server() else: self.log.debug("I am being switched off") self.stop_server() def setup_server(self): self.log.info('Serving now') self.log.debug('About to call %r', Keyserver.ServeKeyThread) self.keyserver = Keyserver.ServeKeyThread(b'Keydata', 'fingerprint') self.log.info('Starting thread %r', self.keyserver) self.keyserver.start() self.log.info('Finsihed serving') return False def stop_server(self): self.keyserver.shutdown() def main(args): log = logging.getLogger(__name__) log.debug('Running main with args: %s', args) w = ServerWindow() w.show_all() log.debug('Starting main') DBusGMainLoop(set_as_default = True) Gtk.main() if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') # From http://stackoverflow.com/a/16486080/2015768 import signal signal.signal(signal.SIGINT, signal.SIG_DFL) sys.exit(main(sys.argv)) gnome-keysign-1.3.0/keysign/KeyPresent.py000077500000000000000000000214171431057335600204220ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Copyright 2014 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import signal import sys import argparse import logging import os from gi.repository import Gtk, GLib if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .__init__ import __version__ from .gpgmeh import get_usable_keys from .QRCode import QRImage from .util import format_fingerprint log = logging.getLogger(__name__) class KeyPresentWidget(Gtk.Widget): """A widget for presenting a gpgmeh.Key It shows details of the given key and customizable data in a qrcode encoded in a QRImage. The widget takes a full key object, rather than a fingerprint, because it makes assumptions about the key object anyway. So it can as well take it directly and enable higher level controllers to deal with the situation that a given fingerprint, which really is a search string for gpg, yields multiple results. """ def __new__(cls, *args, **kwargs): thisdir = os.path.dirname(os.path.abspath(__file__)) builder = kwargs.pop("builder", None) if not builder: builder = Gtk.Builder() builder.add_objects_from_file( os.path.join(thisdir, 'send.ui'), ['box3'] ) log.debug("Our builder is: %r", builder) # The widget will very likely have a parent. # Gtk doesn't like so much adding a Widget to a container # when the widget already has been added somewhere. # So we get the parent widget and remove the child. w = builder.get_object('box3') parent = w.get_parent() if parent: parent.remove(w) w._builder = builder w.__class__ = cls return w def __init__(self, key, discovery_code, qrcodedata=None, builder=None): """ A new KeyPresentWidget shows the string you provide as qrcodedata in a qrcode. If it evaluates to False, the key's fingerprint will be shown. That is, "OPENPGP4FPR: + fingerprint. :param key: a QR code will be generated using this key's fingerprint if qrcodedata is None :param discovery_code: the code that is displayed to the user in the send tab. When a user wants to receive a key he can type this code manually instead of scanning the QR code. :param qrcodedata: this string will be used in the QR code. If None, the key's fingerprint will be used. :param builder: not used """ self.key_id_label = self._builder.get_object("keyidLabel") self.uids_label = self._builder.get_object("uidsLabel") self.fingerprint_label = self._builder.get_object("keyFingerprintLabel") self.qrcode_frame = self._builder.get_object("qrcode_frame") self.key_id_label.set_markup( format_fingerprint(key.fingerprint).replace('\n', ' ')) self.uids_label.set_markup("\n".join( [GLib.markup_escape_text(uid.uid) for uid in key.uidslist])) self.fingerprint_label.set_markup(format_fingerprint(key.fingerprint)) self.key_fingerprint = key.fingerprint self.fingerprint_label.set_markup(discovery_code) if not qrcodedata: qrcodedata = "OPENPGP4FPR:" + self.key_fingerprint qr = self.qrcode_frame.get_child() if qr: self.qrcode_frame.remove(self.qrcode_frame.get_child()) self.qrcode_frame.add(QRImage(qrcodedata)) self.qrcode_frame.show_all() class KeyPresent(Gtk.Application): """A demo application showing how to display sufficient details about a key such that it can be sent securely. Note that the main purpose is to enable secure transfer, not reviewing key details. As such, the implementation might change a lot, depending on the method of secure transfer. """ def __init__(self, *args, **kwargs): #super(Keys, self).__init__(*args, **kwargs) Gtk.Application.__init__( self, application_id="org.gnome.keysign.keypresent") self.connect("activate", self.on_activate) self.connect("startup", self.on_startup) self.log = logging.getLogger(__name__) self.key_present_page = None def on_quit(self, app, param=None): self.quit() def on_startup(self, app): self.log.info("Startup") self.window = Gtk.ApplicationWindow(application=app) self.window.set_title ("Keysign - Key") self.window.add(self.key_present_page) def on_activate(self, app): self.log.info("Activate!") #self.window = Gtk.ApplicationWindow(application=app) self.window.show_all() # In case the user runs the application a second time, # we raise the existing window. self.window.present() def run(self, args): log.debug("running: %s", args) fpr = args key = next(iter(get_usable_keys(pattern=fpr))) self.key_present_page = KeyPresentWidget(key, format_fingerprint(key.fingerprint)) super(KeyPresent, self).run() def parse_command_line(argv): """Parse command line argument. See -h option :param argv: arguments on the command line must include caller file name. """ formatter_class = argparse.RawDescriptionHelpFormatter parser = argparse.ArgumentParser(description='Auxiliary helper program '+ 'to present a key', formatter_class=formatter_class) parser.add_argument("--version", action="version", version="%(prog)s {}".format(__version__)) parser.add_argument("-v", "--verbose", dest="verbose_count", action="count", default=0, help="increases log verbosity for each occurence.") #parser.add_argument("-g", "--gpg", # action="store_true", default=False, # help="Use local GnuPG Keyring instead of file.") #parser.add_argument('-o', metavar="output", # type=argparse.FileType('w'), default=sys.stdout, # help="redirect output to a file") #parser.add_argument('file', help='File to read keydata from ' + # '(or KeyID if --gpg is given)') parser.add_argument('fpr', help='The fingerprint of the key to transfer') ## nargs='+', # argparse.REMAINDER, #parser.add_argument('input', metavar="input", ## nargs='+', # argparse.REMAINDER, #help="input if any...") arguments = parser.parse_args(argv[1:]) # Sets log level to WARN going more verbose for each new -v. log.setLevel(max(3 - arguments.verbose_count, 0) * 10) return arguments def main(args=sys.argv): """This is an example program of how to use the PresentKey widget""" logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') try: arguments = parse_command_line(args) #if arguments.gpg: # keydata = export_keydata(next(get_usable_keys(keyid))) #else: # keydata = open(arguments.file, 'r').read() fpr = arguments.fpr app = KeyPresent() try: GLib.unix_signal_add_full(GLib.PRIORITY_HIGH, signal.SIGINT, lambda *args : app.quit(), None) except AttributeError: pass exit_status = app.run(fpr) return exit_status finally: logging.shutdown() if __name__ == "__main__": sys.exit(main()) gnome-keysign-1.3.0/keysign/Keyserver.py000077500000000000000000000206301431057335600203040ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # Copyright 2014 Andrei Macavei # Copyright 2015 Jody Hansen # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . try: from http.server import BaseHTTPRequestHandler, HTTPServer from socketserver import ThreadingMixIn except ImportError: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from SocketServer import ThreadingMixIn import logging import os import socket from threading import Thread # This is probably really bad... But doing relative imports only # works for modules. However, I want to be able to call this Keyserver.py # for testing purposes. if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .__init__ import __version__ from .network.AvahiPublisher import AvahiPublisher from .gpgmeh import fingerprint_from_keydata log = logging.getLogger(__name__) class KeyRequestHandlerBase(BaseHTTPRequestHandler): '''This is the "base class" which needs to be given access to the key to be served. So you will not use this class, but create a use one inheriting from this class. The subclass must also define a keydata field. ''' server_version = 'GNOME-Keysign/' + '%s' % __version__ # As per RFC 2015 Section 7 # https://tools.ietf.org/html/rfc2015#section-7 ctype = 'application/pgp-keys' def do_GET(self): f = self.send_head(self.keydata) self.wfile.write(self.keydata) def send_head(self, keydata=None): kd = keydata if keydata else self.keydata self.send_response(200) self.send_header('Content-Type', self.ctype) self.send_header('Content-Length', len(kd)) self.end_headers() return kd class ThreadedKeyserver(ThreadingMixIn, HTTPServer): '''The keyserver in a threaded fashion''' address_family = socket.AF_INET6 def __init__(self, server_address, *args, **kwargs): if issubclass(self.__class__, object): super(ThreadedKeyserver, self).__init__(server_address, *args, **kwargs) else: HTTPServer.__init__(self, server_address, *args, **kwargs) # WTF? There is no __init__..? # ThreadingMixIn.__init__(self, server_address, *args, **kwargs) def server_bind(self): # Override this method to be sure v6only is false: we want to # listen to both IPv4 and IPv6! self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, False) HTTPServer.server_bind(self) class ServeKeyThread(Thread): '''Serves requests and manages the server in separates threads. You can create an object and call start() to let it run. If you want to stop serving, call shutdown(). ''' def __init__(self, data, fpr, port=9001, *args, **kwargs): '''Initializes the server to serve the data''' self.keydata = data self.fpr = fpr self.port = port super(ServeKeyThread, self).__init__(*args, **kwargs) self.daemon = True self.httpd = None def start(self, data=None, fpr=None, port=None, *args, **kwargs): '''This is run in the same thread as the caller. This calls run() in a separate thread. In order to resolve DBus issues, most things are done here. However, you probably need to start dbus.mainloop.glib.DBusGMainLoop (set_as_default=True) in order for this work. ''' port = port or self.port or 9001 fpr = fpr or self.fpr tries = 10 kd = data if data else self.keydata class KeyRequestHandler(KeyRequestHandlerBase): '''You will need to create this during runtime''' keydata = kd HandlerClass = KeyRequestHandler for port_i in (port + p for p in range(tries)): try: log.info('Trying port %d', port_i) server_address = ('', port_i) self.httpd = ThreadedKeyserver(server_address, HandlerClass, **kwargs) ### # This is a bit of a hack, it really should be # in some lower layer, such as the place were # the socket is created and listen()ed on. service_txt = { 'fingerprint': fpr, 'version': __version__, } log.info('Requesting Avahi with txt: %s', service_txt) self.avahi_publisher = ap = AvahiPublisher( service_port = port_i, service_name = 'HTTP Keyserver %s' % fpr, service_txt = service_txt, # self.keydata is too big for Avahi; it crashes service_type = '_gnome-keysign._tcp', ) log.info('Trying to add Avahi Service') ap.add_service() except socket.error as value: errno = value.errno if errno == 10054 or errno == 32: # This seems to be harmless break else: break finally: pass super(ServeKeyThread, self).start(*args, **kwargs) def serve_key(self, poll_interval=0.15): '''An HTTPd is started and being put to serve_forever. You need to call shutdown() in order to stop serving. ''' #sa = self.httpd.socket.getsockname() try: log.info('Serving now on %s, this is probably blocking...', self.httpd.socket.getsockname()) self.httpd.serve_forever(poll_interval=poll_interval) finally: log.info('finished serving') #httpd.dispose() def run(self): '''This is being run by Thread in a separate thread after you call start()''' self.serve_key() def shutdown(self): '''Sends shutdown to the underlying httpd''' log.info("Removing Avahi Service") self.avahi_publisher.remove_service() log.info("Shutting down httpd %r", self.httpd) self.httpd.shutdown() if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) import dbus, time dbus.mainloop.glib.DBusGMainLoop (set_as_default=True) def stop_thread(t, seconds=5): log.info('Sleeping %d seconds, then stopping', seconds) time.sleep(seconds) t.shutdown() import sys if len(sys.argv) >= 2: fname = sys.argv[1] KEYDATA = open(fname, 'rb').read() # FIXME: Someone needs to determine the fingerprint # of the data just read fpr = fingerprint_from_keydata(KEYDATA) else: KEYDATA = b'Example data' fpr = ''.join('F289 F7BA 977D F414 3AE9 FDFB F70A 0290 6C30 1813'.split()) if len(sys.argv) >= 3: timeout = int(sys.argv[2]) else: timeout = 5 t = ServeKeyThread(KEYDATA, fpr) stop_t = Thread(target=stop_thread, args=(t,timeout)) stop_t.daemon = True t.start() stop_t.start() while True: log.info('joining stop %s', stop_t.isAlive()) stop_t.join(1) log.info('joining t %s', t.isAlive()) t.join(1) if not t.isAlive() or not stop_t.isAlive(): break log.warn('Last line') gnome-keysign-1.3.0/keysign/QRCode.py000077500000000000000000000255301431057335600174460ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # Copyright 2015 Benjamin Berg # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import gi gi.require_version('Gtk', '3.0') gi.require_version('Gdk', '3.0') from gi.repository import Gdk, Gtk, GObject import qrcode ## It seems python3-cairo does not implement Surface.create_for_data ## https://bugs.freedesktop.org/show_bug.cgi?id=99855 ## Also, the gi version of cairo seems to be mostly useless, ## so either pycairo or cairocffi needs to exist. ## Rumour has it, though, that cairocffi cannot work well together ## with the CairoContext exposed in the do_draw method that we are trying to ## overwrite. So we're back to square one and need to take pycairo. import cairo log = logging.getLogger(__name__) class QRImage(Gtk.DrawingArea): """An Image encoding data as a QR Code. The image tries to scale as big as possible. """ def __init__(self, data='Default String', handle_events=True, background=0xff, *args, **kwargs): """The QRImage widget inherits from Gtk.Image, but it probably cannot be used as one, as there is an event handler for resizing events which will overwrite to currently loaded image. You made set data now, or later simply via the property. handle_events can be set to False if the fullscreen window should not be created on click. The background can be set to 0x00 (or 0xff) creating a black (or white) background onto which the code is rendered. """ super(QRImage, self).__init__(*args, **kwargs) self.log = logging.getLogger(__name__) self.background = background # We invert the background self.foreground = 0xff ^ background # The data to be rendered self._surface = None self.data = data self.set_app_paintable(True) self.handle_events = handle_events if handle_events: self.connect('button-release-event', self.on_button_released) self.add_events( Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK) def on_button_released(self, widget, event): self.log.info('Event %s', dir(event)) if event.button == 1: w = FullscreenQRImageWindow(data=self.data) top_level_window = self.get_toplevel() if top_level_window.is_toplevel(): w.set_transient_for(top_level_window) def do_size_allocate(self, event): """This is the event handler for the resizing event, i.e. when window is resized. We then want to regenerate the QR code. """ allocation = self.get_allocation() if allocation != event: self.queue_draw() Gtk.DrawingArea.do_size_allocate(self, event) def do_draw(self, cr): """This scales the QR Code up to the widget's size. You may define your own size, but you must be careful not to cause too many resizing events. When you request a too big size, it may loop to death trying to fit the image. """ data = self.data box = self.get_allocation() width, height = box.width, box.height size = min(width, height) qrcode = self.qrcode img_size = qrcode.get_width() cr.save() background = self.background foreground = self.foreground # This seems to set tje background, # but I'm not sure... cr.set_source_rgb(background, background, background) #cr.fill() # And have it painted cr.paint() # Now, I think we set the colour of the turtle # paint whatever is coming next. cr.set_source_rgb(foreground, foreground, foreground) # All of the rest I do not really understand, # but it seems to work reasonably well, without # weird PIL to Pixbuf hacks. cr.translate(width / 2, height / 2) scale = max(1, size / img_size) cr.scale(scale, scale) cr.translate(-img_size / 2, -img_size / 2) pattern = cairo.SurfacePattern(qrcode) pattern.set_filter(cairo.FILTER_NEAREST) cr.mask(pattern) cr.restore() def create_qrcode(self, data): log.debug('Encoding %s', data) code = qrcode.QRCode() code.add_data(data) matrix = code.get_matrix() size = len(matrix) stride = (size + 3) // 4 * 4 log.debug("stride: %r size: %r", stride, size) data = bytearray(stride * size) background = self.background foreground = self.foreground for x in range(size): for y in range(size): # Here we seem to be defining what # is going to be put on the surface. # I don't know what the semantic is, # though. Is 0 black? Or no modification # of the underlying background? # Anyway, this give us a nice white # QR Code. Note that we do [y][x], # otherwise the generated code is diagonally # mirrored. if matrix[y][x]: data[x + y * stride] = background else: data[x + y * stride] = foreground surface = cairo.ImageSurface.create_for_data(data, cairo.FORMAT_A8, size, size, stride) return surface @property def qrcode(self): if self._surface is not None: return self._surface self._surface = self.create_qrcode(self.data) return self._surface def set_data(self, data): # FIXME: Full screen window is not updated in here ... self._data = data self._surface = None size = self.qrcode.get_width() self.set_size_request(size, size) self.queue_draw() self.set_tooltip_text(data) def get_data(self): return self._data data = GObject.property(getter=get_data, setter=set_data) def fullscreen_at_monitor(window, n): """Fullscreens a given window on the n-th monitor This is because Gtk's fullscreen_on_monitor seems to be buggy. http://stackoverflow.com/a/39386341/2015768 """ screen = Gdk.Screen.get_default() monitor_n_geo = screen.get_monitor_geometry(n) x = monitor_n_geo.x y = monitor_n_geo.y window.move(x,y) window.fullscreen() class FullscreenQRImageWindow(Gtk.Window): '''Displays a QRImage in a fullscreen window The window is supposed to close itself when a button is clicked.''' def __init__(self, data, *args, **kwargs): '''The data will be passed to the QRImage''' self.log = logging.getLogger(__name__) if issubclass(self.__class__, object): super(FullscreenQRImageWindow, self).__init__(*args, **kwargs) else: Gtk.Window.__init__(*args, **kwargs) self.fullscreen() self.qrimage = QRImage(data=data, handle_events=False) self.qrimage.set_has_tooltip(False) self.add(self.qrimage) self.connect('button-release-event', self.on_button_released) self.connect('key-release-event', self.on_key_released) self.add_events( Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK ) self.show_all() def on_button_released(self, widget, event): '''Connected to the button-release-event and closes this window''' # It's unclear whether all resources are free()d self.log.info('Event on fullscreen: %s', event) if event.button == 1: self.unfullscreen() self.hide() self.close() def on_key_released(self, widget, event): self.log.info('Event on fullscreen: %s', dir(event)) self.log.info('keycode: %s', event.get_keycode()) self.log.info('keyval: %s', event.get_keyval()) self.log.info('keyval: %s', Gdk.keyval_name(event.keyval)) keyname = Gdk.keyval_name(event.keyval).lower() if keyname == 'escape' or keyname == 'f' or keyname == 'q': self.unfullscreen() self.hide() self.close() elif keyname == 'left' or keyname == 'right': # We're trying to switch monitors screen = self.get_screen() # Determines the monitor the window is currently most visible in n = screen.get_monitor_at_window(screen.get_active_window()) n_monitors = screen.get_n_monitors() if keyname == 'left': delta = -1 elif keyname == 'right': delta = 1 else: raise ValueError() new_n = (n+delta) % n_monitors log.info("Moving from %d to %d/%d", n, new_n, n_monitors) if n != new_n: # This call would make it animate a little, # but it looks weird for me, so we don't unfullscreen. # self.unfullscreen() fullscreen_at_monitor(self, new_n) # The following call is broken, unfortunately. # https://bugzilla.gnome.org/show_bug.cgi?id=752677 # self.fullscreen_on_monitor(self.get_screen(), new_n) def main(data): w = Gtk.Window() w.connect("delete-event", Gtk.main_quit) w.set_default_size(100,100) qr = QRImage(data) global fullscreen fullscreen = False def on_released(widget, event): global fullscreen if event.button == 1: fullscreen = not fullscreen if fullscreen: w.fullscreen() else: w.unfullscreen() #qr.connect('button-release-event', on_released) #qr.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK) w.add(qr) w.show_all() Gtk.main() if __name__ == '__main__': import sys logging.basicConfig(level=logging.DEBUG) try: data = sys.argv[1] except: raise ValueError("Not Enough Arguments passed as data for the QR code encoding") main(data) gnome-keysign-1.3.0/keysign/SignKey.py000077500000000000000000000045141431057335600177010ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2015 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import sys from .util import sign_keydata_and_send if sys.version_info.major < 3: input = raw_input def main(): import argparse parser = argparse.ArgumentParser(description="" "Certify UIDs of given OpenPGP certificates (aka sign OpenPGP keys) " " from a file. " "The program will open each file, extract exactly one " "OpenPGP certificate, sign each UID separately, encrypt and send " "each signed UID using xdg-email.") parser.add_argument('-v', '--verbose', action='count', default=0, help="Increase detail of logging") parser.add_argument("file", nargs='+', type=argparse.FileType('rb'), help="File containing OpenPGP keys") args = parser.parse_args() log_levels = [logging.WARNING, logging.INFO, logging.DEBUG] log_level = log_levels[min(len(log_levels)-1, args.verbose)] logging.basicConfig(level=log_level) log = logging.getLogger(__name__) log.debug('Running main with args: %s', args) for fhandle in args.file: data = fhandle.read() log.info("Calling %r to sign %s", sign_keydata_and_send, fhandle.name) tmpfiles = list(sign_keydata_and_send(keydata=data)) print("Finished signing. " + "We're only waiting for the signature " + "files to be picked up. " + "Press any key to quit the application.") input() if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') sys.exit(main()) gnome-keysign-1.3.0/keysign/__init__.py000077500000000000000000000016231431057335600200650ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from ._version import __version__ def main(*args, **kwargs): from . import app return app.main(*args, **kwargs) gnome-keysign-1.3.0/keysign/__main__.py000077500000000000000000000020671431057335600200510ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging, sys def main(*args, **kwargs): from . import app return app.main(*args, **kwargs) if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') sys.exit(main()) gnome-keysign-1.3.0/keysign/_version.py000077500000000000000000000000541431057335600201470ustar00rootroot00000000000000#!/usr/bin/env python __version__ = '1.3.0' gnome-keysign-1.3.0/keysign/app.py000077500000000000000000000320061431057335600171050ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2017 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import re import os import signal import sys import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GLib gi.require_version('Gst', '1.0') from gi.repository import Gst from gi.repository import Gdk from twisted.internet import gtk3reactor gtk3reactor.install() from twisted.internet import reactor if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .avahioffer import AvahiHTTPOffer from .avahidiscovery import AvahiKeysignDiscoveryWithMac from .errors import NoAvahiDbus from .keyconfirm import PreSignWidget from .keyfprscan import KeyFprScanWidget from .keylistwidget import KeyListWidget from .KeyPresent import KeyPresentWidget from .gpgmeh import openpgpkey_from_data from . import gpgmeh from .i18n import _ from .receive import ReceiveApp from .send import SendApp from . import gtkexcepthook log = logging.getLogger(__name__) def remove_whitespace(s): cleaned = re.sub('[\s+]', '', s) return cleaned class PswMappingReceiveApp(ReceiveApp): """A simple extension to the existing Receive class to connect to the PreSignWidget's mapped signal (or an emulation thereof. This is a bit of a hack, but by having pushed common receive functionality in the ReceiveApp class, we do not necessarily control anymore when the PreSignWidget is created let alone connect to the map signal in time. """ def __init__(self, mapped_func, builder=None): # ReceiveApp, in Python 2, is an old style object ReceiveApp.__init__(self, builder=builder) self.func = mapped_func def on_keydata_downloaded(self, *args, **kwargs): ReceiveApp.on_keydata_downloaded(self, *args, **kwargs) psw = self.psw psw.connect('map', self.func) if psw.get_mapped(): self.func(psw) def get_toplevel(self): """We're continuing to hack around If we ever want to run a dialog, say a FileSave dialog, then we need to provide the top level window of that widget. """ return self.psw.get_toplevel() class KeysignApp(Gtk.Application): def __init__(self, *args, **kwargs): super(KeysignApp, self).__init__(*args, **kwargs) self.connect('activate', self.on_activate) self.send_stack = None self.receive_stack = None self.send_receive_stack = None self.header_button_handler_id = None self.pre_sign_widget = None def on_activate(self, app): ui_file_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "app.ui") appwindow = 'applicationwindow1' builder = Gtk.Builder() builder.add_objects_from_file(ui_file_path, [appwindow]) window = builder.get_object(appwindow) window.set_wmclass ("GNOME Keysign", "GNOME Keysign") window.set_title("GNOME Keysign") window.connect("delete-event", self.on_delete_window) self.headerbar = window.get_titlebar() self.header_button = builder.get_object("back_refresh_button") self.header_button.connect('clicked', self.on_header_button_clicked) self.internet_toggle = builder.get_object("internet_toggle") self.internet_toggle.connect("toggled", self.on_toggle_clicked) sw = builder.get_object('stackswitcher1') # FIXME: I want to be able to press Alt+S and Alt+R respectively # to switch the stack pages to Send and Receive. # It's possible when using the Gtk Inspector and modify the # Switcher's children (ToggleButton and Label) to "use-underscore". # but it must be possible to do programmatically. # sw.get_children() self.stack_switcher = sw self.send_receive_stack = builder.get_object("send_receive_stack") self.send_receive_stack.connect('notify::visible-child', self.on_sr_stack_switch) ## Load Send part self.send = SendApp() ss = self.send.stack p = ss.get_parent() if p: p.remove(ss) ss.connect('notify::visible-child', self.on_send_stack_switch) ss.connect('map', self.on_send_stack_mapped) self.send_stack = ss ## End of loading send part # Load Receive part try: self.receive = PswMappingReceiveApp(self.on_presign_mapped) except NoAvahiDbus as de: log.info("Probably Avahi needs to be manually started: %s", de) ui_file_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "dialog_avahi.ui") appwindow = 'dialog_avahi' builder = Gtk.Builder() builder.add_objects_from_file(ui_file_path, [appwindow]) window.set_wmclass("GNOME Keysign", "GNOME Keysign") window.set_title("GNOME Keysign") ok_button = builder.get_object("avahi_ok") ok_button.connect('clicked', self.on_delete_window) window = builder.get_object(appwindow) else: rs = self.receive.stack rs.connect('notify::visible-child', self.on_receive_stack_switch) scanner = self.receive.scanner scanner.connect("map", self.on_scanner_mapped) self.receive_stack = rs # Hm. Leaving comments for translators does not seem to work self.send_receive_stack.add_titled(self.send_stack, "send_stack", _("Send")) self.send_receive_stack.add_titled(rs, "receive_stack", _("Receive")) # These properties must be set after the stacks has been added to the window # because they require a window element that "receive.ui" file doesn't provide. accel_group = Gtk.AccelGroup() window.add_accel_group(accel_group) self.receive.accept_button.add_accelerator("clicked", accel_group, ord('o'), Gdk.ModifierType.MOD1_MASK, Gtk.AccelFlags.VISIBLE) self.receive.accept_button.set_can_default(True) window.show_all() self.add_window(window) def run(self, args=[]): super(KeysignApp, self).run() @staticmethod def on_delete_window(*args): reactor.callFromThread(reactor.stop) def on_sr_stack_switch(self, stack, *args): log.debug("Switched Stack! %r", args) #self.update_header_button() def on_send_stack_switch(self, stack, *args): log.debug("Switched Send Stack! %r", args) current = self.send.stack.get_visible_child() if current == self.send.klw: log.debug("Key list page now visible") self.on_keylist_mapped(self.send.klw) elif current == self.send.kpw: log.debug("Key present page now visible") self.on_keypresent_mapped(self.send.kpw) elif current == self.send.rb: log.debug("Result page now visible") self.on_resultbox_mapped(self.send.rb) else: log.error("An unexpected page is now visible: %r", current) def on_receive_stack_switch(self, stack, *args): log.debug("Switched Receive Stack! %r", args) #self.update_header_button() def on_send_header_button_clicked(self, button, *args): # Here we assume that there are only two places where # we could have possibly pressed this button, i.e. # from the keypresentwidget or the result page log.debug("Send Headerbutton %r clicked! %r", button, args) current = self.send.stack.get_visible_child() klw = self.send.klw kpw = self.send.kpw rb = self.send.rb # If we are in the keypresentwidget if current == kpw: self.send_stack.set_visible_child(klw) self.send.deactivate() # If we are in the result page elif current == rb: self.send_stack.remove(current) self.send.set_saved_child_visible() self.send.on_key_activated(None, self.send.key) else: log.error("Header button pressed in an unexpected page: %s", current) def on_receive_header_button_clicked(self, button, *args): # Here we assume that there is only one place where # we could have possibly pressed this button, i.e. # from the presignwidget. log.debug("Receive Headerbutton %r clicked! %r", button, args) self.receive_stack.set_visible_child_name("scanner") def on_header_button_clicked(self, button, *args): log.debug("Headerbutton %r clicked! %r", button, args) # We have 2 children in the top level stack: send and receive. # In the send stack, we currently have two children. # In the receive stack, we have at least three. visible_child = self.send_receive_stack.get_visible_child() if not visible_child: return if visible_child == self.send_stack: return self.on_send_header_button_clicked(button, *args) elif visible_child == self.receive_stack: return self.on_receive_header_button_clicked(button, *args) else: raise RuntimeError("We expected either send or receive stack " "but got %r" % visible_child) def on_toggle_clicked(self, toggle): log.info("Internet toggled to: %s", toggle.get_active()) self.send.set_internet_option(toggle.get_active()) def on_resultbox_mapped(self, rb): log.debug("Resultbox becomes visible!") self.header_button.set_sensitive(True) self.header_button.set_image( Gtk.Image.new_from_icon_name("go-previous", Gtk.IconSize.BUTTON)) self.internet_toggle.hide() def on_keylist_mapped(self, keylistwidget): log.debug("Keylist becomes visible!") self.header_button.set_image( Gtk.Image.new_from_icon_name("view-refresh", Gtk.IconSize.BUTTON)) # We don't support refreshing for now. self.header_button.set_sensitive(False) self.internet_toggle.show() def on_send_stack_mapped(self, stack): log.debug("send stack becomes visible!") # Adjust the top bar buttons self.on_send_stack_switch(stack) def on_keypresent_mapped(self, kpw): log.debug("keypresent becomes visible!") self.header_button.set_sensitive(True) self.header_button.set_image( Gtk.Image.new_from_icon_name("go-previous", Gtk.IconSize.BUTTON)) self.internet_toggle.hide() def on_scanner_mapped(self, scanner): log.debug("scanner becomes visible!") self.header_button.set_sensitive(False) self.header_button.set_image( Gtk.Image.new_from_icon_name("go-previous", Gtk.IconSize.BUTTON)) self.internet_toggle.hide() def on_presign_mapped(self, psw): log.debug("presign becomes visible!") self.header_button.set_sensitive(True) self.header_button.set_image( Gtk.Image.new_from_icon_name("go-previous", Gtk.IconSize.BUTTON)) self.internet_toggle.hide() def main(args=[]): logging.basicConfig( level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') log = logging.getLogger(__name__) log.debug('Running main with args: %s', args) if not args: args = [] Gst.init(None) app = KeysignApp() try: GLib.unix_signal_add_full(GLib.PRIORITY_HIGH, signal.SIGINT, lambda *args: reactor.callFromThread(reactor.stop), None) except AttributeError: pass reactor.registerGApplication(app) reactor.run() if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') sys.exit(main(sys.argv[1:])) gnome-keysign-1.3.0/keysign/app.ui000066400000000000000000000101451431057335600170670ustar00rootroot00000000000000 False 6 center 600 400 False True False False True True True True True True False gtk-refresh True True True True True False True False gtk-connect False True 0 True False 5 Internet False True 1 1 True False send_receive_stack True False crossfade gnome-keysign-1.3.0/keysign/avahidiscovery.py000077500000000000000000000173201431057335600213470ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import os import sys from requests.exceptions import ConnectionError from gi.repository import GObject, GLib if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .util import strip_fingerprint, download_key_http, parse_barcode try: from .gpgmeh import fingerprint_from_keydata except ImportError: # FIXME: Remove this conditional from .gpgmeh import fingerprint_for_key as fingerprint_from_keydata from .network.AvahiBrowser import AvahiBrowser from .util import mac_verify log = logging.getLogger(__name__) class AvahiKeysignDiscovery(GObject.GObject): "A client discovery using Avahi" __gsignals__ = { # Gets emitted whenever a new server has been found or has been removed. # Is also emitted shortly after an object has been created. str("list-changed"): (GObject.SignalFlags.RUN_LAST, None, (int,)), } def __init__(self, *args, **kwargs): super(AvahiKeysignDiscovery, self).__init__(*args, **kwargs) self.log = logging.getLogger(__name__) # We should probably try to put this constant in a more central place avahi_service_type = '_gnome-keysign._tcp' self.avahi_browser = AvahiBrowser(service=avahi_service_type) self.avahi_browser.connect('new_service', self.on_new_service) self.avahi_browser.connect('remove_service', self.on_remove_service) self.discovered_services = [] # It seems we cannot emit directly... GLib.idle_add(lambda: self.emit("list-changed", len(self.discovered_services))) def on_new_service(self, browser, name, address, port, txt_dict): published_fpr = txt_dict.get('fingerprint', None) self.log.info("discovered something: %s %s:%i:%s", name, address, port, published_fpr) if not address.startswith('fe80::'): # We intend to ignore IPv6 link local addresses, because it seems # that you cannot just connect to that address without also # knowing which NIC the address belongs to. # http://serverfault.com/a/794967 # FIXME: Use something more sane like attr.s instead of the tuple self.discovered_services += ((name, address, port, published_fpr), ) self.emit("list-changed", len(self.discovered_services)) def on_remove_service(self, browser, service_type, name): '''Handler for the on_remove signal from AvahiBrowser Removes a service from the internal list by calling remove_discovered_service. ''' self.log.info("Received a remove signal, let's check; %s:%s", service_type, name) self.remove_discovered_service(name) def remove_discovered_service(self, name): '''Removes server-side clients from discovered_services list when the server name with fpr is a match.''' for client in self.discovered_services: if client[0] == name: self.discovered_services.remove(client) self.emit("list-changed", len(self.discovered_services)) self.log.info("Clients currently in list '%s'", self.discovered_services) def find_key(self, userdata): "Returns the key if it thinks it found one..." self.log.info("Trying to find key with %r", userdata) parsed = parse_barcode(userdata) cleaned = strip_fingerprint(parsed["fingerprint"]) downloaded_key = None # FIXME: Replace with attr.ib for (name, address, port, fpr) in self.discovered_services: if cleaned == fpr: # This is blocking :-/ try: downloaded_key = download_key_http(address, port) if fingerprint_from_keydata(downloaded_key) != cleaned: continue except ConnectionError: self.log.exception("Error downloading from %r:%r", address, port) return downloaded_key class AvahiKeysignDiscoveryWithMac(AvahiKeysignDiscovery): def find_key(self, userdata): "Returns the key if it thinks it found one which also matched the MAC" key = super(AvahiKeysignDiscoveryWithMac, self).find_key(userdata) if key: # For now, we cannot assume that a MAC exists, simply because # currently the MAC is only transferred via the barcode. # The user, however, might as well enter the fingerprint # manually. Unless we stop allowing that, we won't have a MAC. mac = parse_barcode(userdata).get("MAC", [None])[0] if mac is None: # This is the ugly shortcut which exists for legacy reasons verified_key = key else: mac_key = fingerprint_from_keydata(key) verified = mac_verify(mac_key.encode('ascii'), key, mac) if verified: verified_key = key else: self.log.info("MAC validation failed: %r", verified) verified_key = None else: verified_key = None return verified_key def main(args): log = logging.getLogger(__name__) log.debug('Running main with args: %s', args) if not args: raise ValueError("You must provide an argument to identify the key") loop = GObject.MainLoop() arg = args[0] # FIXME: Enable parameter timeout = 5 GObject.timeout_add_seconds(timeout, lambda: loop.quit()) discover = AvahiKeysignDiscovery() # We quickly attach the found to the object to maintain state discover.found_key = None def find_key(): keydata = discover.find_key(arg) if keydata: log.info("Found %d key bytes", len(keydata)) discover.found_key = keydata print (keydata) loop.quit() return not keydata discover.avahi_browser.connect('new_service', lambda *args: find_key()) # Instead of using this implementation detail for getting the notification, # it would be possible to repeatedly call find_key. # GObject.timeout_add(25, lambda: find_key() and False) # GObject.timeout_add(500, find_key) loop.run() if not discover.found_key: log.error("No Key found for %r!!1", arg) if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') sys.exit(main(sys.argv[1:])) gnome-keysign-1.3.0/keysign/avahioffer.py000077500000000000000000000062611431057335600204430ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import signal import sys import argparse import logging import os if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .__init__ import __version__ from .gpgmeh import get_usable_keys, get_public_key_data from .i18n import _ from .util import mac_generate, format_fingerprint from . import Keyserver log = logging.getLogger(__name__) class AvahiHTTPOffer: "Spawns a local HTTP daemon and announces it via Avahi" def __init__(self, key): self.key = key self.fingerprint = fingerprint = key.fingerprint self.keydata = keydata = get_public_key_data(fingerprint) self.keyserver = Keyserver.ServeKeyThread(keydata, fingerprint) self.mac = mac_generate(fingerprint.encode('ascii'), keydata) def allocate_code(self): """Returns the information necessary to discover the key through Avahi""" fingerprint = self.fingerprint.upper() mac = self.mac.upper() discovery_info = 'OPENPGP4FPR:{0}#MAC={1}'.format( fingerprint, mac) return format_fingerprint(self.key.fingerprint), discovery_info def start(self): """Starts offering the key""" log.info("Requesting to start") self.keyserver.start() def stop(self): "Stops offering the key" log.info("Requesting to shutdown") self.keyserver.shutdown() def main(args): if not args: raise ValueError("You must provide an argument to identify the key") key = get_usable_keys(pattern=args[0])[0] offer = AvahiHTTPOffer(key) discovery_info = offer.allocate_code() print (_("Offering key: {}").format(key)) print (_("Discovery info: {}").format(discovery_info)) offer.start() print (_("Press Enter to stop")) try: input_ = raw_input except NameError: input_ = input input_("Press Enter to stop") offer.stop() if __name__ == "__main__": import sys main(sys.argv[1:]) gnome-keysign-1.3.0/keysign/bluetoothoffer.py000066400000000000000000000135701431057335600213560ustar00rootroot00000000000000import logging from bluetooth import BluetoothSocket, RFCOMM, PORT_ANY import dbus import select import socket import sys if __name__ == "__main__": import gi gi.require_version('Gtk', '3.0') from twisted.internet import gtk3reactor gtk3reactor.install() from twisted.internet import reactor from twisted.internet import threads from twisted.internet.defer import inlineCallbacks, returnValue if sys.version < '3': input = raw_input if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") import os parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign __package__ = str('keysign') from .errors import NoBluezDbus, NoAdapter, UnpoweredAdapter from .gpgmeh import get_public_key_data, get_usable_keys from .i18n import _ from .util import get_local_bt_address, mac_generate log = logging.getLogger(__name__) class BluetoothOffer: def __init__(self, key, port=3, size=1024): self.key = key self.port = port self.size = size self.server_socket = None self.message_def = None self.stopped = False @inlineCallbacks def start(self): self.stopped = False message = "Back" success = False try: while not self.stopped and not success: # server_socket.accept() is not stoppable. So with select we can call accept() # only when we are sure that there is already a waiting connection ready_to_read, ready_to_write, in_error = yield threads.deferToThread( select.select, [self.server_socket], [], [], 0.5) if ready_to_read: # We are sure that a connection is available, so we can call # accept() without deferring it to a thread client_socket, address = self.server_socket.accept() key_data = get_public_key_data(self.key.fingerprint) kd_decoded = key_data.decode('utf-8') yield threads.deferToThread(client_socket.sendall, kd_decoded) log.info("Key has been sent") client_socket.shutdown(socket.SHUT_RDWR) client_socket.close() success = True message = None except Exception as e: log.error("An error occurred: %s" % e) success = False message = e returnValue((success, message)) @inlineCallbacks def allocate_code(self): """Acquires and returns a string suitable for finding the key via Bluetooth. Returns None if no powered on adapter could be found.""" bt_data = None try: code = yield threads.deferToThread(get_local_bt_address) code = code.upper() except NoBluezDbus as e: log.debug("Bluetooth service seems to be unavailable: %s", e) except NoAdapter as e: log.debug("Bluetooth adapter is not available: %s", e) except UnpoweredAdapter as e: log.debug("Bluetooth adapter is turned off: %s", e) else: if self.server_socket is None: self.server_socket = BluetoothSocket(RFCOMM) # We create a bind with the Bluetooth address we have in the system self.server_socket.bind((code, PORT_ANY)) # Number of unaccepted connections that the system will allow before refusing new connections backlog = 1 self.server_socket.listen(backlog) log.info("sockname: %r", self.server_socket.getsockname()) port = self.server_socket.getsockname()[1] log.info("BT Code: %s %s", code, port) bt_data = "BT={0};PT={1}".format(code, port) returnValue(bt_data) def stop(self): log.debug("Stopping bt receive") self.stopped = True if self.server_socket: self.server_socket.shutdown(socket.SHUT_RDWR) self.server_socket.close() self.server_socket = None def main(args): if not args: raise ValueError(_("You must provide an argument to identify the key")) def code_generated(data): if data: # getting the code from "BT=code;...." code = data.split("=", 1)[1] code = code.split(";", 1)[0] port = data.rsplit("=", 1)[1] offer.start().addCallback(_received) print(_("Offering key: {}").format(key)) print(_("Discovery info: {}").format(code)) print(_("HMAC: {}").format(hmac)) print(_("Port: {}").format(port)) # Wait for the user without blocking everything else: print(_("Bluetooth not available")) reactor.callInThread(cancel) def cancel(): input(_("Press Enter to cancel")) offer.stop() reactor.callFromThread(reactor.stop) def _received(result): success, error_msg = result if success: print(_("\nKey successfully sent")) else: print(_("\nAn error occurred: {}").format(error_msg)) # We are still waiting for the user to press Enter print(_("Press Enter to exit")) key = get_usable_keys(pattern=args[0])[0] file_key_data = get_public_key_data(key.fingerprint) hmac = mac_generate(key.fingerprint.encode('ascii'), file_key_data) offer = BluetoothOffer(key) offer.allocate_code().addCallback(code_generated) reactor.run() if __name__ == "__main__": import sys logging.basicConfig(level=logging.DEBUG) main(sys.argv[1:]) gnome-keysign-1.3.0/keysign/bluetoothreceive.py000066400000000000000000000127221431057335600216750ustar00rootroot00000000000000import logging import select from bluetooth import BluetoothSocket, BluetoothError, RFCOMM import socket if __name__ == "__main__": import gi gi.require_version('Gtk', '3.0') from twisted.internet import gtk3reactor gtk3reactor.install() from twisted.internet import reactor from twisted.internet import threads from twisted.internet.defer import inlineCallbacks, returnValue if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") import os parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .gpgmeh import fingerprint_from_keydata from .i18n import _ from .util import mac_verify log = logging.getLogger(__name__) class BluetoothReceive: def __init__(self, port=3, size=1024): self.port = port self.size = size self.client_socket = None self.stopped = False @inlineCallbacks def find_key(self, bt_mac, mac): self.client_socket = BluetoothSocket(RFCOMM) message = b"" try: self.client_socket.setblocking(False) try: log.info("Trying to connect to %s port %s", bt_mac, self.port) self.client_socket.connect((bt_mac, self.port)) except BluetoothError as be: if be.args[0] == "(115, 'Operation now in progress')": pass else: raise be success = False while not self.stopped and not success: r, w, e = yield threads.deferToThread(select.select, [self.client_socket], [], [], 0.5) if r: log.info("Connection established") self.client_socket.setblocking(True) success = True # try to receive until the sender closes the connection try: while True: part_message = self.client_socket.recv(self.size) log.debug("Read %d bytes: %r", len(part_message), part_message) message += part_message except BluetoothError as be: if be.args[0] == "(104, 'Connection reset by peer')": log.info("Bluetooth connection closed, let's check if we downloaded the key") else: raise be mac_key = fingerprint_from_keydata(message) verified = None if mac: verified = mac_verify(mac_key.encode('ascii'), message, mac) if verified: success = True else: log.info("MAC validation failed: %r", verified) success = False message = b"" except BluetoothError as be: if be.args[0] == "(16, 'Device or resource busy')": log.info("Probably has been provided a partial bt mac") elif be.args[0] == "(111, 'Connection refused')": log.info("The sender refused our connection attempt") elif be.args[0] == "(112, 'Host is down')": log.info("The sender's Bluetooth is not available") elif be.args[0] == "(113, 'No route to host')": log.info("An error occurred with Bluetooth, if present probably the device is not powered") else: log.info("An unknown bt error occurred: %s" % be.args[0]) key_data = None success = False returnValue((key_data, success, be)) except Exception as e: log.error("An error occurred connecting or receiving: %s" % e) key_data = None success = False returnValue((key_data, success, e)) if self.client_socket: self.client_socket.close() returnValue((message.decode("utf-8"), success, None)) def stop(self): self.stopped = True if self.client_socket: try: self.client_socket.shutdown(socket.SHUT_RDWR) self.client_socket.close() except BluetoothError as be: if be.args[0] == "(9, 'Bad file descriptor')": log.info("The old Bluetooth connection was already closed") else: log.exception("An unknown bt error occurred") def main(args): log.debug('Running main with args: %s', args) if not len(args) == 3: raise ValueError("You must provide three arguments: bluetooth code, hmac and port") def _received(result): key_data, success, error_message = result if success: print(key_data) else: print(error_message) reactor.callFromThread(reactor.stop) print(_("Trying to download the key, please wait")) bt_mac = args[0] hmac = args[1] port = int(args[2]) receive = BluetoothReceive(port) d = receive.find_key(bt_mac, hmac) d.addCallback(_received) reactor.run() if __name__ == "__main__": logging.basicConfig(level=logging.INFO) import sys main(sys.argv[1:]) gnome-keysign-1.3.0/keysign/compat/000077500000000000000000000000001431057335600172325ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/compat/__init__.py000066400000000000000000000000001431057335600213310ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/compat/gtkbutton.py000066400000000000000000000020651431057335600216300ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2015 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . """This is a simple compatibility layer for the Gtk.Button and its set_always_show_image method which exists from Gtk 3.6 only. """ from gi.repository import Gtk if not hasattr(Gtk.Button, 'set_always_show_image'): setattr(Gtk.Button, 'set_always_show_image', lambda x,y: None) gnome-keysign-1.3.0/keysign/dialog_avahi.ui000066400000000000000000000037341431057335600207240ustar00rootroot00000000000000 False dialog Unable to Start Avahi Keysign is unable to automatically start Avahi. You can try to execute `systemctl start avahi-daemon` for solving this problem. False vertical 2 False True True expand OK avahi_ok True True True True True 0 True True 0 gnome-keysign-1.3.0/keysign/discover.py000066400000000000000000000103441431057335600201410ustar00rootroot00000000000000import logging from twisted.internet import threads from twisted.internet.defer import inlineCallbacks, returnValue from wormhole.errors import LonelyError from .wormholereceive import WormholeReceive from .avahidiscovery import AvahiKeysignDiscoveryWithMac from .util import is_code_complete, parse_barcode try: from .bluetoothreceive import BluetoothReceive except ImportError: BluetoothReceive = None log = logging.getLogger(__name__) class Discover: def __init__(self, userdata, discovery, app_id=None): # if the userdata is a qr code we extract the wormhole and bluetooth codes self.worm_code = parse_barcode(userdata).get("WORM", [None])[0] self.bt_code = parse_barcode(userdata).get("BT", [None])[0] self.bt_port = parse_barcode(userdata).get("PT", [None])[0] if self.bt_port: self.bt_port = int(self.bt_port) self.mac = parse_barcode(userdata).get("MAC", [None])[0] # check if userdata is a valid wormhole code if is_code_complete(userdata): self.worm_code = userdata self.userdata = userdata self.app_id = app_id if discovery: self.discovery = discovery else: self.discovery = AvahiKeysignDiscoveryWithMac() self.worm = None self.bt = None self.stopped = False @inlineCallbacks def start(self): # First we try Avahi, if it fails we fallback to Bluetooth and lastly # Wormhole, because the receiver may be able to use only one of them success = False message = LonelyError log.info("Trying to use this code with Avahi: %s", self.userdata) try: key_data = yield threads.deferToThread(self.discovery.find_key, self.userdata) except ValueError as e: key_data = None success = False message = "Error downloading key, maybe it has been altered in transit" log.warning(message, exc_info=e) else: # Actually.. key_data can very well be None as an indication of failure. We might change that API to throw. log.debug("We may have found a key: %r", key_data) if key_data: success = True message = "" else: if self.bt_code and BluetoothReceive and not self.stopped: # We try Bluetooth, if we have it log.info("Trying to connect to %s with Bluetooth", self.bt_code) # We try to see if Bluetooth was imported, # else we log an event of missing Pybluez. try: self.bt = BluetoothReceive(self.bt_port) msg_tuple = yield self.bt.find_key(self.bt_code, self.mac) except TypeError as e: key_data = None success = False log.exception("Pybluez may be missing.") else: key_data, success, message = msg_tuple if key_data: # If we found the key log.debug("Found the key via bluetooth: %r", key_data[:32]) if not key_data and self.worm_code and not self.stopped: # We try the wormhole code, if we have it log.info("Trying to use this code with Wormhole: %s", self.worm_code) self.worm = WormholeReceive(self.worm_code, self.mac) msg_tuple = yield self.worm.start() key_data, success, message = msg_tuple if self.stopped: key_data = None success = False # We use the LonelyError in a similar way as Wormhole does. # That is to indicate that the connection as been stopped before a transfer. message = LonelyError log.debug("Returning key: %r, success: %r, message: %r", key_data, success, message) returnValue((key_data, success, message)) def stop(self): self.stopped = True # WormholeReceive needs to be stopped because right now after the 'start()' # it continues trying to connect until it does or we stop it. if self.worm: self.worm.stop() if self.bt: self.bt.stop() gnome-keysign-1.3.0/keysign/errors.py000066400000000000000000000010411431057335600176310ustar00rootroot00000000000000class BluetoothException(Exception): """Parent class for all Bluetooth-related errors""" class NoBluezDbus(BluetoothException): """The required org.bluez dbus is not available""" class NoAdapter(BluetoothException): """There isn't an usable Bluetooth adapter""" class UnpoweredAdapter(BluetoothException): """The Bluetooth adapter is turned off""" class AvahiException(Exception): """Parent class for all Avahi-related errors""" class NoAvahiDbus(AvahiException): """The required avahi dbus is not available""" gnome-keysign-1.3.0/keysign/export_uids.py000066400000000000000000000022511431057335600206660ustar00rootroot00000000000000#!/usr/bin/env python3 import logging from pathlib import Path import os import sys if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .gpgmeh import export_uids, minimise_key def escape_filename(fname): escaped = ''.join(c if c.isalnum() else "_" for c in fname) return escaped def main(): fname = sys.argv[1] keydata = open(fname, 'rb').read() minimise = True if minimise: keydata = minimise_key(keydata) for i, (uid, uid_bytes) in enumerate(export_uids(keydata), start=1): uid_file = Path('.') / ("{:02d}-".format(i) + escape_filename(uid) + ".pgp.asc") print (f"Writing {uid_file}...") uid_file.write_bytes(uid_bytes) print (f"Done!") if __name__ == "__main__": main() gnome-keysign-1.3.0/keysign/gpgkey.py000077500000000000000000000147461431057335600176260ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from __future__ import unicode_literals from collections import namedtuple from datetime import datetime import logging import warnings log = logging.getLogger(__name__) def to_valid_utf8_string(s, errors='replace', replacement='?'): """Takes a string and returns a valid utf8 encodable string Not every Python string is utf-8 encodable. Take 'fo\udcf6e\udce9ba ' for example. This function replaces undecodable characters with a '?' """ try: safe = s.encode('utf-8', errors=errors).decode('utf-8', errors=errors) except UnicodeDecodeError: # This is the Python 2 way... safe = s.decode('utf-8', errors=errors).replace(u"\uFFFD", replacement) return safe def parse_uid(uid, errors='replace'): """Parses a GnuPG UID into it's name, comment, and email component It converts them to strings with the errors paramenter controlling how to deal with encoding problems. """ # remove the comment from UID (if it exists) com_start = uid.find(b'(') if com_start != -1: com_end = uid.find(b')') uid = uid[:com_start].strip() + uid[com_end+1:].strip() # FIXME: Actually parse the comment... comment = b"" comment = comment.decode('utf-8', errors) # split into user's name and email tokens = uid.split(b'<') name = tokens[0].strip() name = name.decode('utf-8', errors) email = b'unknown' if len(tokens) > 1: log.debug("Parsing tokens: %r", tokens) email = tokens[1].replace(b'>',b'').strip() email = email.decode('utf-8', errors) log.debug("Parsed %r to name (%d): %r", uid, len(name), name) return (name, comment, email) def parse_expiry(value): """Takes either a string, an epoch, or a datetime and converts it to a datetime. If the string is empty (or otherwise evaluates to False) then this function returns None, meaning that no expiry has been set. An edge case is the epoch value "0". """ if not value: expiry = None else: try: expiry = datetime.fromtimestamp(int(value)) except TypeError: expiry = value return expiry class Key(namedtuple("Key", ["expiry", "fingerprint", "uidslist"])): "Represents an OpenPGP Key to extent we care about" log = logging.getLogger(__name__) def __new__(cls, expiry, fingerprint, uidslist, *args, **kwargs): exp_date = parse_expiry(expiry) self = super(Key, cls).__new__(cls, exp_date, fingerprint, uidslist) return self def __format__(self, arg): s = "{fingerprint}\r\n" s += '\r\n'.join((" {}".format(uid) for uid in self.uidslist)) # This is what original output looks like: # pub [unknown] 3072R/1BF98D6D 1336669781 [expiry: 2017-05-09 19:09:41] # Fingerprint = FF52 DA33 C025 B1E0 B910 92FC 1C34 19BF 1BF9 8D6D # uid 1 [unknown] Tobias Mueller # uid 2 [unknown] Tobias Mueller <4tmuelle@informatik.uni-hamburg.de> # sub 3072R/3B76E8B3 1336669781 [expiry: 2017-05-09 19:09:41] return s.format(**self._asdict()) @property def fpr(self): "Legacy compatibility, use fingerprint instead" warnings.warn("Legacy fpr, use the fingerprint property", DeprecationWarning) return self.fingerprint @classmethod def from_monkeysign(cls, key): "Creates a new Key from an existing monkeysign key" log.debug("From mks: %r", key) uids = [UID.from_monkeysign(uid) for uid in key.uidslist] expiry = parse_expiry(key.expiry) fingerprint = key.fpr return cls(expiry, fingerprint, uids) @classmethod def from_gpgme(cls, key): "Creates a new Key from an existing gpgme key" uids = [UID.from_gpgme(uid) for uid in key.uids] expiry = parse_expiry(key.subkeys[0].expires) fingerprint = key.fpr return cls(expiry, fingerprint, uids) class UID(namedtuple("UID", "expiry uid name comment email")): "Represents an OpenPGP UID - at least to the extent we care about it" @classmethod def from_monkeysign(cls, uid): "Creates a new UID from a monkeysign key" # We expect to get raw bytes. # While RFC4880 demands UTF-8 encoded data, # real-life has produced non UTF-8 keys... rawuid = to_valid_utf8_string(uid.uid).encode('utf-8') log.debug("UidStr (%d): %r", len(rawuid), rawuid) name, comment, email = parse_uid(rawuid) expiry = parse_expiry(uid.expire) return cls(expiry, rawuid.decode('utf-8'), name, comment, email) @classmethod def from_gpgme(cls, uid): "Creates a new UID from a gpgme UID" # Weird. I would expect the uid to be raw bytes, # because how would gpgme know what encoding to apply? # Also, you can have invalid encodings. # Turns out, that Python strings can be encoded according to PEP 383 # which basically encodes invalid bytes as 0xDC80 + byte. # That's the "surrogateescape" error handler available in Python 3. # Here, we don't care about that, though. We are in the user facing # abstraction for a UID. As such, we ensure that it can be rendered. # So we take the string we get from gpgme and try to convert it to # to utf-8 bytes. log.debug("UID from gpgme: %r", uid.uid) rawuid = to_valid_utf8_string(uid.uid) name = to_valid_utf8_string(uid.name) comment = '' # FIXME: uid.comment email = to_valid_utf8_string(uid.email) expiry = None # FIXME: Maybe UIDs don't expire themselves but via the binding signature return cls(expiry, rawuid, name, comment, email) gnome-keysign-1.3.0/keysign/gpgmeh.py000077500000000000000000000562601431057335600176040ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from __future__ import unicode_literals import base64 import logging import os # The SigningKeyring uses os.symlink for the agent from subprocess import check_output import sys from tempfile import mkdtemp import platform import dbus import gpg from gpg.constants import PROTOCOL_OpenPGP, IMPORT_NEW, IMPORT_SIG from gpg.errors import GPGMEError from .gpgkey import Key, UID texttype = unicode if sys.version_info.major < 3 else str log = logging.getLogger(__name__) ##### ## INTERNAL API ## class GPGRuntimeError(RuntimeError): pass class GenEdit: _ignored_status = (gpg.constants.STATUS_EOF, gpg.constants.STATUS_GOT_IT, gpg.constants.STATUS_NEED_PASSPHRASE, gpg.constants.STATUS_GOOD_PASSPHRASE, gpg.constants.STATUS_BAD_PASSPHRASE, gpg.constants.STATUS_USERID_HINT, gpg.constants.STATUS_SIGEXPIRED, gpg.constants.STATUS_KEYEXPIRED, gpg.constants.STATUS_PROGRESS, gpg.constants.STATUS_KEY_CREATED, gpg.constants.STATUS_ALREADY_SIGNED, gpg.constants.STATUS_KEY_CONSIDERED, gpg.constants.STATUS_CARDCTRL) def __init__(self, generator): generator.send(None) self.generator = generator self.last_sink_index = 0 def edit_cb(self, status, args, sink=None): if status in self._ignored_status: logging.info("Returning None for %r %r", status, args) return if not status: logging.info("Closing for %r", status) self.generator.close() return # 0 is os.SEEK_SET if sink: # os.SEEK_CUR = 1 current = sink.seek(0, 1) sink.seek(self.last_sink_index, 0) sinkdata = sink.read(current) self.last_sink_index = current else: sinkdata = None log.info("edit_cb: %r %r '%s'", status, args, sinkdata) data = self.generator.send((status, args)) #, sinkdata)) log.info("edit_cb data: %r", data) return texttype(data) def del_uids(uids): status, arg = yield None log.info("status args: %r %r", status, arg) #log.info("sinkdata: %s", sinkdata) #uids = [l for l in sinkdata.splitlines() if l.startswith('uid:')] #log.info("UIDs: %s", uids) status, arg = yield "list" log.info("status args: %r %r", status, arg) for uid in uids: status, arg = yield "uid %d" % uid log.info("status args: %r %r", status, arg) if uids: status, arg = yield "deluid" log.info("status args: %r %r", status, arg) assert status == gpg.constants.STATUS_GET_BOOL, "%r %r" % (status, arg) assert arg == 'keyedit.remove.uid.okay' status, arg = yield "Y" log.info("status args: %r %r", status, arg) yield 'save' def sign_key(uid=0, sign_cmd=u"sign", expire=False, check=3, error_cb=None): log.info("Signing key uid %r", uid) status, prompt = yield None if status == u"status_code_lost": # Yeah, such a constant does not exist *sigh* # We are here, because the agent on the host is too old for # what the guest, e.g. the flatpaked app, expects. # Let's hope we can just ignore that. log.info("Agent on the host might be too old: %s %s", status, prompt) status, prompt = yield None assert status == gpg.constants.STATUS_GET_LINE, "Expected status to be GET_LINE, but is %r" % status assert prompt == u"keyedit.prompt" status, prompt = yield u"uid %d" % uid # We ignore GOT_IT... # assert status == gpg.constants.STATUS_GOT_IT #status, prompt = yield None assert status == gpg.constants.STATUS_GET_LINE status, prompt = yield sign_cmd # We ignore GOT_IT... # assert status == gpg.constants.STATUS_GOT_IT while prompt != 'keyedit.prompt': if prompt == 'keyedit.sign_all.okay': status, prompt = yield 'Y' elif prompt == 'sign_uid.expire': status, prompt = yield '%s' % ('Y' if expire else 'N') elif prompt == 'sign_uid.class': status, prompt = yield '%d' % check elif prompt == 'sign_uid.okay': status, prompt = yield 'Y' elif status == gpg.constants.STATUS_INV_SGNR: # seems to happen if you have an expired # (or otherwise unsuable) signing key. # The CONSIDERED line should have been issued # with details. # We don't maintain that state at the moment which is # a bit unfortunate as we cannot properly detect # when we have no usable key at all rather than # one key being expired. log.warn("INV_SGNR: %r", prompt) status, prompt = yield None elif status == gpg.constants.STATUS_PINENTRY_LAUNCHED: status, prompt = yield None elif status == gpg.constants.STATUS_GOT_IT: status, prompt = yield None elif status == gpg.constants.STATUS_ALREADY_SIGNED: status, prompt = yield u'Y' elif status == gpg.constants.STATUS_ERROR: if error_cb: error_cb(prompt) else: raise GPGRuntimeError("Error signing key: %s" % prompt) status, prompt = yield None else: raise AssertionError("Unexpected state %r %r" % (status, prompt)) yield u"save" def UIDExport(keydata, uid_i): """Export only the UID of a key. Unfortunately, GnuPG does not provide smth like --export-uid-only in order to obtain a UID and its signatures.""" log.debug("Deletion of UID %r from %r", uid_i, keydata) if not uid_i >= 1: log.debug("Raising because uid: %r", uid_i) raise ValueError("Expected UID to be >= 1, but is %r", uid_i) ctx = TempContext() ctx.op_import(keydata) result = ctx.op_import_result() if result.considered != 1 or result.imported != 1: raise ValueError("Expected exactly one key in keydata. %r" % result) else: assert len(result.imports) == 1 fpr = result.imports[0].fpr key = ctx.get_key(fpr) uids_to_remove = {i for i in range(1, len(key.uids)+1)} uids_to_remove.remove(uid_i) if uids_to_remove: sink = gpg.Data() ctx.interact(key, GenEdit(del_uids(uids_to_remove)).edit_cb, fnc_value=sink, sink=sink) sink.seek(0, 0) log.debug("Data after UIDExport: %s", sink.read()) uid_data = gpg.Data() ctx.op_export_keys([key], 0, uid_data) uid_data.seek(0, 0) uid_bytes = uid_data.read() log.debug("UID %r: %r", uid_i, uid_bytes) return uid_bytes def export_uids(keydata): """Export each valid and non-revoked UID of a key Returns: An iterator over a tuple of the UID, i.e. the string and the bytes making the OpenPGP with that UID only. """ ctx = TempContext() ctx.op_import(keydata) result = ctx.op_import_result() log.debug("ExportUIDs: Imported %r", result) if result.considered != 1 or result.imported != 1: raise ValueError("Expected exactly one key in keydata. %r" % result) else: assert len(result.imports) == 1 fpr = result.imports[0].fpr key = ctx.get_key(fpr) for i, uid in enumerate(key.uids, start=1): log.info("Potentially deleting UID %d: %r", i, uid) if not uid.invalid and not uid.revoked: uid_data = UIDExport(keydata, i) yield (uid.uid, uid_data) def is_usable(key): unusable = key.invalid or key.disabled \ or key.expired or key.revoked log.debug('Key %s is invalid: %s (i:%s, d:%s, e:%s, r:%s)', key, unusable, key.invalid, key.disabled, key.expired, key.revoked) return not unusable def filter_usable_keys(keys): usable_keys = [Key.from_gpgme(key) for key in keys if is_usable(key)] log.debug('Identified usable keys: %s', usable_keys) return usable_keys class DirectoryContext(gpg.Context): def __init__(self, homedir): super(DirectoryContext, self).__init__() self.set_engine_info(PROTOCOL_OpenPGP, None, homedir) self.homedir = homedir class TempContext(DirectoryContext): def __init__(self): self.homedir = mkdtemp(suffix="-gnome-keysign") super(TempContext, self).__init__(homedir=self.homedir) def __del__(self): try: # shutil.rmtree(self.homedir, ignore_errors=True) pass except: log.exception("During cleanup of %r", self.homedir) def get_agent_socket_path_for_homedir(homedir): homedir_cmd = ["--homedir", homedir] if homedir else [] cmd = ["gpgconf"] + homedir_cmd + \ ["--list-dirs", "agent-socket"] path = check_output(cmd).strip() log.info("Path for %r: %r", homedir, path) return path class TempContextWithAgent(TempContext): def __init__(self, oldctx): super(TempContextWithAgent, self).__init__() homedir = self.homedir log.info("new homedir: %r", homedir) assert (len(list(self.keylist())) == 0) assert (len(list(self.keylist(secret=True))) == 0) old_homedir = oldctx.engine_info.home_dir if oldctx else None log.info("Old homedir: %r", old_homedir) old_agent_path = get_agent_socket_path_for_homedir(old_homedir) new_agent_path = get_agent_socket_path_for_homedir(homedir) os.symlink(old_agent_path, new_agent_path) assert len(list(self.keylist())) == 0 assert len(list(self.keylist(secret=True))) == 0 secret_keys = list(oldctx.keylist(secret=True)) log.info("old secret keys: %r", secret_keys) for key in secret_keys: log.debug("Making %r known in new ctx", key) def export_key(fpr): # FIXME: The Context should really be able to export() public_key = gpg.Data() oldctx.op_export(fpr, 0, public_key) public_key.seek(0, os.SEEK_SET) return public_key keydata = export_key(key.subkeys[0].fpr) self.op_import(keydata) result = self.op_import_result() # Hrm. Only gpgme>=1.9 has a repr for the result, I think log.debug("Import result: %r", result) log.debug("Import result imports: %r", result.imports) log.debug("Import result considered: %r", result.considered) assert len(result.imports) >= 1 i = result.imports[0] # 0 is success, I guess. assert i.result == 0 log.debug("Import result i result status: %r %r %r", i.result, i.status, i.fpr) log.debug("Import result GPGME_IMPORT_NEW: %r", i.status & gpg.constants.IMPORT_NEW) assert len(list(self.keylist())) == len(secret_keys) log.info("new secret keys: %r", list(self.keylist(secret=True))) assert len(secret_keys) == len(list(self.keylist(secret=True))) def import_signature_dbus(signature): "Imports a TPK into the user's keyring by using Seahorse's DBus API" name = "org.gnome.seahorse" path = "/org/gnome/seahorse/keys" bus = dbus.SessionBus() result = [] proxy = bus.get_object(name, path) iface = "org.gnome.seahorse.KeyService" gpg_iface = dbus.Interface(proxy, iface) payload = base64.b64encode(signature).decode('latin-1') payload = '\n'.join(payload[i:(i + 64)] for i in range(0, len(payload), 64)) payload = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n" + payload + "\n-----END PGP PUBLIC KEY BLOCK-----" result = gpg_iface.ImportKeys("openpgp", payload) log.debug("Importing via DBus: %r", result) return result def import_signature_gpgme(signature, homedir=None): "Imports an OpenPGP TPK into a keyring via GPGME" ctx = DirectoryContext(homedir) ctx.op_import(signature) result = ctx.op_import_result() if len(result.imports) < 1: raise GPGMEError return result ## ## END OF INTERNAL API ##### def openpgpkey_from_data(keydata): c = TempContext() c.op_import(gpg.Data(keydata)) result = c.op_import_result() log.debug("Import Result: %s", result) if result.imported != 1: raise ValueError("Keydata did not contain exactly one key, but %r" % result.imported) else: imported = result.imports import_ = imported[0] fpr = import_.fpr key = c.get_key(fpr) return Key.from_gpgme(key) def get_public_key_data(fpr, homedir=None): c = DirectoryContext(homedir) c.armor = True sink = gpg.Data() # FIXME: There will probably be an export() function c.op_export(fpr, 0, sink) sink.seek(0, os.SEEK_SET) keydata = sink.read() log.debug("Exported %r: %r", fpr, keydata) if not keydata: s = "No data to export for {} (in {})".format(fpr, homedir) raise ValueError(s) return keydata def fingerprint_from_keydata(keydata): '''Returns the OpenPGP Fingerprint for a given key''' openpgpkey = openpgpkey_from_data(keydata) return openpgpkey.fpr def get_usable_keys_from_context(ctx, pattern="", secret=False): keys = [Key.from_gpgme(key) for key in ctx.keylist(pattern=pattern, secret=secret) if is_usable(key) and # We filter "offline" keys. # If secret=False then it passes. # If secret=True then we require the primary subkey # to be "secret". It is false if the key is offline. (not secret or key.subkeys[0].secret) ] return keys def get_usable_keys(pattern="", homedir=None): '''Uses get_keys on the keyring and filters for non revoked, expired, disabled, or invalid keys''' log.debug('Retrieving keys for %s, %s', pattern, homedir) ctx = DirectoryContext(homedir=homedir) return get_usable_keys_from_context(ctx, pattern=pattern, secret=False) def get_usable_secret_keys(pattern="", homedir=None): '''Returns all secret keys which can be used to sign a key''' ctx = DirectoryContext(homedir=homedir) return get_usable_keys_from_context(ctx, pattern=pattern, secret=True) def minimise_key(keydata): "Returns the public key exported under the MINIMAL mode" ctx = TempContext() ctx.op_import(keydata) result = ctx.op_import_result() if result.considered != 1 and result.imported != 1: raise ValueError("Expected to load exactly one key. %r", result) else: imports = [i for i in result.imports if i.status == gpg.constants.IMPORT_NEW] log.debug("Import %r", result) assert len(imports) == 1 fpr = result.imports[0].fpr key = ctx.get_key(fpr) sink = gpg.Data() ctx.op_export_keys([key], gpg.constants.EXPORT_MODE_MINIMAL, sink) sink.seek(0, 0) minimised_key = sink.read() return minimised_key def local_sign_keydata(keydata, expires_in=60*60*24*1, error_cb=None, homedir=None): """Produces non-exportable and expiring signatures. This can be useful if we want to enable the user to send an email to the other party right away, without waiting for the protocol to have completed. By letting the signature expire, we limit the time in which a wrongly signed key is harmful. This is a challenge for thx UX, because sending emails will stop working pretty much out of the blue. But it can hardly be any worse than it is now. And the app ought to inform the user about the fact that it's only ephemeral. Returns: nothing """ ctx = DirectoryContext(homedir) tmpctx = TempContext() available_secret_keys = [key for key in ctx.keylist(secret=True) if not key.disabled or key.revoked or key.invalid or key.expired] log.debug('Setting available sec keys to: %r', available_secret_keys) ctx.signers = available_secret_keys tmpctx.op_import(keydata) result = tmpctx.op_import_result() if result.considered != 1 and result.imported != 1: raise ValueError("Expected to load exactly one key. %r", result) else: imports = result.imports assert len(imports) == 1 fpr = result.imports[0].fpr ctx.op_import(keydata) key = ctx.get_key(fpr) # We need to sign in the regular context, because gpgme does not # export local signatures from a keyring. ctx.key_sign(key, local=True, expires_in=expires_in) # Unfortunately, key_sign does not report back how many # signatures were produced (or not produced...) # It may raise an error, but I have yet to see that it does... log.info("Locally signed key %s with an exiry in %d secods", fpr, expires_in) def sign_keydata_and_encrypt(keydata, error_cb=None, homedir=None): oldctx = DirectoryContext(homedir) ctx = TempContextWithAgent(oldctx) # We're trying to sign with all available secret keys available_secret_keys = [key for key in ctx.keylist(secret=True) if not (key.disabled or key.revoked or key.invalid or key.expired)] log.debug('Setting available sec keys to (%d): %r', len(available_secret_keys), available_secret_keys) ctx.signers = available_secret_keys ctx.op_import(minimise_key(keydata)) result = ctx.op_import_result() if result.considered != 1 and result.imported != 1: raise ValueError("Expected to load exactly one key. %r", result) else: imports = result.imports assert len(imports) == 1 fpr = result.imports[0].fpr key = ctx.get_key(fpr) sink = gpg.Data() # There is op_keysign, but it's only available with gpg 2.1.12 ctx.interact(key, GenEdit(sign_key(error_cb=error_cb)).edit_cb, sink=sink) sink.seek(0, 0) log.debug("Sink after signing: %r", sink.read()) signed_sink = gpg.Data() ctx.set_keylist_mode(gpg.constants.KEYLIST_MODE_SIGS) ctx.armor = True ctx.op_export_keys([key], 0, signed_sink) signed_sink.seek(0, 0) signed_keydata = signed_sink.read() log.debug("Signed Key: %s", signed_keydata) # Do I have to re-get the key to make the signatures known? key = ctx.get_key(fpr) for i, uid in enumerate(key.uids, start=1): if uid.revoked or uid.invalid: continue else: log.debug("The UID %s has %d signatures", uid, len(uid.signatures)) if len(uid.signatures) < 2: log.error("We seem to not have produced signatures correctly. " "%s has less than 2 signatures: %s", uid, uid.signatures, ) uid_data = UIDExport(signed_keydata, i) log.debug("Data for uid %d: %r, sigs: %r %r", i, uid, uid.signatures, uid_data) ciphertext, _, _ = ctx.encrypt(plaintext=uid_data, recipients=[key], # We probably have to set owner trust # in order for it to work out of the box always_trust=True, sign=False) yield (UID.from_gpgme(uid), ciphertext, uid_data) class NoNewSignatures(GPGMEError): pass class NewRevocations(GPGMEError): pass class NewSubkey(GPGMEError): pass def decrypt_signature(encrypted_sig, homedir=None): """ Takes an encrypted signture, tries to decrypt it, and returns the decrypted signature if it is does indeed contain a certification only """ ctx = DirectoryContext(homedir) # Check if we are really importing a signature temp_ctx = TempContextWithAgent(ctx) signature = temp_ctx.decrypt(encrypted_sig) log.debug("signature decryption result: %r", signature) decrypted_sig = signature[0] temp_ctx.op_import(decrypted_sig) result = temp_ctx.op_import_result() if result.imported != 0: log.warning("Trying to import a new key instead of a signature!") raise GPGMEError if result.new_signatures == 0: raise NoNewSignatures() if result.new_revocations != 0: raise NewRevocations() if result.new_sub_keys != 0: raise NewSubkey() return decrypted_sig def decrypt_and_import_signature(encrypted_sig, homedir=None): signature = decrypt_signature(encrypted_sig, homedir=homedir) import_signature(signature) return signature class ImportNewCertificationError(GPGMEError): "The import of a TPK failed, probably due to containing a new certificate rather than new 'signatures'" def import_signature(signature, homedir=None): """ Imports an OpenPGP TPK to the local keyring The purpose is to import a certification (hence the name of the function) but it is in fact agnostic about what the TPK contains. This function will try to import the TPK via DBus first and, if that failed, resort to using gpgme directly. """ result = [] ctx = TempContextWithAgent(DirectoryContext(homedir=homedir)) ctx.op_import(signature) res = ctx.op_import_result() log.debug("ImportSignature: Testing for new certificate: %r", res) imports = res.imports if len(imports) != 1: log.error("We expected to import only one certificate, " "but it seems we have %d", len(import_)) raise ImportNewCertificationError else: import_ = imports[0] if import_.status & gpg.constants.IMPORT_NEW: log.error("We did not expect to import a *new* certificate, " "but this seems to be new: %r", import_) raise ImportNewCertificationError else: assert import_.status & gpg.constants.IMPORT_SIG if not homedir: # If a homedir is requested, we have to use the gpgme API, because we cannot specify a GnuPG keyring via DBus try: # Try Seahorse DBus result = import_signature_dbus(signature) except dbus.exceptions.DBusException: log.debug("Seahorse DBus is not available") # If Seahorse failed we try op_import if len(result) < 1: result = import_signature_gpgme(signature, homedir=homedir) return result gnome-keysign-1.3.0/keysign/gtkexcepthook.py000077500000000000000000000271351431057335600212130ustar00rootroot00000000000000#!/usr/bin/env python # (c) 2003 Gustavo J A M Carneiro gjc at inescporto.pt # 2004-2005 Filip Van Raemdonck # # http://www.daa.com.au/pipermail/pygtk/2003-August/005775.html # Message-ID: <1062087716.1196.5.camel@emperor.homelinux.net> # "The license is whatever you want." # # This file was downloaded from http://www.sysfs.be/downloads/ # Adaptions 2009-2010 by Martin Renold: # - let KeyboardInterrupt through # - print traceback to stderr before showing the dialog # - nonzero exit code when hitting the "quit" button # - suppress more dialogs while one is already active # - fix Details button when a context in the traceback is None # - remove email features # - fix lockup with dialog.run(), return to mainloop instead # see also http://faq.pygtk.org/index.py?req=show&file=faq20.010.htp # (The license is still whatever you want.) from __future__ import print_function import inspect import linecache import pydoc import sys import traceback if sys.version_info.major < 3: from io import BytesIO as StringIO else: from io import StringIO as StringIO from gettext import gettext as _ import os try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus import textwrap from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango #with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), # '_version.py')) as f: # # This should define __version__ # exec(f.read()) #VERSION = __version__ # We are ignoring the actual version for now, because it's only used # to determine whether it's a -dev version to then show a "report" # button. Let's show this button unconditionally for now. # Once it's too annoying, we get rid of it. VERSION = "0.0.0.1-dev" # Function that will be called when the user presses "Quit" # Return True to confirm quit, False to cancel quit_confirmation_func = None RESPONSE_QUIT = 1 RESPONSE_SEARCH = 2 RESPONSE_REPORT = 3 def analyse_simple(exctyp, value, tb): trace = StringIO() traceback.print_exception(exctyp, value, tb, None, trace) return trace def lookup(name, frame, lcls): '''Find the value for a given name in the given frame''' if name in lcls: return 'local', lcls[name] elif name in frame.f_globals: return 'global', frame.f_globals[name] elif '__builtins__' in frame.f_globals: builtins = frame.f_globals['__builtins__'] if type(builtins) is dict: if name in builtins: return 'builtin', builtins[name] else: if hasattr(builtins, name): return 'builtin', getattr(builtins, name) return None, [] def analyse(exctyp, value, tb): import tokenize import keyword import platform #import application #app = application.get_app() trace = StringIO() nlines = 3 frecs = inspect.getinnerframes(tb, nlines) #trace.write('GNOME Keysign version: %s\n' % app.version) trace.write('System information: %s\n' % platform.platform()) trace.write('Python information: %s\n' % sys.version) #trace.write('Using: %s\n' % (get_libs_version_string(),)) trace.write('Traceback (most recent call last):\n') for frame, fname, lineno, funcname, context, cindex in frecs: trace.write(' File "%s", line %d, ' % (fname, lineno)) args, varargs, varkw, lcls = inspect.getargvalues(frame) def readline(lno=[lineno], *args): if args: print(args) try: return linecache.getline(fname, lno[0]) finally: lno[0] += 1 all, prev, name, scope = {}, None, '', None for ttype, tstr, stup, etup, line in tokenize.generate_tokens(readline): if ttype == tokenize.NAME and tstr not in keyword.kwlist: if name: if name[-1] == '.': try: val = getattr(prev, tstr) except AttributeError: # XXX skip the rest of this identifier only break name += tstr else: assert not name and not scope scope, val = lookup(tstr, frame, lcls) name = tstr if val is not None: prev = val elif tstr == '.': if prev: name += '.' else: if name: all[name] = (scope, prev) prev, name, scope = None, '', None if ttype == tokenize.NEWLINE: break try: details = inspect.formatargvalues(args, varargs, varkw, lcls, formatvalue=lambda v: '=' + pydoc.text.repr(v)) except: # seen that one on Windows (actual exception was KeyError: self) details = '(no details)' trace.write(funcname + details + '\n') if context is None: context = ['\n'] trace.write(''.join([' ' + x.replace('\t', ' ') for x in filter(lambda a: a.strip(), context)])) if len(all): trace.write(' variables: %s\n' % str(all)) trace.write('%s: %s' % (exctyp.__name__, value)) return trace def _info(exctyp, value, tb): global exception_dialog_active if exctyp is KeyboardInterrupt: return original_excepthook(exctyp, value, tb) sys.stderr.write(analyse_simple(exctyp, value, tb).getvalue()) if exception_dialog_active: return Gdk.pointer_ungrab(Gdk.CURRENT_TIME) Gdk.keyboard_ungrab(Gdk.CURRENT_TIME) exception_dialog_active = True # Create the dialog dialog = Gtk.MessageDialog(type=Gtk.MessageType.WARNING) dialog.set_title(_("Bug Detected")) primary = _( "A programming error has been detected." ) secondary = _( "You may be able to ignore this error and carry on working, " "but you may get unexpected results.\n\n" "Please tell the developers about this using the issue tracker " "if no-one else has reported it yet." ) dialog.set_markup(primary) dialog.format_secondary_text(secondary) dialog.add_button(_("Search Tracker..."), RESPONSE_SEARCH) if "-" in VERSION: # only development and prereleases dialog.add_button(_("Report..."), RESPONSE_REPORT) dialog.set_response_sensitive(RESPONSE_REPORT, False) dialog.add_button(_("Ignore Error"), Gtk.ResponseType.CLOSE) dialog.add_button(_("Quit GNOME Keysign"), RESPONSE_QUIT) # Add an expander with details of the problem to the dialog def expander_cb(expander, *ignore): # Ensures that on deactivating the expander, the dialog is resized down if expander.get_expanded(): dialog.set_resizable(True) else: dialog.set_resizable(False) details_expander = Gtk.Expander() details_expander.set_label(_("Details...")) details_expander.connect("notify::expanded", expander_cb) textview = Gtk.TextView() textview.show() textview.set_editable(False) textview.modify_font(Pango.FontDescription("Monospace normal")) sw = Gtk.ScrolledWindow() sw.show() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(textview) # Set window sizing so that it's always at least 600 pixels wide, and # increases by 300 pixels in height once the details panel is open sw.set_size_request(0, 300) dialog.set_size_request(600, 0) details_expander.add(sw) details_expander.show_all() dialog.get_content_area().pack_start(details_expander, True, True, 0) # Get the traceback and set contents of the details try: trace = analyse(exctyp, value, tb).getvalue() except: try: trace = _("Exception while analyzing the exception.") + "\n" trace += analyse_simple(exctyp, value, tb).getvalue() except: trace = _("Exception while analyzing the exception.") buf = textview.get_buffer() trace = "\n".join(["```python", trace, "```"]) buf.set_text(trace) ## Would be nice to scroll to the bottom automatically, but @#&%*@ #first, last = buf.get_bounds() #buf.place_cursor(last) #mark = buf.get_insert() ##buf.scroll_mark_onscreen() ##textview.scroll_mark_onscreen(buf.get_insert(), 0) #textview.scroll_to_mark(mark, 0.0) # Connect callback and present the dialog dialog.connect('response', _dialog_response_cb, trace, exctyp, value) #dialog.set_modal(True) # this might actually be contra-productive... dialog.show() # calling dialog.run() here locks everything up in some cases, so # we just return to the main loop instead def _dialog_response_cb(dialog, resp, trace, exctyp, value): global exception_dialog_active if resp == RESPONSE_QUIT: if not quit_confirmation_func: sys.exit(1) # Exit code is important for IDEs else: if quit_confirmation_func(): sys.exit(1) # Exit code is important for IDEs else: dialog.destroy() exception_dialog_active = False elif resp == RESPONSE_SEARCH: search_url = ( "https://github.com/GNOME-Keysign/gnome-keysign/search" "?utf8=%E2%9C%93" "&q={}+{}" "&type=Issues" ).format( quote_plus(exctyp.__name__, "/"), quote_plus(str(value), "/") ) Gtk.show_uri(None, search_url, Gdk.CURRENT_TIME) if "-" in VERSION: dialog.set_response_sensitive(RESPONSE_REPORT, True) elif resp == RESPONSE_REPORT: #TRANSLATORS: Crash report template for github, preceding a traceback. #TRANSLATORS: Please ask users kindly to supply at least an English #TRANSLATORS: title if they are able. body = _(u"""\ #### Description Give this report a short descriptive title. Use something like "{feature-that-broke}: {what-went-wrong}" for the title, if you can. Then please replace this text with a longer description of the bug. Screenshots or videos are great, too! #### Steps to reproduce Please tell us what you were doing when the error message popped up. If you can provide step-by-step instructions on how to reproduce the bug, that's even better. #### Traceback """) body = "\n\n".join([ "".join(textwrap.wrap(p, sys.maxsize)) for p in textwrap.dedent(body).split("\n\n") ] + [trace]) report_url = ( "https://github.com/GNOME-Keysign/gnome-keysign/issues/new" "?title={title}" "&body={body}" ).format( title="", body=quote_plus(body.encode("utf-8"), "/"), ) Gtk.show_uri(None, report_url, Gdk.CURRENT_TIME) else: dialog.destroy() exception_dialog_active = False original_excepthook = sys.excepthook sys.excepthook = _info exception_dialog_active = False if __name__ == '__main__': import sys import os def _test_button_clicked_cb(*a): class _TestException (Exception): pass raise _TestException("That was supposed to happen.") win = Gtk.Window() win.set_size_request(200, 150) win.set_title(os.path.basename(sys.argv[0])) btn = Gtk.Button("Break it") btn.connect("clicked", _test_button_clicked_cb) win.add(btn) win.connect("destroy", lambda *a: Gtk.main_quit()) win.show_all() Gtk.main() gnome-keysign-1.3.0/keysign/i18n.py000066400000000000000000000023301431057335600170760ustar00rootroot00000000000000#!/usr/bin/env python import gettext import locale import logging import os log = logging.getLogger(__name__) APP = 'keysign' # We have pretty much no idea what we're doing here. # We want to be able to find the compiled message catalogues # not only when the app has been installed, but also # when it's being run from source. Hence we're using # a path relative to this file, hoping that it will cater # for both use cases. Feel free to improve. DIR = os.path.join(os.path.dirname(__file__), 'locale') ## This is for C libraries, I think. I.e. not for pure python ## ones like us. We do, however, need this for Gtk.Builder ## to load translations try: locale.setlocale(locale.LC_ALL, '') except locale.Error: log.exception("Cannot set locale") locale.bindtextdomain(APP, DIR) locale.textdomain(APP) gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) lang = gettext.translation(APP, DIR, fallback=True) ## This seems to cause "_" to be installed into globals. ## Let's not do that to not confuse libraries that we include # gettext.install(APP, DIR, unicode=1) from locale import gettext as _ try: _ = lang.ugettext except AttributeError: log.info("Cannot get ugettext from lang: %r", lang, exc_info=True) gnome-keysign-1.3.0/keysign/keyconfirm.py000077500000000000000000000165511431057335600205020ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Copyright 2016 Andrei Macavei # Copyright 2017 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from datetime import date, datetime import signal import sys import argparse import logging import os import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GLib from gi.repository import GObject if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .gpgmeh import get_usable_keys from .scan_barcode import ScalingImage from .util import format_fingerprint log = logging.getLogger(__name__) #FIXME: remove the temporary keyword args after updating Key class #with length and creation_time fields def format_key_header(fpr, length='2048', creation_time=None): if creation_time == None: creation_time = datetime.strptime('01011970', "%d%m%Y").date() try: creation = date.fromtimestamp(float(creation_time)) except TypeError as e: # This might be the case when the creation_time is already a timedate creation = creation_time key_header = format_fingerprint(fpr).replace('\n', ' ') return key_header def format_uidslist(uidslist): result = "" for uid in uidslist: uidstr = GLib.markup_escape_text(uid.uid) result += ("{}\n".format(uidstr)) return result class PreSignWidget(Gtk.VBox): """A widget for obtaining a key fingerprint. The fingerprint can be obtain by inserting it into a text entry, or by scanning a barcode with the built-in camera. """ __gsignals__ = { str('sign-key-confirmed'): (GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT,)), } def __init__(self, key, pixbuf=None, builder=None): super(PreSignWidget, self).__init__() thisdir = os.path.dirname(os.path.abspath(__file__)) widget_name = 'keyconfirmbox' if not builder: builder = Gtk.Builder() builder.add_objects_from_file( os.path.join(thisdir, 'receive.ui'), [widget_name, 'confirm-button-image']) widget = builder.get_object(widget_name) parent = widget.get_parent() if parent: parent.remove(widget) self.add(widget) confirm_btn = builder.get_object("confirm_sign_button") confirm_btn.connect("clicked", self.on_confirm_button_clicked) self.key = key keyIdsLabel = builder.get_object("key_ids_label") log.info("The Key ID Label can focus: %r, %r", keyIdsLabel.props.can_focus, keyIdsLabel.get_can_focus()) # Weird. The glade file defines can_focus = False, but it's set to True... keyIdsLabel.set_can_focus(False) keyIdsLabel.set_markup(format_key_header(self.key.fingerprint)) uidsLabel = builder.get_object("uids_label") # FIXME: Check why Builder thinks the widget can focus when the glade file says no uidsLabel.set_can_focus(False) markup = format_uidslist(self.key.uidslist) uidsLabel.set_markup(markup) imagebox = builder.get_object("imagebox") for child in imagebox.get_children(): imagebox.remove(child) imagebox.add(ScalingImage(pixbuf=pixbuf)) imagebox.show_all() # We save the reference here to expose this infobar to the caller. # This is a bit ugly, because it makes this implementation detail part of the # API. The infobar should probably be part of the caller's responsibility, # i.e. not part of this widget. self.infobar_success = builder.get_object('infobar_certifications_produced') self.infobar_errors = builder.get_object('infobar_certifications_errors') self.infobar_save_as_button = builder.get_object('btn_local_import_save_as') self.infobar_import_button = builder.get_object('btn_local_import') self.infobar_show_error_button = builder.get_object('btn_show_error_details') ib_error_show = self.infobar_errors.show def show(exception): self.infobar_errors.exception = exception ib_error_show() def show_error(btn): dialog = Gtk.MessageDialog( transient_for=self.get_toplevel(), flags=0, message_type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.CLOSE, text="Error certifying key" ) dialog.format_secondary_text( str(exception) + "\n" "We don't know any more, sorry :(") dialog.run() dialog.destroy() self.infobar_show_error_button.connect("clicked", show_error) self.infobar_errors.show = show def on_confirm_button_clicked(self, buttonObject, *args): self.emit('sign-key-confirmed', self.key, *args) class PreSignApp(Gtk.Application): def __init__(self, *args, **kwargs): super(PreSignApp, self).__init__(*args, **kwargs) self.connect('activate', self.on_activate) self.psw = None self.log = logging.getLogger(__name__) def on_activate(self, app): window = Gtk.ApplicationWindow() window.set_title("Key Pre Sign Widget") # window.set_size_request(600, 400) if not self.psw: self.psw = PreSignWidget() self.psw.connect('sign-key-confirmed', self.on_sign_key_confirmed) window.add(self.psw) window.show_all() self.add_window(window) def on_sign_key_confirmed(self, keyPreSignWidget, *args): self.log.debug ("Sign key confirmed!") def run(self, args): if not args: args = [""] key = get_usable_keys (pattern=args[0])[0] if len(args) >= 2: image_fname = args[1] log.debug("Trying to load pixbuf from %r", image_fname) pixbuf = Gtk.Image.new_from_file(image_fname).get_pixbuf() else: pixbuf = None self.psw = PreSignWidget(key, pixbuf=pixbuf) super(PreSignApp, self).run() if __name__ == "__main__": import sys logging.basicConfig(level=logging.DEBUG) app = PreSignApp() app.run(sys.argv[1:]) gnome-keysign-1.3.0/keysign/keyfprscan.py000077500000000000000000000130731431057335600204750ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # Copyright 2016 Andrei Macavei # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import sys import logging import os import gi gi.require_version('Gtk', '3.0') gi.require_version('Gst', '1.0') from gi.repository import Gtk, Gst, GdkPixbuf from gi.repository import GObject if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .scan_barcode import BarcodeReaderGTK log = logging.getLogger(__name__) class KeyFprScanWidget(Gtk.VBox): """A widget for obtaining a key fingerprint. The fingerprint can be obtain by inserting it into a text entry, or by scanning a barcode with the built-in camera. """ __gsignals__ = { # This is the Gtk widget signal's name str('changed'): (GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT,)), # It's probably not the best name for that signal. # While "barcode_scanned" might be better, it is probably # unneccesarily specific. str('barcode'): (GObject.SignalFlags.RUN_LAST, None, (str, # The barcode string Gst.Message.__gtype__, # The GStreamer message itself GdkPixbuf.Pixbuf.__gtype__,),) # The pixbuf which caused # the above string to be decoded } def __init__(self, builder=None): log.debug("Init KFSW %r %r", self, builder) if issubclass(self.__class__, object): super(KeyFprScanWidget, self).__init__() else: Gtk.VBox.__init__(self) log.debug("Inited parent KFSW %r", self) widget_name = 'scanner_widget' if not builder: thisdir = os.path.dirname(os.path.abspath(__file__)) builder = Gtk.Builder() builder.add_objects_from_file(os.path.join(thisdir, 'receive.ui'), [widget_name]) widget = builder.get_object(widget_name) parent = widget.get_parent() if parent: parent.remove(widget) self.add(widget) self.scanner = builder.get_object("scanner") if not Gst.is_initialized(): log.error("Gst does not seem to be initialised. Call Gst.init()!") # This needs to be called before creating a BarcodeReaderGTK Gst.init(None) reader = BarcodeReaderGTK() reader.set_size_request(150,150) reader.connect('barcode', self.on_barcode) self.scanner.add(reader) # We keep a referece here to not "lose" the object. # If we don't, Gtk crashes. With a segfault. Probably # because the object is freed but still used. # Somebody should look at that... self.reader = reader self.fpr_entry = builder.get_object("fingerprint_entry") self.fpr_entry.connect('changed', self.on_text_changed) self.set_hexpand(True) self.set_vexpand(True) # Temporary measure... self.barcode_scanner = self def on_text_changed(self, entryObject, *args): self.emit('changed', entryObject, *args) def on_barcode(self, sender, barcode, message, image): self.emit('barcode', barcode, message, image) def get_text(self): "Returns the text present in the Entry" text = self.fpr_entry.get_text() return text class KeyScanApp(Gtk.Application): def __init__(self, *args, **kwargs): super(KeyScanApp, self).__init__(*args, **kwargs) self.connect('activate', self.on_activate) self.scanwidget = None self.log = logging.getLogger(__name__) def on_activate(self, app): window = Gtk.ApplicationWindow() window.set_title("Key Fingerprint Scanner Widget") window.set_size_request(600, 400) if not self.scanwidget: self.scanwidget = KeyFprScanWidget() self.scanwidget.connect('changed', self.on_text_changed) self.scanwidget.connect('barcode', self.on_barcode) window.add(self.scanwidget) window.show_all() self.add_window(window) def on_text_changed(self, keyFprScanWidget, entryObject, *args): self.log.debug ("Text changed! %s" % (entryObject.get_text(),)) def on_barcode(self, sender, barcode, message, image): self.log.debug ("Barcode signal %r %r", barcode, message) if __name__ == "__main__": import sys logging.basicConfig(level=logging.DEBUG) Gst.init(None) app = KeyScanApp() app.run() gnome-keysign-1.3.0/keysign/keylistwidget.py000077500000000000000000000173571431057335600212310ustar00rootroot00000000000000#!/usr/bin/env python from __future__ import unicode_literals import logging import os import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import GObject # for __gsignals__ from gi.repository import GLib # for markup_escape_text if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .gpgmeh import get_usable_keys from .i18n import _ from .util import fix_infobar log = logging.getLogger(__name__) class ListBoxRowWithKey(Gtk.ListBoxRow): "A simple extension of a Gtk.ListBoxRow to also hold a key object" def __init__(self, key): super(ListBoxRowWithKey, self).__init__() self.key = key s = self.format(key) label = Gtk.Label(label=s, use_markup=True, xalign=0) self.add(label) @staticmethod def glib_markup_escape_text_to_text(s): """A helper function to return the text type markup_escape_text returns a "str" which is a binary type in python2. This function tries to decode the returned str object. It will fail in Python3. """ m = GLib.markup_escape_text(s) try: ret = m.decode('utf-8') except AttributeError: # We are in Python3 land. All is fine. ret = m return ret @classmethod def format_uid(cls, uid): "Returns a pango string for a gpgmeh.UID" fmt = "{name}\t{email}\t{expiry}" items = ('name', 'email', 'expiry') format_dict = {k: ""+(uid._asdict()[k] or "") for k in items} log.info("format dicT: %r", format_dict) d = {k: (log.debug("handling kv: %r %r", k, v), cls.glib_markup_escape_text_to_text( "{}".format(v)))[1] for k, v in format_dict.items()} log.info("Formatting UID %r", d) s = fmt.format(**d) log.info("Formatted UID: %r", s) return s @classmethod def format(cls, key): "Returns a pango string for a gpgmeh.Key" fmt = "{created} " fmt = "{fingerprint}\n" fmt += "\n".join((cls.format_uid(uid) for uid in key.uidslist)) fmt += "\n" + _("Expires: ") + " {expiry}" d = {k: GLib.markup_escape_text("{}".format(v)) for k,v in key._asdict().items()} log.info("Formatting key %r", d) s = fmt.format(**d) log.info("Formatted key: %r", s) return s class KeyListWidget(Gtk.HBox): """A Gtk Widget representing a list of OpenPGP Keys It shows the keys you provide in a ListBox and emits a `key-activated` or `key-selected` signal when the user "activated" or "selected" a key. "Activating" is Gtk speak for double-clicking (or pressing space, enter, ...) on an entry. It is also possible that the widget emits that signal on a single click if so configured. "Selected" means that the user switched to an entry, e.g. by clicking it or pressing up or down. If you don't provide any keys, the widget will not behave nicely and potentially display a user facing warning. Or not. """ __gsignals__ = { str('key-activated'): (GObject.SignalFlags.RUN_LAST, None, # (ListBoxRowWithKey.__gtype__,) (object,)), # The activated key str('key-selected'): (GObject.SignalFlags.RUN_LAST, None, # (ListBoxRowWithKey.__gtype__,) (object,)), # The selected key } def __init__(self, keys, builder=None): "Sets the widget up with the given keys" super(KeyListWidget, self).__init__() self.log = logging.getLogger(__name__) self.log.debug("KLW with keys: %r", keys) thisdir = os.path.dirname(os.path.abspath(__file__)) widget_name = 'keylistbox' if not builder: builder = Gtk.Builder() builder.add_objects_from_file( os.path.join(thisdir, 'send.ui'), [widget_name]) widget = builder.get_object(widget_name) old_parent = widget.get_parent() if old_parent: old_parent.remove(widget) self.add(widget) self.listbox = builder.get_object("keys_listbox") self.code_spinner = builder.get_object("code_spinner") self.ib_internet = builder.get_object('infobar_internet') fix_infobar(self.ib_internet) self.label_ib_internet = builder.get_object('label_internet') self.ib_import_okay = builder.get_object('infobar_import_okay') self.ib_import_error = builder.get_object('infobar_import_error') assert self.ib_import_okay assert self.ib_import_error fix_infobar(self.ib_import_okay) fix_infobar(self.ib_import_error) self.label_ib_import_okay = builder.get_object('label_import_okay') self.image_ib_import_okay = builder.get_object('image_import_okay') self.label_ib_import_error = builder.get_object('label_import_error') self.image_ib_import_error = builder.get_object('image_import_error') self.button_ib_import_error = builder.get_object('import_error_details_button') self.button_ib_import_okay = builder.get_object('return_signature') if len(list(keys)) <= 0: infobar = builder.get_object("infobar") infobar.show() l = Gtk.Label("You don't have any OpenPGP keys") self.listbox.add(l) else: for key in keys: self.log.debug("Adding key: %r", key) lbr = ListBoxRowWithKey(key) lbr.props.margin_bottom = 5 self.listbox.add(lbr) self.listbox.connect('row-activated', self.on_row_activated) self.listbox.connect('row-selected', self.on_row_selected) def on_row_activated(self, keylistwidget, row): if row: self.emit('key-activated', row.key) def on_row_selected(self, keylistwidget, row): if row: self.emit('key-selected', row.key) class App(Gtk.Application): def __init__(self, *args, **kwargs): super(App, self).__init__(*args, **kwargs) self.connect('activate', self.on_activate) self.kpw = None def on_activate(self, app): window = Gtk.ApplicationWindow() window.set_title("Key List") if not self.kpw: self.kpw = KeyListWidget(get_usable_keys()) self.kpw.connect('key-activated', self.on_key_activated) self.kpw.connect('key-selected', self.on_key_selected) window.add(self.kpw) window.show_all() self.add_window(window) def on_key_activated(self, keylistwidget, row): self.get_windows()[0].get_window().beep() print ("Row activated! %r" % (row,)) def on_key_selected(self, keylistwidget, row): print ("Row selected! %r" % (row,)) def run(self, args): if not args: args = [""] keys = list(get_usable_keys(pattern=args[0])) self.kpw = KeyListWidget(keys) super(App, self).run() if __name__ == "__main__": import sys logging.basicConfig(level=logging.DEBUG) app = App() app.run(sys.argv[1:]) gnome-keysign-1.3.0/keysign/locale/000077500000000000000000000000001431057335600172065ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/README.rst000066400000000000000000000026371431057335600207050ustar00rootroot00000000000000Translations ============== This document describes operations we anticipate to occur every so often, but not often enough to remember. Updating existing translations ------------------------------- Everytime a translatable string has changed, the .pot file needs to be updated. This can be done with python setup.py extract_messages From the .pot file, the actual to-be-translated .po files need to be generated. This can be done with python setup.py update_catalog Now, you can edit the .po file of your language. Later, the .po files need to be compiled into .mo files. That, however, should be done by the setup.py when building the package. To do that manually, you can try to python setup.py compile_catalog Testing translations ---------------------- In order to test whether the translation works as expected, you can run the (built and installed) program with the locale of your desire set via the environment, i.e. env LC_MESSAGES=de_DE.utf-8 Check the output of locale -a to determine which locales you have installed. Starting a new translation --------------------------- For providing a new language, the .pot file has to be generated (or updated) using: python setup.py extract_messages Now, the initial .po file can be created using the command below, replacing "en" with the language code you want to translate to: python setup.py init_catalog --locale en gnome-keysign-1.3.0/keysign/locale/cs/000077500000000000000000000000001431057335600176135ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/cs/LC_MESSAGES/000077500000000000000000000000001431057335600214005ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/cs/LC_MESSAGES/keysign.po000066400000000000000000000355271431057335600234250ustar00rootroot00000000000000# Czech translation for gnome-keysign. # Copyright (C) 2018 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # # Marek Černocký , 2018, 2020, 2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-09-06 07:42+0200\n" "Last-Translator: Marek Černocký \n" "Language-Team: čeština \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Gtranslator 2.91.7\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" "Podepisování klíčů GNOME umožňuje pohodlné a bezpečné podepisování klíčů " "OpenPGP přes místní síť nebo Bluetooth. " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" "Umí číst čárový kód jiného klíče a klíče bezpečně přenášet, což se hodí pro " "dvoustranné podepisování klíčů. Drží se osvědčené praxe posílání šifrovaných " "podpisů do UID klíče pomocí e-mailového klienta, kterého pro daný účel " "uživatel nastavil." #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Podepisování klíčů" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Pomocník s podepisováním klíčů, abyste si mohli s přáteli pohodlně vyměňovat " "klíče OpenPGP" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Odeslání" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Příjem" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Nabízený klíč: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informace o vyhledávání: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Zastavíte zmáčknutím Enter" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Musíte zadat argument pro identifikaci klíče" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth není k dispozici" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Zrušíte zmáčknutím Enter" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Klíč byl úspěšně odeslán" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Vyskytla se chyba: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Ukončíte zmáčknutím Enter" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Zkouší se stáhnout klíč, čekejte prosím" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Nelze spusti Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Podepisování klíčů není schopné automaticky spustit Avahi. Můžete zkusit " "spustit ručně „systemctl start avahi-daemon“, aby se problém vyřešil." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Budiž" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Zjištěna chyba" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Byla zjištěna programová chyba." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Můžete tuto chybu ignorovat a pokračovat v práci, ale může to způsobit " "neočekávané výsledky.\n" "\n" "Pokud problém zatím nikdo nenahlásil, řekněte o něm prosím vývojářům pomoci " "systému pro sledování problémů." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Vyhledat v nahlášených…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Nahlásit…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignorovat chyby" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Ukončit Podepisování klíčů" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Podrobnosti…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Výjimka při analýze výjimky." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Dejte hlášení výstižný anglický název.\n" " Pokud můžete, použijte něco jako\n" " \"{vadná-funkce}: {co-je-špatně}\"\n" " Po té nahraďte tento text delším popisem\n" " chyby v angličtině. Hodit se mohou i\n" " Snímky nebo nahrávky obrazovky.\n" "\n" " #### Steps to reproduce\n" "\n" " Sdělte nám anglicky, co přesně děláte,\n" " když se chyba projeví.\n" " Nejlepší je, pokud můžete napsat krok za\n" " krokem instrukce, které vedou k vyvolání.\n" " chyby.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Vyprší: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Podepisovací klíč" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Vyberte soubor k uložení" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "V okolí není žádný server pro podepisování klíčů :-(\n" "Domluvte se s přáteli na používání aplikace Podepisování klíčů.\n" "Nebo je také možné, že máte jen problémy s připojením k síti.\n" "Více informací najdete v tomto dokumentu." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Abyste mohl podepsat něčí klíč, musíte načíst QR kód neb zadat " "bezpečnostní kód" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Integrovaná webová kamera" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Bezpečnostní kód" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Načtení čárového kódu" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Stahují se data klíče. Čekejte prosím…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Stahování klíče bylo přerušeno!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Zobrazit k chybě podrobností" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Certifikát produkující chyby ☹\n" "Něco bylo špatně. Někdy bývá nesprávně zadaná heslová fráze.\n" "Můžete to zkusit znovu zmáčknutím tlačítka „Potvrdit“." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "Uložit vytvořené certifikáty jako samostatné soubory ve vlastní složce" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "Naimportovat dočasné verze vytvořených certifikátů do místní klíčenky" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Byly úspěšně vytvořeny klíče.\n" "Jestliže byl klíč ji řádně prověřen, můžete naimportovat dočasný podpis, aby " "se klíč začal používat.\n" "Více informací najdete v tomto dokumentu." #: keysign/receive.ui:541 msgid "Key" msgstr "Klíč" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Jestli chcete klíč podepsat, potvrďte, že chcete podepsat následující klíč.\n" "Tím se vygeneruje e-mail, který musíte odeslat, aby bylo podepsání úplné." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "P_otvrdit" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Podepisují se následující UID:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Stále se zkouší získat připojení do Internetu. Vypadá to, že je pomalé nebo " "nedostupné." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Není k dispozici internetové připojení!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Klíč byl úspěšně odeslán.\n" "V krátké době byste měli obdržet e-mail s podpisem." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Nelze ustavit bezpečné spojení.\n" "Buď váš partner zadal nesprávný kód nebo se někdo pokusil zachytit vaše " "spojení." #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Vyskytla se neočekávaná chyba:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Výběr a odeslání klíče" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Výběr a odeslání klíče" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "K přenosu certifikátu použít také Internet" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Nemáte žádné klíče!\n" "Použijte prosím třeba „Hesla a klíče“ k vytvoření nějakého." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Připojení do Internetu je pomalé nebo nefunkční!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Podpis byl úspěšně naimportován." #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Vrací přijatou certifikaci zpět odesilateli, takže tento odesilatel může " "používat váš certifikát OpenPGP." #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Zobrazit k chybě více podrobností." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Při pokusu o import podpisu se vyskytla chyba." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Vyberte klíč k podepsání" #: keysign/send.ui:443 msgid "Times signed" msgstr "Počet podepsání" #: keysign/send.ui:510 msgid "Keylist" msgstr "Seznam klíčů" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Abyste měli klíč podepsaný, musí jiná osoba zadat bezpečnostní kód " "nebo načíst QR kód" #: keysign/send.ui:557 msgid "Key Details" msgstr "Údaje klíče" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Otisk" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR kód" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Milý uživateli/uživatelko $uid,\n" "\n" "\n" "Právě byl podepsán váš klíč\n" "\n" " $fingerprint\n" "\n" "\n" "Děkujeme, že jste umožnil(a) svůj klíč podepsat!\n" "\n" "--\n" "Podepisování klíčů GNOME\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Nesprávný ověřovací kód zprávy" gnome-keysign-1.3.0/keysign/locale/da/000077500000000000000000000000001431057335600175725ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/da/LC_MESSAGES/000077500000000000000000000000001431057335600213575ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/da/LC_MESSAGES/keysign.po000066400000000000000000000357631431057335600234060ustar00rootroot00000000000000# Danish translation for gnome-keysign. # Copyright (C) 2019 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # scootergrisen, 2019, 2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-05-05 00:00+0200\n" "Last-Translator: scootergrisen\n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Nøgleunderskriver gør det muligt at underskrive OpenPGP-nøgler\n" " komfortabelt og sikkert via det lokale netværk eller Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Den kan skanne andre nøglers stregkode og overføre nøglen sikkert,\n" " hvilket giver afslappede nøgleunderskrivningssessioner mellem to " "parter.\n" " Den følger bedste praksisser ved at sende de krypterede underskrifter\n" " til UID'erne af en nøgle med den e-mailklient brugeren har\n" " konfigureret.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Nøgleunderskriver" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "En nøgleunderskriver-hjælper som giver dig mulighed for komfortabelt at " "udveksle OpenPGP-nøgler med en ven" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;nøgle;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Send" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Modtag" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Tilbyder nøgle: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Opdagelsesinfo: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Tryk på Enter for at stoppe" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Du skal angive et argument for at identificere nøglen" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth er ikke tilgængelig" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Tryk på Enter for at annullere" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Nøglen blev sendt" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Der opstod en fejl: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Tryk på Enter for at afslutte" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Prøver at downloade nøglen, vent venligst" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Kan ikke starte Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Nøgleunderskriver kan ikke starte Avahi automatisk. Du kan prøve at udføre " "`systemctl start avahi-daemon` for at løse problemet." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Fejl registreret" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "En programmeringsfejl blev registreret." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Du kan muligvis ignorere fejlen og fortsætte arbejdet, men du får måske " "uventede resultater.\n" "\n" "Fortæl venligst udviklerne om det med issue trackeren, hvis ikke der er " "andre som har rapporteret det endnu." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Søg i tracker …" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Rapportér …" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignorer fejl" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Afslut GNOME Nøgleunderskriver" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Detaljer …" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Undtagelse ved analysering af undtagelsen." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Beskrivelse\n" "\n" " Giv rapporteren en kort beskrivende titel.\n" " Brug noget i stil med\n" " \"{funktionalitet-som-ikke-virker}: {hvad-der-gik-galt}\"\n" " til titlen, hvis du kan.\n" " Erstat så venligst denne teskt med\n" " en længere beskrivelse af fejlen.\n" " Skærmbilleder eller videoer er også godt!\n" " Skriv venligst titlen på engelsk hvis du kan.\n" "\n" " #### Trin til at genskabe\n" "\n" " Fortæl os venligst hvad du gjorde\n" " da fejlmeddelelsen kom frem.\n" " Hvis du kan give trin for trin instruktioner\n" " til hvordan fejlen kan genskabes,\n" " så er det endnu bedre.\n" "\n" " #### Traceback (tilbagesporing)\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Udløber: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Underskriv nøgle" #: keysign/receive.py:225 #| msgid "Select a key for signing" msgid "Select file for saving" msgstr "Vælg fil som skal gemmes" #: keysign/receive.ui:53 #| msgid "" #| "No GNOME Keysign servers around :-(\n" #| "Find a friend to use GNOME Keysign with.\n" #| "You may also suffer from connectivity problems.\n" #| "For more information click here." msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Fandt ingen tilgængelige servere til GNOME Nøgleunderskriver :-(\n" "Find en ven at bruge GNOME Nøgleunderskriver med.\n" "Der kan også være problemer med netværket.\n" "Besøg dokumentationen for mere information." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "For at underskrive nogens nøgle, skal du skanne deres QR eller " "indtaste sikkerhedskoden" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Integreret webcam" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Sikkerhedskode" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Skan stregkode" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Downloader nøgledata. Vent venligst …" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Download af nøgle blev afbrudt!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Vis detaljer om fejlen" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Fejl ved generering af certificeringer ☹\n" "Noget gik galt. Det kan være, at adgangskoden ikke blev indtastet korrekt.\n" "Du kan prøve igen ved at klikke på knappen \"bekræft\"." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "Gemmer de genererede certificeringer som separate filer i en brugerdefineret mapper" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "Importerer en midlertidig version af de genererede certificeringer i den lokale nøglering" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "Certificeringer blev genereret.\n" "Du kan importere en midlertidig underskrift for at begynde at bruge nøglen, som " "om den allerede er blevet bekræftet ordentligt.\n" "Besøg dokumentation for more information." #: keysign/receive.ui:541 msgid "Key" msgstr "Nøgle" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID'er" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "For at fortsætte, skal du bekræfte, at du vil underskrive følgende nøgle.\n" "Det genererer en e-mail som skal sendes for at fuldføre " "underskriftsprocessen." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "_Bekræft" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Underskriver følgende UID'er:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Prøver stadigvæk på at få forbindelse til internettet. Det ser ud til at " "være langsomt eller utilgængeligt." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Der er ikke forbindelse til internettet!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Nøglen blev sendt.\n" "Du bør snart modtage en e-mail med underskriften." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Kunne ikke etablere en sikker forbindelse.\n" "Enten har din partner indtastet en forkert kode eller nogen prøvede på at " "opsnappe din forbindelse" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Der opstod en uventet fejl:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Vælg og send nøgle" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Vælg og send nøgle" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Du kan også bruger internettet til at overføre certifikatet" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Du har ikke nogen nøgler!\n" "Brug venligst f.eks. Seahorse til at oprette en." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Meget langsom eller ingen internetforbindelse!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Underskriften blev importeret!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "Returnerer den modtagne certificering til afsenderen, så afsenderen kan bruge dit " "OpenPGP-certifikat" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Vis flere detaljer om fejlen." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Der opstod en fejl da underskriften blev forsøgt importeret." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Vælg en nøgle som skal underskrives" #: keysign/send.ui:443 msgid "Times signed" msgstr "Antal underskrifter" #: keysign/send.ui:510 msgid "Keylist" msgstr "Nøgleliste" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "For at underskrive nøglen, skal den anden person indtaste " "sikkerhedskoden eller skanne QR-koden" #: keysign/send.ui:557 msgid "Key Details" msgstr "Nøgledetaljer" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Fingeraftryk" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR-kode" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Hej $uid,\n" "\n" "\n" "Jeg har lige underskrevet din nøgle\n" "\n" " $fingerprint\n" "\n" "\n" "Tak fordi du lod mig underskrive din nøgle!\n" "\n" "--\n" "GNOME Nøgleunderskriver\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Forkert autentifikationskode for meddelelse" gnome-keysign-1.3.0/keysign/locale/de/000077500000000000000000000000001431057335600175765ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/de/LC_MESSAGES/000077500000000000000000000000001431057335600213635ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/de/LC_MESSAGES/keysign.po000066400000000000000000000404421431057335600234000ustar00rootroot00000000000000# German translations for gnome-keysign. # Copyright (C) 2017 Tobias Mueller # This file is distributed under the same license as the gnome-keysign # project. # Mario Blättermann , 2018. # Christian Kirbach , 2020. # Jürgen Benvenuti , 2022. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign 0.9\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2022-07-12 13:12+0200\n" "Last-Translator: Jürgen Benvenuti \n" "Language-Team: Deutsch \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: Babel 2.5.1\n" "X-Generator: Poedit 3.1\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Keysign ermöglicht das bequeme und sichere Signieren von OpenPGP-" "Schlüsseln\n" " über das lokale Netzwerk oder Bluetooth.\n" " " # CHECK: Keysigning-Party...? # Außerdem ein offensichtlicher Fehler im Original: höchstwahrscheinlich geht es generell nur um QR-Codes, nicht um Barcodes. #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Das Programm scannt den Barcode eines anderen Schlüssels und " "überträgt\n" " den Schlüssel sicher, was spontane Signier-Partys zu zweit ermöglicht. " "Es hält\n" " sich dabei an die übliche Vorgehensweise. So schickt es die " "verschlüsselten\n" " Signaturen als E-Mail-Anhang an die Benutzerkennungen des Schlüssels " "unter\n" " Benutzung des E-Mail-Clients, den der Benutzer schon eingerichtet " "hat.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Ein Dienstprogramm zum Beglaubigen von Schlüsseln, um komfortabel OpenPGP-" "Schlüssel mit einem Freund auszutauschen" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;Schlüssel;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Senden" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Empfangen" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Schlüssel wird angeboten: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Suchinformation: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Eingabetaste zum Stoppen drücken" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Sie müssen ein Argument angeben, um den Schlüssel zu identifizieren" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth ist nicht verfügbar" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Drücken Sie die Eingabetaste, um den Vorgang abzubrechen" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Schlüssel erfolgreich gesendet" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Es ist ein Fehler aufgetreten: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Eingabetaste zum Beenden drücken" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Es wird versucht, den Schlüssel herunterzuladen. Bitte warten" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Avahi kann nicht gestartet werden" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysign kann Avahi nicht automatisch starten. Sie können versuchen, " "»systemctl start avahi-daemon« zur Lösung dieses Problems zu verwenden." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Fehler erkannt" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Ein Programmierfehler wurde bemerkt." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Sie können diesen Fehler ignorieren und weiter arbeiten, was aber zu " "unerwarteten Ergebnissen\n" "führen könnte.\n" "\n" "Bitte melden Sie dies mit Hilfe des Fehlererfassungssystems den Entwicklern, " "falls es bisher\n" "noch von niemandem gemeldet wurde." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Fehlererfassungssystem durchsuchen …" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Melden …" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Fehler ignorieren" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "GNOME Keysign beenden" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Details …" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Ausnahmefehler während der Analyse der Ausnahme." # Müssen wir so etwas übersetzen? Die Gitlab-Oberfläche ist sowieso in Englisch, und vom Bugreporter wird auch Englisch erwartet. Zar haben wird es hier in diesem Fall mit einem deutschsprachigen Entwickler zu tun, aber in anderen Sprachen ergibt so etwas überhaupt keinen Sinn. #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " {feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Läuft ab: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Schlüssel beglaubigen" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Datei zum Speichern auswählen" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Keine GNOME Keysign Server in der Nähe :-(\n" "Sie brauchen einen Freund, um GNOME Keysign zu benutzen.\n" "Netzwerkprobleme können auch ursächlich sein.\n" "Weitere Informationen finden Sie hier." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Scannen Sie einen QR-Code oder tippen Sie den Sicherheitscode ein, um " "einen Schlüssel zu beglaubigen" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Integrierte Webcam" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Sicherheitscode" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Barcode scannen" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Herunterladen von Schlüsseldaten. Bitte warten …" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Herunterladen des Schlüssels wurde unterbrochen!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Details zum Fehler anzeigen" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Fehler beim Erstellen von Zertifizierungen ☹\n" "Etwas ist schiefgegangen. Manchmal wurde die Passphrase nicht korrekt " "eingegeben.\n" "Sie können es erneut probieren, indem Sie auf den »Bestätigen«-Knopf klicken." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Speichert die erstellten Zertifizierungen als separate Dateien in einem " "benutzerdefinierten Ordner" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importiert eine temporäre Version der erstellten Zertifizierungen in den " "lokalen Schlüsselring" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Erfolgreich hergestellte Zertifizierungen.\n" "Sie können eine temporäre Signatur importieren, um den Schlüssel so zu " "verwenden, als ob er bereits ordnungsgemäß überprüft worden wäre.\n" "Weitere Informationen finden Sie in der Dokumentation." #: keysign/receive.ui:541 msgid "Key" msgstr "Schlüssel" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "Benutzerkennungen" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Bestätigen Sie das Beglaubigen des Schlüssels.\n" "Im Anschluss wird eine E-Mail generiert, die verschickt werden muss, um das " "Beglaubigen abzuschließen." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "_Bestätigen" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Folgende Benutzerkennungen werden beglaubigt:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Es wird immer noch versucht, eine Verbindung zum Internet herzustellen. " "Offensichtlich ist die Verbindung langsam oder nicht verfügbar." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Es gibt keine Internetverbindung!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Der Schlüssel wurde erfolgreich gesendet.\n" "Sie sollten zeitnah eine E-Mail mit der Signatur erhalten." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Es konnte keine sichere Verbindung aufgebaut werden.\n" "Entweder hat Ihr Partner einen falschen Code eingegeben oder jemand " "versucht, die Datenübertragung zu belauschen" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Ein unerwarteter Fehler ist aufgetreten:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Schlüssel auswählen und senden" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Schlüssel auswählen und senden" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Verwenden Sie auch das Internet, um das Zertifikat zu übertragen" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Sie haben keine Schlüssel!\n" "Sie können beispielsweise Seahorse verwenden, um einen Schlüssel zu erzeugen." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Sehr langsame oder keine Internetverbindung!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Die Signatur wurde erfolgreich importiert!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Schickt die empfangene Zertifizierung zurück an den Absender, sodass der " "Absender Ihr OpenPGP-Zertifikat nutzen kann" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Weitere Details zum Fehler anzeigen." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Beim Importieren der Signatur ist ein Fehler aufgetreten." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Einen Schlüssel zum Beglaubigen auswählen" # CHECK #: keysign/send.ui:443 msgid "Times signed" msgstr "Anzahl erhaltener Signaturen" #: keysign/send.ui:510 msgid "Keylist" msgstr "Schlüsselliste" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Um den Schlüssel beglaubigen zu lassen, muss eine andere Person den " "Sicherheitscode oder den QR-Code scannen" #: keysign/send.ui:557 msgid "Key Details" msgstr "Schlüsseldetails" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Fingerabdruck" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR-Code" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Hallo $uid,\n" "\n" "Ich habe gerade Ihren Schlüssel unterschrieben\n" "\n" "$fingerprint\n" "\n" "Vielen Dank, dass Sie mich Ihren Schlüssel unterschreiben haben lassen!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Falscher Nachrichtenauthentifizierungscode" #~ msgid "installing symlinks for sockets from %s to %s" #~ msgstr "" #~ "Symbolische Verknüpfungen für Sockets aus %s werden nach %s installiert" #~ msgid "Translated for gettext (C)" #~ msgstr "Übersetzt für gettext (DE)" #~ msgid "Translated for Python (C)" #~ msgstr "Übersetzt für Python (DE)" #~ msgid "page1" #~ msgstr "Seite1" #~ msgid "page2" #~ msgstr "Seite2" #~ msgid "page3" #~ msgstr "Seite3" gnome-keysign-1.3.0/keysign/locale/en_GB/000077500000000000000000000000001431057335600201605ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/en_GB/LC_MESSAGES/000077500000000000000000000000001431057335600217455ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/en_GB/LC_MESSAGES/keysign.po000066400000000000000000000327051431057335600237650ustar00rootroot00000000000000# British English translation for gnome-keysign. # Copyright (C) 2020 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Stephan Woidowski , 2020. # Bruce Cowan , 2020. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2020-09-16 21:24+0000\n" "PO-Revision-Date: 2020-09-19 12:25+0100\n" "Last-Translator: Bruce Cowan \n" "Language-Team: English - United Kingdom \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 3.36.0\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practices by sending the encrypted signatures\n" " to the UIDs of a key using the E-mail client the user configured\n" " to use.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Send" #: keysign/app.py:188 keysign/receive.py:272 msgid "Receive" msgstr "Receive" #: keysign/app.ui:62 keysign/send.ui:54 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Offering key: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Discovery info: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Press Enter to stop" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "You must provide an argument to identify the key" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth not available" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Press Enter to cancel" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Key successfully sent" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "An error occurred: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Press Enter to exit" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Trying to download the key, please wait" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Unable to Start Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Bug Detected" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "A programming error has been detected." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Search Tracker..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Report..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignore Error" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Quit GNOME Keysign" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Details..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Exception while analysing the exception." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Expires: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Sign Key" #: keysign/receive.py:218 msgid "Select file for saving" msgstr "Select file for saving" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "To sign someone's key, scan their QR or enter security code" #: keysign/receive.ui:127 msgid "Camera" msgstr "Camera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Integrated Web Cam" #: keysign/receive.ui:179 keysign/send.ui:568 msgid "Security Code" msgstr "Security Code" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Scan Barcode" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Downloading key-data. Please wait..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Key download was interrupted!" #: keysign/receive.ui:345 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Saves the produced certifications as separate files in a custom directory" #: keysign/receive.ui:360 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Imports a temporary version of the produced certifications into the local " "keyring" #: keysign/receive.ui:403 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." #: keysign/receive.ui:446 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an e-mail that must be sent in order to complete the " "signing process." #: keysign/receive.ui:474 msgid "Key" msgstr "Key" #: keysign/receive.ui:507 keysign/send.ui:493 msgid "UIDs" msgstr "UIDs" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "C_onfirm" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "Signing the following UIDs:" #: keysign/send.py:207 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." #: keysign/send.py:213 msgid "There isn't an Internet connection!" msgstr "There isn't an Internet connection!" #: keysign/send.py:219 keysign/send.ui:267 msgid "The signature has been successfully imported!" msgstr "The signature has been successfully imported!" #: keysign/send.py:225 msgid "" "An error occurred while trying to import the signature.\n" "Please double check the correctness of the chosen signature." msgstr "" "An error occurred while trying to import the signature.\n" "Please double check the correctness of the chosen signature." #: keysign/send.py:254 keysign/send.ui:678 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Key successfully sent.\n" "You should receive soon an e-mail with the signature." #: keysign/send.py:259 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" #: keysign/send.py:263 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "An unexpected error occurred:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Select and send key" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Select and Send key" #: keysign/send.ui:121 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." #: keysign/send.ui:198 msgid "Very slow or no Internet connection!" msgstr "Very slow or no Internet connection!" #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:322 msgid "Select a key for signing" msgstr "Select a key for signing" #: keysign/send.ui:338 msgid "Times signed" msgstr "Times signed" #: keysign/send.ui:405 msgid "Keylist" msgstr "Keylist" #: keysign/send.ui:425 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" #: keysign/send.ui:452 msgid "Key Details" msgstr "Key Details" #: keysign/send.ui:477 msgid "Fingerprint" msgstr "Fingerprint" #: keysign/send.ui:631 msgid "QR Code" msgstr "QR Code" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Wrong message authentication code" gnome-keysign-1.3.0/keysign/locale/es/000077500000000000000000000000001431057335600176155ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/es/LC_MESSAGES/000077500000000000000000000000001431057335600214025ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/es/LC_MESSAGES/keysign.po000066400000000000000000000366371431057335600234320ustar00rootroot00000000000000# Spanish translations for gnome-keysign. # Copyright (C) 2018 Tobias Mueller # This file is distributed under the same license as the gnome-keysign # project. # FIRST AUTHOR , 2018. # Daniel Mustieles , 2018-2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign 0.9.7.2\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-05-05 10:58+0200\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Spanish - Spain \n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: Babel 2.5.1\n" "X-Generator: Gtranslator 40.0\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME-Keysign permite firmar llaves OpenPGP de manera cómoda y segura\n" " a través de la red local o Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Puede escanear el código de barra de otra llave y transferirla\n" " de manera segura, permitiendo sesiones casuales bipartitas de firma de " "llave.\n" " Siga buenas prácticas al enviar las firmas cifradas a los UID\n" " de una llave usando el cliente de correo configurado por\n" " el usuario.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Un ayudante para firmar llaves que le permite cómodamente intercambiar " "llaves OpenPGP con un amigo" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Enviar" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Recibir" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Ofreciendo clave: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Información de descubrimiento: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Pulse Intro para parar" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Debe proporcionar un argumento para identificar la clave" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth no disponible" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Pulse Intro para cancelar" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Clave enviada con éxito" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Ha ocurrido un error: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Pulse Intro para salir" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Intentando descargar la clave, espere por favor" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "No se pudo iniciar Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysing no puede iniciar Avahi automáticamente. Puede intentar ejecutar " "«systemctl start avahi-daemon» para solucionar este problema." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Aceptar" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Error detectado" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Se ha detectado un error de programación." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Es posible que pueda ignorar este error y continuar trabajando, pero puede " "que haya resultados inesperados.\n" "\n" "Informe de esto a los desarrolladores usando el gestor de informes de error " "si nadie más lo ha reportado aún." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Buscar Tracker..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Informar..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignorar error" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Salir de GNOME Keysign" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Detalles..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Excepción analizando la excepción." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Descripción\n" "\n" " Asigne a este reporte un título corto y descriptivo.\n" " Use algo como\n" " \"{característica-rota}: {fallo}\"\n" " para el título, si es posible.\n" " Luego reemplace este texto\n" " con una descripción más larga del error.\n" " Las capturas de pantalla o vídeos vienen genial.\n" "\n" " #### Pasos para reproducir\n" "\n" " Díganos qué estaba haciendo\n" " cuando el mensaje de error apareció.\n" " Si puede ofrecer instrucciones paso a paso\n" " para poder reproducir el error,\n" " mejor aún.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Expira: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Firmar clave" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Seleccione un archivo para guardar" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "No hay servidores GNOME Keysign cerca :-(\n" "Encuentre un amigo con el que usar GNOME Keysign.\n" "Puede que también esté teniendo problemas de conectividad.\n" "Para obtener más información visite la documentación." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Para firmar la llave de alguien, escanee su QR o introduzca el código " "de seguridad" #: keysign/receive.ui:127 msgid "Camera" msgstr "Cámara" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Cámara web Integrada" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Código de seguridad" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Escanear código de barras" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Descargando datos de clave, espere..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Se ha interrumpido la descarga de la clave." #: keysign/receive.ui:346 #| msgid "Display more details for the error." msgid "Show details about the error" msgstr "Mostrar más detalles sobre el error" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Error al generar los certificados ☹\n" "Algo ha fallado. Algunas veces la frase de paso no se ha introducido " "correctamente.\n" "Puede intentarlo de nuevo pulsando el botón «Confirmar»." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Guarda los certificados generados como archivos separados en una carpeta " "personalizada" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importa una versión temporal de los certificados generados en el depósito " "local" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Certificado generado correctamente.\n" "Puede importar una firma temporal para empezar a usar la clave como si se " "hubiera verificado adecuadamente.\n" "Para obtener más información visite la documentación." #: keysign/receive.ui:541 msgid "Key" msgstr "Llave" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Para firmar la clave, confirme que quiere firma la siguiente clave.\n" "Esto generará un correo que debe enviarse para completar el proceso de " "firmado." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "C_onfirmar" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Firmando los siguientes UID:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Intentado obtener conexión a Internet. Parece que va muy lento o que no está " "disponible." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "No hay conexión a Internet." #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Clave enviada correctamente.\n" "Debería recibir un correo con la firma en breve." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "No se ha podido establecer una conexión segura.\n" "O bien la otra parte ha introducido mal el código o alguien ha intentado " "interceptar la conexión." #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Ha ocurrido un error inesperado:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Seleccionar y enviar clave" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Seleccionar y enviar clave" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Usar también Internet para transferir el certificado" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "No tiene ninguna clave.\n" "Use algo como Seahorse para crear una." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Conexión a Internet muy lenta o no hay conexión." #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "La firma se ha importado correctamente." #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Devuelve la certificación recibida al remitente, por lo que éste puede usar " "su certificado openPGP" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Mostrar más detalles sobre el error." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Ha ocurrido un error al intentar importar la firma." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Seleccione una clave para firmar" #: keysign/send.ui:443 msgid "Times signed" msgstr "Veces firmada" #: keysign/send.ui:510 msgid "Keylist" msgstr "Lista de claves" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Para firmar la clave, la otra persona debe introducir el código de " "seguridad, o escanear el código QR" #: keysign/send.ui:557 msgid "Key Details" msgstr "Detalles de la clave" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Huella dactilar" #: keysign/send.ui:736 msgid "QR Code" msgstr "Código QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Hola $uid,\n" "\n" "\n" "Acabo de firmar su clave\n" "\n" "\n" " $fingerprint\n" "\n" "\n" "¡Gracias!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Mensaje de código de autenticación incorrecto" #~ msgid "" #~ "Uses the Internet to transport the key rather than the local network and " #~ "Bluetooth (if available)" #~ msgstr "" #~ "Usa Internet para transportar la clave en lugar de la red local y el " #~ "Bluetooth (si está disponible)" #~ msgid "Translated for gettext (C)" #~ msgstr "Traducido para gettext (es)" #~ msgid "Translated for Python (C)" #~ msgstr "Traducido para Python (es)" #~ msgid "installing symlinks for sockets from %s to %s" #~ msgstr "Instalando enlaces simbólicos para sockets de %s a %s" #~ msgid "page1" #~ msgstr "page1" #~ msgid "page2" #~ msgstr "page2" #~ msgid "page3" #~ msgstr "page3" #~ msgid "Sending {}" #~ msgstr "Enviando {}" gnome-keysign-1.3.0/keysign/locale/eu/000077500000000000000000000000001431057335600176175ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/eu/LC_MESSAGES/000077500000000000000000000000001431057335600214045ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/eu/LC_MESSAGES/keysign.po000066400000000000000000000344621431057335600234260ustar00rootroot00000000000000# Basque translation for gnome-keysign. # Copyright (C) 2019 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Asier Sarasua Garmendia , 2019, 2022. # msgid "" msgstr "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2022-04-26 10:00+0100\n" "Last-Translator: Asier Sarasua Garmendia \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "\n" " GNOME Keysign aplikazioaren bidez, OpenPGP gakoak modu seguru eta erosoan\n" " sinatu daitezke sare lokala edo Bluetooth-a erabilitz.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "\n" " Edozein gakoren barra-kodea eskaneatu dezake eta gakoa modu seguruan\n" " transferitu, bi alderen arteko gako-sinatzeko saioak onartzeko.\n" " Erabiltzaileak konfiguratutako posta-bezeroa erabiltzen du\n" " gako baten UIDei bidaltzeko zifratutako sinadura,\n" " praktika onen bidez.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "Gakoak sinatzeko laguntzailea, OpenPGP gakoak lagunekin erraz partekatzeko prestatua" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Bidali" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Hartu" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Gakoa eskaintzen: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Aurkitze-informazioa: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Sakatu Enter gelditzeko" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Argumentu bat eman behar duzu gakoa identifikatzeko" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Ataka: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth ez dago erabilgarri" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Sakatu Enter uzteko" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "\n" "Gakoa ongi bidali da" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "\n" "Errorea gertatu da: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Sakatu Enter irteteko" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Gakoa deskargatzen saiatzen, itxaron" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Ezin da Avahi abiarazi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "Keysign aplikazioak ezin du automatikoki abiarazi Avahi. Saia zaitez `systemctl start avahi-daemon` exekutatzen arazo hori konpontzeko." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Ados" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Akatsa detektatu da" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Programazio-errorea detektatu da." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "Errore honi ez ikusiarena egin diezaiokezu eta lanean jarraitu, baina espero gabeko emaitzak eduki ditzakedu.\n" "\n" "Ohartarazi garatzaileei honi buruz, auzien aztarnariaren bidez, beste inork akats honen berri eman ez badu." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Bilatu aztarnaria…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Jakinarazi…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ezikusi errorea" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Irten GNOME Keysign aplikaziotik" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Xehetasunak…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Salbuespena gertatu da salbuespena analizatzean." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr " #### Deskribapena\n" "\n" " Eman txosten honi deskribapen labur.\n" " Erabili honelako zerbait:\n" " \"{hautsi-den-eginbidea}: {zer-dabil-gaizki}\"\n" " izenbururako, ahal baduzu.\n" " Ondoren, ordeztu testu hau\n" " akatsaren deskribapen luzeago batekin.\n" " Pantaila-argazkiak ere baliagarriak dira.\n" "\n" " #### Akatsa errepikatzeko urratsak\n" "\n" " Esaiguzu zertan ari zinen\n" " errore-mezua agertu zenean.\n" " Akatsa errepikatzeko urratsez urratseko\n" " argibideak ematen badizkiguzu,\n" " askoz hobeto.\n" "\n" " #### Trazabilitatea\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Iraungitze-data: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Sinatu gakoa" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Hautatu gordeko den fitxategia" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "Ez dago GNOME Keysign zerbitzaririk inguruan.\n" "Aukritu lagunen bat GNOME Keysign berarekin erabiltzeko.\n" "Konektagarritasun-arazoak ere eduki ditzakezu.\n" "Informazio gehiagorako, bisitatu dokumentazioa." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "Norbaiten gakoa sinatzeko, eskaneatu haren QR kodea edo sartu segurtasun-kodea" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Integratutako web kamera" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Segurtasun-kodea" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Eskaneatu barra-kodea" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Gako-datuak deskargatzen. Itxaron…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Gakoaren deskarga eten egin da!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Erakutsi errorearen xehetasunak" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "Errorea ziurtagiriak ekoiztean ☹\n" "Zerbait gaizki joan da. Batzuetan pasaesaldia ez da ongi sartzen.\n" "Saiatu berriro \"berretsi\" botoia sakatuta." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "Ekoiztutako ziurtagiriak fitxategi bereizi gisa gordetzen ditu direktorio pertsonalizatu batean" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "Ekoiztutako ziurtagirien aldi baterako bertsio bat inportatzen du gako sorta lokalera" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "Ziurtagiriak ongi ekoiztu dira.\n" "Aldi baterako sinadura bat inportatu dezakezu gakoa erabiltzen hasteko, benetan egiaztatua izan balitz bezala erabiltzeko. Informazio gehiagorako, ikusi dokumentazioa." #: keysign/receive.ui:541 msgid "Key" msgstr "Gakoa" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UIDak" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "Gakoa sinatzeko, berretsi hurrengo gakoa sinatu nahi duzula.\n" "Horrek posta-mezu bat sortuko du. Mezu hori bidali behar da sinatze-prozesua ongi osatzeko." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "Be_rretsi" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Honako UIDak sinatzen:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "Interneteko konexio bat eskuratzen saiatzen. Badirudi motel doala edo ez dagoela erabilgarri." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Ez dago interneteko konexiorik!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "Gakoa ongi bidali da.\n" "Sinadura duen posta-mezu bat jasoko duzu laster." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "Ezin izan da konexio segurua ezarri.\n" "Zure parekoak kode okerra sartu du edo norbait zuen arteko konexioan esku sartu du" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "Espero gabeko errorea gertatu da:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Hautatu eta bidali gakoa" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Hautatu eta bidali gakoa" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Erabili internet ere ziurtagiria transferitzeko" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "Ez duzu gakorik!\n" "Erabili Seahorse edo antzekoren bat gako bat sortzeko." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Ez dago interneteko konexiorik edo oso motel doa!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Sinadura ongi inportatu da!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "Jasotako ziurtagiria bidaltzaileari itzultzen dio, bidaltzaileak zure OpenPGP ziurtagiria erabili ahal dezan." #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Bistaratu errorearen xehetasun gehiago." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Errorea gertatu da ziurtagiria inportatzen saiatzean." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Hautatu sinatuko den gakoa" #: keysign/send.ui:443 msgid "Times signed" msgstr "Zenbat aldiz sinatua" #: keysign/send.ui:510 msgid "Keylist" msgstr "Gako-zerrenda" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "Gakoa sinatzeko, beste pertsonak segurtasun-kodea sartu behar du edo QR kodea eskaneatu behar du" #: keysign/send.ui:557 msgid "Key Details" msgstr "Gakoaren xehetasunak" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Hatz-marka" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR kodea" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "Kaixo $uid,\n" "\n" "\n" "Zure gakoa sinatu dut\n" "\n" " $fingerprint\n" "\n" "\n" "Eskerrik asko zure gakoa sinatzen uzteagatik!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Mezu-autentifikazioko kode okerra" gnome-keysign-1.3.0/keysign/locale/fi/000077500000000000000000000000001431057335600176045ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/fi/LC_MESSAGES/000077500000000000000000000000001431057335600213715ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/fi/LC_MESSAGES/keysign.po000066400000000000000000000220751431057335600234100ustar00rootroot00000000000000# Finnish translation for gnome-keysign. # Copyright (C) 2019 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Jiri Grönroos , 2019. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-03-03 07:36+0000\n" "PO-Revision-Date: 2019-03-03 14:22+0200\n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Last-Translator: Jiri Grönroos \n" "X-Generator: Poedit 2.0.6\n" #: data/org.gnome.Keysign.raw.appdata.xml:10 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" #: data/org.gnome.Keysign.raw.appdata.xml:14 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;avain;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:181 msgid "Send" msgstr "Lähetä" #: keysign/app.py:183 keysign/receive.py:238 msgid "Receive" msgstr "Vastaanota" #: keysign/app.ui:62 keysign/send.ui:617 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "" #: keysign/avahioffer.py:83 msgid "Press Enter to stop" msgstr "Paina Enter lopettaaksesi" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Portti: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth ei ole käytettävissä" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Paina Enter peruaksesi" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Avain lähetetty onnistuneesti" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Tapahtui virhe: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Paina Enter poistuaksesi" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Yritetään ladata avain, odota" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Avahin käynnistäminen ei onnistunut" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Vika havaittu" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Havaittiin ohjelmointivirhe." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Ilmoita…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ohita virhe" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Tiedot..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "" #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Vanhenee: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information click here." msgstr "" #: keysign/receive.ui:105 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" #: keysign/receive.ui:124 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Integroitu web-kamera" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Turvakoodi" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Skannaa viivakoodi" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait..." msgstr "Ladataan avaimen tietoja. Odota..." #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Avaimen lataaminen keskeytettiin!" #: keysign/receive.ui:337 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" #: keysign/receive.ui:365 msgid "Key" msgstr "Avain" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "_Vahvista" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "" #: keysign/send.py:156 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" #: keysign/send.py:162 msgid "There isn't an Internet connection!" msgstr "Ei internetyhteyttä!" #: keysign/send.py:190 keysign/send.ui:545 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" #: keysign/send.py:195 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" #: keysign/send.py:199 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Odottamaton virhe:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Valitse ja lähetä avain" #: keysign/send.ui:58 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" #: keysign/send.ui:135 msgid "Very slow or no Internet connection!" msgstr "Erittäin hidas internetyhteys tai ei yhteyttä!" #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:190 msgid "Select a key for signing" msgstr "" #: keysign/send.ui:206 msgid "Times signed" msgstr "" #: keysign/send.ui:272 msgid "Keylist" msgstr "" #: keysign/send.ui:292 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" #: keysign/send.ui:319 msgid "Key Details" msgstr "Avaimen tiedot" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Sormenjälki" #: keysign/send.ui:498 msgid "QR Code" msgstr "QR-koodi" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Valitse ja lähetä avain" #: keysign/send.ui:594 msgid "" "Uses the Internet to transport the key rather than the local network and " "Bluetooth (if available)" msgstr "" #: keysign/util.py:222 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "" gnome-keysign-1.3.0/keysign/locale/fr/000077500000000000000000000000001431057335600176155ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/fr/LC_MESSAGES/000077500000000000000000000000001431057335600214025ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/fr/LC_MESSAGES/keysign.po000066400000000000000000000273171431057335600234250ustar00rootroot00000000000000# French translations for gnome-keysign. # Copyright (C) 2017-2018 Listed translators # This file is distributed under the same license as the gnome-keysign # project. # # Claude Paroz , 2018 # msgid "" msgstr "" "Project-Id-Version: gnome-keysign 0.9\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2018-09-06 20:41+0000\n" "PO-Revision-Date: 2018-09-11 14:12+0200\n" "Last-Translator: Claude Paroz \n" "Language-Team: GNOME French Team \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" #: data/org.gnome.Keysign.raw.appdata.xml:10 msgid "" "\n" " GNOME-Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " Signature de clés de GNOME permet de signer agréablement et de manière\n" " sûre des clés OpenPGP via le réseau local ou Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:14 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Il peut lire le code-barre d’une autre clé et transférer la clé\n" " de façon sûre, permettant des sessions de signature de clés bipartites.\n" " Il suit les bonnes pratiques en envoyant les signatures chiffrées aux\n" " identifiants UID d’une clé avec le client de messagerie configuré par\n" " l’utilisateur.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Signature de clés" #gn. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Un utilitaire de signature de clés permettant l’échange facilité de clés " "OpenPGP avec des connaissances" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;clé;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:165 msgid "Send" msgstr "Envoyer" #: keysign/app.py:167 keysign/receive.py:238 msgid "Receive" msgstr "Recevoir" #: keysign/app.ui:62 keysign/send.ui:616 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:144 msgid "Offering key: {}" msgstr "Clé proposée : {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:145 msgid "Discovery info: {}" msgstr "Information découverte : {}" #: keysign/avahioffer.py:83 msgid "Press Enter to stop" msgstr "Appuyez sur Entrée pour interrompre" #: keysign/bluetoothoffer.py:127 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Clé envoyée avec succès" #: keysign/bluetoothoffer.py:129 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Une erreur s’est produite : {}" #: keysign/bluetoothoffer.py:131 msgid "Press Enter to exit" msgstr "Appuyez sur Entrée pour quitter" #: keysign/bluetoothoffer.py:146 msgid "HMAC: {}" msgstr "HMAC : {}" #: keysign/bluetoothoffer.py:147 msgid "Port: {}" msgstr "Port : {}" #: keysign/bluetoothoffer.py:152 msgid "Bluetooth not available" msgstr "Bluetooth non disponible" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Tentative de téléchargement de la clé, veuillez patienter" #: keysign/gpgmks.py:178 #, python-format msgid "installing symlinks for sockets from %s to %s" msgstr "installation de liens symboliques pour les connecteurs de %s à %s" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Anomalie détectée" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Une erreur de programmation a été détectée." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Vous pouvez ignorer cette erreur et continuer votre tâche, mais des " "résultats inattendus peuvent survenir.\n" "\n" "Merci d’informer les développeurs de ce problème en utilisant le site de " "suivi d’anomalies si personne ne l’a encore signalé." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Rechercher dans les anomalies…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Signaler…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignorer l’erreur" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Quitter Signature de clés de GNOME" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Détails…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Une exception s’est produite lors de l’analyse de l’exception." #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Veuillez décrire le problème en anglais si possible.\n" " Donnez un titre descriptif court au rapport.\n" " Utilisez quelque chose comme\n" " « {fonctionnalité-cassée}: {ce qui s’est mal passé} »\n" " comme titre, si possible.\n" " Puis remplacez ce texte par une\n" " description plus longue du problème.\n" " Captures d’écran et vidéos sont aussi appréciées !\n" "\n" " #### Étapes de reproduction\n" "\n" " Expliquez ce que vous faisiez\n" " lorsque le message d’erreur est apparu.\n" " Si vous pouvez donner des instructions pas à pas\n" " sur la manière de reproduire l’anomalie,\n" " c’est encore mieux.\n" "\n" " #### Traceback\n" " " #: keysign/i18n.py:39 msgid "Translated for gettext (C)" msgstr "Traduit pour gettext (C)" #: keysign/i18n.py:47 msgid "Translated for Python (C)" msgstr "Traduit pour Python (C)" #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Date d’expiration : " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Signer la clé" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information click here." msgstr "" "Aucun serveur Signature de clés de GNOME dans les parages :-(\n" "Trouvez un ami pour utiliser Signature de clés de GNOME.\n" "Ou il peut s’agir d’un problème de connexion.\n" "Pour plus d’infos, cliquez ici." #: keysign/receive.ui:105 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Pour signer la clé de quelqu’un, scannez le code QR ou entrez le code " "de sécurité" #: keysign/receive.ui:124 msgid "Camera" msgstr "Caméra" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Caméra Web intégrée" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Code de sécurité" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Scanner le code-barre" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait ..." msgstr "Téléchargement des données de clé. Veuillez patienter…" #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Le téléchargement de la clé a été interrompu !" #: keysign/receive.ui:313 keysign/send.ui:527 msgid "page1" msgstr "page1" #: keysign/receive.ui:337 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Pour signer la clé, confirmez que vous souhaitez signer la clé suivante.\n" "Cela va générer un courriel qui doit être envoyé pour terminer la " "procédure de signature." #: keysign/receive.ui:365 msgid "Key" msgstr "Clé" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "C_onfirmer" #: keysign/receive.ui:521 keysign/send.ui:564 msgid "page2" msgstr "page2" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Signature des UID suivantes :" #: keysign/receive.ui:615 msgid "page3" msgstr "page3" #: keysign/send.py:156 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Toujours en cours d’établissement d’une connexion à Internet. Elle semble " "lente ou indisponible." #: keysign/send.py:162 msgid "There isn't an Internet connection!" msgstr "Aucune connexion Internet disponible !" #: keysign/send.py:190 keysign/send.ui:545 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "La clé a été envoyée avec succès.\n" "vous devriez rapidement recevoir un courriel avec la signature." #: keysign/send.py:195 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Impossible d’établir une connexion sécurisée.\n" "Soit le partenaire a saisi un mauvais code, soit quelqu’un a essayé " "d’intercepter votre connexion" #: keysign/send.py:199 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Une erreur inattendue s’est produite :\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Sélectionner et envoyer la clé" #: keysign/send.ui:58 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Vous n’avez pas de clé !\n" "Utilisez Seahorse par exemple pour en créer une." #: keysign/send.ui:135 msgid "Very slow or no Internet connection!" msgstr "Connexion Internet très lente ou impossible !" #: keysign/send.ui:190 msgid "Select a key for signing" msgstr "Sélectionnez une clé à signer" #: keysign/send.ui:206 msgid "Times signed" msgstr "Nombre de signatures" #: keysign/send.ui:272 msgid "Keylist" msgstr "Liste de clés" #: keysign/send.ui:292 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Pour que la clé soit signée, l’autre personne doit saisir le code de " "sécurité ou scanner le code QR" #: keysign/send.ui:319 msgid "Key Details" msgstr "Détails de clé" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Empreinte" #: keysign/send.ui:498 msgid "QR Code" msgstr "Code QR" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Selectionner et envoyer la clé" gnome-keysign-1.3.0/keysign/locale/fur/000077500000000000000000000000001431057335600200025ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/fur/LC_MESSAGES/000077500000000000000000000000001431057335600215675ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/fur/LC_MESSAGES/keysign.po000066400000000000000000000345761431057335600236170ustar00rootroot00000000000000# Friulian translation for gnome-keysign. # Copyright (C) 2019 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Fabio Tomat , 2019. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2020-10-07 18:17+0000\n" "PO-Revision-Date: 2021-01-22 10:56+0100\n" "Last-Translator: Fabio Tomat \n" "Language-Team: Friulian \n" "Language: fur\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "X-Generator: Poedit 2.4.2\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Keysign al permet di firmâ lis clâfs OpenPGP in maniere comude e " "sigure\n" " vie rêt locâl o Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Al pues scansionâ un codiç a sbaris di une altre clâf e trasferî la \n" " clâf in sigurece, permetint a dôs personis di fâ sessions casuâls di " "firme des clâfs.\n" " Al seguìs il miôr costum di inviâ lis firmis cifradis\n" " al UIDs di une clâf doprant il client E-mail che l'utent al à " "configurât\n" " di doprâ.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Un aiutant par firmâ clâfs che al permet comut comut di scambiâ clâfs " "OpenPGP cuntun amì" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;clâf;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Invie" #: keysign/app.py:188 keysign/receive.py:272 msgid "Receive" msgstr "Ricêf" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Ufrint la clâf: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informazion pe ricercje : {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Frache Invie par fermâ" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Si scugne furnî un argoment par identificâ la clâf" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Puarte: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth no disponibil" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Frache Invie par anulâ" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Clâf inviade cun sucès" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Si è verificât un erôr: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Frache Invie par jessî" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Daûr a cirî di discjariâ la clâf, par plasê spiete" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Impussibil fa partî Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysign nol rive a fâ partî in automatic Avahi. Si pues cirî di " "eseguî`systemctl start avahi-daemon` par risolvi chest probleme." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Va ben" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Rilevât erôr" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Al è stât cjatât un erôr di programazion." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Si pues ignorâ chest erôr e continuâ cul lavôr, ma si podarès la incuintri a " "risultâts inspietâts.\n" "\n" "Par plasê, comunichilu ai svilupadôrs doprant l'analizadôr (tracker) dai " "problemis se nissun altri lu à za segnalât." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Cîr sul Tracker..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Segnale..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignore Erôr" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Jes di GNOME Keysign" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Detais..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Ecezion intal analizâ la ecezion." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Descrizion\n" "\n" " Met dongje a chest rapuart un titul descritîf curt.\n" " Dopre alc come\n" " \"{funzionalitât-cul-fastidi}: {ce-che-al-è-lât-stuart}\"\n" " pal titul, se tu puedis.\n" " Daspò, par plasê, sostituìs chest test\n" " cuntune lungje descrizion dal erôr.\n" " Lis caturis di schermi o i videos a son une vore preseâts!\n" "\n" " #### Passaçs par riprodusilu\n" "\n" " Continus ce che si stave fasint\n" " cuant che al è vignût fûr l'erôr.\n" " Se tu puedis furnî lis istruzions pas-dopo-pas\n" " su cemût riprodusi l'erôr,\n" " al è ancjemò miôr.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Scjadence: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Firme clâf" #: keysign/receive.py:218 msgid "Select file for saving" msgstr "Selezione il file pal salvament" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Nissun server di GNOME Keysign ator :-(\n" "Cîr un amì par doprâ cun lui GNOME Keysign.\n" "Tu podaressis vê di problemis di conession.\n" "Par vê plui informazions lei la documentazion." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Par firmâ la clâf di cualchidun, scansione il so QR o inserìs il " "codiç di sigurece" #: keysign/receive.ui:127 msgid "Camera" msgstr "Fotocjamare" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Web Cam integrade" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Codiç di sigurece" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Scansione codiç a sbaris" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Daûr a discjariâ i dâts de clâf. Spiete..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Il discjariament de clâf al è stât interot!" #: keysign/receive.ui:345 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Al salve i certificâts prodots come files separâts intune cartele " "personalizade" #: keysign/receive.ui:360 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Al impuarte une version temporanie dai certificâts prodots intal puarteclâfs " "locâl" #: keysign/receive.ui:403 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Certificâts prodots cun sucès.\n" "Tu puedis impuartâ une firme temporanie par tacâ a doprâ la clâf come che e " "fos za stade verificade in maniere apropriade.\n" "Par vê plui informazions lei la documentazion." #: keysign/receive.ui:446 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Par firmâ la clâf, conferme che tu desideris firmâ la clâf chi daurman.\n" "Chest al gjenerarà une e-mail che e scugne jessi inviade par podê completâ " "il procès di firme." #: keysign/receive.ui:474 msgid "Key" msgstr "Clâf" #: keysign/receive.ui:507 keysign/send.ui:598 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "C_onferme" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "Daûr a firmâ i UID chi sot:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Si sta ancjemò cirint di otignî une conession a internet. E somee jessi " "lente o no disponibile." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "No si à une conession a internet!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Clâf inviade cun sucès.\n" "Chi di pôc tu ricevarâs une e-mail cun la firme." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Impussibil stabilî une conession sigure.\n" "O il to amì nol à inserît il codiç just o cualchidun al à cirût di intercetâ " "la conession" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Si è presentât un erôr inspietât:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Selezione e invie la clâf" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Selezione e invie clâf" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Dopre ancje Internet par trasferî il certificât" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "No tu âs nissune clâf!\n" "Par plasê dopre par esempli Seahorse par creâ'nt une." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Une vore lente o nissune conession a internet!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "La firme e je stade impuartade cun sucès!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Al torne indaûr al mitent la certificazion ricevude, cussì che il mitent al " "podedi doprâ il tô certificât OpenPGP" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Mostre plui detais par chest erôr." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Si è verificât un erôr intant che si cirive di impuartâ la firme." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Selezione une clâf par firmâ" #: keysign/send.ui:443 msgid "Times signed" msgstr "Voltis firmade" #: keysign/send.ui:510 msgid "Keylist" msgstr "Liste des clâfs" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Par vê la clâf firmade, chê altre persone e scugne inserî il codiç di " "sigurece o scansionâ il codiç QR" #: keysign/send.ui:557 msgid "Key Details" msgstr "Detais clâf" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Impronte" #: keysign/send.ui:736 msgid "QR Code" msgstr "Codiç QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Mandi $uid,\n" "\n" "\n" "O ai juste firmât la tô clâf\n" "\n" " $fingerprint\n" "\n" "\n" "Graciis di lassâmi firmâ la tô clâf!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Codiç di autenticazion dal messaç sbaliât" #~ msgid "Translated for gettext (C)" #~ msgstr "Tradot par gettext (C)" #~ msgid "Translated for Python (C)" #~ msgstr "Tradot par Python (C)" gnome-keysign-1.3.0/keysign/locale/hr/000077500000000000000000000000001431057335600176175ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/hr/LC_MESSAGES/000077500000000000000000000000001431057335600214045ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/hr/LC_MESSAGES/keysign.po000066400000000000000000007136521431057335600234330ustar00rootroot00000000000000# Translation of gnome-applets-locations to Croatian # Copyright (C) Croatian team # Translators: Melita Mihaljevic ,Robert Sedak , msgid "" msgstr "" "Project-Id-Version: gnome-applets-locations 0\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2021-10-01 16:31+0200\n" "Last-Translator: gogo \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2017-04-12 23:08+0000\n" "X-Generator: Poedit 2.3\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Potpis ključeva omogućuje vam udobno i sigurno potpisivanje " "OpenPGP ključeva\n" " putem lokalne mreže ili Bluetootha.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Može skenirati barkôd drugog ključa i sigurno ga prenijeti,\n" " što omogućava povremene sesije potpisivanja ključa između dvije " "strane.\n" " Slijedi najbolje prakse slanjem šifriranih potpisa na\n" " UID-ove ključa pomoću klijenta e-pošte kojeg korisnik \n" " koristi.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Potpis ključeva" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Pomagač potpisivanja ključa za omogućavanje udobne razmjene OpenPGP ključeva " "s prijateljima" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;ključ;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Pošalji" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Primi" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Ponuđeni ključ: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informacije otkrivanja: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Pritisni Enter za zaustavljanje" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Morate navesti argument za identifikaciju ključa" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Ulaz: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth nije dostupan" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Pritisni Enter za prekid" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Ključ je uspješno poslan" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Greška se dogodila: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Pritisni Enter za izlaz" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Pokušaj preuzimanja ključa, pričekajte" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Nemoguće je pokrenuti Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Potpis ključeva ne može automatski pokrenuti Avahi. Možete pokušati " "pokrenuti `systemctl start avahi-daemon` za razrješavanje ovog problema." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "U redu" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Greška otkrivena" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Programska greška je otkrivena." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Možete zanemariti ovu grešku i nastaviti s radom, ali možete dobiti " "neočekivane rezultate.\n" "\n" "Prijavite ovu grešku razvijateljima putem pratitelja grešaka, ako greška već " "nije prijavljena." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Pretraži pratitelja..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Prijavi..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Zanemari grešku" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Zatvori GNOME Potpis ključeva" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Pojedinosti..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Iznimka pri analiziranju iznimke." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Opis\n" "\n" " Navedite u ovom izvještaju kratki opisni naslov.\n" " Koristite nešto poput\n" " \"{značajka-koja-se-slomila}: {što-je-pošlo-po-krivu}\"\n" " za naslov, ako je moguće.\n" " Zatim zamijenite ovaj tekst\n" " s duljim opisom greške.\n" " Slike zaslona ili video snimke su isto dobrodošle!\n" "\n" " #### Korak za reprodukciju\n" "\n" " Recite nam što ste radili\n" " kada se greška pojavila.\n" " Ako možete navesti korak-po-korak upute\n" " kako reproducirati grešku,\n" " to bi bilo poželjno.\n" "\n" " #### Praćenje\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Istječe: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Ključ potpisa" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Odaberite datoteku za spremanje" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Nema GNOME Potpis ključeva poslužitelja u blizini :-(\n" "Potražite prijatelja s kojim ćete koristiti GNOME Potpis ključeva.\n" "Možete iskusiti probleme s mrežnom povezivosti.\n" "Za više informacija posjetite dokumentaciju." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Za potpis nečijeg ključa, skenirajte njegov QR kôd ili upišite " "sigurnosni kôd" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Ugrađena web kamera" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Sigurnosni kôd" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Skeniraj barkôd" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Preuzimanje podataka ključa. Pričekajte..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Preuzimanje ključa je prekinuto!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Prikaži pojedinosti o grešci" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Greška izrade vjerodajnice ☹\n" "Nešto je pošlo po krivu. Ponekad, lozinka nije ispravno upisana.\n" "Možete pokušati ponovno klikom na \"potvrdi\" tipku." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Sprema stvorene vjerodajnice kao zasebne datoteke u prilagođeni direktorij" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "Uvaža privremenu inačicu stvorene vjerodajnice u lokalni skup ključeva" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Vjerodajnica je uspješno stvorena.\n" "Možete uvesti privremeni potpis kako bi započeli koristiti ključ kao da je " "već pravilno provjeren.\n" "Za više informacija posjetite dokumentaciju." #: keysign/receive.ui:541 msgid "Key" msgstr "Ključ" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID-ovi" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Kako bi potpisali ključ, potvrdite da želite potpisati sljedeći ključ.\n" "To će stvoriti e-poštu koja se mora poslati kako bi se završio proces " "potpisivanja." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "P_otvrdi" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Potpisivanje sljedećih UID-ova:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Još pokušavam uspostaviti povezivanje s internetom. Izgleda da je spor ili " "nedostupan." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Ne postoji internet povezivanje!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Ključ je uspješno poslan.\n" "Ubrzo biste trebali primiti e-poštu s potpisom." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Nemoguće uspostavljanje sigurnog povezivanja.\n" "Ili je vaš partner upisao pogrešan kôd ili je netko pokušao presresti vaše " "povezivanje" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Pojavila se neočekivana greška:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Odaberi i pošalji ključ" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Odaberi i pošalji ključ" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Isto tako koristite internet za prijenos vjerodajnica" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Nemate ni jedan ključ!\n" "Koristite, npr. Seahorse kako bi stvorili jedan." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Vrlo sporo ili nema internet povezivanja!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Potpis je uspješno uvezen!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Primljena vjerodajnica je vraćena pošiljatelju, tako da pošiljatelj može " "koristiti vašu OpenPGP vjerodajnicu" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Prikaži više pojedinosti o grešci." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Greška se dogodila pri pokušaju uvoza potpisa." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Odaberi ključ za potpisivanje" #: keysign/send.ui:443 msgid "Times signed" msgstr "Vremena potpisa" #: keysign/send.ui:510 msgid "Keylist" msgstr "Popis ključeva" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Kako bi potpisali ključ, druga osoba mora upisati sigurnosni kôd, ili " "skenirati QR kôd" #: keysign/send.ui:557 msgid "Key Details" msgstr "Pojedinosti ključa" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Otisak" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR kôd" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Zdravo $uid,\n" "\n" "\n" "Upravo sam potpisao tvoj ključ\n" "\n" " $fingerprint\n" "\n" "\n" "Hvala što si mi dopustio potpis tvojeg ključa!\n" "\n" "--\n" "GNOME Potpis ključeva\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Pogrešna poruka ovjere kôda" #~ msgid "Anywhere on Earth (AoE)" #~ msgstr "Bilo gdje na Zemlji (AoE)" #~ msgid "Coordinated Universal Time (UTC)" #~ msgstr "Koordinirano svjetsko vrijeme (UTC)" #~ msgid "Africa" #~ msgstr "Afrika" #~ msgctxt "Region" #~ msgid "Antarctica" #~ msgstr "Antarktika" #~ msgid "Asia" #~ msgstr "Azia" #~ msgctxt "Region" #~ msgid "Atlantic" #~ msgstr "Atlantik" #~ msgid "Australasia and Oceania" #~ msgstr "Australija i oceanija" #~ msgid "Central and South America" #~ msgstr "Centralna i južna Afrika" #~ msgid "Europe" #~ msgstr "Europa" #~ msgid "Middle East" #~ msgstr "Srednji istok" #~ msgid "North America" #~ msgstr "Sjeverna Amerika" #~ msgid "Afghanistan" #~ msgstr "Afganistan" #~ msgid "Albania" #~ msgstr "Albanija" #~ msgid "Algeria" #~ msgstr "Alžir" #~ msgid "American Samoa" #~ msgstr "Američka Samoa" #~ msgid "Andorra" #~ msgstr "Andora" #~ msgid "Angola" #~ msgstr "Angola" #~ msgid "Anguilla" #~ msgstr "Anguilla" #~ msgctxt "Country" #~ msgid "Antarctica" #~ msgstr "Antarktika" #~ msgid "Antigua and Barbuda" #~ msgstr "Antigua i Barbuda" #~ msgid "Argentina" #~ msgstr "Argentina" #~ msgid "Armenia" #~ msgstr "Armenija" #~ msgid "Aruba" #~ msgstr "Aruba" #~ msgid "Australia" #~ msgstr "Australia" #~ msgid "Austria" #~ msgstr "Austrija" #~ msgid "Azerbaijan" #~ msgstr "Azerbaijan" #~ msgid "Bahamas" #~ msgstr "Bahamas" #~ msgid "Bahrain" #~ msgstr "Bahrain" #~ msgid "Bangladesh" #~ msgstr "Bangladeš" #~ msgid "Barbados" #~ msgstr "Barbados" #~ msgid "Belarus" #~ msgstr "Belarus" #~ msgid "Belgium" #~ msgstr "Belgija" #~ msgid "Belize" #~ msgstr "Belize" #~ msgid "Benin" #~ msgstr "Benin" #~ msgid "Bermuda" #~ msgstr "Bermuda" #~ msgid "Bhutan" #~ msgstr "Butan" #~ msgid "Bolivia" #~ msgstr "Bolivia" #~ msgid "Bosnia and Herzegovina" #~ msgstr "Bosna i Hercegovina" #~ msgid "Botswana" #~ msgstr "Botswana" #~ msgid "Brazil" #~ msgstr "Brazil" #~ msgid "British Indian Ocean Territory" #~ msgstr "British Indian oceanski teritorij" #~ msgid "British Virgin Islands" #~ msgstr "British Virgin otočje" #~ msgid "Brunei" #~ msgstr "Brunei" #~ msgid "Bulgaria" #~ msgstr "Bugarska" #~ msgid "Burkina Faso" #~ msgstr "Burkina Faso" #~ msgid "Burundi" #~ msgstr "Burundi" #~ msgid "Cambodia" #~ msgstr "Cambodia" #~ msgid "Cameroon" #~ msgstr "Cameroon" #~ msgid "Canada" #~ msgstr "Canada" #~ msgid "Cape Verde" #~ msgstr "Cape Verde" #~ msgid "Cayman Islands" #~ msgstr "Cayman otočje" #~ msgid "Central African Republic" #~ msgstr "Centralna afrička republika" #~ msgid "Chad" #~ msgstr "Čad" #~ msgid "Chile" #~ msgstr "Čile" #~ msgid "China" #~ msgstr "Kina" #~ msgid "Christmas Island" #~ msgstr "Božični otoci" #~ msgid "Cocos (Keeling) Islands" #~ msgstr "Cocos (Keeling) Otočje" #~ msgid "Colombia" #~ msgstr "Kolumbija" #~ msgid "Comoros" #~ msgstr "Comoros" #~ msgid "Congo, Democratic Republic of the" #~ msgstr "Demokratska republika Kongo" #~ msgid "Congo, Republic of the" #~ msgstr "Republika Kongo" #~ msgid "Cook Islands" #~ msgstr "Cook otok" #~ msgid "Costa Rica" #~ msgstr "Costa Rica" #~ msgid "Croatia" #~ msgstr "Hrvatska" #~ msgid "Cuba" #~ msgstr "Kuba" #~ msgid "Cyprus" #~ msgstr "Cipar" #~ msgid "Czech Republic" #~ msgstr "Republika Češka" #~ msgid "Côte d'Ivoire" #~ msgstr "Côte d'Ivoire" #~ msgid "Denmark" #~ msgstr "Danska" #~ msgctxt "Country" #~ msgid "Djibouti" #~ msgstr "Džibuti" #~ msgid "Dominica" #~ msgstr "Dominica" #~ msgid "Dominican Republic" #~ msgstr "Dominikanska republika" #~ msgid "Ecuador" #~ msgstr "Ekvador" #~ msgid "Egypt" #~ msgstr "Egipat" #~ msgid "El Salvador" #~ msgstr "El Salvador" #~ msgid "Equatorial Guinea" #~ msgstr "Ekvatorska gvineja" #~ msgid "Eritrea" #~ msgstr "Eritreja" #~ msgid "Estonia" #~ msgstr "Estonia" #~ msgid "Ethiopia" #~ msgstr "Etiopija" #~ msgid "Falkland Islands (Malvinas)" #~ msgstr "Falklandski Otoci (Malvinski Otoci)" #~ msgid "Faroe Islands" #~ msgstr "Faroe otočje" #~ msgid "Fiji" #~ msgstr "Fiji" #~ msgid "Finland" #~ msgstr "Finska" #~ msgid "France" #~ msgstr "Francuska" #~ msgid "French Guiana" #~ msgstr "Francuska Guiana" #~ msgid "French Polynesia" #~ msgstr "Francuska Polinezija" #~ msgid "French Southern Territories" #~ msgstr "Francuski južni i antarktički teritoriji" #~ msgid "Gabon" #~ msgstr "Gabon" #~ msgid "Gambia" #~ msgstr "Gambija" #~ msgctxt "Country" #~ msgid "Georgia" #~ msgstr "Gruzija" #~ msgid "Germany" #~ msgstr "Njemačka" #~ msgid "Ghana" #~ msgstr "Ghana" #~ msgctxt "Country" #~ msgid "Gibraltar" #~ msgstr "Gibraltar" #~ msgid "Greece" #~ msgstr "Grčka" #~ msgid "Greenland" #~ msgstr "Greenland" #~ msgid "Grenada" #~ msgstr "Grenada" #~ msgid "Guadeloupe" #~ msgstr "Guadeloupe" #~ msgid "Guam" #~ msgstr "Guam" #~ msgctxt "Country" #~ msgid "Guatemala" #~ msgstr "Gvatemala" #~ msgid "Guernsey" #~ msgstr "Guernsey" #~ msgid "Guinea" #~ msgstr "Gvineja" #~ msgid "Guinea-Bissau" #~ msgstr "Gvineja-Bissau" #~ msgid "Guyana" #~ msgstr "Guyana" #~ msgid "Haiti" #~ msgstr "Haiti" #~ msgid "Honduras" #~ msgstr "Honduras" #~ msgid "Hong Kong" #~ msgstr "Hong Kong" #~ msgid "Hungary" #~ msgstr "Mađarska" #~ msgid "Iceland" #~ msgstr "Island" #~ msgid "India" #~ msgstr "Indija" #~ msgid "Indonesia" #~ msgstr "Indonezija" #~ msgid "Iran" #~ msgstr "Iran" #~ msgid "Iraq" #~ msgstr "Irak" #~ msgid "Ireland" #~ msgstr "Irska" #~ msgid "Isle of Man" #~ msgstr "Isle of Man" #~ msgid "Israel" #~ msgstr "Israel" #~ msgid "Italy" #~ msgstr "Italija" #~ msgid "Jamaica" #~ msgstr "Jamaika" #~ msgid "Japan" #~ msgstr "Japan" #~ msgid "Jersey" #~ msgstr "Jersey" #~ msgctxt "Country" #~ msgid "Jordan" #~ msgstr "Jordan" #~ msgid "Kazakhstan" #~ msgstr "Kazakhstan" #~ msgid "Kiribati" #~ msgstr "Kiribati" #~ msgid "Kosovo" #~ msgstr "Kosovo" #~ msgctxt "Country" #~ msgid "Kuwait" #~ msgstr "Kuvajt" #~ msgid "Kyrgyzstan" #~ msgstr "Kyrgyzstan" #~ msgid "Laos" #~ msgstr "Laos" #~ msgid "Latvia" #~ msgstr "Latvia" #~ msgctxt "Country" #~ msgid "Lebanon" #~ msgstr "Libanon" #~ msgid "Lesotho" #~ msgstr "Lesotho" #~ msgctxt "Country" #~ msgid "Liberia" #~ msgstr "Liberija" #~ msgid "Libya" #~ msgstr "Libya" #~ msgid "Liechtenstein" #~ msgstr "Lihtenštajn" #~ msgid "Lithuania" #~ msgstr "Lithuania" #~ msgctxt "Country" #~ msgid "Luxembourg" #~ msgstr "Luksemburg" #~ msgctxt "Country" #~ msgid "Macau" #~ msgstr "Makau" #~ msgid "Macedonia" #~ msgstr "Makedonija" #~ msgid "Madagascar" #~ msgstr "Madagascar" #~ msgid "Malawi" #~ msgstr "Malawi" #~ msgid "Malaysia" #~ msgstr "Malaysia" #~ msgid "Maldives" #~ msgstr "Maldives" #~ msgid "Mali" #~ msgstr "Mali" #~ msgctxt "Country" #~ msgid "Malta" #~ msgstr "Malta" #~ msgid "Marshall Islands" #~ msgstr "Marshall otočje" #~ msgid "Martinique" #~ msgstr "Martinique" #~ msgid "Mauritania" #~ msgstr "Mauritania" #~ msgid "Mauritius" #~ msgstr "Mauritius" #~ msgid "Mayotte" #~ msgstr "Majote" #~ msgid "Mexico" #~ msgstr "Meksiko" #~ msgid "Micronesia, Federated States of" #~ msgstr "Micronesia, Federativna država" #~ msgid "Moldova" #~ msgstr "Moldova" #~ msgctxt "Country" #~ msgid "Monaco" #~ msgstr "Monako" #~ msgid "Mongolia" #~ msgstr "Mongolia" #~ msgid "Montenegro" #~ msgstr "Crna Gora" #~ msgid "Montserrat" #~ msgstr "Montserrat" #~ msgid "Morocco" #~ msgstr "Morocco" #~ msgid "Mozambique" #~ msgstr "Mozambik" #~ msgid "Myanmar" #~ msgstr "Myanmar" #~ msgid "Namibia" #~ msgstr "Namibija" #~ msgid "Nauru" #~ msgstr "Nauru" #~ msgid "Nepal" #~ msgstr "Nepal" #~ msgid "Netherlands" #~ msgstr "Nizozemska" #~ msgid "Netherlands Antilles" #~ msgstr "Nizozemski antili" #~ msgid "New Caledonia" #~ msgstr "New Caledonia" #~ msgid "New Zealand" #~ msgstr "New Zealand" #~ msgid "Nicaragua" #~ msgstr "Nicaragua" #~ msgid "Niger" #~ msgstr "Niger" #~ msgid "Nigeria" #~ msgstr "Nigeria" #~ msgid "Niue" #~ msgstr "Niue" #~ msgid "Norfolk Island" #~ msgstr "Norfolk otok" #~ msgid "North Korea" #~ msgstr "Sjeverna Korea" #~ msgid "Northern Mariana Islands" #~ msgstr "Sjeverno Marijansko otočje" #~ msgid "Norway" #~ msgstr "Norway" #~ msgid "Oman" #~ msgstr "Oman" #~ msgid "Pakistan" #~ msgstr "Pakistan" #~ msgid "Palau" #~ msgstr "Palau" #~ msgid "Palestinian Territory" #~ msgstr "Palestinski teritorij" #~ msgid "Panama" #~ msgstr "Panama" #~ msgid "Papua New Guinea" #~ msgstr "Papua New Guinea" #~ msgid "Paraguay" #~ msgstr "Paraguay" #~ msgctxt "Country" #~ msgid "Peru" #~ msgstr "Peru" #~ msgid "Philippines" #~ msgstr "Philipini" #~ msgid "Pitcairn" #~ msgstr "Pitcairn" #~ msgid "Poland" #~ msgstr "Poljska" #~ msgid "Portugal" #~ msgstr "Portugal" #~ msgid "Puerto Rico" #~ msgstr "Puerto Rico" #~ msgid "Qatar" #~ msgstr "Qatar" #~ msgid "Romania" #~ msgstr "Rumunjska" #~ msgid "Russia" #~ msgstr "Rusija" #~ msgid "Rwanda" #~ msgstr "Ruanda" #~ msgid "Réunion" #~ msgstr "Réunion" #~ msgid "Saint Barthélemy" #~ msgstr "Sveti Bartolomej" #~ msgid "Saint Helena" #~ msgstr "Sveta Helena" #~ msgid "Saint Kitts and Nevis" #~ msgstr "Sveti Kitts i Nevis" #~ msgid "Saint Lucia" #~ msgstr "Sveta Lucija" #~ msgid "Saint Martin" #~ msgstr "Sveti Martin" #~ msgid "Saint Pierre and Miquelon" #~ msgstr "Sveti Pierre i Miquelon" #~ msgid "Saint Vincent and the Grenadines" #~ msgstr "Sveti Vincent i Grenadines" #~ msgid "Samoa" #~ msgstr "Samoa" #~ msgctxt "Country" #~ msgid "San Marino" #~ msgstr "San Marino" #~ msgid "Sao Tome and Principe" #~ msgstr "Sao Tome and Principe" #~ msgid "Saudi Arabia" #~ msgstr "Saudijska Arabija" #~ msgid "Senegal" #~ msgstr "Senegal" #~ msgid "Serbia" #~ msgstr "Srbija" #~ msgid "Seychelles" #~ msgstr "Seychelles" #~ msgid "Sierra Leone" #~ msgstr "Sierra Leone" #~ msgctxt "Country" #~ msgid "Singapore" #~ msgstr "Singapur" #~ msgid "Slovakia" #~ msgstr "Slovačka" #~ msgid "Slovenia" #~ msgstr "Slovenija" #~ msgid "Solomon Islands" #~ msgstr "Otočje Solomon" #~ msgid "Somalia" #~ msgstr "Somalija" #~ msgid "South Africa" #~ msgstr "Južn Africa" #~ msgid "South Georgia and the South Sandwich Islands" #~ msgstr "Južna Georgija i otočje Južni Sandwich" #~ msgid "South Korea" #~ msgstr "Južna Korea" #~ msgid "Spain" #~ msgstr "Španjolska" #~ msgid "Sri Lanka" #~ msgstr "Sri Lanka" #~ msgid "Sudan" #~ msgstr "Sudan" #~ msgid "Suriname" #~ msgstr "Suriname" #~ msgid "Svalbard and Jan Mayen" #~ msgstr "Svalbard i Jan Mayen" #~ msgid "Swaziland" #~ msgstr "Swaziland" #~ msgid "Sweden" #~ msgstr "Švedska" #~ msgid "Switzerland" #~ msgstr "Švicarska" #~ msgid "Syria" #~ msgstr "Sirija" #~ msgid "Taiwan" #~ msgstr "Tajvan" #~ msgid "Tajikistan" #~ msgstr "Tadžikistan" #~ msgid "Tanzania" #~ msgstr "Tanzania" #~ msgid "Thailand" #~ msgstr "Tajland" #~ msgid "Timor-Leste" #~ msgstr "Istočni Timor" #~ msgid "Togo" #~ msgstr "Togo" #~ msgid "Tokelau" #~ msgstr "Tokelau" #~ msgid "Tonga" #~ msgstr "Tonga" #~ msgid "Trinidad and Tobago" #~ msgstr "Trinidad i Tobago" #~ msgid "Tunisia" #~ msgstr "Tunis" #~ msgid "Turkey" #~ msgstr "Turska" #~ msgid "Turkmenistan" #~ msgstr "Turkmenistan" #~ msgid "Turks and Caicos Islands" #~ msgstr "Turski i Caicos otoci" #~ msgid "Tuvalu" #~ msgstr "Tuvalu" #~ msgid "Uganda" #~ msgstr "Uganda" #~ msgid "Ukraine" #~ msgstr "Ukraina" #~ msgid "United Arab Emirates" #~ msgstr "Ujedinjeni Arapski Emirati" #~ msgid "United Kingdom" #~ msgstr "Ujedinjeno Kraljevstvo" #~ msgid "United States" #~ msgstr "Sjedinjene države" #~ msgid "United States Minor Outlying Islands" #~ msgstr "Sjedinjene države jezera Minor Outlying" #~ msgid "United States Virgin Islands" #~ msgstr "Djevičanski Otoci Sjedinjenih Država" #~ msgid "Uruguay" #~ msgstr "Uruguay" #~ msgid "Uzbekistan" #~ msgstr "Uzbekistan" #~ msgid "Vanuatu" #~ msgstr "Vanuatu" #~ msgid "Vatican City" #~ msgstr "Vatikan" #~ msgid "Venezuela" #~ msgstr "Venecuela" #~ msgid "Viet Nam" #~ msgstr "Viet Nam" #~ msgid "Wallis and Futuna" #~ msgstr "Wallis i Futuna" #~ msgid "Western Sahara" #~ msgstr "Western Sahara" #~ msgid "Yemen" #~ msgstr "Yemen" #~ msgid "Zambia" #~ msgstr "Zambija" #~ msgid "Zimbabwe" #~ msgstr "Zimbabwe" #~ msgid "Åland Islands" #~ msgstr "Otoci Åland" #~ msgid "Western Congo" #~ msgstr "Zapadni Kongo" #~ msgid "Eastern Congo" #~ msgstr "Istočni Kongo" #~ msgid "Palmer Station (Chile Time)" #~ msgstr "Postaja Palmer (čileansko vrijeme)" #~ msgid "Rothera Research Station" #~ msgstr "Istraživačka postaja Rothera" #~ msgid "Showa Station" #~ msgstr "Postaja Showa" #~ msgid "Mawson Station" #~ msgstr "Postaja Mawson" #~ msgid "Vostok Station" #~ msgstr "Postaja Vostok" #~ msgid "Davis Station" #~ msgstr "Postaja Davis" #~ msgid "Casey Station (Western Australia Time)" #~ msgstr "Postaja Casey (zapadnoaustralsko vrijeme)" #~ msgid "Dumont d'Urville Station" #~ msgstr "Postaja Dumont d'Urville" #~ msgid "McMurdo Station (New Zealand Time)" #~ msgstr "Postaja McMurdo (novozelandsko vrijeme)" #~ msgid "Amundsen-Scott South Pole Station (New Zealand Time)" #~ msgstr "Postaja na južnom polu Amundsen-Scott (novozelansko vrijeme)" #~ msgid "Eastern Kazakhstan" #~ msgstr "Istočni Kazahstan" #~ msgid "Western Kazakhstan" #~ msgstr "Zapadni Kazahstan" #~ msgid "Eastern Mongolia" #~ msgstr "Istočna Mongolija" #~ msgid "Western Mongolia" #~ msgstr "Zapadna Mongolija" #~ msgid "Central Mongolia" #~ msgstr "Središnja Mongolija" #~ msgid "Danmarkshavn" #~ msgstr "Danmarkshavn" #~ msgid "Western Greenland" #~ msgstr "Zapadni Grenland" #~ msgid "Eastern Greenland" #~ msgstr "Istočni Grenland" #~ msgid "Thule AFB" #~ msgstr "Zračna baza Thule" #~ msgid "Atlantic Time" #~ msgstr "Atlantsko vrijeme" #~ msgid "Western Time" #~ msgstr "Zapadno vrijeme" #~ msgid "Central Western Time" #~ msgstr "Središnje zapadno vrijrme" #~ msgid "Central Time (South Australia)" #~ msgstr "Središnje vrijeme (južna Australija)" #~ msgid "Central Time (Yancowinna, NSW)" #~ msgstr "Središnje vrijeme (Yancowinna, NSW)" #~ msgid "Central Time (Northern Territory)" #~ msgstr "Središnje vrijeme (Sjeverni teritorij)" #~ msgid "Eastern Time (Tasmania)" #~ msgstr "Istočno vrijeme (Tasmanija)" #~ msgid "Eastern Time (Victoria)" #~ msgstr "Istočno vrijeme (Victoria)" #~ msgid "Eastern Time (New South Wales)" #~ msgstr "Istočno vrijeme (New South Wales)" #~ msgid "Eastern Time (Queensland)" #~ msgstr "Istočno vrijeme (Queensland)" #~ msgid "Lord Howe Island" #~ msgstr "Otok Lord Howe" #~ msgid "Tahiti / Society Islands" #~ msgstr "Tahiti / Društveni otoci" #~ msgid "Marquesas Islands" #~ msgstr "Otoci Marquesas" #~ msgid "Gambier Islands" #~ msgstr "Otoci Gambier" #~ msgid "Western Indonesia Time" #~ msgstr "Zapadno indonezijsko vrijeme" #~ msgid "Central Indonesia Time" #~ msgstr "Srednje indonezijsko vrijeme" #~ msgid "Eastern Indonesia Time" #~ msgstr "Istočno indonezijsko vrijeme" #~ msgid "Gilbert Islands" #~ msgstr "Gilbertovi otoci" #~ msgid "Phoenix Islands" #~ msgstr "Otoci Phoenix" #~ msgid "Line Islands" #~ msgstr "Otoci Line" #~ msgid "Pohnpei / Kosrae" #~ msgstr "Pohnpei / Kosrae" #~ msgid "Yap / Chuuk" #~ msgstr "Yap / Chuuk" #~ msgid "Mainland New Zealand" #~ msgstr "Središnji Novi zeland" #~ msgid "Chatham Islands" #~ msgstr "Otoci Chatham" #~ msgid "Johnston Atoll (Hawaii Time)" #~ msgstr "Atol Johnston (havajsko vrijeme)" #~ msgid "Midway Atoll (Samoa Time)" #~ msgstr "Atol Midway (samoansko vrijeme)" #~ msgid "Wake Island" #~ msgstr "Otok Wake" #~ msgid "Tocantins" #~ msgstr "Tocantins" #~ msgctxt "Timezone" #~ msgid "Bahia" #~ msgstr "Bahia" #~ msgid "Amapá / East Pará" #~ msgstr "Amapá / Istočna Pará" #~ msgctxt "Timezone" #~ msgid "Roraima" #~ msgstr "Roraima" #~ msgctxt "Timezone" #~ msgid "Mato Grosso do Sul" #~ msgstr "Mato Grosso do Sul" #~ msgctxt "Timezone" #~ msgid "Mato Grosso" #~ msgstr "Mato Grosso" #~ msgid "West Amazonas" #~ msgstr "Zapadna Amazona" #~ msgid "Ceará, Maranhão, Paraíba, Piauí, Rio Grande do Norte" #~ msgstr "Ceará, Maranhão, Paraíba, Piauí, Rio Grande do Norte" #~ msgid "Alagoas, Sergipe" #~ msgstr "Alagoas, Sergipe" #~ msgid "East Amazonas" #~ msgstr "Istočna Amazona" #~ msgid "Fernando de Noronha" #~ msgstr "Fernando de Noronha" #~ msgid "West Pará, Rondônia" #~ msgstr "Zapadna Pará, Rondônia" #~ msgctxt "Timezone" #~ msgid "Pernambuco" #~ msgstr "Pernambuco" #~ msgctxt "Timezone" #~ msgid "Acre" #~ msgstr "Acre" #~ msgid "Brasília Time" #~ msgstr "Vrijeme Brazilije" #~ msgid "Mainland Chile" #~ msgstr "Središnji Čile" #~ msgid "Easter Island" #~ msgstr "Uskršnji otok" #~ msgid "Mainland Ecuador" #~ msgstr "Središnji Ekvador" #~ msgid "Galapagos Islands" #~ msgstr "Otoci Galapagos" #~ msgid "GMT/BST" #~ msgstr "GMT/BST" #~ msgid "GMT/IST" #~ msgstr "GMT/IST" #~ msgid "Azores" #~ msgstr "Azori" #~ msgid "Madeira" #~ msgstr "Madeira" #~ msgid "Mainland Portugal" #~ msgstr "Središnji Portugal" #~ msgid "Kaliningrad Time" #~ msgstr "Kalinjingradsko vrijeme" #~ msgid "Moscow Time" #~ msgstr "Moskovsko vrijeme" #~ msgid "Samara Time" #~ msgstr "Samarsko vrijeme" #~ msgid "Yekaterinburg Time" #~ msgstr "Jekaterinburško vrijeme" #~ msgid "Omsk Time" #~ msgstr "Omsko vrijeme" #~ msgid "Novosibirsk Time" #~ msgstr "Novosibirsk vrijeme" #~ msgid "Krasnoyarsk Time" #~ msgstr "Krasnojarsko vrijeme" #~ msgid "Irkutsk Time" #~ msgstr "Irkutsko vrijeme" #~ msgid "Yakutsk Time" #~ msgstr "Jakutsko vrijeme" #~ msgid "Vladivostok Time" #~ msgstr "Vladivostovsko vrijeme" #~ msgid "Magadan Time" #~ msgstr "Magadansko vrijeme" #~ msgid "Kamchatka Time" #~ msgstr "Kamčatsko vrijeme" #~ msgid "Canary Islands" #~ msgstr "Kanarsko otočje" #~ msgid "Mainland Spain" #~ msgstr "Središnja Španjolska" #~ msgid "Ceuta and Melilla" #~ msgstr "Ceuta i Melilla" #~ msgid "Pacific Time" #~ msgstr "Pacifičko vrijeme" #~ msgid "Mountain Time" #~ msgstr "Planinsko vrijeme" #~ msgid "Mountain Time, no DST (Northeast BC)" #~ msgstr "" #~ "Planinsko vrijeme, bez ljetnog računanja vremena (sjeveroistočna BC)" #~ msgid "Central Time" #~ msgstr "Središnje vrijeme" #~ msgid "Central Time, no DST (Saskatchewan)" #~ msgstr "Središnje vrijeme, bez ljetnog računanja vremena (Saskatchewan)" #~ msgid "Eastern Time" #~ msgstr "Istočno vrijeme" #~ msgid "Eastern Time, no DST (Southampton Island, etc)" #~ msgstr "" #~ "Istočno vrijeme, bez ljetnog računanja vremena (Otoci Southampton itd.)" #~ msgid "Atlantic Time, no DST (Eastern Quebec)" #~ msgstr "Atlanstko vrijeme, bez ljetnog računanja vremena (istočni Quebec)" #~ msgid "Newfoundland Time" #~ msgstr "Newfoundlandsko vrijeme" #~ msgid "Hawaiian-Aleutian Time (Aleutian Islands)" #~ msgstr "Havajsko-aleutsko vrijeme (Aleutski otoci)" #~ msgid "Hawaiian-Aleutian Time, no DST (Hawaii)" #~ msgstr "Havajsko-aleutsko vrijeme, bez ljetnog računanja vremena (Havaji)" #~ msgid "Alaska Time" #~ msgstr "Aljaško vrijeme" #~ msgid "Mountain Time, no DST (Arizona)" #~ msgstr "Planinsko vrijeme, bez ljetnog računanja vremena (Arizona)" #~ msgid "Australian Capital Territory" #~ msgstr "Australsko glavno područje" #~ msgid "New South Wales" #~ msgstr "New South Wales" #~ msgid "Northern Territory" #~ msgstr "Northern Territory" #~ msgid "Queensland" #~ msgstr "Queensland" #~ msgid "South Australia" #~ msgstr "Južna Australija" #~ msgid "Tasmania" #~ msgstr "Tasmania" #~ msgctxt "State in Australia" #~ msgid "Victoria" #~ msgstr "Victoria" #~ msgid "Western Australia" #~ msgstr "Zapadna Australija" #~ msgctxt "State in Belgium" #~ msgid "Antwerp" #~ msgstr "Antwerpen" #~ msgid "Brussels, Flemish and Walloon Brabant" #~ msgstr "Brussels, Flemish i Walloon Brabant" #~ msgid "East-Flanders" #~ msgstr "Istočna Flandrija" #~ msgid "Hainaut" #~ msgstr "Hainaut" #~ msgid "Limburg" #~ msgstr "Limburg" #~ msgid "Liège" #~ msgstr "Liège" #~ msgctxt "State in Belgium" #~ msgid "Luxembourg" #~ msgstr "Luksemburg" #~ msgid "Namur" #~ msgstr "Namur" #~ msgid "West-Flanders" #~ msgstr "Zapadna Flandrija" #~ msgctxt "State in Brazil" #~ msgid "Acre" #~ msgstr "Acre" #~ msgid "Alagoas" #~ msgstr "Alagoas" #~ msgid "Amapá" #~ msgstr "Amapá" #~ msgid "Amazonas" #~ msgstr "Amazona" #~ msgctxt "State in Brazil" #~ msgid "Bahia" #~ msgstr "Bahia" #~ msgid "Ceará" #~ msgstr "Ceará" #~ msgctxt "State in Brazil" #~ msgid "Distrito Federal" #~ msgstr "Distrito Federal" #~ msgid "Espírito Santo" #~ msgstr "Espírito Santo" #~ msgid "Goiás" #~ msgstr "Goiás" #~ msgid "Maranhão" #~ msgstr "Maranhão" #~ msgctxt "State in Brazil" #~ msgid "Mato Grosso" #~ msgstr "Mato Grosso" #~ msgctxt "State in Brazil" #~ msgid "Mato Grosso do Sul" #~ msgstr "Mato Grosso do Sul" #~ msgid "Minas Gerais" #~ msgstr "Minas Gerais" #~ msgid "Paraná" #~ msgstr "Paraná" #~ msgid "Paraíba" #~ msgstr "Paraíba" #~ msgid "Pará" #~ msgstr "Pará" #~ msgctxt "State in Brazil" #~ msgid "Pernambuco" #~ msgstr "Pernambuco" #~ msgid "Piauí" #~ msgstr "Piauí" #~ msgid "Rio Grande do Norte" #~ msgstr "Rio Grande do Norte" #~ msgid "Rio Grande do Sul" #~ msgstr "Rio Grande do Sul" #~ msgctxt "State in Brazil" #~ msgid "Rio de Janeiro" #~ msgstr "Rio de Janeiro" #~ msgid "Rondônia" #~ msgstr "Rondônia" #~ msgctxt "State in Brazil" #~ msgid "Roraima" #~ msgstr "Roraima" #~ msgid "Santa Catarina" #~ msgstr "Santa Catarina" #~ msgid "Sergipe" #~ msgstr "Sergipe" #~ msgctxt "State in Brazil" #~ msgid "São Paulo" #~ msgstr "São Paulo" #~ msgid "Tocantis" #~ msgstr "Tocantis" #~ msgid "Alberta" #~ msgstr "Alberta" #~ msgid "British Columbia" #~ msgstr "British Columbia" #~ msgid "Manitoba" #~ msgstr "Manitoba" #~ msgid "New Brunswick" #~ msgstr "New Brunswick" #~ msgid "Newfoundland and Labrador" #~ msgstr "Newfoundland i Labrador" #~ msgid "Northwest Territories" #~ msgstr "Northwest Territories" #~ msgid "Nova Scotia" #~ msgstr "Nova Scotia" #~ msgid "Nunavut" #~ msgstr "Nunavut" #~ msgctxt "State in Canada" #~ msgid "Ontario" #~ msgstr "Ontario" #~ msgid "Prince Edward Island" #~ msgstr "Prince Edward otok" #~ msgctxt "State in Canada" #~ msgid "Quebec" #~ msgstr "Quebec" #~ msgid "Saskatchewan" #~ msgstr "Saskatchewan" #~ msgid "Yukon Territory" #~ msgstr "Yukon Territory" #~ msgid "Anhui" #~ msgstr "Anhui" #~ msgctxt "State in China" #~ msgid "Beijing" #~ msgstr "Peking" #~ msgctxt "State in China" #~ msgid "Chongqing" #~ msgstr "Chongqing" #~ msgid "Fujian" #~ msgstr "Fujian" #~ msgid "Gansu" #~ msgstr "Gansu" #~ msgid "Guangdong" #~ msgstr "Guangdong" #~ msgid "Guangxi" #~ msgstr "Guangxi" #~ msgid "Guizhou" #~ msgstr "Guizhou" #~ msgid "Hainan" #~ msgstr "Hainan" #~ msgid "Heilongjiang" #~ msgstr "Heilongjiang" #~ msgid "Henan" #~ msgstr "Henan" #~ msgid "Hubei" #~ msgstr "Hubei" #~ msgid "Hunan" #~ msgstr "Hunan" #~ msgid "Inner Mongolia" #~ msgstr "Unitrašnja Mongolia" #~ msgid "Jiangsu" #~ msgstr "Jiangsu" #~ msgid "Jilin" #~ msgstr "Jilin" #~ msgid "Liaoning" #~ msgstr "Liaoning" #~ msgid "Shaanxi" #~ msgstr "Shaanxi" #~ msgid "Shandong" #~ msgstr "Shandong" #~ msgctxt "State in China" #~ msgid "Shanghai" #~ msgstr "Šangaj" #~ msgid "Shanxi" #~ msgstr "Shanxi" #~ msgid "Sichuan" #~ msgstr "Sichuan" #~ msgctxt "State in China" #~ msgid "Tianjin" #~ msgstr "Tianjin" #~ msgid "Xinjiang" #~ msgstr "Xinjiang" #~ msgid "Yunnan" #~ msgstr "Yunnan" #~ msgid "Zhejiang" #~ msgstr "Zhejiang" #~ msgid "Tbilisi" #~ msgstr "Tbilisi" #~ msgid "Baden-Württemberg" #~ msgstr "Baden-Württemberg" #~ msgid "Bavaria" #~ msgstr "Bavarska" #~ msgctxt "State in Germany" #~ msgid "Berlin" #~ msgstr "Berlin" #~ msgid "Brandenburg" #~ msgstr "Brandenburg" #~ msgctxt "State in Germany" #~ msgid "Bremen" #~ msgstr "Bremen" #~ msgctxt "State in Germany" #~ msgid "Hamburg" #~ msgstr "Hamburg" #~ msgid "Hesse" #~ msgstr "Hesse" #~ msgid "Lower Saxony" #~ msgstr "Lower Saxony" #~ msgid "Mecklenburg-Western Pomerania" #~ msgstr "Mecklenburg - Western Pomerania" #~ msgid "North Rhine-Westphalia" #~ msgstr "North Rhine- Westphalia" #~ msgid "Rhineland-Palatinate" #~ msgstr "Rhineland - Palatinate" #~ msgid "Saarland" #~ msgstr "Saarland" #~ msgid "Saxony" #~ msgstr "Saxony" #~ msgid "Saxony-Anhalt" #~ msgstr "Saxony - Anhalt" #~ msgid "Schleswig-Holstein" #~ msgstr "Schleswig - Holstein" #~ msgid "Thuringia" #~ msgstr "Thuringia" #~ msgctxt "State in Mexico" #~ msgid "Aguascalientes" #~ msgstr "Aguascalientes" #~ msgid "Baja California" #~ msgstr "Baja California" #~ msgid "Baja California Sur" #~ msgstr "Baja California Sur" #~ msgctxt "State in Mexico" #~ msgid "Campeche" #~ msgstr "Campeche" #~ msgid "Chiapas" #~ msgstr "Chiapas" #~ msgctxt "State in Mexico" #~ msgid "Chihuahua" #~ msgstr "Chihuahua" #~ msgid "Coahuila" #~ msgstr "Coahuila" #~ msgctxt "State in Mexico" #~ msgid "Colima" #~ msgstr "Colima" #~ msgctxt "State in Mexico" #~ msgid "Distrito Federal" #~ msgstr "Distrito Federal" #~ msgctxt "State in Mexico" #~ msgid "Durango" #~ msgstr "Durango" #~ msgid "Guanajuato" #~ msgstr "Guanajuato" #~ msgid "Guerrero" #~ msgstr "Guerrero" #~ msgid "Hidalgo" #~ msgstr "Hidalgo" #~ msgid "Jalisco" #~ msgstr "Jalisco" #~ msgid "Michoacán" #~ msgstr "Michoacán" #~ msgid "Morelos" #~ msgstr "Morelos" #~ msgid "México" #~ msgstr "México" #~ msgid "Nayarit" #~ msgstr "Nayarit" #~ msgid "Nuevo León" #~ msgstr "Nuevo León" #~ msgctxt "State in Mexico" #~ msgid "Oaxaca" #~ msgstr "Oaxaca" #~ msgctxt "State in Mexico" #~ msgid "Puebla" #~ msgstr "Puebla" #~ msgctxt "State in Mexico" #~ msgid "Querétaro" #~ msgstr "Querétaro" #~ msgid "Quintana Roo" #~ msgstr "Quintana Roo" #~ msgctxt "State in Mexico" #~ msgid "San Luis Potosí" #~ msgstr "San Luis Potosí" #~ msgid "Sinaloa" #~ msgstr "Sinaloa" #~ msgctxt "State in Mexico" #~ msgid "Sonora" #~ msgstr "Sonora" #~ msgid "Tabasco" #~ msgstr "Tabasco" #~ msgid "Tamaulipas" #~ msgstr "Tamaulipas" #~ msgid "Tlaxcala" #~ msgstr "Tlaxcala" #~ msgctxt "State in Mexico" #~ msgid "Veracruz" #~ msgstr "Veracruz" #~ msgid "Yucatán" #~ msgstr "Yucatán" #~ msgctxt "State in Mexico" #~ msgid "Zacatecas" #~ msgstr "Zacatecas" #~ msgid "East and South East England" #~ msgstr "Istočna i jugoistočna Engleska" #~ msgid "Midlands" #~ msgstr "Midlands" #~ msgid "North East England" #~ msgstr "North East England" #~ msgid "North West England" #~ msgstr "North West England" #~ msgid "Northern Ireland" #~ msgstr "Northern Ireland" #~ msgid "Scotland" #~ msgstr "Škotska" #~ msgid "South and South West England" #~ msgstr "Južna i jugozapadna Engleska" #~ msgid "Wales" #~ msgstr "Wales" #~ msgid "Alabama" #~ msgstr "Alabama" #~ msgid "Alaska" #~ msgstr "Aljaska" #~ msgid "Arizona" #~ msgstr "Arizona" #~ msgid "Arkansas" #~ msgstr "Arkansas" #~ msgid "California" #~ msgstr "Kalifornija" #~ msgid "Colorado" #~ msgstr "Colorado" #~ msgid "Connecticut" #~ msgstr "Connecticut" #~ msgid "Delaware" #~ msgstr "Delaware" #~ msgid "District of Columbia" #~ msgstr "District of Columbia" #~ msgid "Florida" #~ msgstr "Florida" #~ msgctxt "State in United States" #~ msgid "Georgia" #~ msgstr "Georgia" #~ msgid "Hawaii" #~ msgstr "Hawaii" #~ msgid "Idaho" #~ msgstr "Idaho" #~ msgid "Illinois" #~ msgstr "Illinois" #~ msgctxt "State in United States" #~ msgid "Indiana" #~ msgstr "Indiana" #~ msgid "Iowa" #~ msgstr "Iowa" #~ msgid "Kansas" #~ msgstr "Kansas" #~ msgid "Kentucky" #~ msgstr "Kentucky" #~ msgid "Louisiana" #~ msgstr "Louisiana" #~ msgid "Maine" #~ msgstr "Maine" #~ msgid "Maryland" #~ msgstr "Maryland" #~ msgid "Massachusetts" #~ msgstr "Massachusetts" #~ msgid "Michigan" #~ msgstr "Michigan" #~ msgid "Minnesota" #~ msgstr "Minnesota" #~ msgid "Mississippi" #~ msgstr "Mississippi" #~ msgid "Missouri" #~ msgstr "Missouri" #~ msgid "Montana" #~ msgstr "Montana" #~ msgid "Nebraska" #~ msgstr "Nebraska" #~ msgid "Nevada" #~ msgstr "Nevada" #~ msgid "New Hampshire" #~ msgstr "New Hampshire" #~ msgid "New Jersey" #~ msgstr "New Jersey" #~ msgid "New Mexico" #~ msgstr "New Mexico" #~ msgctxt "State in United States" #~ msgid "New York" #~ msgstr "New York" #~ msgid "North Carolina" #~ msgstr "Sjeverna Carolina" #~ msgid "North Dakota" #~ msgstr "Sjeverna Dakota" #~ msgid "Ohio" #~ msgstr "Ohio" #~ msgid "Oklahoma" #~ msgstr "Oklahoma" #~ msgid "Oregon" #~ msgstr "Oregon" #~ msgid "Pennsylvania" #~ msgstr "Pennsylvania" #~ msgid "Rhode Island" #~ msgstr "Rhode otok" #~ msgid "South Carolina" #~ msgstr "Južna Karolina" #~ msgid "South Dakota" #~ msgstr "Južna Dakota" #~ msgid "Tennessee" #~ msgstr "Tennessee" #~ msgid "Texas" #~ msgstr "Texas" #~ msgid "Utah" #~ msgstr "Utah" #~ msgid "Vermont" #~ msgstr "Vermont" #~ msgid "Virginia" #~ msgstr "Virginia" #~ msgctxt "State in United States" #~ msgid "Washington" #~ msgstr "Washington" #~ msgid "West Virginia" #~ msgstr "Zapadna Virginia" #~ msgid "Wisconsin" #~ msgstr "Wisconsin" #~ msgctxt "State in United States" #~ msgid "Wyoming" #~ msgstr "Wyoming" #~ msgid "Herat" #~ msgstr "Herat" #~ msgid "Kabul" #~ msgstr "Kabul" #~ msgid "Tirana" #~ msgstr "Tirana" #~ msgid "Adrar" #~ msgstr "Adrar" #~ msgid "Algiers" #~ msgstr "Alžir" #~ msgid "Annaba" #~ msgstr "Annaba" #~ msgid "Batna" #~ msgstr "Batna" #~ msgid "Bechar" #~ msgstr "Bechar" #~ msgid "Bejaia" #~ msgstr "Bejaia" #~ msgid "Berriane" #~ msgstr "Berriane" #~ msgid "Biskra" #~ msgstr "Biskra" #~ msgid "Bou Saada" #~ msgstr "Bou Saada" #~ msgid "Chlef" #~ msgstr "Chlef" #~ msgid "Constantine" #~ msgstr "Konstantin" #~ msgid "Dar el Beida" #~ msgstr "Dar el Beida" #~ msgid "Djanet" #~ msgstr "Djanet" #~ msgid "El Golea" #~ msgstr "El Golea" #~ msgid "Ghardaia" #~ msgstr "Ghardaia" #~ msgid "Hassi Messaoud" #~ msgstr "Hassi Messaoud" #~ msgid "I-n-Amenas" #~ msgstr "I-n-Amenas" #~ msgid "I-n-Salah" #~ msgstr "I-n-Salah" #~ msgid "Illizi" #~ msgstr "Illizi" #~ msgid "Jijel" #~ msgstr "Jijel" #~ msgid "Laghouat" #~ msgstr "Laghouat" #~ msgid "Mascara" #~ msgstr "Mascara" #~ msgid "Oran" #~ msgstr "Oran" #~ msgid "Ouargla" #~ msgstr "Ouargla" #~ msgid "Setif" #~ msgstr "Setif" #~ msgid "Sidi Amrane" #~ msgstr "Sidi Amrane" #~ msgid "Sidi Bel Abbes" #~ msgstr "Sidi Bel Abbes" #~ msgid "Tamanrasset" #~ msgstr "Tamanrasset" #~ msgid "Tebessa" #~ msgstr "Tebessa" #~ msgid "Tiaret" #~ msgstr "Tiaret" #~ msgid "Timimoun" #~ msgstr "Timimoun" #~ msgid "Tindouf" #~ msgstr "Tindouf" #~ msgid "Tlemcen" #~ msgstr "Tlemcen" #~ msgid "Touggourt" #~ msgstr "Touggourt" #~ msgid "Pago Pago" #~ msgstr "Pago Pago" #~ msgid "The Valley" #~ msgstr "The Valley" #~ msgid "Amundsen-Scott South Pole Station" #~ msgstr "Postaja na južnom polu Amundsen-Scott" #~ msgid "Fitches Creek" #~ msgstr "Fitches Creek" #~ msgctxt "City in Antigua and Barbuda" #~ msgid "Saint John's" #~ msgstr "Saint John's" #~ msgid "Buenos Aires" #~ msgstr "Buenos Aires" #~ msgid "Comodoro Rivadavia" #~ msgstr "Comodoro Rivadavia" #~ msgid "Corrientes" #~ msgstr "Corrientes" #~ msgctxt "City in Argentina" #~ msgid "Córdoba" #~ msgstr "Córdoba" #~ msgid "El Palomar" #~ msgstr "El Palomar" #~ msgid "Ezeiza" #~ msgstr "Ezeiza" #~ msgid "Formosa" #~ msgstr "Formosa" #~ msgid "Mar del Plata" #~ msgstr "Mar del Plata" #~ msgid "Mendoza" #~ msgstr "Mendoza" #~ msgid "Neuquén" #~ msgstr "Neuquén" #~ msgid "Posadas" #~ msgstr "Posadas" #~ msgid "Puerto Iguazú" #~ msgstr "Puerto Iguazú" #~ msgid "Reconquista" #~ msgstr "Reconquista" #~ msgid "Resistencia" #~ msgstr "Resistencia" #~ msgid "Rosario" #~ msgstr "Rosario" #~ msgid "Río Gallegos" #~ msgstr "Río Gallegos" #~ msgid "Río Grande" #~ msgstr "Río Grande" #~ msgid "Salta" #~ msgstr "Salta" #~ msgid "San Carlos de Bariloche" #~ msgstr "San Carlos de Bariloche" #~ msgctxt "City in Argentina" #~ msgid "San Fernando" #~ msgstr "San Fernando" #~ msgid "San Salvador de Jujuy" #~ msgstr "San Salvador de Jujuy" #~ msgid "Ushuaia" #~ msgstr "Ushuaia" #~ msgid "Yerevan" #~ msgstr "Yerevan" #~ msgid "Camacuri" #~ msgstr "Camacuri" #~ msgid "Oranjestad" #~ msgstr "Oranjestad" #~ msgid "Adelaide" #~ msgstr "Adelaide" #~ msgid "Alice Springs" #~ msgstr "Alice Springs" #~ msgid "Brisbane" #~ msgstr "Brisbane" #~ msgid "Broome" #~ msgstr "Broome" #~ msgid "Bullsbrook" #~ msgstr "Bullsbrook" #~ msgid "Cairns" #~ msgstr "Cairns" #~ msgid "Canberra" #~ msgstr "Canberra" #~ msgid "Coolangatta" #~ msgstr "Coolangatta" #~ msgid "Darwin" #~ msgstr "Darwin" #~ msgid "Dubbo" #~ msgstr "Dubbo" #~ msgid "Forest Hill" #~ msgstr "Forest Hill" #~ msgctxt "City in Tasmania, Australia" #~ msgid "Hobart" #~ msgstr "Hobart" #~ msgid "Kalgoorlie" #~ msgstr "Kalgoorlie" #~ msgid "Katherine" #~ msgstr "Katherine" #~ msgid "Kununurra" #~ msgstr "Kununurra" #~ msgid "Lara" #~ msgstr "Lara" #~ msgid "Launceston" #~ msgstr "Launceston" #~ msgid "Learmonth" #~ msgstr "Learmonth" #~ msgctxt "City in Victoria, Australia" #~ msgid "Melbourne" #~ msgstr "Melbourne" #~ msgid "Mount Isa" #~ msgstr "Mount Isa" #~ msgid "Perth" #~ msgstr "Perth" #~ msgctxt "City in New South Wales, Australia" #~ msgid "Richmond" #~ msgstr "Richmond" #~ msgid "Rockhampton" #~ msgstr "Rockhampton" #~ msgid "Shellborough" #~ msgstr "Shellborough" #~ msgctxt "City in New South Wales, Australia" #~ msgid "Sydney" #~ msgstr "Sydney" #~ msgid "Tamworth" #~ msgstr "Tamworth" #~ msgid "Townsville" #~ msgstr "Townsville" #~ msgid "Wangaratta" #~ msgstr "Wangaratta" #~ msgid "Woomera" #~ msgstr "Woomera" #~ msgid "Aigen im Ennstal" #~ msgstr "Aigen im Ennstal" #~ msgid "Graz" #~ msgstr "Graz" #~ msgid "Hohenems" #~ msgstr "Hohenems" #~ msgid "Innsbruck" #~ msgstr "Innsbruck" #~ msgid "Klagenfurt" #~ msgstr "Klagenfurt" #~ msgid "Linz" #~ msgstr "Linz" #~ msgid "Salzburg" #~ msgstr "Salzburg" #~ msgid "Teesdorf" #~ msgstr "Teesdorf" #~ msgid "Tulln" #~ msgstr "Tulln" #~ msgid "Vienna" #~ msgstr "Beč" #~ msgid "Wiener Neustadt" #~ msgstr "Bečko novo mjesto" #~ msgid "Zell am See" #~ msgstr "Zell am See" #~ msgid "Zeltweg" #~ msgstr "Zeltweg" #~ msgid "Baku" #~ msgstr "Baku" #~ msgid "Ganca" #~ msgstr "Ganca" #~ msgctxt "City in Bahamas" #~ msgid "Freeport" #~ msgstr "Freeport" #~ msgctxt "City in Bahamas" #~ msgid "Georgetown" #~ msgstr "Georgetown" #~ msgid "Nassau" #~ msgstr "Nassau" #~ msgid "Al Hadd" #~ msgstr "Al Hadd" #~ msgid "Manama" #~ msgstr "Manama" #~ msgid "Chittagong" #~ msgstr "Chittagong" #~ msgid "Dhaka" #~ msgstr "Dhaka" #~ msgid "Solpur" #~ msgstr "Solpur" #~ msgid "Bridgetown" #~ msgstr "Bridgetown" #~ msgid "Paragon" #~ msgstr "Paragon" #~ msgctxt "City in Belarus" #~ msgid "Brest" #~ msgstr "Brest" #~ msgid "Homyel'" #~ msgstr "Homyel'" #~ msgid "Hrodna" #~ msgstr "Hrodna" #~ msgid "Minsk" #~ msgstr "Minsk" #~ msgid "Vitsyebsk" #~ msgstr "Vitsyebsk" #~ msgctxt "City in Antwerp, Belgium" #~ msgid "Antwerp" #~ msgstr "Antwerpen" #~ msgid "Beauvechain" #~ msgstr "Beauvechain" #~ msgid "Bierset" #~ msgstr "Bierset" #~ msgid "Brussels" #~ msgstr "Bruxelles" #~ msgid "Chièvres" #~ msgstr "Chièvres" #~ msgid "Elsenborn" #~ msgstr "Elsenborn" #~ msgid "Florennes" #~ msgstr "Florennes" #~ msgid "Gosselies" #~ msgstr "Gosselies" #~ msgid "Kleine-Brogel" #~ msgstr "Kleine-Brogel" #~ msgid "Koksijde" #~ msgstr "Koksijde" #~ msgid "Oostende" #~ msgstr "Oostende" #~ msgid "Schaffen" #~ msgstr "Schaffen" #~ msgid "Belize City" #~ msgstr "Belize City" #~ msgid "Cotonou" #~ msgstr "Cotonou" #~ msgid "Porto-Novo" #~ msgstr "Porto-Novo" #~ msgctxt "City in Bermuda" #~ msgid "Hamilton" #~ msgstr "Hamilton" #~ msgctxt "City in Bermuda" #~ msgid "Saint George" #~ msgstr "Saint George" #~ msgid "Camiri" #~ msgstr "Camiri" #~ msgid "Cobija" #~ msgstr "Cobija" #~ msgid "Cochabamba" #~ msgstr "Cochabamba" #~ msgctxt "City in Bolivia" #~ msgid "Concepción" #~ msgstr "Concepción" #~ msgctxt "City in Bolivia" #~ msgid "La Paz" #~ msgstr "La Paz" #~ msgid "Magdalena" #~ msgstr "Magdalena" #~ msgid "Oruro" #~ msgstr "Oruro" #~ msgid "Potosí" #~ msgstr "Potosí" #~ msgid "Puerto Suárez" #~ msgstr "Puerto Suárez" #~ msgid "Reyes" #~ msgstr "Reyes" #~ msgid "Riberalta" #~ msgstr "Riberalta" #~ msgid "Roboré" #~ msgstr "Roboré" #~ msgid "Rurrenabaque" #~ msgstr "Rurrenabaque" #~ msgid "San Borja" #~ msgstr "San Borja" #~ msgid "San Ignacio de Velasco" #~ msgstr "San Ignacio de Velasco" #~ msgid "San Joaquín" #~ msgstr "San Joaquín" #~ msgid "San José de Chiquitos" #~ msgstr "San José de Chiquitos" #~ msgid "Santa Ana de Yacuma" #~ msgstr "Santa Ana de Yacuma" #~ msgid "Santa Cruz" #~ msgstr "Santa Cruz" #~ msgid "Sucre" #~ msgstr "Sucre" #~ msgid "Tarija" #~ msgstr "Tarija" #~ msgctxt "City in Bolivia" #~ msgid "Trinidad" #~ msgstr "Trinidad" #~ msgid "Villamontes" #~ msgstr "Villamontes" #~ msgid "Viro Viro" #~ msgstr "Viro Viro" #~ msgid "Yacuiba" #~ msgstr "Yacuiba" #~ msgid "Banja Luka" #~ msgstr "Banja Luka" #~ msgid "Mostar" #~ msgstr "Mostar" #~ msgid "Sarajevo" #~ msgstr "Sarajevo" #~ msgid "Francistown" #~ msgstr "Francistown" #~ msgid "Gaborone" #~ msgstr "Gaborone" #~ msgid "Ghanzi" #~ msgstr "Ghanzi" #~ msgid "Kasane" #~ msgstr "Kasane" #~ msgid "Letlhakane" #~ msgstr "Letlhakane" #~ msgid "Lokerane" #~ msgstr "Lokerane" #~ msgid "Maun" #~ msgstr "Maun" #~ msgid "Mochudi" #~ msgstr "Mochudi" #~ msgid "Selebi-Phikwe" #~ msgstr "Selebi-Phikwe" #~ msgid "Tshabong" #~ msgstr "Tshabong" #~ msgid "Alta Floresta" #~ msgstr "Alta Floresta" #~ msgid "Altamira" #~ msgstr "Altamira" #~ msgid "Anápolis" #~ msgstr "Anápolis" #~ msgid "Aracaju" #~ msgstr "Aracaju" #~ msgid "Barbacena" #~ msgstr "Barbacena" #~ msgid "Barra do Garças" #~ msgstr "Barra do Garças" #~ msgid "Bauru" #~ msgstr "Bauru" #~ msgid "Belo Horizonte" #~ msgstr "Belo Horizonte" #~ msgid "Belém" #~ msgstr "Belém" #~ msgid "Boa Vista" #~ msgstr "Boa Vista" #~ msgid "Bom Jesus da Lapa" #~ msgstr "Bom Jesus da Lapa" #~ msgid "Brasília" #~ msgstr "Brasília" #~ msgid "Cachimbo" #~ msgstr "Cachimbo" #~ msgid "Campina Grande" #~ msgstr "Campina Grande" #~ msgid "Campinas" #~ msgstr "Campinas" #~ msgid "Campo Grande" #~ msgstr "Campo Grande" #~ msgid "Campos" #~ msgstr "Campos" #~ msgid "Conceição do Araguaia" #~ msgstr "Conceição do Araguaia" #~ msgid "Corumbá" #~ msgstr "Corumbá" #~ msgid "Cruzeiro do Sul" #~ msgstr "Cruzeiro do Sul" #~ msgid "Cuiabá" #~ msgstr "Cuiabá" #~ msgid "Curitiba" #~ msgstr "Curitiba" #~ msgid "Dourados" #~ msgstr "Dourados" #~ msgid "Florianópolis" #~ msgstr "Florianópolis" #~ msgid "Fortaleza" #~ msgstr "Fortaleza" #~ msgid "Foz do Iguaçu" #~ msgstr "Foz do Iguaçu" #~ msgid "Goiânia" #~ msgstr "Goiânia" #~ msgid "Guaratinguetá" #~ msgstr "Guaratinguetá" #~ msgid "Guarulhos" #~ msgstr "Guarulhos" #~ msgid "Ilhéus" #~ msgstr "Ilhéus" #~ msgid "Imperatriz" #~ msgstr "Imperatriz" #~ msgid "Itaituba" #~ msgstr "Itaituba" #~ msgid "Jacareacanga" #~ msgstr "Jacareacanga" #~ msgid "João Pessoa" #~ msgstr "João Pessoa" #~ msgid "Juiz de Fora" #~ msgstr "Juiz de Fora" #~ msgid "Londrina" #~ msgstr "Londrina" #~ msgid "Maceió" #~ msgstr "Maceió" #~ msgid "Manaus" #~ msgstr "Manaus" #~ msgid "Manicoré" #~ msgstr "Manicoré" #~ msgid "Marabá" #~ msgstr "Marabá" #~ msgid "Maringá" #~ msgstr "Maringá" #~ msgid "Montes Claros" #~ msgstr "Montes Claros" #~ msgid "Mossoró" #~ msgstr "Mossoró" #~ msgctxt "City in Rio Grande do Norte, Brazil" #~ msgid "Natal" #~ msgstr "Natal" #~ msgid "Oiapoque" #~ msgstr "Oiapoque" #~ msgid "Palmeiras" #~ msgstr "Palmeiras" #~ msgid "Parnaíba" #~ msgstr "Parnaíba" #~ msgid "Paulo Afonso" #~ msgstr "Paulo Afonso" #~ msgid "Pelotas" #~ msgstr "Pelotas" #~ msgid "Petrolina" #~ msgstr "Petrolina" #~ msgid "Piracicaba" #~ msgstr "Piracicaba" #~ msgid "Piraçununga" #~ msgstr "Piraçununga" #~ msgid "Piri Grande" #~ msgstr "Piri Grande" #~ msgid "Ponta Porã" #~ msgstr "Ponta Porã" #~ msgid "Porto Alegre" #~ msgstr "Porto Alegre" #~ msgid "Poços de Caldas" #~ msgstr "Poços de Caldas" #~ msgid "Presidente Prudente" #~ msgstr "Presidente Prudente" #~ msgid "Pôrto Seguro" #~ msgstr "Pôrto Seguro" #~ msgid "Pôrto Velho" #~ msgstr "Pôrto Velho" #~ msgid "Recife" #~ msgstr "Recife" #~ msgid "Rio Branco" #~ msgstr "Rio Branco" #~ msgctxt "City in Rio de Janeiro, Brazil" #~ msgid "Rio de Janeiro" #~ msgstr "Rio de Janeiro" #~ msgid "Salvador" #~ msgstr "Salvador" #~ msgctxt "City in Rio Grande do Sul, Brazil" #~ msgid "Santa Maria" #~ msgstr "Santa Maria" #~ msgid "Santarém" #~ msgstr "Santarém" #~ msgid "Santos" #~ msgstr "Santos" #~ msgid "São Félix" #~ msgstr "São Félix" #~ msgid "São Gabriel" #~ msgstr "São Gabriel" #~ msgid "São José dos Campos" #~ msgstr "São José dos Campos" #~ msgid "São Luís" #~ msgstr "São Luís" #~ msgctxt "City in São Paulo, Brazil" #~ msgid "São Paulo" #~ msgstr "São Paulo" #~ msgid "São Pedro da Aldeia" #~ msgstr "São Pedro da Aldeia" #~ msgid "Tarauacá" #~ msgstr "Tarauacá" #~ msgid "Tefé" #~ msgstr "Tefé" #~ msgid "Teresina" #~ msgstr "Teresina" #~ msgid "Tucuruí" #~ msgstr "Tucuruí" #~ msgid "Uberaba" #~ msgstr "Uberaba" #~ msgid "Uberlândia" #~ msgstr "Uberlândia" #~ msgid "Uruguaiana" #~ msgstr "Uruguaiana" #~ msgid "Vila dos Remédios" #~ msgstr "Vila dos Remédios" #~ msgid "Vilhena" #~ msgstr "Vilhena" #~ msgid "Vitória" #~ msgstr "Vitória" #~ msgid "Vitória da Conquista" #~ msgstr "Vitória da Conquista" #~ msgid "Road Town" #~ msgstr "Road Town" #~ msgid "The Mill" #~ msgstr "The Mill" #~ msgid "Bandar Seri Begawan" #~ msgstr "Bandar Seri Begawan" #~ msgid "Burgas" #~ msgstr "Burgas" #~ msgid "Gorna Oryakhovitsa" #~ msgstr "Gorna Oryakhovitsa" #~ msgid "Plovdiv" #~ msgstr "Plovdiv" #~ msgid "Sofia" #~ msgstr "Sofia" #~ msgid "Varna" #~ msgstr "Varna" #~ msgid "Ouagadougou" #~ msgstr "Ouagadougou" #~ msgid "Bujumbura" #~ msgstr "Bujumbura" #~ msgid "Phnom Penh" #~ msgstr "Phnom Penh" #~ msgid "Siemreab" #~ msgstr "Siemreab" #~ msgid "Douala" #~ msgstr "Douala" #~ msgid "Garoua" #~ msgstr "Garoua" #~ msgid "Ngaoundere" #~ msgstr "Ngaoundere" #~ msgid "Yaounde" #~ msgstr "Yaounde" #~ msgid "Abbotsford" #~ msgstr "Abbotsford" #~ msgid "Agassiz" #~ msgstr "Agassiz" #~ msgid "Aklavik" #~ msgstr "Aklavik" #~ msgid "Allison Harbour" #~ msgstr "Allison Harbour" #~ msgid "Alta Lake" #~ msgstr "Alta Lake" #~ msgid "Amqui" #~ msgstr "Amqui" #~ msgid "Argentia" #~ msgstr "Argentia" #~ msgid "Arviat" #~ msgstr "Arviat" #~ msgid "Assiniboia" #~ msgstr "Assiniboia" #~ msgid "Bagotville" #~ msgstr "Bagotville" #~ msgid "Baie-Comeau" #~ msgstr "Baie-Comeau" #~ msgid "Baie-Sainte-Catherine" #~ msgstr "Baie-Sainte-Catherine" #~ msgid "Baie-de-la-Trinité" #~ msgstr "Baie-de-la-Trinité" #~ msgid "Baker Lake" #~ msgstr "Baker Lake" #~ msgid "Baldonnel" #~ msgstr "Baldonnel" #~ msgid "Bancroft" #~ msgstr "Bancroft" #~ msgid "Banff" #~ msgstr "Banff" #~ msgid "Bathurst" #~ msgstr "Bathurst" #~ msgid "Bay Saint Lawrence" #~ msgstr "Bay Saint Lawrence" #~ msgid "Beardmore" #~ msgstr "Beardmore" #~ msgid "Beauceville" #~ msgstr "Beauceville" #~ msgid "Beauport" #~ msgstr "Beauport" #~ msgid "Beaver Harbour" #~ msgstr "Beaver Harbour" #~ msgctxt "City in Quebec, Canada" #~ msgid "Bedford" #~ msgstr "Bedford" #~ msgid "Bella Coola" #~ msgstr "Bella Coola" #~ msgid "Bellin" #~ msgstr "Bellin" #~ msgid "Berens River" #~ msgstr "Berens River" #~ msgid "Bergen" #~ msgstr "Bergen" #~ msgid "Blanc-Sablon" #~ msgstr "Blanc-Sablon" #~ msgid "Blue River" #~ msgstr "Blue River" #~ msgid "Boat Basin" #~ msgstr "Boat Basin" #~ msgid "Borden" #~ msgstr "Borden" #~ msgid "Bow Island" #~ msgstr "Bow Island" #~ msgid "Brandon" #~ msgstr "Brandon" #~ msgid "Broadview" #~ msgstr "Broadview" #~ msgid "Brooks" #~ msgstr "Brooks" #~ msgid "Buffalo Narrows" #~ msgstr "Buffalo Narrows" #~ msgctxt "City in Ontario, Canada" #~ msgid "Burlington" #~ msgstr "Burlington" #~ msgid "Burns Lake" #~ msgstr "Burns Lake" #~ msgid "Burwash Landing" #~ msgstr "Burwash Landing" #~ msgid "Caledonia" #~ msgstr "Caledonia" #~ msgid "Calgary" #~ msgstr "Calgary" #~ msgid "Cambridge Bay" #~ msgstr "Cambridge Bay" #~ msgid "Campbell River" #~ msgstr "Campbell River" #~ msgid "Canso" #~ msgstr "Canso" #~ msgid "Canton-Bégin" #~ msgstr "Canton-Bégin" #~ msgid "Cap-Chat" #~ msgstr "Cap-Chat" #~ msgid "Cap-aux-Meules" #~ msgstr "Cap-aux-Meules" #~ msgid "Cape Cove" #~ msgstr "Cape Cove" #~ msgid "Cape Dorset" #~ msgstr "Cape Dorset" #~ msgid "Cape Dyer" #~ msgstr "Cape Dyer" #~ msgid "Cape Parry" #~ msgstr "Cape Parry" #~ msgid "Cape Race" #~ msgstr "Cape Race" #~ msgid "Cardston" #~ msgstr "Cardston" #~ msgid "Caribou Island" #~ msgstr "Caribou otok" #~ msgid "Carmacks" #~ msgstr "Carmacks" #~ msgid "Carman" #~ msgstr "Carman" #~ msgid "Cartwright" #~ msgstr "Cartwright" #~ msgid "Castlegar" #~ msgstr "Castlegar" #~ msgid "Central Patricia" #~ msgstr "Central Patricia" #~ msgid "Chapleau" #~ msgstr "Chapleau" #~ msgid "Charlottetown" #~ msgstr "Charlottetown" #~ msgid "Chesterfield Inlet" #~ msgstr "Chesterfield Inlet" #~ msgid "Chibougamau" #~ msgstr "Chibougamau" #~ msgid "Churchill" #~ msgstr "Churchill" #~ msgid "Chéticamp" #~ msgstr "Chéticamp" #~ msgid "Claresholm" #~ msgstr "Claresholm" #~ msgctxt "City in British Columbia, Canada" #~ msgid "Clinton" #~ msgstr "Clinton" #~ msgid "Clyde River" #~ msgstr "Rijeka Clyde" #~ msgid "Cobourg" #~ msgstr "Cobourg" #~ msgid "Cold Lake" #~ msgstr "Jezero Cold" #~ msgid "Coleman" #~ msgstr "Coleman" #~ msgid "Collingwood" #~ msgstr "Collingwood" #~ msgid "Comox" #~ msgstr "Comox" #~ msgid "Coppell" #~ msgstr "Coppell" #~ msgid "Coral Harbour" #~ msgstr "Luka Coral" #~ msgid "Coronation" #~ msgstr "Coronation" #~ msgid "Cranbrook" #~ msgstr "Cranbrook" #~ msgctxt "City in British Columbia, Canada" #~ msgid "Creston" #~ msgstr "Creston" #~ msgid "Dauphin" #~ msgstr "Dauphin" #~ msgid "Dawson" #~ msgstr "Dawson" #~ msgid "Dease Lake" #~ msgstr "Jezero Dease" #~ msgid "Deer Lake" #~ msgstr "Jezero Deer" #~ msgid "Delhi" #~ msgstr "Delhi" #~ msgid "Dingwall" #~ msgstr "Dingwall" #~ msgid "Dipper Harbour" #~ msgstr "Dipper Harbour" #~ msgid "Drumheller" #~ msgstr "Drumheller" #~ msgctxt "City in Ontario, Canada" #~ msgid "Dryden" #~ msgstr "Dryden" #~ msgid "Délįne" #~ msgstr "Délįne" #~ msgid "Earlton" #~ msgstr "Earlton" #~ msgid "East Poplar" #~ msgstr "East Poplar" #~ msgid "Eastend" #~ msgstr "Eastend" #~ msgid "Edmonton" #~ msgstr "Edmonton" #~ msgid "Edson" #~ msgstr "Edson" #~ msgid "Elliot Lake" #~ msgstr "Rijeka Elliot" #~ msgctxt "City in Prince Edward Island, Canada" #~ msgid "Elmira" #~ msgstr "Elmira" #~ msgid "Embarras Portage" #~ msgstr "Embarras Portage" #~ msgid "Englee" #~ msgstr "Englee" #~ msgid "Ennadai" #~ msgstr "Ennadai" #~ msgid "Erieau" #~ msgstr "Erieau" #~ msgid "Esquimalt" #~ msgstr "Esquimalt" #~ msgid "Estevan" #~ msgstr "Estevan" #~ msgid "Esther" #~ msgstr "Esther" #~ msgctxt "City in Nunavut, Canada" #~ msgid "Eureka" #~ msgstr "Eureka" #~ msgid "Ferolle Point" #~ msgstr "Ferolle Point" #~ msgid "Flin Flon" #~ msgstr "Flin Flon" #~ msgid "Fort Chipewyan" #~ msgstr "Fort Chipewyan" #~ msgid "Fort Good Hope" #~ msgstr "Rt Dobre Nade" #~ msgid "Fort Grahame" #~ msgstr "Fort Grahame" #~ msgid "Fort McMurray" #~ msgstr "Fort McMurray" #~ msgid "Fort Nelson" #~ msgstr "Fort Nelson" #~ msgid "Fort Providence" #~ msgstr "Fort Providence" #~ msgid "Fort Simpson" #~ msgstr "Fort Simpson" #~ msgctxt "City in Northwest Territories, Canada" #~ msgid "Fort Smith" #~ msgstr "Fort Smith" #~ msgid "Fort-Rupert" #~ msgstr "Fort-Rupert" #~ msgid "Fredericton" #~ msgstr "Fredericton" #~ msgid "Front of Escott" #~ msgstr "Front of Escott" #~ msgid "Gabriola" #~ msgstr "Gabriola" #~ msgid "Gagetown" #~ msgstr "Gagetown" #~ msgid "Gander" #~ msgstr "Gander" #~ msgid "Gaspé" #~ msgstr "Gaspé" #~ msgid "Gatineau" #~ msgstr "Gatineau" #~ msgid "Geraldton" #~ msgstr "Geraldton" #~ msgid "Gillam" #~ msgstr "Gillam" #~ msgid "Gimli" #~ msgstr "Gimli" #~ msgid "Gjoa Haven" #~ msgstr "Gjoa Haven" #~ msgid "Goderich" #~ msgstr "Goderich" #~ msgid "Golden" #~ msgstr "Golden" #~ msgid "Goose Bay" #~ msgstr "Goose Bay" #~ msgid "Gore Bay" #~ msgstr "Gore Zaljev" #~ msgctxt "City in Manitoba, Canada" #~ msgid "Grand Rapids" #~ msgstr "Grand Rapids" #~ msgid "Grand-Etang" #~ msgstr "Grand-Etang" #~ msgid "Grande Prairie" #~ msgstr "Grande Prairie" #~ msgctxt "City in Nova Scotia, Canada" #~ msgid "Greenwood" #~ msgstr "Greenwood" #~ msgid "Haines Junction" #~ msgstr "Haines Junction" #~ msgid "Halifax" #~ msgstr "Halifax" #~ msgid "Hall Beach" #~ msgstr "Hall Beach" #~ msgid "Hallowell" #~ msgstr "Hallowell" #~ msgctxt "City in Ontario, Canada" #~ msgid "Hamilton" #~ msgstr "Hamilton" #~ msgid "Harbour Breton" #~ msgstr "Harbour Breton" #~ msgid "Harrington Harbour" #~ msgstr "Harrington Harbour" #~ msgid "Havre-Saint-Pierre" #~ msgstr "Havre-Saint-Pierre" #~ msgid "Hay River" #~ msgstr "Rijeka Hay" #~ msgctxt "City in Newfoundland and Labrador, Canada" #~ msgid "Hebron" #~ msgstr "Hebron" #~ msgid "Heron Bay" #~ msgstr "Heron Bay" #~ msgid "High Level" #~ msgstr "High Level" #~ msgid "Hollyburn" #~ msgstr "Hollyburn" #~ msgid "Holman" #~ msgstr "Holman" #~ msgid "Hope" #~ msgstr "Hope" #~ msgid "Hopedale" #~ msgstr "Hopedale" #~ msgid "Igloolik" #~ msgstr "Igloolik" #~ msgid "Inoucdjouac" #~ msgstr "Inoucdjouac" #~ msgid "Inuvik" #~ msgstr "Inuvik" #~ msgid "Iqaluit" #~ msgstr "Iqaluit" #~ msgid "Island Lake" #~ msgstr "Jezero Island" #~ msgid "Ivugivik" #~ msgstr "Ivugivik" #~ msgid "Jacques-Cartier" #~ msgstr "Jacques-Cartier" #~ msgctxt "City in Alberta, Canada" #~ msgid "Jasper" #~ msgstr "Jasper" #~ msgid "Jonquière" #~ msgstr "Jonquière" #~ msgid "Kamloops" #~ msgstr "Kamloops" #~ msgid "Kapuskasing" #~ msgstr "Kapuskasing" #~ msgid "Kelowna" #~ msgstr "Kelowna" #~ msgid "Kenora" #~ msgstr "Kenora" #~ msgid "Kentville" #~ msgstr "Kentville" #~ msgid "Kindersley" #~ msgstr "Kindersley" #~ msgctxt "City in Ontario, Canada" #~ msgid "Kingston" #~ msgstr "Kingston" #~ msgid "Koartac" #~ msgstr "Koartac" #~ msgid "Kugaaruk" #~ msgstr "Kugaaruk" #~ msgid "Kugluktuk" #~ msgstr "Kugluktuk" #~ msgid "Kuujjuaq" #~ msgstr "Kuujjuaq" #~ msgid "L'Anse-Saint-Jean" #~ msgstr "L'Anse-Saint-Jean" #~ msgid "L'Ascension" #~ msgstr "L'Ascension" #~ msgid "L'Assomption" #~ msgstr "L'Assomption" #~ msgid "La Baie" #~ msgstr "La Baie" #~ msgid "La Ronge" #~ msgstr "La Ronge" #~ msgid "La Tuque" #~ msgstr "La Tuque" #~ msgid "Lac La Biche" #~ msgstr "Lac La Biche" #~ msgid "Lasqueti" #~ msgstr "Lasqueti" #~ msgid "Leader" #~ msgstr "Leader" #~ msgid "Leaf River" #~ msgstr "Leaf River" #~ msgid "Lennoxville" #~ msgstr "Lennoxville" #~ msgid "Lethbridge" #~ msgstr "Lethbridge" #~ msgid "Little Prairie" #~ msgstr "Little Prairie" #~ msgctxt "City in Nova Scotia, Canada" #~ msgid "Liverpool" #~ msgstr "Liverpool" #~ msgid "Lloydminster" #~ msgstr "Lloydminster" #~ msgctxt "City in Ontario, Canada" #~ msgid "London" #~ msgstr "London" #~ msgid "Longue-Pointe-de-Mingan" #~ msgstr "Longue-Pointe-de-Mingan" #~ msgid "Lucky Lake" #~ msgstr "Lucky jezero" #~ msgid "Lynn Lake" #~ msgstr "Lynn Lake" #~ msgid "Lytton" #~ msgstr "Lytton" #~ msgid "Makkovik" #~ msgstr "Makkovik" #~ msgid "Maniwaki" #~ msgstr "Maniwaki" #~ msgid "Maple Creek" #~ msgstr "Maple Creek" #~ msgid "Maricourt" #~ msgstr "Maricourt" #~ msgid "Mary's Harbour" #~ msgstr "Mary's luka" #~ msgid "Matagami" #~ msgstr "Matagami" #~ msgid "Mayo" #~ msgstr "Mayo" #~ msgid "McLeod Lake" #~ msgstr "McLeod Lake" #~ msgid "Meadow Lake" #~ msgstr "Meadow jezero" #~ msgid "Medicine Hat" #~ msgstr "Medicine Hat" #~ msgid "Melfort" #~ msgstr "Melfort" #~ msgctxt "City in Manitoba, Canada" #~ msgid "Miami" #~ msgstr "Miami" #~ msgid "Milk River" #~ msgstr "Milk River" #~ msgid "Moncton" #~ msgstr "Moncton" #~ msgid "Mont-Apica" #~ msgstr "Mont-Apica" #~ msgid "Mont-Joli" #~ msgstr "Mont-Joli" #~ msgid "Montmagny" #~ msgstr "Montmagny" #~ msgid "Montreal" #~ msgstr "Montreal" #~ msgid "Moosonee" #~ msgstr "Moosonee" #~ msgid "Morden" #~ msgstr "Morden" #~ msgid "Mount Forest" #~ msgstr "Mount Forest" #~ msgid "Mount Pearl Park" #~ msgstr "Mount Pearl Park" #~ msgid "Muskoka Falls" #~ msgstr "Muskoka Falls" #~ msgid "Nahanni Butte" #~ msgstr "Nahanni Butte" #~ msgid "Nain" #~ msgstr "Nain" #~ msgid "Nakusp" #~ msgstr "Nakusp" #~ msgid "Nanaimo" #~ msgstr "Nanaimo" #~ msgid "Nanoose Bay" #~ msgstr "Nanoose Bay" #~ msgid "Nanticoke" #~ msgstr "Nanticoke" #~ msgctxt "City in British Columbia, Canada" #~ msgid "Natal" #~ msgstr "Natal" #~ msgid "Natashquan" #~ msgstr "Natashquan" #~ msgid "Neddy Harbour" #~ msgstr "Neddy Harbour" #~ msgid "Nelson" #~ msgstr "Nelson" #~ msgid "New Carlisle" #~ msgstr "New Carlisle" #~ msgid "Nicolet" #~ msgstr "Nicolet" #~ msgid "Nipawin" #~ msgstr "Nipawin" #~ msgid "Norman Wells" #~ msgstr "Norman Wells" #~ msgid "Normandin" #~ msgstr "Normandin" #~ msgid "North Battleford" #~ msgstr "North Battleford" #~ msgid "North Bay" #~ msgstr "North Bay" #~ msgid "North Kamloops" #~ msgstr "North Kamloops" #~ msgid "Norway House" #~ msgstr "Norway House" #~ msgid "Notre-Dame-de-la-Salette" #~ msgstr "Notre-Dame-de-la-Salette" #~ msgid "Nouveau-Comptoir" #~ msgstr "Nouveau-Comptoir" #~ msgid "Nutak" #~ msgstr "Nutak" #~ msgid "Ocean Falls" #~ msgstr "Ocean Falls" #~ msgid "Old Crow" #~ msgstr "Old Crow" #~ msgid "Onefour" #~ msgstr "Onefour" #~ msgid "Osoyoos" #~ msgstr "Osoyoos" #~ msgid "Ottawa" #~ msgstr "Ottawa" #~ msgid "Pangnirtung" #~ msgstr "Pangnirtung" #~ msgid "Parent" #~ msgstr "Parent" #~ msgid "Paulatuk" #~ msgstr "Paulatuk" #~ msgid "Peace River" #~ msgstr "Peace rijeka" #~ msgid "Penticton" #~ msgstr "Penticton" #~ msgid "Petawawa" #~ msgstr "Petawawa" #~ msgid "Peterborough" #~ msgstr "Peterborough" #~ msgid "Petite-Rivière" #~ msgstr "Petite-Rivière" #~ msgid "Pilot Mound" #~ msgstr "Pilot Mound" #~ msgid "Pincher Creek" #~ msgstr "Pincher Creek" #~ msgid "Pitt Meadows" #~ msgstr "Pitt Meadows" #~ msgid "Pond Inlet" #~ msgstr "Pond Inlet" #~ msgid "Port Hardy" #~ msgstr "Port Hardy" #~ msgid "Port Simpson" #~ msgstr "Port Simpson" #~ msgid "Port Weller" #~ msgstr "Port Weller" #~ msgid "Port-Menier" #~ msgstr "Port-Menier" #~ msgid "Portneuf" #~ msgstr "Portneuf" #~ msgid "Poste-de-la-Baleine" #~ msgstr "Poste-de-la-Baleine" #~ msgid "Powell River" #~ msgstr "Powell rijeka" #~ msgid "Prince Albert" #~ msgstr "Prince Albert" #~ msgid "Prince George" #~ msgstr "Prince George" #~ msgid "Prince Rupert" #~ msgstr "Prince Rupert" #~ msgctxt "City in British Columbia, Canada" #~ msgid "Princeton" #~ msgstr "Princeton" #~ msgid "Puvirnituq" #~ msgstr "Puvirnituq" #~ msgid "Qikiqtarjuaq" #~ msgstr "Qikiqtarjuaq" #~ msgctxt "City in Quebec, Canada" #~ msgid "Quebec" #~ msgstr "Quebec" #~ msgid "Queen Charlotte" #~ msgstr "Queen Charlotte" #~ msgid "Quesnel" #~ msgstr "Quesnel" #~ msgid "Radisson" #~ msgstr "Radisson" #~ msgid "Rankin Inlet" #~ msgstr "Rankin Inlet" #~ msgid "Red Deer" #~ msgstr "Red Deer" #~ msgid "Red Lake" #~ msgstr "Red jezero" #~ msgid "Regina" #~ msgstr "Regina" #~ msgid "Repulse Bay" #~ msgstr "Repulse Bay" #~ msgid "Resolute" #~ msgstr "Resolute" #~ msgid "Revelstoke" #~ msgstr "Revelstoke" #~ msgid "Rivière-du-Loup" #~ msgstr "Rivière-du-Loup" #~ msgid "Rivière-la-Madeleine" #~ msgstr "Rivière-la-Madeleine" #~ msgid "Roberval" #~ msgstr "Roberval" #~ msgid "Rockglen" #~ msgstr "Rockglen" #~ msgid "Rocky Mountain House" #~ msgstr "Rocky Mountain House" #~ msgid "Rocky Point" #~ msgstr "Rocky Point" #~ msgid "Rosetown" #~ msgstr "Rosetown" #~ msgid "Rouyn" #~ msgstr "Rouyn" #~ msgid "Sachs Harbour" #~ msgstr "Sachs luka" #~ msgid "Saint Anthony" #~ msgstr "Saint Anthony" #~ msgid "Saint Catharines" #~ msgstr "Saint Catharines" #~ msgid "Saint John" #~ msgstr "Sveti Ivan" #~ msgctxt "City in Newfoundland and Labrador, Canada" #~ msgid "Saint John's" #~ msgstr "Saint John's" #~ msgid "Saint Leonard" #~ msgstr "Sveti Leonard" #~ msgid "Saint Stephen" #~ msgstr "Saint Stephen" #~ msgid "Saint-Anicet" #~ msgstr "Saint-Anicet" #~ msgid "Saint-Chrysostome" #~ msgstr "Saint-Chrysostome" #~ msgid "Saint-Fabien" #~ msgstr "Saint-Fabien" #~ msgid "Saint-François" #~ msgstr "Saint-François" #~ msgid "Saint-Henri-de-Taillon" #~ msgstr "Saint-Henri-de-Taillon" #~ msgid "Saint-Jean" #~ msgstr "Saint-Jean" #~ msgid "Saint-Joachim" #~ msgstr "Saint-Joachim" #~ msgid "Saint-Jovite" #~ msgstr "Saint-Jovite" #~ msgid "Sainte-Anne-de-la-Pocatière" #~ msgstr "Sainte-Anne-de-la-Pocatière" #~ msgid "Salmon Arm" #~ msgstr "Salmon Arm" #~ msgid "Sandspit" #~ msgstr "Sandspit" #~ msgid "Sarnia" #~ msgstr "Sarnia" #~ msgid "Saskatoon" #~ msgstr "Saskatoon" #~ msgid "Sault Sainte Marie" #~ msgstr "Sault Sainte Marie" #~ msgid "Schefferville" #~ msgstr "Schefferville" #~ msgid "Seebe" #~ msgstr "Seebe" #~ msgid "Senneville" #~ msgstr "Senneville" #~ msgid "Sept-Îles" #~ msgstr "Sept-Îles" #~ msgid "Shawinigan" #~ msgstr "Shawinigan" #~ msgid "Sheet Harbour" #~ msgstr "Sheet Harbour" #~ msgid "Sherbrooke" #~ msgstr "Sherbrooke" #~ msgid "Shingle Point" #~ msgstr "Shingle Point" #~ msgid "Sioux Lookout" #~ msgstr "Sioux vidikovac" #~ msgid "Slave Lake" #~ msgstr "Jezero Slave" #~ msgid "Smithers" #~ msgstr "Smithers" #~ msgid "Snag" #~ msgstr "Snag" #~ msgctxt "City in Saskatchewan, Canada" #~ msgid "Southend" #~ msgstr "Southend" #~ msgid "Spirit River" #~ msgstr "Spirit River" #~ msgid "Spiritwood" #~ msgstr "Spiritwood" #~ msgid "Squamish" #~ msgstr "Squamish" #~ msgid "Stephen" #~ msgstr "Stephen" #~ msgctxt "City in Newfoundland and Labrador, Canada" #~ msgid "Stephenville" #~ msgstr "Stephenville" #~ msgid "Steveston" #~ msgstr "Steveston" #~ msgid "Stewart" #~ msgstr "Stewart" #~ msgid "Stoneham" #~ msgstr "Stoneham" #~ msgid "Stony Rapids" #~ msgstr "Stony Rapids" #~ msgid "Sudbury" #~ msgstr "Sudbury" #~ msgid "Summerland" #~ msgstr "Summerland" #~ msgid "Summerside" #~ msgstr "Summerside" #~ msgid "Swan River" #~ msgstr "Rijeka Swan" #~ msgid "Swift Current" #~ msgstr "Swift Current" #~ msgctxt "City in Nova Scotia, Canada" #~ msgid "Sydney" #~ msgstr "Sydney" #~ msgid "Taloyoak" #~ msgstr "Taloyoak" #~ msgid "Terra Nova" #~ msgstr "Terra Nova" #~ msgid "Terrace" #~ msgstr "Terrace" #~ msgid "Teslin" #~ msgstr "Teslin" #~ msgid "The Pas" #~ msgstr "The Pas" #~ msgid "Thompson" #~ msgstr "Thompson" #~ msgid "Three Hills" #~ msgstr "Three Hills" #~ msgid "Thunder Bay" #~ msgstr "Thunder Bay" #~ msgid "Tignish" #~ msgstr "Tignish" #~ msgid "Timmins" #~ msgstr "Timmins" #~ msgid "Tobermory" #~ msgstr "Tobermory" #~ msgid "Tofino" #~ msgstr "Tofino" #~ msgid "Toronto" #~ msgstr "Toronto" #~ msgid "Tow Hill" #~ msgstr "Tow Hill" #~ msgctxt "City in Ontario, Canada" #~ msgid "Trenton" #~ msgstr "Trenton" #~ msgid "Trois-Rivières" #~ msgstr "Trois-Rivières" #~ msgid "Trout Lake" #~ msgstr "Jezero Trout" #~ msgid "Tuktoyaktuk" #~ msgstr "Tuktoyaktuk" #~ msgid "Tununuk" #~ msgstr "Tununuk" #~ msgid "Twillingate" #~ msgstr "Twillingate" #~ msgid "Upsala" #~ msgstr "Upsala" #~ msgid "Uranium City" #~ msgstr "Uranium City" #~ msgid "Val Marie" #~ msgstr "Val Marie" #~ msgid "Val-d'Or" #~ msgstr "Val-d'Or" #~ msgid "Valcartier Station" #~ msgstr "Valcartier Station" #~ msgctxt "City in British Columbia, Canada" #~ msgid "Vancouver" #~ msgstr "Vancouver" #~ msgid "Varennes" #~ msgstr "Varennes" #~ msgid "Vegreville" #~ msgstr "Vegreville" #~ msgctxt "City in British Columbia, Canada" #~ msgid "Vernon" #~ msgstr "Vernon" #~ msgctxt "City in British Columbia, Canada" #~ msgid "Victoria" #~ msgstr "Victoria" #~ msgid "Victoria Beach" #~ msgstr "Victoria Beach" #~ msgid "Wabush" #~ msgstr "Wabush" #~ msgctxt "City in Ontario, Canada" #~ msgid "Waterloo" #~ msgstr "Waterloo" #~ msgid "Watrous" #~ msgstr "Watrous" #~ msgid "Watson Lake" #~ msgstr "Jezero Watson" #~ msgid "Wawa" #~ msgstr "Wawa" #~ msgid "Westport" #~ msgstr "Westport" #~ msgid "Weyburn" #~ msgstr "Weyburn" #~ msgid "Wha Ti" #~ msgstr "Wha Ti" #~ msgid "White Rock" #~ msgstr "White Rock" #~ msgid "Whitecourt" #~ msgstr "Whitecourt" #~ msgid "Whitefish Falls" #~ msgstr "Whitefish Falls" #~ msgid "Whitehorse" #~ msgstr "Whitehorse" #~ msgid "Wiarton" #~ msgstr "Wiarton" #~ msgid "Williams Lake" #~ msgstr "Jezero Williams" #~ msgid "Windsor" #~ msgstr "Windsor" #~ msgid "Winnipeg" #~ msgstr "Winnipeg" #~ msgid "Winter Harbour" #~ msgstr "Winter Harbour" #~ msgid "Wynyard" #~ msgstr "Wynyard" #~ msgid "Yarmouth" #~ msgstr "Yarmouth" #~ msgid "Yellowknife" #~ msgstr "Yellowknife" #~ msgid "Yorkton" #~ msgstr "Yorkton" #~ msgid "Preguiça" #~ msgstr "Preguiça" #~ msgctxt "City in Cayman Islands" #~ msgid "George Town" #~ msgstr "George Town" #~ msgid "Knob Hill" #~ msgstr "Knob Hill" #~ msgid "Red Bay Estate" #~ msgstr "Red Bay Estate" #~ msgid "Bangassou" #~ msgstr "Bangassou" #~ msgid "Bangui" #~ msgstr "Bangui" #~ msgid "Berberati" #~ msgstr "Berberati" #~ msgid "Moundou" #~ msgstr "Moundou" #~ msgid "N'Djamena" #~ msgstr "N'Djamena" #~ msgid "Sarh" #~ msgstr "Sarh" #~ msgid "Antofagasta" #~ msgstr "Antofagasta" #~ msgid "Arica" #~ msgstr "Arika" #~ msgid "Balmaceda" #~ msgstr "Balmaceda" #~ msgctxt "City in Chile" #~ msgid "Concepción" #~ msgstr "Concepción" #~ msgid "Curico" #~ msgstr "Curico" #~ msgid "Hanga Roa" #~ msgstr "Hanga Roa" #~ msgid "Iquique" #~ msgstr "Iquique" #~ msgid "La Serena" #~ msgstr "La Serena" #~ msgid "Puerto Montt" #~ msgstr "Puerto Montt" #~ msgid "Punta Arenas" #~ msgstr "Punta Arenas" #~ msgid "Santa Teresa de Lo Ovalle" #~ msgstr "Santa Teresa de Lo Ovalle" #~ msgctxt "City in Chile" #~ msgid "Santiago" #~ msgstr "Santiago" #~ msgid "Temuco" #~ msgstr "Temuco" #~ msgctxt "City in Beijing, China" #~ msgid "Beijing" #~ msgstr "Peking" #~ msgid "Changchun" #~ msgstr "Changchun" #~ msgid "Changsha" #~ msgstr "Changsha" #~ msgid "Chengdu" #~ msgstr "Chengdu" #~ msgctxt "City in Chongqing, China" #~ msgid "Chongqing" #~ msgstr "Chongqing" #~ msgid "Dalian" #~ msgstr "Dalian" #~ msgid "Fuzhou" #~ msgstr "Fuzhou" #~ msgid "Guangzhou" #~ msgstr "Guangzhou" #~ msgid "Guilin" #~ msgstr "Guilin" #~ msgid "Hangzhou" #~ msgstr "Hangzhou" #~ msgid "Harbin" #~ msgstr "Harbin" #~ msgid "Hefei" #~ msgstr "Hefei" #~ msgid "Hohhot" #~ msgstr "Hohhot" #~ msgid "Jinan" #~ msgstr "Jinan" #~ msgid "Kashi" #~ msgstr "Kashi" #~ msgid "Kunming" #~ msgstr "Kunming" #~ msgid "Lanzhou" #~ msgstr "Lanzhou" #~ msgid "Nanjing" #~ msgstr "Nanjing" #~ msgid "Nanning" #~ msgstr "Nanning" #~ msgid "Qingdao" #~ msgstr "Qingdao" #~ msgid "Sanya" #~ msgstr "Sanya" #~ msgctxt "City in Shanghai, China" #~ msgid "Shanghai" #~ msgstr "Šangaj" #~ msgid "Shantou" #~ msgstr "Shantou" #~ msgid "Shenyang" #~ msgstr "Shenyang" #~ msgid "Shenzhen" #~ msgstr "Shenzhen" #~ msgid "Taiyuan" #~ msgstr "Taiyuan" #~ msgctxt "City in Tianjin, China" #~ msgid "Tianjin" #~ msgstr "Tianjin" #~ msgid "Urumqi" #~ msgstr "Urumqi" #~ msgid "Wuhan" #~ msgstr "Wuhan" #~ msgid "Xi'an" #~ msgstr "Xi'an" #~ msgid "Xiamen" #~ msgstr "Xiamen" #~ msgid "Zhengzhou" #~ msgstr "Zhengzhou" #~ msgid "Drumsite" #~ msgstr "Drumsite" #~ msgid "Flying Fish Cove" #~ msgstr "Flying Fish Cove" #~ msgid "Bantam Village" #~ msgstr "Bantam Village" #~ msgid "Barranquilla" #~ msgstr "Barranquilla" #~ msgid "Bogotá" #~ msgstr "Bogotá" #~ msgid "Bucaramanga" #~ msgstr "Bucaramanga" #~ msgid "Cali" #~ msgstr "Cali" #~ msgid "Cartagena" #~ msgstr "Cartagena" #~ msgid "Cúcuta" #~ msgstr "Cúcuta" #~ msgid "Ibagué" #~ msgstr "Ibagué" #~ msgid "Ipiales" #~ msgstr "Ipiales" #~ msgid "Leticia" #~ msgstr "Leticia" #~ msgid "Medellín" #~ msgstr "Medellín" #~ msgid "Monteria" #~ msgstr "Monteria" #~ msgid "Pasto" #~ msgstr "Pasto" #~ msgid "Pereira" #~ msgstr "Pereira" #~ msgid "Popayán" #~ msgstr "Popayán" #~ msgid "Quibdó" #~ msgstr "Quibdó" #~ msgid "Riohacha" #~ msgstr "Riohacha" #~ msgid "Rionegro" #~ msgstr "Rionegro" #~ msgid "San Andrés" #~ msgstr "San Andrés" #~ msgid "Santa Marta" #~ msgstr "Santa Marta" #~ msgid "Villavicencio" #~ msgstr "Villavicencio" #~ msgid "Mbaléni" #~ msgstr "Mbaléni" #~ msgid "Moroni" #~ msgstr "Moroni" #~ msgid "Kinshasa" #~ msgstr "Kinshasa" #~ msgid "Brazzaville" #~ msgstr "Brazzaville" #~ msgid "Pointe-Noire" #~ msgstr "Pointe - Noire" #~ msgid "Avarua" #~ msgstr "Avarua" #~ msgid "Alajuela" #~ msgstr "Alajuela" #~ msgctxt "City in Costa Rica" #~ msgid "Liberia" #~ msgstr "Liberia" #~ msgid "Mata de Palo" #~ msgstr "Mata de Palo" #~ msgid "Puerto Limón" #~ msgstr "Puerto Limón" #~ msgid "San José" #~ msgstr "San José" #~ msgid "Bol" #~ msgstr "Bol" #~ msgid "Dubrovnik" #~ msgstr "Dubrovnik" #~ msgid "Jelovice" #~ msgstr "Jelovice" #~ msgid "Liška" #~ msgstr "Liška" #~ msgid "Osijek" #~ msgstr "Osijek" #~ msgid "Rijeka" #~ msgstr "Rijeka" #~ msgid "Split" #~ msgstr "Split" #~ msgid "Zadar" #~ msgstr "Zadar" #~ msgid "Zagreb" #~ msgstr "Zagreb" #~ msgid "Camagüey" #~ msgstr "Camagüey" #~ msgid "Cienfuegos" #~ msgstr "Cienfuegos" #~ msgid "Guantánamo" #~ msgstr "Guantánamo" #~ msgid "Havana" #~ msgstr "Havana" #~ msgid "Holguín" #~ msgstr "Holguín" #~ msgctxt "City in Cuba" #~ msgid "Manzanillo" #~ msgstr "Manzanillo" #~ msgid "Matanzas" #~ msgstr "Matanzas" #~ msgid "Santiago de Cuba" #~ msgstr "Santiago de Cuba" #~ msgid "Akrotiri" #~ msgstr "Akrotiri" #~ msgid "Larnaca" #~ msgstr "Larnaka" #~ msgid "Nicosia" #~ msgstr "Nikozija" #~ msgid "Paphos" #~ msgstr "Paphos" #~ msgid "Tymbou" #~ msgstr "Tymbou" #~ msgid "Brno" #~ msgstr "Brno" #~ msgid "Holešov" #~ msgstr "Holešov" #~ msgid "Karlovy Vary" #~ msgstr "Karlovy Vary" #~ msgid "Liberec" #~ msgstr "Liberec" #~ msgid "Ostrava" #~ msgstr "Ostrava" #~ msgid "Prague" #~ msgstr "Prag" #~ msgid "Abidjan" #~ msgstr "Abidjan" #~ msgid "Billund" #~ msgstr "Billund" #~ msgid "Copenhagen" #~ msgstr "Copenhagen" #~ msgid "Esbjerg" #~ msgstr "Esbjerg" #~ msgid "Karup" #~ msgstr "Karup" #~ msgid "Kastrup" #~ msgstr "Kastrup" #~ msgid "Mejlby" #~ msgstr "Mejlby" #~ msgid "Odense" #~ msgstr "Odense" #~ msgid "Roskilde" #~ msgstr "Roskilde" #~ msgid "Rønne" #~ msgstr "Rønne" #~ msgid "Skrydstrup" #~ msgstr "Skrydstrup" #~ msgid "Sottrupskov" #~ msgstr "Sottrupskov" #~ msgid "Tirstrup" #~ msgstr "Tirstrup" #~ msgid "Vamdrup" #~ msgstr "Vamdrup" #~ msgid "Ålborg" #~ msgstr "Ålborg" #~ msgctxt "City in Djibouti" #~ msgid "Djibouti" #~ msgstr "Džibuti" #~ msgid "Marigot" #~ msgstr "Marigot" #~ msgctxt "City in Dominica" #~ msgid "Roseau" #~ msgstr "Roseau" #~ msgid "Saint Joseph" #~ msgstr "Saint Joseph" #~ msgid "Barahona" #~ msgstr "Barahona" #~ msgid "La Romana" #~ msgstr "La Romana" #~ msgid "Mancha Nueva" #~ msgstr "Mancha Nueva" #~ msgid "Pantanal" #~ msgstr "Pantanal" #~ msgid "Puerto Plata" #~ msgstr "Puerto Plata" #~ msgctxt "City in Dominican Republic" #~ msgid "Santiago" #~ msgstr "Santiago" #~ msgid "Santo Domingo" #~ msgstr "Santo Domingo" #~ msgid "Guayaquil" #~ msgstr "Guayaquil" #~ msgid "Latacunga" #~ msgstr "Latacunga" #~ msgid "Manta" #~ msgstr "Manta" #~ msgid "Quito" #~ msgstr "Quito" #~ msgid "Al 'Arish" #~ msgstr "Al 'Arish" #~ msgid "Al Ghardaqah" #~ msgstr "Al Ghardaqah" #~ msgid "Al Qabuti" #~ msgstr "Al Qabuti" #~ msgctxt "City in Egypt" #~ msgid "Alexandria" #~ msgstr "Aleksandrija" #~ msgid "Aswan" #~ msgstr "Aswan" #~ msgid "Asyut" #~ msgstr "Asyut" #~ msgctxt "City in Egypt" #~ msgid "Cairo" #~ msgstr "Kairo" #~ msgid "Luxor" #~ msgstr "Luxor" #~ msgid "Marsa Matruh" #~ msgstr "Marsa Matruh" #~ msgid "Sharm ash Shaykh" #~ msgstr "Sharm ash Shaykh" #~ msgid "Taba" #~ msgstr "Taba" #~ msgid "Comalapa" #~ msgstr "Comalapa" #~ msgid "Ilopango" #~ msgstr "Ilopango" #~ msgid "San Salvador" #~ msgstr "San Salvador" #~ msgid "Malabo" #~ msgstr "Malabo" #~ msgid "Kuressaare" #~ msgstr "Kuressaare" #~ msgid "Kärdla" #~ msgstr "Kärdla" #~ msgid "Pärnu" #~ msgstr "Pärnu" #~ msgid "Tallinn" #~ msgstr "Tallinn" #~ msgid "Tartu" #~ msgstr "Tartu" #~ msgctxt "City in Falkland Islands (Malvinas)" #~ msgid "Stanley" #~ msgstr "Stanley" #~ msgid "Sørvágur" #~ msgstr "Sørvágur" #~ msgid "Tórshavn" #~ msgstr "Tórshavn" #~ msgid "Suva" #~ msgstr "Suva" #~ msgid "Enontekiö" #~ msgstr "Enontekiö" #~ msgid "Halli" #~ msgstr "Halli" #~ msgid "Helsinki" #~ msgstr "Helsinki" #~ msgid "Ivalo" #~ msgstr "Ivalo" #~ msgid "Joensuu" #~ msgstr "Joensuu" #~ msgid "Jyväskylä" #~ msgstr "Jyväskylä" #~ msgid "Kajaani" #~ msgstr "Kajaani" #~ msgid "Kauhava" #~ msgstr "Kauhava" #~ msgid "Kemi" #~ msgstr "Kemi" #~ msgid "Kittilä" #~ msgstr "Kittilä" #~ msgid "Kruunupyy" #~ msgstr "Kruunupyy" #~ msgid "Kuopio" #~ msgstr "Kuopio" #~ msgid "Kuusamo" #~ msgstr "Kuusamo" #~ msgid "Lappeenranta" #~ msgstr "Lappeenranta" #~ msgid "Mikkeli" #~ msgstr "Mikkeli" #~ msgid "Oulu" #~ msgstr "Oulu" #~ msgid "Pori" #~ msgstr "Pori" #~ msgid "Rovaniemi" #~ msgstr "Rovaniemi" #~ msgid "Savonlinna" #~ msgstr "Savonlinna" #~ msgid "Seinäjoki" #~ msgstr "Seinäjoki" #~ msgid "Tampere" #~ msgstr "Tampere" #~ msgid "Turku" #~ msgstr "Turku" #~ msgid "Utti" #~ msgstr "Utti" #~ msgid "Vaasa" #~ msgstr "Vaasa" #~ msgid "Vantaa" #~ msgstr "Vantaa" #~ msgid "Varkaus" #~ msgstr "Varkaus" #~ msgid "Agen" #~ msgstr "Agen" #~ msgid "Ajaccio" #~ msgstr "Ajaccio" #~ msgid "Alençon" #~ msgstr "Alençon" #~ msgid "Amiens" #~ msgstr "Amiens" #~ msgid "Auch" #~ msgstr "Auch" #~ msgid "Aurillac" #~ msgstr "Aurillac" #~ msgid "Bastia" #~ msgstr "Bastia" #~ msgid "Beauvais" #~ msgstr "Beauvais" #~ msgid "Bergerac" #~ msgstr "Bergerac" #~ msgid "Biarritz" #~ msgstr "Biarritz" #~ msgctxt "City in France" #~ msgid "Bordeaux" #~ msgstr "Bordeaux" #~ msgid "Bourg-en-Bresse" #~ msgstr "Bourges-en-Bresse" #~ msgid "Bourges" #~ msgstr "Bourges" #~ msgctxt "City in France" #~ msgid "Brest" #~ msgstr "Brest" #~ msgid "Brive" #~ msgstr "Brive" #~ msgid "Béziers" #~ msgstr "Béziers" #~ msgid "Caen" #~ msgstr "Caen" #~ msgid "Calvi" #~ msgstr "Calvi" #~ msgid "Cambrai" #~ msgstr "Cambrai" #~ msgid "Cannes" #~ msgstr "Cannes" #~ msgid "Carcassonne" #~ msgstr "Carcassonne" #~ msgid "Chambéry" #~ msgstr "Chambéry" #~ msgid "Chartres" #~ msgstr "Chartres" #~ msgid "Cherbourg" #~ msgstr "Cherbourg" #~ msgid "Châteauroux" #~ msgstr "Châteauroux" #~ msgid "Clermont-Ferrand" #~ msgstr "Clermont-Ferrand" #~ msgid "Cognac" #~ msgstr "Konjak" #~ msgid "Colmar" #~ msgstr "Colmar" #~ msgid "Dax" #~ msgstr "Dax" #~ msgid "Dijon" #~ msgstr "Dijon" #~ msgid "Dinard" #~ msgstr "Dinard" #~ msgid "Dole" #~ msgstr "Dole" #~ msgid "Dollemard" #~ msgstr "Dollemard" #~ msgid "Grenoble" #~ msgstr "Grenoble" #~ msgid "Hoëricourt" #~ msgstr "Hoëricourt" #~ msgid "Hyères" #~ msgstr "Hyères" #~ msgid "Istres" #~ msgstr "Istres" #~ msgid "La Roche-sur-Yon" #~ msgstr "La Roche-sur-Yon" #~ msgid "La Rochelle" #~ msgstr "La Rochelle" #~ msgid "Lannion" #~ msgstr "Lannion" #~ msgid "Le Mans" #~ msgstr "Le Mans" #~ msgid "Le Puy" #~ msgstr "Le Puy" #~ msgid "Lille" #~ msgstr "Lille" #~ msgid "Limoges" #~ msgstr "Limoges" #~ msgid "Luxeuil-les-Bains" #~ msgstr "Luxeuil-les-Bains" #~ msgid "Lyon" #~ msgstr "Lyon" #~ msgid "Marseille" #~ msgstr "Marseille" #~ msgid "Melun" #~ msgstr "Melun" #~ msgid "Metz" #~ msgstr "Metz" #~ msgid "Mont-de-Marsan" #~ msgstr "Mont-de-Marsan" #~ msgid "Montgauch" #~ msgstr "Montgauch" #~ msgid "Montpellier" #~ msgstr "Montpellier" #~ msgid "Montélimar" #~ msgstr "Montélimar" #~ msgid "Mulhouse" #~ msgstr "Mulhouse" #~ msgid "Mâcon" #~ msgstr "Mâcon" #~ msgid "Méné Guen" #~ msgstr "Méné Guen" #~ msgid "Nancy" #~ msgstr "Nancy" #~ msgid "Nantes" #~ msgstr "Nantes" #~ msgid "Nevers" #~ msgstr "Nevers" #~ msgid "Nice" #~ msgstr "Nice" #~ msgid "Nîmes" #~ msgstr "Nîmes" #~ msgctxt "City in France" #~ msgid "Orange" #~ msgstr "Orange" #~ msgid "Orléans" #~ msgstr "Orléans" #~ msgctxt "City in France" #~ msgid "Paris" #~ msgstr "Pariz" #~ msgid "Pau" #~ msgstr "Pau" #~ msgid "Perpignan" #~ msgstr "Perpignan" #~ msgid "Poggiale" #~ msgstr "Poggiale" #~ msgid "Poitiers" #~ msgstr "Poitiers" #~ msgid "Quimper" #~ msgstr "Quimper" #~ msgid "Reims" #~ msgstr "Reims" #~ msgid "Rennes" #~ msgstr "Rennes" #~ msgid "Rodez" #~ msgstr "Rodez" #~ msgid "Romorantin" #~ msgstr "Romorantin" #~ msgid "Rouen" #~ msgstr "Rouen" #~ msgid "Saint-Brieuc" #~ msgstr "Saint - Brieuc" #~ msgid "Saint-Quentin" #~ msgstr "Sveti Quentin" #~ msgid "Saint-Yan" #~ msgstr "Sveti Yan" #~ msgid "Salon" #~ msgstr "Salon" #~ msgid "Strasbourg" #~ msgstr "Strasbourg" #~ msgid "Tarbes" #~ msgstr "Tarbes" #~ msgid "Toulouse" #~ msgstr "Toulouse" #~ msgid "Tours" #~ msgstr "Tours" #~ msgid "Trignac" #~ msgstr "Trignac" #~ msgid "Troyes" #~ msgstr "Troyes" #~ msgid "Veauche" #~ msgstr "Veauche" #~ msgctxt "City in France" #~ msgid "Vichy" #~ msgstr "Vichy" #~ msgid "Vélizy" #~ msgstr "Vélizy" #~ msgid "Évreux" #~ msgstr "Évreux" #~ msgid "Cayenne" #~ msgstr "Cayenne" #~ msgid "Papeete" #~ msgstr "Papeete" #~ msgid "Franceville" #~ msgstr "Franceville" #~ msgid "Libreville" #~ msgstr "Libreville" #~ msgid "Port-Gentil" #~ msgstr "Port - Gentil" #~ msgid "Banjul" #~ msgstr "Banjul" #~ msgid "Achum" #~ msgstr "Achum" #~ msgid "Altenburg" #~ msgstr "Altenburg" #~ msgid "Augsburg" #~ msgstr "Augsburg" #~ msgid "Baal" #~ msgstr "Baal" #~ msgctxt "City in Berlin, Germany" #~ msgid "Berlin" #~ msgstr "Berlin" #~ msgid "Bindersleben" #~ msgstr "Bindersleben" #~ msgid "Bonn" #~ msgstr "Bonn" #~ msgid "Braunschweig" #~ msgstr "Braunschweig" #~ msgid "Bredeck" #~ msgstr "Bredeck" #~ msgctxt "City in Bremen, Germany" #~ msgid "Bremen" #~ msgstr "Bremen" #~ msgid "Büchel" #~ msgstr "Büchel" #~ msgid "Celle" #~ msgstr "Celle" #~ msgid "Donaueschingen" #~ msgstr "Donaueschingen" #~ msgid "Dorfgmünd" #~ msgstr "Dorfgmünd" #~ msgid "Dortmund" #~ msgstr "Dortmund" #~ msgid "Dresden" #~ msgstr "Dresden" #~ msgid "Faßberg" #~ msgstr "Faßberg" #~ msgid "Frankfurt" #~ msgstr "Frankfurt" #~ msgid "Friedrichshafen" #~ msgstr "Friedrichshafen" #~ msgid "Fritzlar" #~ msgstr "Fritzlar" #~ msgid "Geilenkirchen" #~ msgstr "Geilenkirchen" #~ msgid "Hahn" #~ msgstr "Hahn" #~ msgctxt "City in Hamburg, Germany" #~ msgid "Hamburg" #~ msgstr "Hamburg" #~ msgid "Hannover" #~ msgstr "Hannover" #~ msgid "Hof" #~ msgstr "Hof" #~ msgid "Hohn" #~ msgstr "Hohn" #~ msgid "Holzdorf" #~ msgstr "Holzdorf" #~ msgid "Illesheim" #~ msgstr "Illesheim" #~ msgid "Kalkar" #~ msgstr "Kalkar" #~ msgid "Kalkum" #~ msgstr "Kalkum" #~ msgid "Karlsruhe" #~ msgstr "Karlsruhe" #~ msgid "Kassel" #~ msgstr "Kassel" #~ msgid "Katterbach" #~ msgstr "Katterbach" #~ msgid "Kiel" #~ msgstr "Kiel" #~ msgid "Klemenshof" #~ msgstr "Klemenshof" #~ msgid "Laage" #~ msgstr "Laage" #~ msgid "Lager Lechfeld" #~ msgstr "Lager Lechfeld" #~ msgid "Lahr" #~ msgstr "Lahr" #~ msgid "Landsberg" #~ msgstr "Landsberg" #~ msgid "Laupheim" #~ msgstr "Laupheim" #~ msgid "Leipzig" #~ msgstr "Leipzig" #~ msgid "Liebenscheid" #~ msgstr "Liebenscheid" #~ msgid "Memmingen" #~ msgstr "Memmingen" #~ msgid "Meßstetten" #~ msgstr "Meßstetten" #~ msgid "Munich" #~ msgstr "Munich" #~ msgid "Mönchengladbach" #~ msgstr "Mönchengladbach" #~ msgid "Münster" #~ msgstr "Münster" #~ msgid "Neuburg an der Donau" #~ msgstr "Neuburg na Dunavu" #~ msgid "Neuostheim" #~ msgstr "Neuostheim" #~ msgid "Niederstetten" #~ msgstr "Niederstetten" #~ msgid "Nordholz" #~ msgstr "Nordholz" #~ msgid "Nuremberg" #~ msgstr "Nuremberg" #~ msgid "Oberpfaffenhofen" #~ msgstr "Oberpfaffenhofen" #~ msgid "Paderborn" #~ msgstr "Paderborn" #~ msgid "Parchim" #~ msgstr "Parchim" #~ msgid "Ramstein" #~ msgstr "Ramstein" #~ msgid "Rheine" #~ msgstr "Rheine" #~ msgid "Roth" #~ msgstr "Roth" #~ msgid "Saarbrücken" #~ msgstr "Saarbrücken" #~ msgid "Schleswig" #~ msgstr "Schleswig" #~ msgid "Seebad Heringsdorf" #~ msgstr "Seebad Heringsdorf" #~ msgid "Spangdahlem" #~ msgstr "Spangdahlem" #~ msgctxt "City in Baden-Württemberg, Germany" #~ msgid "Stuttgart" #~ msgstr "Stuttgart" #~ msgid "Trollenhagen" #~ msgstr "Trollenhagen" #~ msgid "Ulstrupfeld" #~ msgstr "Ulstrupfeld" #~ msgid "Vorrade" #~ msgstr "Vorrade" #~ msgid "Webershausen" #~ msgstr "Webershausen" #~ msgid "Westerland" #~ msgstr "Westerland" #~ msgid "Wiesbaden" #~ msgstr "Wiesbaden" #~ msgid "Wunstorf" #~ msgstr "Wunstorf" #~ msgid "Würzburg" #~ msgstr "Würzburg" #~ msgid "Zweibrücken" #~ msgstr "Zweibrücken" #~ msgid "Accra" #~ msgstr "Accra" #~ msgctxt "City in Gibraltar" #~ msgid "Gibraltar" #~ msgstr "Gibraltar" #~ msgid "Alexandroúpolis" #~ msgstr "Alexandroúpolis" #~ msgid "Andravída" #~ msgstr "Andravída" #~ msgid "Argostólion" #~ msgstr "Argostólion" #~ msgctxt "City in Greece" #~ msgid "Athens" #~ msgstr "Atena" #~ msgid "Chrysoúpolis" #~ msgstr "Chrysoúpolis" #~ msgid "Chíos" #~ msgstr "Chíos" #~ msgid "Elefsís" #~ msgstr "Elefsís" #~ msgid "Irákleion" #~ msgstr "Irákleion" #~ msgid "Kalamáta" #~ msgstr "Kalamáta" #~ msgid "Karpásion" #~ msgstr "Karpásion" #~ msgid "Katomérion" #~ msgstr "Katomérion" #~ msgid "Kos" #~ msgstr "Kos" #~ msgid "Kozáni" #~ msgstr "Kozáni" #~ msgid "Kárpathos" #~ msgstr "Kárpathos" #~ msgid "Kérkyra" #~ msgstr "Kérkyra" #~ msgid "Kýthira" #~ msgstr "Kýthira" #~ msgid "Lárisa" #~ msgstr "Lárisa" #~ msgid "Monólithos" #~ msgstr "Monólithos" #~ msgid "Mytilíni" #~ msgstr "Mytilíni" #~ msgid "Mýkonos" #~ msgstr "Mýkonos" #~ msgid "Náxos" #~ msgstr "Náksos" #~ msgid "Paradeísion" #~ msgstr "Paradeísion" #~ msgid "Páros" #~ msgstr "Páros" #~ msgid "Skíathos" #~ msgstr "Skíathos" #~ msgid "Soúda" #~ msgstr "Soúda" #~ msgid "Sámos" #~ msgstr "Sámos" #~ msgid "Tanágra" #~ msgstr "Tanágra" #~ msgid "Thessaloníki" #~ msgstr "Thessaloníki" #~ msgid "Zákynthos" #~ msgstr "Zákynthos" #~ msgid "Áno Síros" #~ msgstr "Áno Síros" #~ msgid "Áraxos" #~ msgstr "Áraksos" #~ msgid "Áyios Athanásios" #~ msgstr "Áyios Athanásios" #~ msgid "Dundas" #~ msgstr "Dundas" #~ msgid "Godthåb" #~ msgstr "Nuuk" #~ msgid "Ittorisseq" #~ msgstr "Ittorisseq" #~ msgid "Jakobshavn" #~ msgstr "Jakobshavn" #~ msgid "Kulusuk" #~ msgstr "Kulusuk" #~ msgid "Narsarsuaq" #~ msgstr "Narsarsuaq" #~ msgid "Søndre Strømfjord" #~ msgstr "Søndre Strømfjord" #~ msgid "Bamboo" #~ msgstr "Bamboo" #~ msgid "Saint George's" #~ msgstr "Saint George's" #~ msgid "Basse-Terre" #~ msgstr "Basse-Terre" #~ msgid "Les Abymes" #~ msgstr "Les Abymes" #~ msgid "Asatdas" #~ msgstr "Asatdas" #~ msgid "Hagåtña" #~ msgstr "Hagåtña" #~ msgctxt "City in Guatemala" #~ msgid "Guatemala" #~ msgstr "Gvatemala" #~ msgid "Huehuetenango" #~ msgstr "Huehuetenango" #~ msgid "Puerto Barrios" #~ msgstr "Puerto Barrios" #~ msgid "Puerto San José" #~ msgstr "Puerto San José" #~ msgid "Retalhuleu" #~ msgstr "Retalhuleu" #~ msgid "Tikal" #~ msgstr "Tikal" #~ msgid "Hautnez" #~ msgstr "Hautnez" #~ msgid "Saint Peter Port" #~ msgstr "Saint Peter Port" #~ msgid "Conakry" #~ msgstr "Conakry" #~ msgctxt "City in Guyana" #~ msgid "Georgetown" #~ msgstr "Georgetown" #~ msgid "Port-au-Prince" #~ msgstr "Port-au-Prince" #~ msgid "Amapala" #~ msgstr "Amapala" #~ msgid "Catacamas" #~ msgstr "Catacamas" #~ msgid "Ciudad Choluteca" #~ msgstr "Ciudad Choluteca" #~ msgid "Comayagua" #~ msgstr "Comayagua" #~ msgid "Guanaja" #~ msgstr "Guanaja" #~ msgid "La Ceiba" #~ msgstr "La Ceiba" #~ msgid "La Esperanza" #~ msgstr "La Esperanza" #~ msgid "La Mesa" #~ msgstr "La Mesa" #~ msgid "Puerto Lempira" #~ msgstr "Puerto Lempira" #~ msgid "Roatán" #~ msgstr "Roatán" #~ msgid "Santa Rosa de Copán" #~ msgstr "Santa Rosa de Copán" #~ msgid "Tegucigalpa" #~ msgstr "Tegucigalpa" #~ msgid "Tela" #~ msgstr "Tela" #~ msgid "Yoro" #~ msgstr "Yoro" #~ msgid "Budapest" #~ msgstr "Budimpešta" #~ msgid "Debrecen" #~ msgstr "Debrecen" #~ msgid "Győr" #~ msgstr "Győr" #~ msgid "Kecskemét" #~ msgstr "Kecskemét" #~ msgid "Pápa" #~ msgstr "Pápa" #~ msgid "Pécs" #~ msgstr "Pečuh" #~ msgid "Szeged" #~ msgstr "Szeged" #~ msgid "Szolnok" #~ msgstr "Szolnok" #~ msgid "Akureyri" #~ msgstr "Akureyri" #~ msgid "Eiðar" #~ msgstr "Eiðar" #~ msgid "Reykjavík" #~ msgstr "Reykjavík" #~ msgid "Ytri-Njarðvík" #~ msgstr "Ytri-Njarðvík" #~ msgid "Agartala" #~ msgstr "Agartala" #~ msgid "Agra" #~ msgstr "Agra" #~ msgid "Ahmadabad" #~ msgstr "Ahmadabad" #~ msgid "Allahabad" #~ msgstr "Allahabad" #~ msgid "Amritsar" #~ msgstr "Amritsar" #~ msgid "Aurangabad" #~ msgstr "Aurangabad" #~ msgid "Bagdogra" #~ msgstr "Bagdogra" #~ msgid "Bangalore" #~ msgstr "Bangalore" #~ msgid "Benares" #~ msgstr "Benares" #~ msgid "Bhavnagar" #~ msgstr "Bhavnagar" #~ msgid "Bhopal" #~ msgstr "Bopal" #~ msgid "Bhubaneshwar" #~ msgstr "Bhubaneshwar" #~ msgid "Bhuj" #~ msgstr "Bhuj" #~ msgid "Car Nicobar" #~ msgstr "Car Nicobar" #~ msgid "Chandigarh" #~ msgstr "Chandigarh" #~ msgid "Chennai" #~ msgstr "Chennai" #~ msgid "Coimbatore" #~ msgstr "Coimbatore" #~ msgid "Dehradun" #~ msgstr "Dehradun" #~ msgid "Dibrugarh" #~ msgstr "Dibrugarh" #~ msgid "Dimapur" #~ msgstr "Dimapur" #~ msgid "Hyderabad" #~ msgstr "Hyderabad" #~ msgid "Jaipur" #~ msgstr "Jaipur" #~ msgid "Jammu" #~ msgstr "Jammu" #~ msgid "Kochi" #~ msgstr "Kochi" #~ msgid "Kolkata" #~ msgstr "Kalkuta" #~ msgid "Leh" #~ msgstr "Leh" #~ msgid "Lucknow" #~ msgstr "Lucknow" #~ msgid "Mumbai" #~ msgstr "Mumbai" #~ msgid "Nagpur" #~ msgstr "Nagpur" #~ msgid "New Delhi" #~ msgstr "New Delhi" #~ msgid "Patna" #~ msgstr "Patna" #~ msgid "Port Blair" #~ msgstr "Port Hardy" #~ msgid "Pune" #~ msgstr "Pune" #~ msgid "Shimla" #~ msgstr "Shimla" #~ msgid "Srinagar" #~ msgstr "Srinagar" #~ msgid "Thiruvananthapuram" #~ msgstr "Thiruvananthapuram" #~ msgid "Tiruchchirappalli" #~ msgstr "Tiruchchirappalli" #~ msgid "Tirupati" #~ msgstr "Tirupati" #~ msgid "Vijayawada" #~ msgstr "Vijayawada" #~ msgid "Visakhapatnam" #~ msgstr "Visakhapatnam" #~ msgid "Jakarta" #~ msgstr "Jakarta" #~ msgid "Makassar" #~ msgstr "Makassar" #~ msgid "Medan" #~ msgstr "Medan" #~ msgid "Palembang" #~ msgstr "Palembang" #~ msgid "Pekanbaru" #~ msgstr "Pekanbaru" #~ msgid "Abadan" #~ msgstr "Abadan" #~ msgid "Abadeh" #~ msgstr "Abadeh" #~ msgid "Abū Mūsā" #~ msgstr "Abū Mūsā" #~ msgid "Aghajari" #~ msgstr "Aghajari" #~ msgid "Ahvaz" #~ msgstr "Ahvaz" #~ msgid "Ardabil" #~ msgstr "Ardabil" #~ msgid "Bandar 'Abbas" #~ msgstr "Bandar 'Abbas" #~ msgid "Bandar-e Bushehr" #~ msgstr "Bandar-e Bushehr" #~ msgid "Bandar-e Lengeh" #~ msgstr "Bandar-e Lengeh" #~ msgid "Bandar-e Mahshahr" #~ msgstr "Bandar-e Mahshahr" #~ msgid "Birjand" #~ msgstr "Birjand" #~ msgid "Chah Bahar" #~ msgstr "Chah Bahar" #~ msgid "Dayrestan" #~ msgstr "Dayrestan" #~ msgid "Do Gonbadan" #~ msgstr "Do Gonbadan" #~ msgid "Esfahan" #~ msgstr "Esfahan" #~ msgid "Fasa" #~ msgstr "Fasa" #~ msgid "Gorgan" #~ msgstr "Gorgan" #~ msgid "Gusheh Shahzadeh Qasem" #~ msgstr "Gusheh Shahzadeh Qasem" #~ msgid "Hamadan" #~ msgstr "Hamadan" #~ msgid "Ilam" #~ msgstr "Ilam" #~ msgid "Iranshahr" #~ msgstr "Iranshahr" #~ msgid "Karaj" #~ msgstr "Karaj" #~ msgid "Kashan" #~ msgstr "Kashan" #~ msgid "Kerman" #~ msgstr "Kerman" #~ msgid "Kermanshah" #~ msgstr "Kermanshah" #~ msgid "Khorramabad" #~ msgstr "Khorramabad" #~ msgid "Kish" #~ msgstr "Kish" #~ msgid "Lar" #~ msgstr "Lar" #~ msgid "Mashhad" #~ msgstr "Mashhad" #~ msgid "Masjed Soleyman" #~ msgstr "Masjed Soleyman" #~ msgid "Now Shahr" #~ msgstr "Now Shahr" #~ msgid "Orumiyeh" #~ msgstr "Orumiyeh" #~ msgid "Qazvin" #~ msgstr "Qazvin" #~ msgid "Rasht" #~ msgstr "Rasht" #~ msgid "Sabzevar" #~ msgstr "Sabzevar" #~ msgid "Sakht Sar" #~ msgstr "Sakht Sar" #~ msgid "Sanandaj" #~ msgstr "Sanandaj" #~ msgid "Sarakhs" #~ msgstr "Sarakhs" #~ msgid "Semnan" #~ msgstr "Semnan" #~ msgid "Shahr-e Bala" #~ msgstr "Shahr-e Bala" #~ msgid "Shahr-e Kord" #~ msgstr "Shahr-e Kord" #~ msgid "Shiraz" #~ msgstr "Shiraz" #~ msgid "Tabas" #~ msgstr "Tabas" #~ msgid "Tabriz" #~ msgstr "Tabriz" #~ msgid "Tehran" #~ msgstr "Teheran" #~ msgid "Yazd" #~ msgstr "Yazd" #~ msgid "Zabol" #~ msgstr "Zabol" #~ msgid "Zahedan-e (Yek)" #~ msgstr "Zahedan-e (Yek)" #~ msgid "Athlone" #~ msgstr "Athlone" #~ msgid "Bray" #~ msgstr "Bray" #~ msgid "Carlow" #~ msgstr "Carlow" #~ msgid "Carrick on Shannon" #~ msgstr "Carrick on Shannon" #~ msgid "Castlebar" #~ msgstr "Castlebar" #~ msgid "Cavan" #~ msgstr "Cavan" #~ msgid "Clonmel" #~ msgstr "Clonmel" #~ msgid "Cork" #~ msgstr "Cork" #~ msgid "Drogheda" #~ msgstr "Drogheda" #~ msgid "Dublin" #~ msgstr "Dublin" #~ msgid "Dundalk" #~ msgstr "Dundalk" #~ msgid "Ennis" #~ msgstr "Ennis" #~ msgid "Galway" #~ msgstr "Galway" #~ msgid "Kilkenny" #~ msgstr "Kilkenny" #~ msgid "Lifford" #~ msgstr "Lifford" #~ msgid "Limerick" #~ msgstr "Limerick" #~ msgid "Longford" #~ msgstr "Longford" #~ msgid "Mullingar" #~ msgstr "Mullingar" #~ msgid "Naas" #~ msgstr "Naas" #~ msgid "Navan" #~ msgstr "Navan" #~ msgid "Nenagh" #~ msgstr "Nenagh" #~ msgid "Newbridge" #~ msgstr "Newbridge" #~ msgid "Portlaoise" #~ msgstr "Portlaoise" #~ msgid "Roscommon" #~ msgstr "Roscommon" #~ msgid "Sligo" #~ msgstr "Sligo" #~ msgid "Swords" #~ msgstr "Swords" #~ msgid "Tallaght" #~ msgstr "Tallaght" #~ msgid "Tralee" #~ msgstr "Tralee" #~ msgid "Trim" #~ msgstr "Trim" #~ msgid "Tullamore" #~ msgstr "Tullamore" #~ msgid "Waterford" #~ msgstr "Waterford" #~ msgid "Wexford" #~ msgstr "Wexford" #~ msgid "Wicklow" #~ msgstr "Wicklow" #~ msgctxt "City in Isle of Man" #~ msgid "Douglas" #~ msgstr "Douglas" #~ msgid "Ronaldsway" #~ msgstr "Ronaldsway" #~ msgid "Eilat" #~ msgstr "Eilat" #~ msgid "Haifa" #~ msgstr "Haifa" #~ msgid "Lod" #~ msgstr "Lod" #~ msgid "Rosh Pina" #~ msgstr "Rosh Pina" #~ msgid "Shizzafon" #~ msgstr "Shizzafon" #~ msgid "Tel Aviv" #~ msgstr "Tel Aviv" #~ msgid "Albenga" #~ msgstr "Albenga" #~ msgid "Alghero" #~ msgstr "Alghero" #~ msgid "Ancona" #~ msgstr "Ancona" #~ msgid "Aviano" #~ msgstr "Aviano" #~ msgid "Bari" #~ msgstr "Bari" #~ msgid "Bergamo" #~ msgstr "Bergamo" #~ msgid "Bologna" #~ msgstr "Bolonja" #~ msgid "Bolzano" #~ msgstr "Bolzano" #~ msgid "Brescia" #~ msgstr "Brescia" #~ msgid "Breuil-Cervinia" #~ msgstr "Breuil-Cervinia" #~ msgid "Brindisi" #~ msgstr "Brindisi" #~ msgid "Cagliari" #~ msgstr "Cagliari" #~ msgid "Capri" #~ msgstr "Capri" #~ msgid "Case Arfel" #~ msgstr "Case Arfel" #~ msgid "Catania" #~ msgstr "Catania" #~ msgid "Cervia" #~ msgstr "Cervia" #~ msgid "Crotone" #~ msgstr "Crotone" #~ msgid "Cuneo" #~ msgstr "Cuneo" #~ msgid "Decimomannu" #~ msgstr "Decimomannu" #~ msgid "Dobbiaco" #~ msgstr "Dobbiaco" #~ msgid "Ferrara" #~ msgstr "Ferrara" #~ msgctxt "City in Italy" #~ msgid "Florence" #~ msgstr "Firenca" #~ msgid "Forlì" #~ msgstr "Forlì" #~ msgid "Frosinone" #~ msgstr "Frosinone" #~ msgid "Genoa" #~ msgstr "Genova" #~ msgid "Ginosa Marina" #~ msgstr "Ginosa Marina" #~ msgid "Gioia del Colle" #~ msgstr "Gioia del Colle" #~ msgid "Grazzanise" #~ msgstr "Grazzanise" #~ msgid "Grosseto" #~ msgstr "Grosseto" #~ msgid "Grottaglie" #~ msgstr "Grottaglie" #~ msgid "Isola del Cantone" #~ msgstr "Isola del Cantone" #~ msgid "L'Aquila" #~ msgstr "L'Aquila" #~ msgid "Laigueglia" #~ msgstr "Laigueglia" #~ msgid "Lampedusa" #~ msgstr "Lampedusa" #~ msgid "Latina" #~ msgstr "Latina" #~ msgid "Lecce" #~ msgstr "Lecce" #~ msgid "Lucca" #~ msgstr "Lucca" #~ msgid "Messina" #~ msgstr "Messina" #~ msgid "Milan" #~ msgstr "Milano" #~ msgctxt "City in Italy" #~ msgid "Naples" #~ msgstr "Napulj" #~ msgid "Olbia" #~ msgstr "Olbia" #~ msgid "Palazzo" #~ msgstr "Palazzo" #~ msgid "Palermo" #~ msgstr "Palermo" #~ msgid "Paneveggio" #~ msgstr "Paneveggio" #~ msgid "Pantelleria" #~ msgstr "Pantelleria" #~ msgid "Parma" #~ msgstr "Parma" #~ msgid "Perugia" #~ msgstr "Perugia" #~ msgid "Pescara" #~ msgstr "Pescara" #~ msgid "Piacenza" #~ msgstr "Piacenza" #~ msgid "Pisa" #~ msgstr "Pisa" #~ msgid "Pontecagnano" #~ msgstr "Pontecagnano" #~ msgid "Pratica di Mare" #~ msgstr "Pratica di Mare" #~ msgid "Reggio di Calabria" #~ msgstr "Reggio di Calabria" #~ msgid "Resia" #~ msgstr "Resia" #~ msgid "Rieti" #~ msgstr "Rieti" #~ msgid "Rimini" #~ msgstr "Rimini" #~ msgctxt "City in Italy" #~ msgid "Rome" #~ msgstr "Rim" #~ msgid "Ronchi dei Legionari" #~ msgstr "Ronchi dei Legionari" #~ msgid "Salignano" #~ msgstr "Salignano" #~ msgid "San Stèfano" #~ msgstr "San Stèfano" #~ msgid "Sant'Eufemia Lamezia" #~ msgstr "Sant'Eufemia Lamezia" #~ msgid "Sporminore" #~ msgstr "Sporminore" #~ msgid "Tamaricciola" #~ msgstr "Tamaricciola" #~ msgid "Tarvisio" #~ msgstr "Tarvisio" #~ msgid "Trapani" #~ msgstr "Trapani" #~ msgid "Trevico" #~ msgstr "Trevico" #~ msgid "Treviso" #~ msgstr "Treviso" #~ msgid "Trieste" #~ msgstr "Trst" #~ msgid "Turin" #~ msgstr "Torino" #~ msgid "Venice" #~ msgstr "Venecija" #~ msgid "Verona" #~ msgstr "Verona" #~ msgid "Vicenza" #~ msgstr "Vicenza" #~ msgid "Viterbo" #~ msgstr "Viterbo" #~ msgid "Àrbatax" #~ msgstr "Àrbatax" #~ msgctxt "City in Jamaica" #~ msgid "Kingston" #~ msgstr "Kingston" #~ msgid "Montego Bay" #~ msgstr "Montego Bay" #~ msgid "Akita" #~ msgstr "Akita" #~ msgid "Ami" #~ msgstr "Ami" #~ msgid "Aomori" #~ msgstr "Aomori" #~ msgid "Asahikawa" #~ msgstr "Asahikawa" #~ msgid "Ashiya" #~ msgstr "Ashiya" #~ msgid "Chitose" #~ msgstr "Chitose" #~ msgid "Chofu" #~ msgstr "Chofu" #~ msgid "Fuji" #~ msgstr "Fuji" #~ msgid "Fukue" #~ msgstr "Fukue" #~ msgid "Fukuoka" #~ msgstr "Fukuoka" #~ msgid "Futemma" #~ msgstr "Futemma" #~ msgid "Gifu" #~ msgstr "Gifu" #~ msgid "Hakodate" #~ msgstr "Hakodate" #~ msgid "Hamamatsu" #~ msgstr "Hamamatsu" #~ msgid "Hamanaka" #~ msgstr "Hamanaka" #~ msgid "Hanamaki" #~ msgstr "Hanamaki" #~ msgid "Hiroshima" #~ msgstr "Hiroshima" #~ msgid "Hofu" #~ msgstr "Hofu" #~ msgid "Ishigaki" #~ msgstr "Ishigaki" #~ msgid "Iwakuni" #~ msgstr "Iwakuni" #~ msgid "Izumo" #~ msgstr "Izumo" #~ msgid "Janado" #~ msgstr "Janado" #~ msgid "Kadena" #~ msgstr "Kadena" #~ msgid "Kagoshima" #~ msgstr "Kagoshima" #~ msgid "Kanayama" #~ msgstr "Kanayama" #~ msgid "Kanoya" #~ msgstr "Kanoya" #~ msgid "Kashoji" #~ msgstr "Kashoji" #~ msgid "Kitakyushu" #~ msgstr "Kitakyushu" #~ msgid "Komatsu" #~ msgstr "Komatsu" #~ msgid "Komatsushima" #~ msgstr "Komatsushima" #~ msgid "Kumamoto" #~ msgstr "Kumamoto" #~ msgid "Kushiro" #~ msgstr "Kushiro" #~ msgid "Matsubara" #~ msgstr "Matsubara" #~ msgid "Matsumoto" #~ msgstr "Matsumoto" #~ msgid "Matsushima" #~ msgstr "Matsushima" #~ msgid "Matsuyama" #~ msgstr "Matsuyama" #~ msgid "Memambetsu" #~ msgstr "Memambetsu" #~ msgid "Mihonoseki" #~ msgstr "Mihonoseki" #~ msgid "Minami" #~ msgstr "Minami" #~ msgid "Misawa" #~ msgstr "Misawa" #~ msgid "Mito" #~ msgstr "Mito" #~ msgid "Miyazaki" #~ msgstr "Miyazaki" #~ msgid "Mombetsu" #~ msgstr "Mombetsu" #~ msgid "Nagasaki" #~ msgstr "Nagasaki" #~ msgid "Nagoya" #~ msgstr "Nagoya" #~ msgid "Naha" #~ msgstr "Naha" #~ msgid "Naka-shibetsu" #~ msgstr "Naka-shibetsu" #~ msgid "Niigata" #~ msgstr "Niigata" #~ msgid "Obihiro" #~ msgstr "Obihiro" #~ msgid "Odaira" #~ msgstr "Odaira" #~ msgid "Odaka" #~ msgstr "Odaka" #~ msgid "Odate" #~ msgstr "Odate" #~ msgid "Ofunakoshi" #~ msgstr "Ofunakoshi" #~ msgid "Ogimachiya" #~ msgstr "Ogimachiya" #~ msgid "Oita" #~ msgstr "Oita" #~ msgid "Okata" #~ msgstr "Okata" #~ msgid "Okayama" #~ msgstr "Okayama" #~ msgid "Okazato" #~ msgstr "Okazato" #~ msgid "Osaka" #~ msgstr "Osaka" #~ msgid "Ozuki" #~ msgstr "Ozuki" #~ msgid "Saga" #~ msgstr "Saga" #~ msgid "Sanrizuka" #~ msgstr "Sanrizuka" #~ msgid "Sawada" #~ msgstr "Sawada" #~ msgid "Shiroi" #~ msgstr "Shiroi" #~ msgid "Takamatsu" #~ msgstr "Takamatsu" #~ msgid "Takatsu" #~ msgstr "Takatsu" #~ msgid "Tateyama" #~ msgstr "Tateyama" #~ msgid "Tokyo" #~ msgstr "Tokyo" #~ msgid "Tottori" #~ msgstr "Tottori" #~ msgid "Toyama" #~ msgstr "Toyama" #~ msgid "Toyooka" #~ msgstr "Toyooka" #~ msgid "Tsuiki" #~ msgstr "Tsuiki" #~ msgid "Ushuku" #~ msgstr "Ushuku" #~ msgid "Wakkanai" #~ msgstr "Wakkanai" #~ msgid "Yamagata" #~ msgstr "Yamagata" #~ msgid "Yamaguchi" #~ msgstr "Yamaguchi" #~ msgid "Yao" #~ msgstr "Yao" #~ msgid "Yokota" #~ msgstr "Yokota" #~ msgid "Yoshinaga" #~ msgstr "Yoshinaga" #~ msgid "La Hougue" #~ msgstr "La Hougue" #~ msgid "Saint Helier" #~ msgstr "Saint Helier" #~ msgid "Al 'Aqabah" #~ msgstr "Al 'Aqabah" #~ msgid "Al Jizah" #~ msgstr "Al Jizah" #~ msgid "Amman" #~ msgstr "Amman" #~ msgid "Almaty" #~ msgstr "Almaty" #~ msgid "Aqtau" #~ msgstr "Aqtau" #~ msgid "Aqtöbe" #~ msgstr "Aqtöbe" #~ msgid "Astana" #~ msgstr "Astana" #~ msgid "Atyrau" #~ msgstr "Atyrau" #~ msgid "Oral" #~ msgstr "Oral" #~ msgid "Qaraghandy" #~ msgstr "Qaraghandy" #~ msgid "Qostanay" #~ msgstr "Qostanay" #~ msgid "Qyzylorda" #~ msgstr "Qyzylorda" #~ msgid "Shymkent" #~ msgstr "Shymkent" #~ msgid "Eldoret" #~ msgstr "Eldoret" #~ msgid "Kisumu" #~ msgstr "Kisumu" #~ msgid "Mombasa" #~ msgstr "Mombasa" #~ msgid "Nairobi" #~ msgstr "Nairobi" #~ msgctxt "City in Kiribati" #~ msgid "London" #~ msgstr "London" #~ msgid "Pristina" #~ msgstr "Priština" #~ msgctxt "City in Kuwait" #~ msgid "Kuwait" #~ msgstr "Kuvajt" #~ msgid "Bishkek" #~ msgstr "Bishkek" #~ msgid "Vientiane" #~ msgstr "Vientiane" #~ msgid "Liepāja" #~ msgstr "Liepāja" #~ msgid "Rīga" #~ msgstr "Rīga" #~ msgid "Beirut" #~ msgstr "Beirut" #~ msgid "Baninah" #~ msgstr "Baninah" #~ msgid "Sabha" #~ msgstr "Sabha" #~ msgid "Tripoli" #~ msgstr "Tripoli" #~ msgid "Vaduz" #~ msgstr "Vaduz" #~ msgid "Kaunas" #~ msgstr "Kaunas" #~ msgid "Palanga" #~ msgstr "Palanga" #~ msgid "Vilnius" #~ msgstr "Vilnius" #~ msgid "Šiauliai" #~ msgstr "Šiauliai" #~ msgctxt "City in Luxembourg" #~ msgid "Luxembourg" #~ msgstr "Luksemburg" #~ msgctxt "City in Macau" #~ msgid "Macau" #~ msgstr "Makau" #~ msgid "Taipa" #~ msgstr "Taipa" #~ msgid "Ohrid" #~ msgstr "Ohrid" #~ msgid "Skopje" #~ msgstr "Skopje" #~ msgid "Ankarena" #~ msgstr "Ankarena" #~ msgid "Antananarivo" #~ msgstr "Antananarivo" #~ msgid "Antsiranana" #~ msgstr "Antsiranana" #~ msgid "Fasenina-Ampasy" #~ msgstr "Fasenina-Ampasy" #~ msgid "Mahajanga" #~ msgstr "Mahajanga" #~ msgid "Toamasina" #~ msgstr "Toamasina" #~ msgid "Tolanaro" #~ msgstr "Tolanaro" #~ msgid "Bintulu" #~ msgstr "Bintulu" #~ msgctxt "City in Malaysia" #~ msgid "George Town" #~ msgstr "George Town" #~ msgid "Johor Bahru" #~ msgstr "Johor Bahru" #~ msgid "Klang" #~ msgstr "Klang" #~ msgid "Kota Baharu" #~ msgstr "Kota Baharu" #~ msgid "Kota Kinabalu" #~ msgstr "Kota Kinabalu" #~ msgid "Kuah" #~ msgstr "Kuah" #~ msgid "Kuala Lumpur" #~ msgstr "Kuala Lumpur" #~ msgid "Kuantan" #~ msgstr "Kuantan" #~ msgid "Kuching" #~ msgstr "Kuching" #~ msgid "Kudat" #~ msgstr "Kudat" #~ msgid "Melaka" #~ msgstr "Melaka" #~ msgid "Miri" #~ msgstr "Miri" #~ msgid "Sandakan" #~ msgstr "Sandakan" #~ msgid "Sepang" #~ msgstr "Sepang" #~ msgid "Sibu" #~ msgstr "Sibu" #~ msgid "Sitiawan" #~ msgstr "Sitiawan" #~ msgid "Tawau" #~ msgstr "Tawau" #~ msgctxt "City in Malaysia" #~ msgid "Victoria" #~ msgstr "Victoria" #~ msgid "Male" #~ msgstr "Male" #~ msgid "Luqa" #~ msgstr "Luqa" #~ msgid "Valletta" #~ msgstr "Valletta" #~ msgid "Majuro" #~ msgstr "Majuro" #~ msgid "Fort-de-France" #~ msgstr "Fort-de-France" #~ msgid "Le Lamentin" #~ msgstr "Le Lamentin" #~ msgid "Nouadhibou" #~ msgstr "Nouadhibou" #~ msgid "Nouakchott" #~ msgstr "Nouakchott" #~ msgid "Plaisance" #~ msgstr "Plaisance" #~ msgid "Port Louis" #~ msgstr "Port Louis" #~ msgid "Port Mathurin" #~ msgstr "Port Mathurin" #~ msgid "Dzaoudzi" #~ msgstr "Dzaoudzi" #~ msgid "Mamoudzou" #~ msgstr "Mamoudzou" #~ msgid "Acapulco" #~ msgstr "Acapulco" #~ msgctxt "City in Aguascalientes, Mexico" #~ msgid "Aguascalientes" #~ msgstr "Aguascalientes" #~ msgctxt "City in Campeche, Mexico" #~ msgid "Campeche" #~ msgstr "Campeche" #~ msgid "Cancún" #~ msgstr "Cancún" #~ msgid "Carmen" #~ msgstr "Carmen" #~ msgid "Chetumal" #~ msgstr "Chetumal" #~ msgid "Chichén-Itzá" #~ msgstr "Chichén-Itzá" #~ msgctxt "City in Chihuahua, Mexico" #~ msgid "Chihuahua" #~ msgstr "Chihuahua" #~ msgid "Ciudad Juárez" #~ msgstr "Ciudad Juárez" #~ msgid "Ciudad Obregón" #~ msgstr "Ciudad Obregón" #~ msgid "Ciudad Victoria" #~ msgstr "Ciudad Victoria" #~ msgctxt "City in Colima, Mexico" #~ msgid "Colima" #~ msgstr "Colima" #~ msgid "Cozumel" #~ msgstr "Cozumel" #~ msgid "Cuernavaca" #~ msgstr "Cuernavaca" #~ msgid "Culiacán" #~ msgstr "Culiacán" #~ msgctxt "City in Durango, Mexico" #~ msgid "Durango" #~ msgstr "Durango" #~ msgid "El Zapote" #~ msgstr "El Zapote" #~ msgid "Guadalajara" #~ msgstr "Guadalajara" #~ msgid "Guaymas" #~ msgstr "Guaymas" #~ msgid "Hermosillo" #~ msgstr "Hermosillo" #~ msgid "Ixtapa" #~ msgstr "Ixtapa" #~ msgid "Ixtepec" #~ msgstr "Ixtepec" #~ msgctxt "City in Baja California Sur, Mexico" #~ msgid "La Paz" #~ msgstr "La Paz" #~ msgid "Laguna Tepic" #~ msgstr "Laguna Tepic" #~ msgctxt "City in Guanajuato, Mexico" #~ msgid "León" #~ msgstr "León" #~ msgid "Loreto" #~ msgstr "Loreto" #~ msgid "Los Mochis" #~ msgstr "Los Mochis" #~ msgctxt "City in Colima, Mexico" #~ msgid "Manzanillo" #~ msgstr "Manzanillo" #~ msgid "Matamoros" #~ msgstr "Matamoros" #~ msgid "Mazatlán" #~ msgstr "Mazatlán" #~ msgid "Mexicali" #~ msgstr "Mexicali" #~ msgid "Mexico City" #~ msgstr "Mexico City" #~ msgid "Minatitlán" #~ msgstr "Minatitlán" #~ msgid "Monclova" #~ msgstr "Monclova" #~ msgid "Monterrey" #~ msgstr "Monterrey" #~ msgid "Morelia" #~ msgstr "Morelia" #~ msgctxt "City in Yucatán, Mexico" #~ msgid "Mérida" #~ msgstr "Mérida" #~ msgid "Nuevo Laredo" #~ msgstr "Nuevo Laredo" #~ msgctxt "City in Oaxaca, Mexico" #~ msgid "Oaxaca" #~ msgstr "Oaxaca" #~ msgid "Piedras Negras" #~ msgstr "Piedras Negras" #~ msgid "Poza Rica de Hidalgo" #~ msgstr "Poza Rica de Hidalgo" #~ msgctxt "City in Puebla, Mexico" #~ msgid "Puebla" #~ msgstr "Puebla" #~ msgid "Puerto Escondido" #~ msgstr "Puerto Escondido" #~ msgid "Puerto Vallarta" #~ msgstr "Puerto Vallarta" #~ msgctxt "City in Querétaro, Mexico" #~ msgid "Querétaro" #~ msgstr "Querétaro" #~ msgid "Reynosa" #~ msgstr "Reynosa" #~ msgid "Saltillo" #~ msgstr "Saltillo" #~ msgid "San José del Cabo" #~ msgstr "San José del Cabo" #~ msgctxt "City in San Luis Potosí, Mexico" #~ msgid "San Luis Potosí" #~ msgstr "San Luis Potosí" #~ msgid "Tampico" #~ msgstr "Tampico" #~ msgid "Tapachula" #~ msgstr "Tapachula" #~ msgid "Tijuana" #~ msgstr "Tijuana" #~ msgid "Toluca" #~ msgstr "Toluca" #~ msgid "Torreón" #~ msgstr "Torreón" #~ msgid "Tuxtla" #~ msgstr "Tuxtla" #~ msgid "Uruapan" #~ msgstr "Uruapan" #~ msgctxt "City in Veracruz, Mexico" #~ msgid "Veracruz" #~ msgstr "Veracruz" #~ msgid "Villahermosa" #~ msgstr "Villahermosa" #~ msgctxt "City in Zacatecas, Mexico" #~ msgid "Zacatecas" #~ msgstr "Zacatecas" #~ msgid "Palikir" #~ msgstr "Palikir" #~ msgid "Chişinău" #~ msgstr "Chişinău" #~ msgctxt "City in Monaco" #~ msgid "Monaco" #~ msgstr "Monako" #~ msgid "Ulaanbaatar" #~ msgstr "Ulan Bator" #~ msgid "Podgorica" #~ msgstr "Podgorica" #~ msgid "Tivat" #~ msgstr "Tivat" #~ msgid "Agadir" #~ msgstr "Agadir" #~ msgid "Al Hoceima" #~ msgstr "Al Hoceima" #~ msgid "Fes" #~ msgstr "Fes" #~ msgid "Marrakech" #~ msgstr "Marrakech" #~ msgid "Meknes" #~ msgstr "Meknes" #~ msgid "Nador" #~ msgstr "Nador" #~ msgid "Nouaseur" #~ msgstr "Nouaseur" #~ msgid "Ouarzazat" #~ msgstr "Ouarzazat" #~ msgid "Oujda" #~ msgstr "Oujda" #~ msgid "Rabat" #~ msgstr "Rabat" #~ msgid "Tangier" #~ msgstr "Tanger" #~ msgid "Tetouan" #~ msgstr "Tetouan" #~ msgid "Beira" #~ msgstr "Beira" #~ msgid "Chimoio" #~ msgstr "Chimoio" #~ msgid "Lichinga" #~ msgstr "Lichinga" #~ msgid "Maputo" #~ msgstr "Maputo" #~ msgid "Nampula" #~ msgstr "Nampula" #~ msgid "Pemba" #~ msgstr "Pemba" #~ msgid "Quelimane" #~ msgstr "Quelimane" #~ msgid "Rangoon" #~ msgstr "Rangun" #~ msgid "Windhoek" #~ msgstr "Windhoek" #~ msgid "Kathmandu" #~ msgstr "Kathmandu" #~ msgid "Amsterdam" #~ msgstr "Amsterdam" #~ msgid "De Kooy" #~ msgstr "De Kooy" #~ msgid "Deelen" #~ msgstr "Deelen" #~ msgid "Eindhoven" #~ msgstr "Eindhoven" #~ msgid "Gilze" #~ msgstr "Gilze" #~ msgid "Groningen" #~ msgstr "Groningen" #~ msgid "Leeuwarden" #~ msgstr "Leeuwarden" #~ msgid "Maastricht" #~ msgstr "Maastricht" #~ msgid "Oost-Vlieland" #~ msgstr "Oost-Vlieland" #~ msgid "Rotterdam" #~ msgstr "Rotterdam" #~ msgid "The Hague" #~ msgstr "Haag" #~ msgid "Utrecht" #~ msgstr "Utrecht" #~ msgid "Volkel" #~ msgstr "Volkel" #~ msgid "Woensdrecht" #~ msgstr "Woensdrecht" #~ msgid "Benners" #~ msgstr "Benners" #~ msgid "Cupe Coy" #~ msgstr "Cupe Coy" #~ msgid "Dorp Nikiboko" #~ msgstr "Dorp Nikiboko" #~ msgid "Gato" #~ msgstr "Gato" #~ msgid "Karenga" #~ msgstr "Karenga" #~ msgid "Nouméa" #~ msgstr "Nouméa" #~ msgid "Auckland" #~ msgstr "Auckland" #~ msgid "Christchurch" #~ msgstr "Christchurch" #~ msgid "Wellington" #~ msgstr "Wellington" #~ msgid "Bluefields" #~ msgstr "Bluefields" #~ msgid "Chinandega" #~ msgstr "Chinandega" #~ msgid "Jinotega" #~ msgstr "Jinotega" #~ msgid "Juigalpa" #~ msgstr "Juigalpa" #~ msgid "Managua" #~ msgstr "Managua" #~ msgid "Puerto Cabezas" #~ msgstr "Puerto Cabezas" #~ msgid "Rivas" #~ msgstr "Rivas" #~ msgid "Agadez" #~ msgstr "Agadez" #~ msgid "Niamey" #~ msgstr "Niamey" #~ msgid "Zinder" #~ msgstr "Zinder" #~ msgid "Abuja" #~ msgstr "Abuja" #~ msgid "Ikeja" #~ msgstr "Ikeja" #~ msgid "Ilorin" #~ msgstr "Ilorin" #~ msgid "Kaduna" #~ msgstr "Kaduna" #~ msgid "Kano" #~ msgstr "Kano" #~ msgid "Lagos" #~ msgstr "Lagos" #~ msgid "Port Harcourt" #~ msgstr "Port Harcourt" #~ msgid "Alofi" #~ msgstr "Alofi" #~ msgctxt "City in Norfolk Island" #~ msgid "Kingston" #~ msgstr "Kingston" #~ msgid "Pyongyang" #~ msgstr "Pjonjang" #~ msgid "Chalan Kanoa" #~ msgstr "Chalan Kanoa" #~ msgid "Alta" #~ msgstr "Alta" #~ msgid "Berlevåg" #~ msgstr "Berlevåg" #~ msgid "Bodø" #~ msgstr "Bodø" #~ msgid "Bolle" #~ msgstr "Bolle" #~ msgid "Boltåsen" #~ msgstr "Boltåsen" #~ msgid "Brønnøysund" #~ msgstr "Brønnøysund" #~ msgid "Båtsfjord" #~ msgstr "Båtsfjord" #~ msgid "Dalem" #~ msgstr "Dalem" #~ msgid "Djupdalen" #~ msgstr "Djupdalen" #~ msgid "Eldskog" #~ msgstr "Eldskog" #~ msgid "Fagernes" #~ msgstr "Fagernes" #~ msgid "Fiskenes" #~ msgstr "Fiskenes" #~ msgid "Florø" #~ msgstr "Florø" #~ msgid "Førde" #~ msgstr "Førde" #~ msgid "Gardermoen" #~ msgstr "Gardermoen" #~ msgid "Hammerfest" #~ msgstr "Hammerfest" #~ msgid "Hasvik" #~ msgstr "Hasvik" #~ msgid "Haugesund" #~ msgstr "Haugesund" #~ msgid "Holm" #~ msgstr "Holm" #~ msgid "Honningsvåg" #~ msgstr "Honningsvåg" #~ msgid "Kirkenes" #~ msgstr "Kirkenes" #~ msgid "Kjevik" #~ msgstr "Kjevik" #~ msgid "Kristiansund" #~ msgstr "Kristiansund" #~ msgid "Mehamn" #~ msgstr "Mehamn" #~ msgid "Molde" #~ msgstr "Molde" #~ msgid "Mosjøen" #~ msgstr "Mosjøen" #~ msgid "Namsos" #~ msgstr "Namsos" #~ msgid "Narvik" #~ msgstr "Narvik" #~ msgid "Notodden" #~ msgstr "Notodden" #~ msgid "Oseberg" #~ msgstr "Oseberg" #~ msgid "Oslo" #~ msgstr "Oslo" #~ msgid "Rygge" #~ msgstr "Rygge" #~ msgid "Røros" #~ msgstr "Røros" #~ msgid "Rørvik" #~ msgstr "Rørvik" #~ msgid "Røssvoll" #~ msgstr "Røssvoll" #~ msgid "Røst" #~ msgstr "Røst" #~ msgid "Sandane" #~ msgstr "Sandane" #~ msgid "Skagen" #~ msgstr "Skagen" #~ msgid "Skien" #~ msgstr "Skien" #~ msgid "Sola" #~ msgstr "Sola" #~ msgid "Stokka" #~ msgstr "Stokka" #~ msgid "Svartnes" #~ msgstr "Svartnes" #~ msgid "Svolvær" #~ msgstr "Svolvær" #~ msgid "Sørkjosen" #~ msgstr "Sørkjosen" #~ msgid "Torp" #~ msgstr "Torp" #~ msgid "Tromsø" #~ msgstr "Tromsø" #~ msgid "Trondheim" #~ msgstr "Trondheim" #~ msgid "Vadsø" #~ msgstr "Vadsø" #~ msgid "Ålesund" #~ msgstr "Ålesund" #~ msgid "Ørsta" #~ msgstr "Ørsta" #~ msgid "Mu'askar al Murtafi'ah" #~ msgstr "Mu'askar al Murtafi'ah" #~ msgid "Muscat" #~ msgstr "Muscat" #~ msgid "Salalah" #~ msgstr "Salalah" #~ msgid "Islamabad" #~ msgstr "Islamabad" #~ msgid "Karachi" #~ msgstr "Karachi" #~ msgid "Lahore" #~ msgstr "Lahore" #~ msgid "Nawabshah" #~ msgstr "Nawabshah" #~ msgid "Koror" #~ msgstr "Koror" #~ msgid "Melekeok" #~ msgstr "Melekeok" #~ msgid "David" #~ msgstr "David" #~ msgid "Fuerte Kobbe" #~ msgstr "Fuerte Kobbe" #~ msgid "Panamá" #~ msgstr "Panamá" #~ msgid "Tocumen" #~ msgstr "Tocumen" #~ msgid "Port Moresby" #~ msgstr "Port Moresby" #~ msgid "Asunción" #~ msgstr "Asunción" #~ msgid "Colonia Félix de Azara" #~ msgstr "Colonia Félix de Azara" #~ msgid "Andahuaylas" #~ msgstr "Andahuaylas" #~ msgid "Arequipa" #~ msgstr "Arequipa" #~ msgid "Ayacucho" #~ msgstr "Ayacucho" #~ msgid "Chiclayo" #~ msgstr "Chiclayo" #~ msgid "Cusco" #~ msgstr "Cusco" #~ msgid "Iquitos" #~ msgstr "Iquitos" #~ msgid "Juliaca" #~ msgstr "Juliaca" #~ msgctxt "City in Peru" #~ msgid "Lima" #~ msgstr "Lima" #~ msgid "Pisco" #~ msgstr "Pisco" #~ msgid "Pucallpa" #~ msgstr "Pucallpa" #~ msgid "Puerto Maldonado" #~ msgstr "Puerto Maldonado" #~ msgid "Tacna" #~ msgstr "Tacna" #~ msgid "Talara" #~ msgstr "Talara" #~ msgid "Tarapoto" #~ msgstr "Tarapoto" #~ msgid "Trujillo" #~ msgstr "Trujillo" #~ msgid "Tumbes" #~ msgstr "Tumbes" #~ msgid "Angeles" #~ msgstr "Angeles" #~ msgid "Davao" #~ msgstr "Davao" #~ msgid "Laoag" #~ msgstr "Laoag" #~ msgid "Manila" #~ msgstr "Manila" #~ msgid "Masbate" #~ msgstr "Masbate" #~ msgid "Pildira" #~ msgstr "Pildira" #~ msgid "Subic" #~ msgstr "Subic" #~ msgid "Zamboanga City" #~ msgstr "Zamboanga City" #~ msgid "Bydgoszcz" #~ msgstr "Bydgoszcz" #~ msgid "Gdańsk" #~ msgstr "Gdanjsk" #~ msgid "Katowice" #~ msgstr "Katowice" #~ msgid "Kraków" #~ msgstr "Kraków" #~ msgid "Lublin" #~ msgstr "Lublin" #~ msgid "Olsztyn" #~ msgstr "Olsztyn" #~ msgid "Poznań" #~ msgstr "Poznań" #~ msgid "Radom" #~ msgstr "Radom" #~ msgid "Rzeszów" #~ msgstr "Rzeszów" #~ msgid "Szczecin" #~ msgstr "Szczecin" #~ msgctxt "City in Poland" #~ msgid "Warsaw" #~ msgstr "Varšava" #~ msgid "Wrocław" #~ msgstr "Wrocław" #~ msgid "Zielona Góra" #~ msgstr "Zielona Góra" #~ msgid "Łódź" #~ msgstr "Lodž" #~ msgid "Beja" #~ msgstr "Beja" #~ msgid "Castelo Branco" #~ msgstr "Castelo Branco" #~ msgid "Faro" #~ msgstr "Faro" #~ msgid "Flor da Rosa" #~ msgstr "Flor da Rosa" #~ msgid "Lajes" #~ msgstr "Lajes" #~ msgid "Lisbon" #~ msgstr "Lisbon" #~ msgid "Monte Real" #~ msgstr "Monte Real" #~ msgid "Montijo" #~ msgstr "Montijo" #~ msgid "Ovar" #~ msgstr "Ovar" #~ msgid "Ponta Delgada" #~ msgstr "Ponta Delgada" #~ msgid "Porto Santo" #~ msgstr "Porto Santo" #~ msgid "Santa Cruz das Flores" #~ msgstr "Santa Cruz das Flores" #~ msgid "Sintra" #~ msgstr "Sintra" #~ msgid "Água de Pena" #~ msgstr "Água de Pena" #~ msgid "Carolina" #~ msgstr "Carolina" #~ msgid "Ponce" #~ msgstr "Ponce" #~ msgid "Rafael Hernandez" #~ msgstr "Rafael Hernandez" #~ msgid "San Juan" #~ msgstr "San Juan" #~ msgid "Doha" #~ msgstr "Doha" #~ msgid "Arad" #~ msgstr "Arad" #~ msgid "Bacău" #~ msgstr "Bacău" #~ msgid "Baia Mare" #~ msgstr "Baia Mare" #~ msgid "Bucharest" #~ msgstr "Bukurešt" #~ msgid "Cluj-Napoca" #~ msgstr "Cluj-Napoca" #~ msgid "Craiova" #~ msgstr "Craiova" #~ msgid "Iaşi" #~ msgstr "Iaşi" #~ msgid "Mihail Kogălniceanu" #~ msgstr "Mihail Kogălniceanu" #~ msgid "Oradea" #~ msgstr "Oradea" #~ msgid "Satu Mare" #~ msgstr "Satu Mare" #~ msgid "Sibiu" #~ msgstr "Sibiu" #~ msgid "Suceava" #~ msgstr "Suceava" #~ msgid "Timişoara" #~ msgstr "Timişoara" #~ msgid "Tulcea" #~ msgstr "Tulcea" #~ msgid "Târgu-Mureş" #~ msgstr "Târgu - Mureş" #~ msgid "Abakan" #~ msgstr "Abakan" #~ msgid "Adler" #~ msgstr "Adler" #~ msgid "Anadyr'" #~ msgstr "Anadyr'" #~ msgid "Anapa" #~ msgstr "Anapa" #~ msgid "Arkhangel'sk" #~ msgstr "Arhangelsk" #~ msgid "Astrakhan'" #~ msgstr "Astrahan" #~ msgid "Barnaul" #~ msgstr "Barnaul" #~ msgid "Bratsk" #~ msgstr "Bratsk" #~ msgid "Bryansk" #~ msgstr "Brjansk" #~ msgid "Cheboksary" #~ msgstr "Cheboksary" #~ msgid "Chelyabinsk" #~ msgstr "Čeljabinsk" #~ msgid "Chita" #~ msgstr "Chita" #~ msgid "Chul'man" #~ msgstr "Chul'man" #~ msgid "Engel's" #~ msgstr "Engel's" #~ msgid "Irkutsk" #~ msgstr "Irkutsk" #~ msgid "Izhevsk" #~ msgstr "Iževsk" #~ msgid "Kaliningrad" #~ msgstr "Kaliningrad" #~ msgid "Kazan'" #~ msgstr "Kazan'" #~ msgid "Kemerovo" #~ msgstr "Kemerovo" #~ msgid "Khabarovsk" #~ msgstr "Khabarovsk" #~ msgid "Khanty-Mansiysk" #~ msgstr "Hanty-Mansiysk" #~ msgid "Krasnodar" #~ msgstr "Krasnodar" #~ msgid "Krasnoyarsk" #~ msgstr "Krasnoyarsk" #~ msgid "Magadan" #~ msgstr "Magadan" #~ msgid "Mineral'nyye Vody" #~ msgstr "Mineral'nyye Vody" #~ msgid "Mirnyy" #~ msgstr "Mirnyy" #~ msgctxt "City in Russia" #~ msgid "Moscow" #~ msgstr "Moskva" #~ msgid "Murmansk" #~ msgstr "Murmansk" #~ msgid "Nal'chik" #~ msgstr "Nalčik" #~ msgid "Nizhnevartovsk" #~ msgstr "Nizhnevartovsk" #~ msgid "Nizhny Novgorod" #~ msgstr "Nižnji Novgorod" #~ msgid "Novokuznetsk" #~ msgstr "Novokuznetsk" #~ msgid "Novosibirsk" #~ msgstr "Novosibirsk" #~ msgid "Omsk" #~ msgstr "Omsk" #~ msgid "Orenburg" #~ msgstr "Orenburg" #~ msgid "Penza" #~ msgstr "Penza" #~ msgid "Perm" #~ msgstr "Perm" #~ msgid "Petropavlovsk" #~ msgstr "Petropavlovsk" #~ msgid "Rostov" #~ msgstr "Rostov" #~ msgid "Rybinsk" #~ msgstr "Rybinsk" #~ msgid "Saint Petersburg" #~ msgstr "Sankt Petersburg" #~ msgid "Samara" #~ msgstr "Samara" #~ msgid "Saratov" #~ msgstr "Saratov" #~ msgid "Stavropol'" #~ msgstr "Stavropolj" #~ msgid "Surgut" #~ msgstr "Surgut" #~ msgid "Syktyvkar" #~ msgstr "Syktyvkar" #~ msgid "Tiksi" #~ msgstr "Tiksi" #~ msgid "Tomsk" #~ msgstr "Tomsk" #~ msgid "Tyumen" #~ msgstr "Tyumen" #~ msgid "Udachnyy" #~ msgstr "Udachnyy" #~ msgid "Ufa" #~ msgstr "Ufa" #~ msgid "Ul'yanovsk" #~ msgstr "Ul'yanovsk" #~ msgid "Ulan-Ude" #~ msgstr "Ulan - Ude" #~ msgid "Velikiye Luki" #~ msgstr "Velikiye Luki" #~ msgid "Vladivostok" #~ msgstr "Vladivostok" #~ msgid "Volgograd" #~ msgstr "Volgograd" #~ msgid "Voronezh" #~ msgstr "Voronež" #~ msgid "Yakutsk" #~ msgstr "Yakutsk" #~ msgid "Yaroslavl" #~ msgstr "Jaroslavlj" #~ msgid "Yekaterinburg" #~ msgstr "Jekaterinburg" #~ msgid "Yoshkar-Ola" #~ msgstr "Joškar-Ola" #~ msgid "Yuzhno-Sakhalinsk" #~ msgstr "Yuzhno - Sakhalinsk" #~ msgid "Saint-Denis" #~ msgstr "Saint-Denis" #~ msgctxt "City in Réunion" #~ msgid "Saint-Pierre" #~ msgstr "Saint-Pierre" #~ msgctxt "City in Saint Helena" #~ msgid "Georgetown" #~ msgstr "Georgetown" #~ msgid "Basseterre" #~ msgstr "Basseterre" #~ msgid "Golden Rock" #~ msgstr "Golden Rock" #~ msgctxt "City in Saint Kitts and Nevis" #~ msgid "Newcastle" #~ msgstr "Newcastle" #~ msgid "Castries" #~ msgstr "Castries" #~ msgid "Pointe Sable" #~ msgstr "Pointe Sable" #~ msgid "Vigie" #~ msgstr "Vigie" #~ msgctxt "City in Saint Pierre and Miquelon" #~ msgid "Saint-Pierre" #~ msgstr "Saint-Pierre" #~ msgid "Arnos Vale" #~ msgstr "Arnos Vale" #~ msgid "Kingstown" #~ msgstr "Kingstown" #~ msgid "Apia" #~ msgstr "Apia" #~ msgctxt "City in San Marino" #~ msgid "San Marino" #~ msgstr "San Marino" #~ msgid "'Ar'ar" #~ msgstr "'Ar'ar" #~ msgid "Abha" #~ msgstr "Abha" #~ msgid "Ad Dalfa'ah" #~ msgstr "Ad Dalfa'ah" #~ msgid "Ad Dammam" #~ msgstr "Ad Dammam" #~ msgid "Al 'Aqiq" #~ msgstr "Al 'Aqiq" #~ msgid "Al Qaysumah" #~ msgstr "Al Qaysumah" #~ msgid "Al Qurayyat" #~ msgstr "Al Qurayyat" #~ msgid "Al Wajh" #~ msgstr "Al Wajh" #~ msgid "Al Wuday'ah" #~ msgstr "Al Wuday'ah" #~ msgid "Ar Ruqayyiqah" #~ msgstr "Ar Ruqayyiqah" #~ msgid "At Ta'if" #~ msgstr "At Ta'if" #~ msgid "Dhahran" #~ msgstr "Dhahran" #~ msgid "Ha'il" #~ msgstr "Ha'il" #~ msgid "Jiddah" #~ msgstr "Jiddah" #~ msgid "Jizan" #~ msgstr "Jizan" #~ msgid "Khamis Mushayt" #~ msgstr "Khamis Mushayt" #~ msgid "Masjid Ibn Rashid" #~ msgstr "Masjid Ibn Rashid" #~ msgid "Mecca" #~ msgstr "Meka" #~ msgid "Medina" #~ msgstr "Medina" #~ msgid "Najran" #~ msgstr "Najran" #~ msgid "Qal'at Bishah" #~ msgstr "Qal'at Bishah" #~ msgid "Qara" #~ msgstr "Qara" #~ msgid "Rafha" #~ msgstr "Rafha" #~ msgid "Riyadh" #~ msgstr "Riyadh" #~ msgid "Tabuk" #~ msgstr "Tabuk" #~ msgid "Tamrah" #~ msgstr "Tamrah" #~ msgid "Turayf" #~ msgstr "Turayf" #~ msgid "Yanbu' al Bahr" #~ msgstr "Yanbu' al Bahr" #~ msgid "Boukot Ouolof" #~ msgstr "Boukot Ouolof" #~ msgid "Dakar" #~ msgstr "Dakar" #~ msgid "Saint-Louis" #~ msgstr "Sveti Louis" #~ msgid "Tambacounda" #~ msgstr "Tambacounda" #~ msgid "Ziguinchor" #~ msgstr "Ziguinchor" #~ msgid "Belgrade" #~ msgstr "Beograd" #~ msgid "Niš" #~ msgstr "Niš" #~ msgid "Vršac" #~ msgstr "Vršac" #~ msgid "Zemun" #~ msgstr "Zemun" #~ msgid "Cascade" #~ msgstr "Cascade" #~ msgctxt "City in Seychelles" #~ msgid "Victoria" #~ msgstr "Victoria" #~ msgid "Freetown" #~ msgstr "Freetown" #~ msgid "Lungi" #~ msgstr "Lungi" #~ msgctxt "City in Singapore" #~ msgid "Singapore" #~ msgstr "Singapur" #~ msgid "Bratislava" #~ msgstr "Bratislava" #~ msgid "Dolný Hričov" #~ msgstr "Dolný Hričov" #~ msgid "Kamenica nad Cirochou" #~ msgstr "Kamenica nad Cirochou" #~ msgid "Košice" #~ msgstr "Košice" #~ msgid "Lučenec" #~ msgstr "Lučenec" #~ msgid "Piešťany" #~ msgstr "Piešťany" #~ msgid "Poprad" #~ msgstr "Poprad" #~ msgid "Prešov" #~ msgstr "Prešov" #~ msgid "Prievidza" #~ msgstr "Prievidza" #~ msgid "Sliač" #~ msgstr "Sliač" #~ msgid "Žilina" #~ msgstr "Žilina" #~ msgid "Ljubljana" #~ msgstr "Ljubljana" #~ msgid "Maribor" #~ msgstr "Maribor" #~ msgid "Portorož" #~ msgstr "Portorož" #~ msgid "Honiara" #~ msgstr "Honiara" #~ msgid "Bloemfontein" #~ msgstr "Bloemfontein" #~ msgid "Cape Town" #~ msgstr "Cape Town" #~ msgid "Durban" #~ msgstr "Durban" #~ msgid "Johannesburg" #~ msgstr "Johannesburg" #~ msgid "Klerksdorp" #~ msgstr "Klerksdorp" #~ msgid "Port Elizabeth" #~ msgstr "Port Elizabeth" #~ msgid "Potchefstroom" #~ msgstr "Potchefstroom" #~ msgid "Pretoria" #~ msgstr "Pretoria" #~ msgid "Springs" #~ msgstr "Springs" #~ msgid "Upington" #~ msgstr "Upington" #~ msgid "Vereeniging" #~ msgstr "Vereeniging" #~ msgid "Ch'ongju" #~ msgstr "Ch'ongju" #~ msgid "Cheju" #~ msgstr "Cheju" #~ msgid "Inch'on" #~ msgstr "Inch'on" #~ msgid "Kunsan" #~ msgstr "Kunsan" #~ msgid "Osan" #~ msgstr "Osan" #~ msgid "P'yongt'aek" #~ msgstr "P'yongt'aek" #~ msgid "Pusan" #~ msgstr "Pusan" #~ msgid "Seoul" #~ msgstr "Seoul" #~ msgid "Taegu" #~ msgstr "Taegu" #~ msgid "A Coruña" #~ msgstr "La Coruña" #~ msgid "Agoncillo" #~ msgstr "Agoncillo" #~ msgid "Alcantarilla" #~ msgstr "Alcantarilla" #~ msgid "Alcorcón" #~ msgstr "Alcorcón" #~ msgid "Alicante" #~ msgstr "Alicante" #~ msgid "Almería" #~ msgstr "Almería" #~ msgid "Armilla" #~ msgstr "Armilla" #~ msgid "Atogo" #~ msgstr "Atogo" #~ msgid "Avilés" #~ msgstr "Avilés" #~ msgid "Barajas" #~ msgstr "Barajas" #~ msgctxt "City in Spain" #~ msgid "Barcelona" #~ msgstr "Barcelona" #~ msgid "Bilbao" #~ msgstr "Bilbao" #~ msgid "Colmenar Viejo" #~ msgstr "Colmenar Viejo" #~ msgid "Corcovados" #~ msgstr "Corcovados" #~ msgid "Cuatro Vientos" #~ msgstr "Cuatro Vientos" #~ msgctxt "City in Spain" #~ msgid "Córdoba" #~ msgstr "Córdoba" #~ msgid "El Matorral" #~ msgstr "El Matorral" #~ msgid "Fuenlabrada" #~ msgstr "Fuenlabrada" #~ msgid "Fuenterrabía" #~ msgstr "Fuenterrabía" #~ msgid "Gando" #~ msgstr "Gando" #~ msgid "Gerona" #~ msgstr "Gerona" #~ msgid "Getafe" #~ msgstr "Getafe" #~ msgid "Gijón" #~ msgstr "Gijón" #~ msgid "Granada" #~ msgstr "Granada" #~ msgid "Güime" #~ msgstr "Güime" #~ msgid "Ibiza" #~ msgstr "Ibiza" #~ msgid "Jerez" #~ msgstr "Jerez" #~ msgid "Leganés" #~ msgstr "Leganés" #~ msgctxt "City in Spain" #~ msgid "León" #~ msgstr "León" #~ msgid "Los Baldíos" #~ msgstr "Los Baldíos" #~ msgid "Los Llanos" #~ msgstr "Los Llanos" #~ msgid "Madrid" #~ msgstr "Madrid" #~ msgid "Mahón" #~ msgstr "Mahón" #~ msgid "Melilla" #~ msgstr "Melilla" #~ msgid "Morón" #~ msgstr "Morón" #~ msgid "Málaga" #~ msgstr "Málaga" #~ msgid "Móstoles" #~ msgstr "Móstoles" #~ msgid "Noáin" #~ msgstr "Noáin" #~ msgid "Palma" #~ msgstr "Palma" #~ msgid "Reus" #~ msgstr "Reus" #~ msgid "Rota" #~ msgstr "Rota" #~ msgid "Sabadell" #~ msgstr "Sabadell" #~ msgid "Salamanca" #~ msgstr "Salamanca" #~ msgid "San Javier" #~ msgstr "San Javier" #~ msgid "San Pablo" #~ msgstr "San Pablo" #~ msgid "Santander" #~ msgstr "Santander" #~ msgctxt "City in Spain" #~ msgid "Santiago" #~ msgstr "Santiago" #~ msgid "Talavera la Real" #~ msgstr "Talavera la Real" #~ msgid "Tamaduste" #~ msgstr "Tamaduste" #~ msgid "Torrejón del Rey" #~ msgstr "Torrejón del Rey" #~ msgctxt "City in Spain" #~ msgid "Valencia" #~ msgstr "Valencia" #~ msgid "Vigo" #~ msgstr "Vigo" #~ msgid "Villanubla" #~ msgstr "Villanubla" #~ msgid "Vitoria-Gasteiz" #~ msgstr "Vitoria-Gasteiz" #~ msgid "Zaragoza" #~ msgstr "Zaragoza" #~ msgid "Colombo" #~ msgstr "Colombo" #~ msgid "Katunayaka" #~ msgstr "Katunayaka" #~ msgid "Sri Jayewardenepura Kotte" #~ msgstr "Sri Jayewardenepura Kotte" #~ msgid "Khartoum" #~ msgstr "Khartoum" #~ msgid "Paramaribo" #~ msgstr "Paramaribo" #~ msgid "Zanderij" #~ msgstr "Zanderij" #~ msgid "Longyearbyen" #~ msgstr "Longyearbyen" #~ msgid "Lobamba" #~ msgstr "Lobamba" #~ msgid "Manzini" #~ msgstr "Manzini" #~ msgid "Mbabane" #~ msgstr "Mbabane" #~ msgid "Borlänge" #~ msgstr "Borlänge" #~ msgid "Gällivare" #~ msgstr "Gällivare" #~ msgid "Göteborg" #~ msgstr "Göteborg" #~ msgid "Halmstad" #~ msgstr "Halmstad" #~ msgid "Jönköping" #~ msgstr "Jönköping" #~ msgid "Kalmar" #~ msgstr "Kalmar" #~ msgid "Karlstad" #~ msgstr "Karlstad" #~ msgid "Kiruna" #~ msgstr "Kiruna" #~ msgid "Kramfors" #~ msgstr "Kramfors" #~ msgid "Kristianstad" #~ msgstr "Kristianstad" #~ msgid "Linköping" #~ msgstr "Linköping" #~ msgid "Ljungbyhed" #~ msgstr "Ljungbyhed" #~ msgid "Luleå" #~ msgstr "Luleå" #~ msgid "Lycksele" #~ msgstr "Lycksele" #~ msgid "Malmö" #~ msgstr "Malmö" #~ msgid "Norrköping" #~ msgstr "Norrköping" #~ msgid "Nyköping" #~ msgstr "Nyköping" #~ msgid "Ronneby" #~ msgstr "Ronneby" #~ msgid "Skellefteå" #~ msgstr "Skellefteå" #~ msgid "Skövde" #~ msgstr "Skövde" #~ msgid "Stockholm" #~ msgstr "Stockholm" #~ msgid "Sundsvall" #~ msgstr "Sundsvall" #~ msgid "Söderhamn" #~ msgstr "Söderhamn" #~ msgid "Umeå" #~ msgstr "Umeå" #~ msgid "Visby" #~ msgstr "Visby" #~ msgid "Västerås" #~ msgstr "Västerås" #~ msgid "Växjö" #~ msgstr "Växjö" #~ msgid "Ängelholm" #~ msgstr "Ängelholm" #~ msgid "Örebro" #~ msgstr "Örebro" #~ msgid "Örnsköldsvik" #~ msgstr "Örnsköldsvik" #~ msgid "Basel" #~ msgstr "Basel" #~ msgid "Bern" #~ msgstr "Bern" #~ msgid "Geneva" #~ msgstr "Geneva" #~ msgid "Grenchen" #~ msgstr "Grenchen" #~ msgid "Lugano" #~ msgstr "Lugano" #~ msgid "Neuchâtel" #~ msgstr "Neuchâtel" #~ msgid "Sankt Gallen" #~ msgstr "Sankt Gallen" #~ msgid "Sion" #~ msgstr "Sion" #~ msgid "St. Moritz" #~ msgstr "St. Moritz" #~ msgid "Zürich" #~ msgstr "Zürich" #~ msgid "Al Qamishli" #~ msgstr "Al Qamishli" #~ msgid "Aleppo" #~ msgstr "Aleppo" #~ msgid "Damascus" #~ msgstr "Damascus" #~ msgid "Dayr az Zawr" #~ msgstr "Dayr az Zawr" #~ msgid "Latakia" #~ msgstr "Latakia" #~ msgid "Kaohsiung" #~ msgstr "Kaohsiung" #~ msgid "Taipei" #~ msgstr "Taipei" #~ msgid "Taoyuan" #~ msgstr "Taoyuan" #~ msgid "Dushanbe" #~ msgstr "Dushanbe" #~ msgid "Arusha" #~ msgstr "Arusha" #~ msgid "Bukoba" #~ msgstr "Bukoba" #~ msgid "Dar es Salaam" #~ msgstr "Dar es Salaam" #~ msgid "Dodoma" #~ msgstr "Dodoma" #~ msgid "Iringa" #~ msgstr "Iringa" #~ msgid "Kigoma" #~ msgstr "Kigoma" #~ msgid "Mbeya" #~ msgstr "Mbeya" #~ msgid "Morogoro" #~ msgstr "Morogoro" #~ msgid "Moshi" #~ msgstr "Moshi" #~ msgid "Mtwara" #~ msgstr "Mtwara" #~ msgid "Musoma" #~ msgstr "Musoma" #~ msgid "Mwanza" #~ msgstr "Mwanza" #~ msgid "Songea" #~ msgstr "Songea" #~ msgid "Tabora" #~ msgstr "Tabora" #~ msgid "Zanzibar" #~ msgstr "Zanzibar" #~ msgid "Bangkok" #~ msgstr "Bangkok" #~ msgid "Chiang Mai" #~ msgstr "Chiang Mai" #~ msgid "Chon Buri" #~ msgstr "Chon Buri" #~ msgid "Hat Yai" #~ msgstr "Hat Yai" #~ msgid "Hua Hin" #~ msgstr "Hua Hin" #~ msgid "Khon Kaen" #~ msgstr "Khon Kaen" #~ msgid "Lampang" #~ msgstr "Lampang" #~ msgid "Mae Hong Son" #~ msgstr "Mae Hong Son" #~ msgid "Nan" #~ msgstr "Nan" #~ msgid "Phrae" #~ msgstr "Phrae" #~ msgid "Phuket" #~ msgstr "Phuket" #~ msgid "Ranong" #~ msgstr "Ranong" #~ msgid "Rayong" #~ msgstr "Rayong" #~ msgid "Surat Thani" #~ msgstr "Surat Thani" #~ msgid "Trang" #~ msgstr "Trang" #~ msgid "Ubon Ratchathani" #~ msgstr "Ubon Ratchathani" #~ msgid "Udon Thani" #~ msgstr "Udon Thani" #~ msgid "Lome" #~ msgstr "Lome" #~ msgid "Niamtougou" #~ msgstr "Niamtougou" #~ msgid "Fua'amotu" #~ msgstr "Fua'amotu" #~ msgid "Nuku'alofa" #~ msgstr "Nuku'alofa" #~ msgid "Bon Accord" #~ msgstr "Bon Accord" #~ msgid "Piarco" #~ msgstr "Piarco" #~ msgid "Port-of-Spain" #~ msgstr "Port-of-Spain" #~ msgid "Bizerte" #~ msgstr "Bizerte" #~ msgid "El Borma" #~ msgstr "El Borma" #~ msgid "Gabes" #~ msgstr "Gabes" #~ msgid "Gafsa" #~ msgstr "Gafsa" #~ msgid "Houmt Souk" #~ msgstr "Houmt Souk" #~ msgid "Jendouba" #~ msgstr "Jendouba" #~ msgid "Kairouan" #~ msgstr "Kairouan" #~ msgid "Monastir" #~ msgstr "Monastir" #~ msgid "Qulaybiyah" #~ msgstr "Qulaybiyah" #~ msgid "Remada" #~ msgstr "Remada" #~ msgid "Sfax" #~ msgstr "Sfax" #~ msgid "Tabarka" #~ msgstr "Tabarka" #~ msgid "Tozeur" #~ msgstr "Tozeur" #~ msgid "Tunis" #~ msgstr "Tunis" #~ msgid "Adana" #~ msgstr "Adana" #~ msgid "Ankara" #~ msgstr "Ankara" #~ msgid "Antalya" #~ msgstr "Antalya" #~ msgid "Balikesir" #~ msgstr "Balikesir" #~ msgid "Bandirma" #~ msgstr "Bandirma" #~ msgid "Bodrum" #~ msgstr "Bodrum" #~ msgid "Burdur" #~ msgstr "Burdur" #~ msgid "Bursa" #~ msgstr "Bursa" #~ msgid "Corlu" #~ msgstr "Corlu" #~ msgid "Dalaman" #~ msgstr "Dalaman" #~ msgid "Diyarbakir" #~ msgstr "Diyarbakir" #~ msgid "Erzurum" #~ msgstr "Erzurum" #~ msgid "Eskisehir" #~ msgstr "Eskisehir" #~ msgid "Gaziantep" #~ msgstr "Gaziantep" #~ msgid "Istanbul" #~ msgstr "Istanbul" #~ msgid "Izmir" #~ msgstr "Izmir" #~ msgid "Kars" #~ msgstr "Kars" #~ msgid "Kayseri" #~ msgstr "Kayseri" #~ msgid "Kislakoy" #~ msgstr "Kislakoy" #~ msgid "Konya" #~ msgstr "Konya" #~ msgid "Malatya" #~ msgstr "Malatya" #~ msgid "Merzifon" #~ msgstr "Merzifon" #~ msgid "Nevsehir" #~ msgstr "Nevsehir" #~ msgid "Samsun" #~ msgstr "Samsun" #~ msgid "Tepetarla" #~ msgstr "Tepetarla" #~ msgid "Trabzon" #~ msgstr "Trabzon" #~ msgid "Van" #~ msgstr "Van" #~ msgid "Ashgabat" #~ msgstr "Ashgabat" #~ msgid "Funafuti" #~ msgstr "Funafuti" #~ msgid "Arua" #~ msgstr "Arua" #~ msgid "Entebbe" #~ msgstr "Entebbe" #~ msgid "Kabale" #~ msgstr "Kabale" #~ msgid "Kampala" #~ msgstr "Kampala" #~ msgid "Boryspil'" #~ msgstr "Boryspil'" #~ msgid "Chernivtsi" #~ msgstr "Černovci" #~ msgid "Dnipropetrovs'k" #~ msgstr "Dnipropetrovs'k" #~ msgid "Donets'k" #~ msgstr "Donets'k" #~ msgid "Hostomel'" #~ msgstr "Hostomel'" #~ msgid "Ivano-Frankivs'k" #~ msgstr "Ivano-Frankivs'k" #~ msgid "Kharkiv" #~ msgstr "Kharkiv" #~ msgid "Kryvyy Rih" #~ msgstr "Kryvyy Rih" #~ msgid "Kyiv" #~ msgstr "Kijev" #~ msgid "L'viv" #~ msgstr "Lavov" #~ msgid "Mokroye" #~ msgstr "Mokroye" #~ msgid "Mykolayiv" #~ msgstr "Mykolayiv" #~ msgid "Odesa" #~ msgstr "Odesa" #~ msgid "Rivne" #~ msgstr "Rivne" #~ msgid "Simferopol'" #~ msgstr "Simferopol'" #~ msgid "Telichka" #~ msgstr "Telichka" #~ msgid "Uzhhorod" #~ msgstr "Uzhhorod" #~ msgid "Abu Dhabi" #~ msgstr "Abu Dhabi" #~ msgid "Al 'Ayn" #~ msgstr "Al 'Ayn" #~ msgid "Al Fujayrah" #~ msgstr "Al Fujayrah" #~ msgid "Dubai" #~ msgstr "Dubai" #~ msgid "Ra's al Khaymah" #~ msgstr "Ra's al Khaymah" #~ msgid "Sharjah" #~ msgstr "Sharjah" #~ msgctxt "City in Scotland, United Kingdom" #~ msgid "Aberdeen" #~ msgstr "Aberdeen" #~ msgid "Belfast" #~ msgstr "Belfast" #~ msgctxt "City in East and South East England, United Kingdom" #~ msgid "Benson" #~ msgstr "Benson" #~ msgid "Biggin Hill" #~ msgstr "Biggin Hill" #~ msgctxt "City in Midlands, United Kingdom" #~ msgid "Birmingham" #~ msgstr "Birmingham" #~ msgid "Blackpool" #~ msgstr "Blackpool" #~ msgid "Boscombe" #~ msgstr "Boscombe" #~ msgid "Bournemouth" #~ msgstr "Bournemouth" #~ msgid "Brighton" #~ msgstr "Brighton" #~ msgid "Bristol" #~ msgstr "Bristol" #~ msgid "Brize Norton" #~ msgstr "Brize Norton" #~ msgid "Butes" #~ msgstr "Butes" #~ msgctxt "City in East and South East England, United Kingdom" #~ msgid "Cambridge" #~ msgstr "Cambridge" #~ msgid "Campbeltown" #~ msgstr "Campbeltown" #~ msgctxt "City in Wales, United Kingdom" #~ msgid "Cardiff" #~ msgstr "Cardiff" #~ msgid "Carlisle" #~ msgstr "Carlisle" #~ msgid "Castle Donington" #~ msgstr "Castle Donington" #~ msgid "Church Fenton" #~ msgstr "Church Fenton" #~ msgid "Coningsby" #~ msgstr "Coningsby" #~ msgid "Cottesmore" #~ msgstr "Cottesmore" #~ msgid "Coventry" #~ msgstr "Coventry" #~ msgid "Cranfield" #~ msgstr "Cranfield" #~ msgid "Cranwell" #~ msgstr "Cranwell" #~ msgid "Dishforth" #~ msgstr "Dishforth" #~ msgid "Dundee" #~ msgstr "Dundee" #~ msgid "Edinburgh" #~ msgstr "Edinburgh" #~ msgid "Eglinton" #~ msgstr "Eglinton" #~ msgid "Exeter" #~ msgstr "Exeter" #~ msgid "Fairford" #~ msgstr "Fairford" #~ msgid "Farnborough" #~ msgstr "Farnborough" #~ msgid "Filton" #~ msgstr "Filton" #~ msgctxt "City in Scotland, United Kingdom" #~ msgid "Glasgow" #~ msgstr "Glasgow" #~ msgid "Gramisdale" #~ msgstr "Gramisdale" #~ msgid "Hawarden" #~ msgstr "Hawarden" #~ msgid "Helston" #~ msgstr "Helston" #~ msgid "Hugh Town" #~ msgstr "Hugh Town" #~ msgid "Ipswich" #~ msgstr "Ipswich" #~ msgid "Kilmoluag" #~ msgstr "Kilmoluag" #~ msgid "Kinloss" #~ msgstr "Kinloss" #~ msgid "Kintra" #~ msgstr "Kintra" #~ msgid "Kirkwall" #~ msgstr "Kirkwall" #~ msgid "Kirmington" #~ msgstr "Kirmington" #~ msgid "Lakenheath" #~ msgstr "Lakenheath" #~ msgid "Leeds" #~ msgstr "Leeds" #~ msgid "Leeming Bar" #~ msgstr "Leeming Bar" #~ msgid "Leuchars" #~ msgstr "Leuchars" #~ msgid "Linton upon Ouse" #~ msgstr "Linton upon Ouse" #~ msgctxt "City in North West England, United Kingdom" #~ msgid "Liverpool" #~ msgstr "Liverpool" #~ msgctxt "City in East and South East England, United Kingdom" #~ msgid "London" #~ msgstr "London" #~ msgid "Lossiemouth" #~ msgstr "Lossiemouth" #~ msgid "Luton" #~ msgstr "Luton" #~ msgid "Lydd" #~ msgstr "Lydd" #~ msgid "Lyneham" #~ msgstr "Lyneham" #~ msgctxt "City in North West England, United Kingdom" #~ msgid "Manchester" #~ msgstr "Manchester" #~ msgid "Manston" #~ msgstr "Manston" #~ msgid "Marham" #~ msgstr "Marham" #~ msgid "Middle Wallop" #~ msgstr "Middle Wallop" #~ msgid "Mildenhall" #~ msgstr "Mildenhall" #~ msgid "Mossbank" #~ msgstr "Mossbank" #~ msgctxt "City in North East England, United Kingdom" #~ msgid "Newcastle" #~ msgstr "Newcastle" #~ msgid "Northolt" #~ msgstr "Northolt" #~ msgid "Norwich" #~ msgstr "Norwich" #~ msgid "Odiham" #~ msgstr "Odiham" #~ msgid "Pembrey" #~ msgstr "Pembrey" #~ msgctxt "City in South and South West England, United Kingdom" #~ msgid "Plymouth" #~ msgstr "Plymouth" #~ msgid "Prestwick" #~ msgstr "Prestwick" #~ msgid "Saint Athan" #~ msgstr "Saint Athan" #~ msgid "Shawbury" #~ msgstr "Shawbury" #~ msgid "Shoreham-by-Sea" #~ msgstr "Shoreham-by-Sea" #~ msgid "Southampton" #~ msgstr "Southampton" #~ msgctxt "City in East and South East England, United Kingdom" #~ msgid "Southend" #~ msgstr "Southend" #~ msgid "Stansted Mountfitchet" #~ msgstr "Stansted Mountfitchet" #~ msgid "Staverton" #~ msgstr "Staverton" #~ msgctxt "City in North East England, United Kingdom" #~ msgid "Stockton" #~ msgstr "Stockton" #~ msgid "Stornoway" #~ msgstr "Stornoway" #~ msgid "Sumburgh" #~ msgstr "Sumburgh" #~ msgid "Topcliffe" #~ msgstr "Topcliffe" #~ msgid "Valley" #~ msgstr "Valley" #~ msgid "Waddington" #~ msgstr "Waddington" #~ msgid "Wainfleet" #~ msgstr "Wainfleet" #~ msgid "Wick" #~ msgstr "Wick" #~ msgid "Wittering" #~ msgstr "Wittering" #~ msgid "Yeovilton" #~ msgstr "Yeovilton" #~ msgctxt "City in South Dakota, United States" #~ msgid "Aberdeen" #~ msgstr "Aberdeen" #~ msgid "Abilene" #~ msgstr "Abilene" #~ msgid "Abingdon" #~ msgstr "Abingdon" #~ msgid "Ada" #~ msgstr "Ada" #~ msgid "Adak" #~ msgstr "Adak" #~ msgid "Adamsville" #~ msgstr "Adamsville" #~ msgid "Adrian" #~ msgstr "Adrian" #~ msgid "Ahoskie" #~ msgstr "Ahoskie" #~ msgid "Ainsworth" #~ msgstr "Ainsworth" #~ msgid "Aitkin" #~ msgstr "Aitkin" #~ msgctxt "City in Colorado, United States" #~ msgid "Akron" #~ msgstr "Akron" #~ msgctxt "City in Ohio, United States" #~ msgid "Akron" #~ msgstr "Akron" #~ msgid "Alabaster" #~ msgstr "Alabaster" #~ msgid "Alamogordo" #~ msgstr "Alamogordo" #~ msgid "Alamosa" #~ msgstr "Alamosa" #~ msgctxt "City in Georgia, United States" #~ msgid "Albany" #~ msgstr "Albany" #~ msgctxt "City in New York, United States" #~ msgid "Albany" #~ msgstr "Albany" #~ msgid "Albemarle" #~ msgstr "Albemarle" #~ msgid "Albert Lea" #~ msgstr "Albert Lea" #~ msgid "Albertville" #~ msgstr "Albertville" #~ msgid "Albion" #~ msgstr "Albion" #~ msgid "Albuquerque" #~ msgstr "Albuquerque" #~ msgid "Alexander City" #~ msgstr "Alexander City" #~ msgctxt "City in Louisiana, United States" #~ msgid "Alexandria" #~ msgstr "Alexandria" #~ msgctxt "City in Minnesota, United States" #~ msgid "Alexandria" #~ msgstr "Alexandria" #~ msgctxt "City in Virginia, United States" #~ msgid "Alexandria" #~ msgstr "Alexandria" #~ msgid "Alice" #~ msgstr "Alice" #~ msgid "Allentown" #~ msgstr "Allentown" #~ msgid "Alliance" #~ msgstr "Alliance" #~ msgctxt "City in Georgia, United States" #~ msgid "Alma" #~ msgstr "Alma" #~ msgctxt "City in Michigan, United States" #~ msgid "Alma" #~ msgstr "Alma" #~ msgid "Alpena" #~ msgstr "Alpena" #~ msgctxt "City in Alaska, United States" #~ msgid "Alpine" #~ msgstr "Alpine" #~ msgctxt "City in Texas, United States" #~ msgid "Alpine" #~ msgstr "Alpine" #~ msgid "Alton" #~ msgstr "Alton" #~ msgid "Altoona" #~ msgstr "Altoona" #~ msgid "Alturas" #~ msgstr "Alturas" #~ msgid "Altus" #~ msgstr "Altus" #~ msgid "Alva" #~ msgstr "Alva" #~ msgid "Amarillo" #~ msgstr "Amarillo" #~ msgid "Ambler" #~ msgstr "Ambler" #~ msgid "Amelia" #~ msgstr "Amelia" #~ msgid "Ames" #~ msgstr "Ames" #~ msgid "Anaheim" #~ msgstr "Anaheim" #~ msgid "Anaktuvuk Pass" #~ msgstr "Anaktuvuk Pass" #~ msgid "Anchorage" #~ msgstr "Anchorage" #~ msgid "Andalusia" #~ msgstr "Andalusia" #~ msgctxt "City in Indiana, United States" #~ msgid "Anderson" #~ msgstr "Anderson" #~ msgctxt "City in South Carolina, United States" #~ msgid "Anderson" #~ msgstr "Anderson" #~ msgid "Andover" #~ msgstr "Andover" #~ msgid "Andrews" #~ msgstr "Andrews" #~ msgid "Angle Inlet" #~ msgstr "Angle Inlet" #~ msgid "Angleton" #~ msgstr "Angleton" #~ msgid "Angoon" #~ msgstr "Angoon" #~ msgid "Aniak" #~ msgstr "Aniak" #~ msgid "Ankeny" #~ msgstr "Ankeny" #~ msgid "Ann Arbor" #~ msgstr "Ann Arbor" #~ msgid "Annapolis" #~ msgstr "Annapolis" #~ msgid "Annette" #~ msgstr "Annette" #~ msgid "Anniston" #~ msgstr "Anniston" #~ msgid "Antigo" #~ msgstr "Antigo" #~ msgid "Anvik" #~ msgstr "Anvik" #~ msgid "Apalachicola" #~ msgstr "Apalachicola" #~ msgctxt "City in Minnesota, United States" #~ msgid "Appleton" #~ msgstr "Appleton" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Appleton" #~ msgstr "Appleton" #~ msgid "Arcata" #~ msgstr "Arcata" #~ msgid "Arctic Village" #~ msgstr "Arctic Village" #~ msgid "Ardmore" #~ msgstr "Ardmore" #~ msgid "Arkadelphia" #~ msgstr "Arkadelphia" #~ msgctxt "City in Texas, United States" #~ msgid "Arlington" #~ msgstr "Arlington" #~ msgctxt "City in Washington, United States" #~ msgid "Arlington" #~ msgstr "Arlington" #~ msgid "Artesia" #~ msgstr "Artesia" #~ msgid "Arvada" #~ msgstr "Arvada" #~ msgid "Asheboro" #~ msgstr "Asheboro" #~ msgid "Asheville" #~ msgstr "Asheville" #~ msgctxt "City in Virginia, United States" #~ msgid "Ashland" #~ msgstr "Ashland" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Ashland" #~ msgstr "Ashland" #~ msgid "Ashtabula" #~ msgstr "Ashtabula" #~ msgid "Aspen" #~ msgstr "Aspen" #~ msgid "Astoria" #~ msgstr "Astoria" #~ msgctxt "City in Georgia, United States" #~ msgid "Athens" #~ msgstr "Athens" #~ msgid "Atlanta" #~ msgstr "Atlanta" #~ msgctxt "City in Iowa, United States" #~ msgid "Atlantic" #~ msgstr "Atlantic" #~ msgid "Atlantic City" #~ msgstr "Atlantic City" #~ msgid "Atoka" #~ msgstr "Atoka" #~ msgctxt "City in Alabama, United States" #~ msgid "Auburn" #~ msgstr "Auburn" #~ msgctxt "City in California, United States" #~ msgid "Auburn" #~ msgstr "Auburn" #~ msgctxt "City in Maine, United States" #~ msgid "Auburn" #~ msgstr "Auburn" #~ msgid "Audubon" #~ msgstr "Audubon" #~ msgctxt "City in Georgia, United States" #~ msgid "Augusta" #~ msgstr "Augusta" #~ msgctxt "City in Maine, United States" #~ msgid "Augusta" #~ msgstr "Augusta" #~ msgctxt "City in Colorado, United States" #~ msgid "Aurora" #~ msgstr "Aurora" #~ msgctxt "City in Illinois, United States" #~ msgid "Aurora" #~ msgstr "Aurora" #~ msgctxt "City in Nebraska, United States" #~ msgid "Aurora" #~ msgstr "Aurora" #~ msgctxt "City in Oregon, United States" #~ msgid "Aurora" #~ msgstr "Aurora" #~ msgctxt "City in Minnesota, United States" #~ msgid "Austin" #~ msgstr "Austin" #~ msgctxt "City in Texas, United States" #~ msgid "Austin" #~ msgstr "Austin" #~ msgid "Avalon" #~ msgstr "Avalon" #~ msgid "Bad Axe" #~ msgstr "Bad Axe" #~ msgid "Bainbridge" #~ msgstr "Bainbridge" #~ msgid "Baker" #~ msgstr "Baker" #~ msgid "Baker City" #~ msgstr "Baker City" #~ msgid "Bakersfield" #~ msgstr "Bakersfield" #~ msgid "Baltimore" #~ msgstr "Baltimore" #~ msgid "Bangor" #~ msgstr "Bangor" #~ msgid "Bar Harbor" #~ msgstr "Bar Harbor" #~ msgid "Baraboo" #~ msgstr "Baraboo" #~ msgid "Barre" #~ msgstr "Barre" #~ msgid "Barretts" #~ msgstr "Barretts" #~ msgid "Barrow" #~ msgstr "Barrow" #~ msgid "Bartlesville" #~ msgstr "Bartlesville" #~ msgid "Bartow" #~ msgstr "Bartow" #~ msgid "Batesville" #~ msgstr "Batesville" #~ msgid "Baton Rouge" #~ msgstr "Baton Rouge" #~ msgid "Battle Creek" #~ msgstr "Battle Creek" #~ msgid "Baudette" #~ msgstr "Baudette" #~ msgid "Bay City" #~ msgstr "Bay City" #~ msgid "Beatrice" #~ msgstr "Beatrice" #~ msgctxt "City in North Carolina, United States" #~ msgid "Beaufort" #~ msgstr "Beaufort" #~ msgctxt "City in South Carolina, United States" #~ msgid "Beaufort" #~ msgstr "Beaufort" #~ msgid "Beaumont" #~ msgstr "Beaumont" #~ msgid "Beaver Falls" #~ msgstr "Beaver Falls" #~ msgid "Beckley" #~ msgstr "Beckley" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Bedford" #~ msgstr "Bedford" #~ msgid "Bellaire" #~ msgstr "Bellaire" #~ msgid "Belleville" #~ msgstr "Belleville" #~ msgid "Bellevue" #~ msgstr "Bellevue" #~ msgid "Bellingham" #~ msgstr "Bellingham" #~ msgid "Belmar" #~ msgstr "Belmar" #~ msgid "Bemidji" #~ msgstr "Bemidji" #~ msgid "Bennington" #~ msgstr "Bennington" #~ msgctxt "City in Minnesota, United States" #~ msgid "Benson" #~ msgstr "Benson" #~ msgid "Benton Harbor" #~ msgstr "Benton Harbor" #~ msgid "Bentonville" #~ msgstr "Bentonville" #~ msgid "Berkeley" #~ msgstr "Berkeley" #~ msgctxt "City in New Hampshire, United States" #~ msgid "Berlin" #~ msgstr "Berlin" #~ msgid "Bethel" #~ msgstr "Bethel" #~ msgid "Bettles" #~ msgstr "Bettles" #~ msgid "Beverly" #~ msgstr "Beverly" #~ msgid "Big Piney" #~ msgstr "Big Piney" #~ msgid "Big Rapids" #~ msgstr "Big Rapids" #~ msgid "Big Spring" #~ msgstr "Big Spring" #~ msgid "Bigfork" #~ msgstr "Bigfork" #~ msgid "Billings" #~ msgstr "Billings" #~ msgid "Biloxi" #~ msgstr "Biloxi" #~ msgid "Binghamton" #~ msgstr "Binghamton" #~ msgid "Birchwood" #~ msgstr "Birchwood" #~ msgctxt "City in Alabama, United States" #~ msgid "Birmingham" #~ msgstr "Birmingham" #~ msgid "Bishop" #~ msgstr "Bishop" #~ msgid "Bismarck" #~ msgstr "Bismarck" #~ msgid "Black Eagle" #~ msgstr "Black Eagle" #~ msgid "Black River" #~ msgstr "Black River" #~ msgid "Blacksburg" #~ msgstr "Blacksburg" #~ msgctxt "City in Illinois, United States" #~ msgid "Bloomington" #~ msgstr "Bloomington" #~ msgctxt "City in Indiana, United States" #~ msgid "Bloomington" #~ msgstr "Bloomington" #~ msgid "Bluefield" #~ msgstr "Bluefield" #~ msgid "Blythe" #~ msgstr "Blythe" #~ msgid "Blytheville" #~ msgstr "Blytheville" #~ msgid "Boca Raton" #~ msgstr "Boca Raton" #~ msgid "Bogue" #~ msgstr "Bogue" #~ msgid "Boise" #~ msgstr "Boise" #~ msgctxt "City in Iowa, United States" #~ msgid "Boone" #~ msgstr "Boone" #~ msgctxt "City in North Carolina, United States" #~ msgid "Boone" #~ msgstr "Boone" #~ msgctxt "City in Wyoming, United States" #~ msgid "Bordeaux" #~ msgstr "Bordeaux" #~ msgid "Borger" #~ msgstr "Borger" #~ msgid "Boscobel" #~ msgstr "Boscobel" #~ msgid "Boston" #~ msgstr "Boston" #~ msgctxt "City in Colorado, United States" #~ msgid "Boulder" #~ msgstr "Boulder" #~ msgid "Bowling Green" #~ msgstr "Bowling Green" #~ msgid "Bowman" #~ msgstr "Bowman" #~ msgid "Box Elder" #~ msgstr "Box Elder" #~ msgid "Bozeman" #~ msgstr "Bozeman" #~ msgid "Bradford" #~ msgstr "Bradford" #~ msgid "Brady" #~ msgstr "Brady" #~ msgid "Brainerd" #~ msgstr "Brainerd" #~ msgid "Bremerton" #~ msgstr "Bremerton" #~ msgid "Brenham" #~ msgstr "Brenham" #~ msgid "Bridgeport" #~ msgstr "Bridgeport" #~ msgid "Broken Bow" #~ msgstr "Broken Bow" #~ msgctxt "City in Oregon, United States" #~ msgid "Brookings" #~ msgstr "Brookings" #~ msgctxt "City in South Dakota, United States" #~ msgid "Brookings" #~ msgstr "Brookings" #~ msgid "Brooksville" #~ msgstr "Brooksville" #~ msgid "Broomfield" #~ msgstr "Broomfield" #~ msgid "Browning" #~ msgstr "Browning" #~ msgid "Brownsville" #~ msgstr "Brownsville" #~ msgid "Brownwood" #~ msgstr "Brownwood" #~ msgctxt "City in Georgia, United States" #~ msgid "Brunswick" #~ msgstr "Brunswick" #~ msgctxt "City in Maine, United States" #~ msgid "Brunswick" #~ msgstr "Brunswick" #~ msgid "Bryce Canyon" #~ msgstr "Bryce Canyon" #~ msgid "Buckhannon" #~ msgstr "Buckhannon" #~ msgid "Buckland" #~ msgstr "Buckland" #~ msgctxt "City in Minnesota, United States" #~ msgid "Buffalo" #~ msgstr "Buffalo" #~ msgctxt "City in New York, United States" #~ msgid "Buffalo" #~ msgstr "Buffalo" #~ msgctxt "City in South Dakota, United States" #~ msgid "Buffalo" #~ msgstr "Buffalo" #~ msgctxt "City in Wyoming, United States" #~ msgid "Buffalo" #~ msgstr "Buffalo" #~ msgid "Bullhead City" #~ msgstr "Bullhead City" #~ msgid "Burbank" #~ msgstr "Burbank" #~ msgid "Burley" #~ msgstr "Burley" #~ msgctxt "City in Colorado, United States" #~ msgid "Burlington" #~ msgstr "Burlington" #~ msgctxt "City in Iowa, United States" #~ msgid "Burlington" #~ msgstr "Burlington" #~ msgctxt "City in North Carolina, United States" #~ msgid "Burlington" #~ msgstr "Burlington" #~ msgctxt "City in Vermont, United States" #~ msgid "Burlington" #~ msgstr "Burlington" #~ msgctxt "City in Washington, United States" #~ msgid "Burlington" #~ msgstr "Burlington" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Burlington" #~ msgstr "Burlington" #~ msgid "Burnet" #~ msgstr "Burnet" #~ msgid "Burns" #~ msgstr "Burns" #~ msgid "Butler" #~ msgstr "Butler" #~ msgid "Butte" #~ msgstr "Butte" #~ msgid "Cadillac" #~ msgstr "Cadillac" #~ msgid "Cahokia" #~ msgstr "Cahokia" #~ msgctxt "City in Illinois, United States" #~ msgid "Cairo" #~ msgstr "Cairo" #~ msgctxt "City in Idaho, United States" #~ msgid "Caldwell" #~ msgstr "Caldwell" #~ msgctxt "City in New Jersey, United States" #~ msgid "Caldwell" #~ msgstr "Caldwell" #~ msgctxt "City in Texas, United States" #~ msgid "Caldwell" #~ msgstr "Caldwell" #~ msgid "Camarillo" #~ msgstr "Camarillo" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Cambridge" #~ msgstr "Cambridge" #~ msgctxt "City in Minnesota, United States" #~ msgid "Cambridge" #~ msgstr "Cambridge" #~ msgid "Camden" #~ msgstr "Camden" #~ msgid "Camp Douglas" #~ msgstr "Camp Douglas" #~ msgid "Camp Springs" #~ msgstr "Camp Springs" #~ msgid "Campo" #~ msgstr "Campo" #~ msgid "Canadian" #~ msgstr "Kanadski" #~ msgid "Canton" #~ msgstr "Canton" #~ msgid "Cape Canaveral" #~ msgstr "Cape Canaveral" #~ msgid "Cape Coral" #~ msgstr "Cape Coral" #~ msgid "Cape Girardeau" #~ msgstr "Cape Girardeau" #~ msgid "Carbondale" #~ msgstr "Carbondale" #~ msgctxt "City in Colorado, United States" #~ msgid "Cardiff" #~ msgstr "Cardiff" #~ msgid "Caribou" #~ msgstr "Caribou" #~ msgctxt "City in California, United States" #~ msgid "Carlsbad" #~ msgstr "Carlsbad" #~ msgctxt "City in New Mexico, United States" #~ msgid "Carlsbad" #~ msgstr "Carlsbad" #~ msgid "Carmi" #~ msgstr "Carmi" #~ msgid "Caro" #~ msgstr "Caro" #~ msgid "Carroll" #~ msgstr "Carroll" #~ msgid "Carrollton" #~ msgstr "Carrollton" #~ msgid "Cartersville" #~ msgstr "Cartersville" #~ msgid "Casa Grande" #~ msgstr "Casa Grande" #~ msgid "Casper" #~ msgstr "Casper" #~ msgid "Cedar City" #~ msgstr "Cedar City" #~ msgid "Cedar Rapids" #~ msgstr "Cedar Rapids" #~ msgid "Centralia" #~ msgstr "Centralia" #~ msgid "Chadron" #~ msgstr "Chadron" #~ msgid "Challis" #~ msgstr "Challis" #~ msgid "Chama" #~ msgstr "Chama" #~ msgid "Chamberlain" #~ msgstr "Chamberlain" #~ msgid "Champaign" #~ msgstr "Champaign" #~ msgid "Chandalar" #~ msgstr "Chandalar" #~ msgctxt "City in Arizona, United States" #~ msgid "Chandler" #~ msgstr "Chandler" #~ msgctxt "City in Oklahoma, United States" #~ msgid "Chandler" #~ msgstr "Chandler" #~ msgid "Chanute" #~ msgstr "Chanute" #~ msgid "Chapel Hill" #~ msgstr "Chapel Hill" #~ msgid "Chariton" #~ msgstr "Chariton" #~ msgid "Charles City" #~ msgstr "Charles City" #~ msgctxt "City in South Carolina, United States" #~ msgid "Charleston" #~ msgstr "Charleston" #~ msgctxt "City in West Virginia, United States" #~ msgid "Charleston" #~ msgstr "Charleston" #~ msgid "Charlevoix" #~ msgstr "Charlevoix" #~ msgctxt "City in Michigan, United States" #~ msgid "Charlotte" #~ msgstr "Charlotte" #~ msgctxt "City in North Carolina, United States" #~ msgid "Charlotte" #~ msgstr "Charlotte" #~ msgid "Charlottesville" #~ msgstr "Charlottesville" #~ msgid "Chatham" #~ msgstr "Chatham" #~ msgid "Chattanooga" #~ msgstr "Chattanooga" #~ msgid "Cheboygan" #~ msgstr "Cheboygan" #~ msgid "Cherokee" #~ msgstr "Cherokee" #~ msgid "Chesapeake" #~ msgstr "Chesapeake" #~ msgid "Chesterfield" #~ msgstr "Chesterfield" #~ msgid "Cheyenne" #~ msgstr "Cheyenne" #~ msgid "Chicago" #~ msgstr "Chicago" #~ msgid "Chickasha" #~ msgstr "Chickasha" #~ msgid "Chico" #~ msgstr "Chico" #~ msgid "Chicopee Falls" #~ msgstr "Slapovi Chicopee" #~ msgid "Chignik" #~ msgstr "Chignik" #~ msgid "Childress" #~ msgstr "Childress" #~ msgid "Childs" #~ msgstr "Childs" #~ msgid "Chillicothe" #~ msgstr "Chillicothe" #~ msgid "China Lake" #~ msgstr "Kinesko jezero" #~ msgid "Chincoteague" #~ msgstr "Chincoteague" #~ msgid "Chino" #~ msgstr "Chino" #~ msgid "Chisana" #~ msgstr "Chisana" #~ msgid "Chistochina" #~ msgstr "Chistochina" #~ msgid "Chula Vista" #~ msgstr "Chula Vista" #~ msgid "Chulitna" #~ msgstr "Chulitna" #~ msgid "Cincinnati" #~ msgstr "Cincinnati" #~ msgid "Claremore" #~ msgstr "Claremore" #~ msgid "Clarinda" #~ msgstr "Clarinda" #~ msgid "Clarion" #~ msgstr "Clarion" #~ msgid "Clarksburg" #~ msgstr "Clarksburg" #~ msgctxt "City in Tennessee, United States" #~ msgid "Clarksville" #~ msgstr "Clarksville" #~ msgctxt "City in Texas, United States" #~ msgid "Clarksville" #~ msgstr "Clarksville" #~ msgid "Clayton" #~ msgstr "Clayton" #~ msgid "Clearfield" #~ msgstr "Clearfield" #~ msgid "Clearwater" #~ msgstr "Clearwater" #~ msgid "Clemson" #~ msgstr "Clemson" #~ msgid "Cleveland" #~ msgstr "Cleveland" #~ msgid "Clines Corners" #~ msgstr "Clines Corners" #~ msgctxt "City in Iowa, United States" #~ msgid "Clinton" #~ msgstr "Clinton" #~ msgctxt "City in North Carolina, United States" #~ msgid "Clinton" #~ msgstr "Clinton" #~ msgctxt "City in Oklahoma, United States" #~ msgid "Clinton" #~ msgstr "Clinton" #~ msgid "Clintonville" #~ msgstr "Clintonville" #~ msgid "Cloquet" #~ msgstr "Cloquet" #~ msgid "Clovis" #~ msgstr "Clovis" #~ msgid "Cocoa" #~ msgstr "Cocoa" #~ msgid "Cody" #~ msgstr "Cody" #~ msgid "Coeur d'Alene" #~ msgstr "Coeur d'Alene" #~ msgid "Coffeyville" #~ msgstr "Coffeyville" #~ msgid "Cold Bay" #~ msgstr "Zaljev Cold" #~ msgid "Coldwater" #~ msgstr "Coldwater" #~ msgid "College Station" #~ msgstr "College stanica" #~ msgid "Colorado Springs" #~ msgstr "Colorado Springs" #~ msgctxt "City in Missouri, United States" #~ msgid "Columbia" #~ msgstr "Columbia" #~ msgctxt "City in South Carolina, United States" #~ msgid "Columbia" #~ msgstr "Columbia" #~ msgctxt "City in Georgia, United States" #~ msgid "Columbus" #~ msgstr "Columbus" #~ msgctxt "City in Indiana, United States" #~ msgid "Columbus" #~ msgstr "Columbus" #~ msgctxt "City in Mississippi, United States" #~ msgid "Columbus" #~ msgstr "Columbus" #~ msgctxt "City in Nebraska, United States" #~ msgid "Columbus" #~ msgstr "Columbus" #~ msgctxt "City in Ohio, United States" #~ msgid "Columbus" #~ msgstr "Columbus" #~ msgctxt "City in California, United States" #~ msgid "Concord" #~ msgstr "Concord" #~ msgctxt "City in New Hampshire, United States" #~ msgid "Concord" #~ msgstr "Concord" #~ msgctxt "City in North Carolina, United States" #~ msgid "Concord" #~ msgstr "Concord" #~ msgid "Concordia" #~ msgstr "Concordia" #~ msgid "Conroe" #~ msgstr "Conroe" #~ msgid "Cook" #~ msgstr "Cook" #~ msgid "Copper Harbor" #~ msgstr "Luka Copper" #~ msgid "Cordova" #~ msgstr "Cordova" #~ msgctxt "City in California, United States" #~ msgid "Corona" #~ msgstr "Corona" #~ msgctxt "City in New Mexico, United States" #~ msgid "Corona" #~ msgstr "Corona" #~ msgid "Corpus Christi" #~ msgstr "Corpus Christi" #~ msgid "Corsicana" #~ msgstr "Corsicana" #~ msgid "Cortez" #~ msgstr "Cortez" #~ msgid "Corvallis" #~ msgstr "Corvallis" #~ msgid "Costa Mesa" #~ msgstr "Costa Mesa" #~ msgid "Cotulla" #~ msgstr "Cotulla" #~ msgid "Council Bluffs" #~ msgstr "Council Bluffs" #~ msgid "Craig" #~ msgstr "Craig" #~ msgid "Crane Lake" #~ msgstr "Jezero Crane" #~ msgid "Crescent City" #~ msgstr "Crescent City" #~ msgctxt "City in Iowa, United States" #~ msgid "Creston" #~ msgstr "Creston" #~ msgid "Crestview" #~ msgstr "Crestview" #~ msgid "Crockett" #~ msgstr "Crockett" #~ msgid "Crookston" #~ msgstr "Crookston" #~ msgid "Cross City" #~ msgstr "Cross City" #~ msgid "Crossville" #~ msgstr "Crossville" #~ msgid "Cullman" #~ msgstr "Cullman" #~ msgid "Culpeper" #~ msgstr "Culpeper" #~ msgid "Cumberland" #~ msgstr "Cumberland" #~ msgid "Currituck" #~ msgstr "Currituck" #~ msgid "Cushing" #~ msgstr "Cushing" #~ msgid "Custer" #~ msgstr "Custer" #~ msgid "Cut Bank" #~ msgstr "Cut Bank" #~ msgid "Daggett" #~ msgstr "Daggett" #~ msgid "Daleville" #~ msgstr "Daleville" #~ msgid "Dalhart" #~ msgstr "Dalhart" #~ msgid "Dallas" #~ msgstr "Dallas" #~ msgid "Dalton" #~ msgstr "Dalton" #~ msgid "Daly City" #~ msgstr "Daly City" #~ msgid "Dalzell" #~ msgstr "Dalzell" #~ msgid "Danbury" #~ msgstr "Danbury" #~ msgid "Dansville" #~ msgstr "Dansville" #~ msgctxt "City in Illinois, United States" #~ msgid "Danville" #~ msgstr "Danville" #~ msgctxt "City in Virginia, United States" #~ msgid "Danville" #~ msgstr "Danville" #~ msgid "Darlington" #~ msgstr "Darlington" #~ msgid "Davenport" #~ msgstr "Davenport" #~ msgid "Dayton" #~ msgstr "Dayton" #~ msgid "Daytona Beach" #~ msgstr "Daytona Beach" #~ msgid "De Queen" #~ msgstr "De Queen" #~ msgid "DeKalb" #~ msgstr "DeKalb" #~ msgid "DeRidder" #~ msgstr "DeRidder" #~ msgid "Deadhorse" #~ msgstr "Deadhorse" #~ msgctxt "City in Alabama, United States" #~ msgid "Decatur" #~ msgstr "Decatur" #~ msgctxt "City in Illinois, United States" #~ msgid "Decatur" #~ msgstr "Decatur" #~ msgctxt "City in Texas, United States" #~ msgid "Decatur" #~ msgstr "Decatur" #~ msgid "Decorah" #~ msgstr "Decorah" #~ msgid "Deer Park" #~ msgstr "Deer Park" #~ msgid "Defiance" #~ msgstr "Defiance" #~ msgid "Del Rio" #~ msgstr "Del Rio" #~ msgid "Delta" #~ msgstr "Delta" #~ msgid "Delta Junction" #~ msgstr "Delta Junction" #~ msgid "Deming" #~ msgstr "Deming" #~ msgid "Denison" #~ msgstr "Denison" #~ msgid "Denton" #~ msgstr "Denton" #~ msgid "Denver" #~ msgstr "Denver" #~ msgid "Des Moines" #~ msgstr "Des Moines" #~ msgid "Destin" #~ msgstr "Destin" #~ msgid "Detroit" #~ msgstr "Detroit" #~ msgid "Detroit Lakes" #~ msgstr "Detroitska jezera" #~ msgid "Devils Lake" #~ msgstr "Jezero Devils" #~ msgid "Dickinson" #~ msgstr "Dickinson" #~ msgid "Dillingham" #~ msgstr "Dillingham" #~ msgid "Dillon" #~ msgstr "Dillon" #~ msgid "Dodge Center" #~ msgstr "Dodge Center" #~ msgid "Dodge City" #~ msgstr "Dodge City" #~ msgid "Dothan" #~ msgstr "Dothan" #~ msgctxt "City in Arizona, United States" #~ msgid "Douglas" #~ msgstr "Douglas" #~ msgctxt "City in Georgia, United States" #~ msgid "Douglas" #~ msgstr "Douglas" #~ msgctxt "City in Wyoming, United States" #~ msgid "Douglas" #~ msgstr "Douglas" #~ msgid "Dover" #~ msgstr "Dover" #~ msgid "Doylestown" #~ msgstr "Doylestown" #~ msgid "Drummond" #~ msgstr "Drummond" #~ msgctxt "City in Texas, United States" #~ msgid "Dryden" #~ msgstr "Dryden" #~ msgid "Du Bois" #~ msgstr "Du Bois" #~ msgctxt "City in Georgia, United States" #~ msgid "Dublin" #~ msgstr "Dublin" #~ msgctxt "City in Virginia, United States" #~ msgid "Dublin" #~ msgstr "Dublin" #~ msgid "Dubuque" #~ msgstr "Dubuque" #~ msgid "Duluth" #~ msgstr "Duluth" #~ msgid "Dumas" #~ msgstr "Dumas" #~ msgid "Duncan" #~ msgstr "Duncan" #~ msgid "Dunkirk" #~ msgstr "Dunkirk" #~ msgctxt "City in Colorado, United States" #~ msgid "Durango" #~ msgstr "Durango" #~ msgid "Durant" #~ msgstr "Durant" #~ msgid "Durham" #~ msgstr "Durham" #~ msgid "Dyersburg" #~ msgstr "Dyersburg" #~ msgctxt "City in Alaska, United States" #~ msgid "Eagle" #~ msgstr "Eagle" #~ msgctxt "City in Colorado, United States" #~ msgid "Eagle" #~ msgstr "Eagle" #~ msgid "Eagle River" #~ msgstr "Rijeka Eagle" #~ msgid "East Hampton" #~ msgstr "East Hampton" #~ msgid "East Milton" #~ msgstr "Istočni Milton" #~ msgid "Easton" #~ msgstr "Easton" #~ msgid "Eastsound" #~ msgstr "Eastsound" #~ msgid "Eau Claire" #~ msgstr "Eau Claire" #~ msgid "Edenton" #~ msgstr "Edenton" #~ msgid "Edinburg" #~ msgstr "Edinburg" #~ msgid "Edwards" #~ msgstr "Edwards" #~ msgid "Effingham" #~ msgstr "Effingham" #~ msgid "Egegik" #~ msgstr "Egegik" #~ msgid "El Centro" #~ msgstr "El Centro" #~ msgid "El Dorado" #~ msgstr "El Dorado" #~ msgid "El Monte" #~ msgstr "El Monte" #~ msgid "El Paso" #~ msgstr "El Paso" #~ msgid "El Reno" #~ msgstr "El Reno" #~ msgid "Elbert" #~ msgstr "Elbert" #~ msgid "Elfin Cove" #~ msgstr "Elfin Cove" #~ msgid "Elizabeth" #~ msgstr "Elizabeth" #~ msgid "Elizabeth City" #~ msgstr "Elizabeth City" #~ msgid "Elizabethtown" #~ msgstr "Elizabethtown" #~ msgctxt "City in Indiana, United States" #~ msgid "Elkhart" #~ msgstr "Elkhart" #~ msgctxt "City in Kansas, United States" #~ msgid "Elkhart" #~ msgstr "Elkhart" #~ msgid "Elkins" #~ msgstr "Elkins" #~ msgid "Elko" #~ msgstr "Elko" #~ msgid "Ellensburg" #~ msgstr "Ellensburg" #~ msgctxt "City in New York, United States" #~ msgid "Elmira" #~ msgstr "Elmira" #~ msgid "Elwood" #~ msgstr "Elwood" #~ msgctxt "City in Minnesota, United States" #~ msgid "Ely" #~ msgstr "Ely" #~ msgctxt "City in Nevada, United States" #~ msgid "Ely" #~ msgstr "Ely" #~ msgid "Elyria" #~ msgstr "Elyria" #~ msgid "Emigrant Gap" #~ msgstr "Emigrant Gap" #~ msgid "Emmonak" #~ msgstr "Emmonak" #~ msgctxt "City in Kansas, United States" #~ msgid "Emporia" #~ msgstr "Emporia" #~ msgctxt "City in Virginia, United States" #~ msgid "Emporia" #~ msgstr "Emporia" #~ msgid "Enid" #~ msgstr "Enid" #~ msgid "Ephrata" #~ msgstr "Ephrata" #~ msgid "Erie" #~ msgstr "Erie" #~ msgid "Erwin" #~ msgstr "Erwin" #~ msgid "Escanaba" #~ msgstr "Escanaba" #~ msgid "Escondido" #~ msgstr "Escondido" #~ msgid "Estherville" #~ msgstr "Estherville" #~ msgid "Eugene" #~ msgstr "Eugene" #~ msgctxt "City in Nevada, United States" #~ msgid "Eureka" #~ msgstr "Eureka" #~ msgid "Eureka Roadhouse" #~ msgstr "Eureka Roadhouse" #~ msgid "Evanston" #~ msgstr "Evanston" #~ msgid "Evansville" #~ msgstr "Evansville" #~ msgid "Eveleth" #~ msgstr "Eveleth" #~ msgid "Everett" #~ msgstr "Everett" #~ msgid "Evergreen" #~ msgstr "Evergreen" #~ msgid "Fairbanks" #~ msgstr "Fairbanks" #~ msgid "Fairchild" #~ msgstr "Fairchild" #~ msgctxt "City in California, United States" #~ msgid "Fairfield" #~ msgstr "Fairfield" #~ msgctxt "City in Illinois, United States" #~ msgid "Fairfield" #~ msgstr "Fairfield" #~ msgctxt "City in Iowa, United States" #~ msgid "Fairfield" #~ msgstr "Fairfield" #~ msgid "Fairmont" #~ msgstr "Fairmont" #~ msgid "Faith" #~ msgstr "Faith" #~ msgid "Falfurrias" #~ msgstr "Falfurrias" #~ msgid "Fallon" #~ msgstr "Fallon" #~ msgid "Falls City" #~ msgstr "Falls City" #~ msgid "Fargo" #~ msgstr "Fargo" #~ msgid "Faribault" #~ msgstr "Faribault" #~ msgid "Farmingdale" #~ msgstr "Farmingdale" #~ msgctxt "City in Missouri, United States" #~ msgid "Farmington" #~ msgstr "Farmington" #~ msgctxt "City in New Mexico, United States" #~ msgid "Farmington" #~ msgstr "Farmington" #~ msgid "Farmville" #~ msgstr "Farmville" #~ msgctxt "City in Arkansas, United States" #~ msgid "Fayetteville" #~ msgstr "Fayetteville" #~ msgctxt "City in North Carolina, United States" #~ msgid "Fayetteville" #~ msgstr "Fayetteville" #~ msgid "Fergus Falls" #~ msgstr "Fergus slapovi" #~ msgid "Findlay" #~ msgstr "Findlay" #~ msgid "Fitchburg" #~ msgstr "Fitchburg" #~ msgid "Flagstaff" #~ msgstr "Flagstaff" #~ msgid "Flint" #~ msgstr "Flint" #~ msgid "Flippin" #~ msgstr "Flippin" #~ msgid "Flora" #~ msgstr "Flora" #~ msgctxt "City in South Carolina, United States" #~ msgid "Florence" #~ msgstr "Florence" #~ msgid "Fond du Lac" #~ msgstr "Fond du Lac" #~ msgid "Fontana" #~ msgstr "Fontana" #~ msgid "Fort Benning" #~ msgstr "Fort Benning" #~ msgid "Fort Carson" #~ msgstr "Fort Carson" #~ msgid "Fort Collins" #~ msgstr "Fort Collins" #~ msgid "Fort Dodge" #~ msgstr "Fort Dodge" #~ msgid "Fort Lauderdale" #~ msgstr "Fort Lauderdale" #~ msgid "Fort Madison" #~ msgstr "Fort Madison" #~ msgid "Fort Myers" #~ msgstr "Fort Myers" #~ msgid "Fort Payne" #~ msgstr "Fort Payne" #~ msgid "Fort Pierce" #~ msgstr "Fort Pierce" #~ msgid "Fort Polk" #~ msgstr "Fort Polk" #~ msgctxt "City in Arkansas, United States" #~ msgid "Fort Smith" #~ msgstr "Fort Smith" #~ msgid "Fort Stockton" #~ msgstr "Fort Stockton" #~ msgid "Fort Walton Beach" #~ msgstr "Fort Walton Beach" #~ msgid "Fort Wayne" #~ msgstr "Fort Wayne" #~ msgid "Fort Worth" #~ msgstr "Fort Worth" #~ msgid "Fort Yukon" #~ msgstr "Fort Yukon" #~ msgid "Fosston" #~ msgstr "Fosston" #~ msgctxt "City in Kentucky, United States" #~ msgid "Frankfort" #~ msgstr "Frankfort" #~ msgctxt "City in Michigan, United States" #~ msgid "Frankfort" #~ msgstr "Frankfort" #~ msgctxt "City in North Carolina, United States" #~ msgid "Franklin" #~ msgstr "Franklin" #~ msgctxt "City in Pennsylvania, United States" #~ msgid "Franklin" #~ msgstr "Franklin" #~ msgctxt "City in Virginia, United States" #~ msgid "Franklin" #~ msgstr "Franklin" #~ msgctxt "City in Maryland, United States" #~ msgid "Frederick" #~ msgstr "Frederick" #~ msgctxt "City in Oklahoma, United States" #~ msgid "Frederick" #~ msgstr "Frederick" #~ msgid "Fredericksburg" #~ msgstr "Fredericksburg" #~ msgctxt "City in Illinois, United States" #~ msgid "Freeport" #~ msgstr "Freeport" #~ msgctxt "City in California, United States" #~ msgid "Fremont" #~ msgstr "Fremont" #~ msgctxt "City in Nebraska, United States" #~ msgid "Fremont" #~ msgstr "Fremont" #~ msgid "Frenchville" #~ msgstr "Frenchville" #~ msgid "Fresno" #~ msgstr "Fresno" #~ msgid "Friday Harbor" #~ msgstr "Luka Friday" #~ msgid "Fryeburg" #~ msgstr "Fryeburg" #~ msgid "Fullerton" #~ msgstr "Fullerton" #~ msgid "Fulton" #~ msgstr "Fulton" #~ msgid "Gadsden" #~ msgstr "Gadsden" #~ msgid "Gage" #~ msgstr "Gage" #~ msgctxt "City in Florida, United States" #~ msgid "Gainesville" #~ msgstr "Gainesville" #~ msgctxt "City in Georgia, United States" #~ msgid "Gainesville" #~ msgstr "Gainesville" #~ msgctxt "City in Texas, United States" #~ msgid "Gainesville" #~ msgstr "Gainesville" #~ msgid "Galena" #~ msgstr "Galena" #~ msgid "Galesburg" #~ msgstr "Galesburg" #~ msgid "Galliano" #~ msgstr "Galliano" #~ msgid "Gallup" #~ msgstr "Gallup" #~ msgid "Galveston" #~ msgstr "Galveston" #~ msgid "Gambell" #~ msgstr "Gambell" #~ msgctxt "City in Kansas, United States" #~ msgid "Garden City" #~ msgstr "Garden City" #~ msgctxt "City in Louisiana, United States" #~ msgid "Garden City" #~ msgstr "Garden City" #~ msgid "Garden Grove" #~ msgstr "Garden Grove" #~ msgid "Garland" #~ msgstr "Garland" #~ msgid "Garrison" #~ msgstr "Garrison" #~ msgid "Gary" #~ msgstr "Gary" #~ msgid "Gastonia" #~ msgstr "Gastonia" #~ msgid "Gatesville" #~ msgstr "Gatesville" #~ msgid "Gaylord" #~ msgstr "Gaylord" #~ msgctxt "City in Delaware, United States" #~ msgid "Georgetown" #~ msgstr "Georgetown" #~ msgctxt "City in Texas, United States" #~ msgid "Georgetown" #~ msgstr "Georgetown" #~ msgid "Giddings" #~ msgstr "Giddings" #~ msgid "Gilbert" #~ msgstr "Gilbert" #~ msgid "Gillette" #~ msgstr "Gillette" #~ msgid "Gilmer" #~ msgstr "Gilmer" #~ msgctxt "City in Kentucky, United States" #~ msgid "Glasgow" #~ msgstr "Glasgow" #~ msgctxt "City in Montana, United States" #~ msgid "Glasgow" #~ msgstr "Glasgow" #~ msgid "Glencoe" #~ msgstr "Glencoe" #~ msgctxt "City in Arizona, United States" #~ msgid "Glendale" #~ msgstr "Glendale" #~ msgctxt "City in California, United States" #~ msgid "Glendale" #~ msgstr "Glendale" #~ msgid "Glendive" #~ msgstr "Glendive" #~ msgid "Glens Falls" #~ msgstr "Glens slapovi" #~ msgid "Glenwood" #~ msgstr "Glenwood" #~ msgid "Goldsboro" #~ msgstr "Goldsboro" #~ msgid "Goodland" #~ msgstr "Goodland" #~ msgid "Goodyear" #~ msgstr "Goodyear" #~ msgid "Goosport" #~ msgstr "Goosport" #~ msgid "Gorham" #~ msgstr "Gorham" #~ msgid "Goshen" #~ msgstr "Goshen" #~ msgid "Grafton" #~ msgstr "Grafton" #~ msgid "Graham" #~ msgstr "Graham" #~ msgid "Granbury" #~ msgstr "Granbury" #~ msgid "Grand Canyon" #~ msgstr "Grand Canyon" #~ msgid "Grand Forks" #~ msgstr "Grand Forks" #~ msgid "Grand Island" #~ msgstr "Grand Island" #~ msgid "Grand Isle" #~ msgstr "Grand Isle" #~ msgid "Grand Junction" #~ msgstr "Grand Junction" #~ msgid "Grand Marais" #~ msgstr "Grand Marais" #~ msgid "Grand Prairie" #~ msgstr "Grand Prairie" #~ msgctxt "City in Michigan, United States" #~ msgid "Grand Rapids" #~ msgstr "Grand Rapids" #~ msgctxt "City in Minnesota, United States" #~ msgid "Grand Rapids" #~ msgstr "Grand Rapids" #~ msgid "Granite Falls" #~ msgstr "Slapovi Granite" #~ msgid "Grants" #~ msgstr "Grants" #~ msgid "Grayling" #~ msgstr "Grayling" #~ msgid "Great Bend" #~ msgstr "Great Bend" #~ msgid "Great Falls" #~ msgstr "Veliki slapovi" #~ msgid "Green Bay" #~ msgstr "Green Bay" #~ msgctxt "City in Georgia, United States" #~ msgid "Greensboro" #~ msgstr "Greensboro" #~ msgctxt "City in North Carolina, United States" #~ msgid "Greensboro" #~ msgstr "Greensboro" #~ msgctxt "City in Maine, United States" #~ msgid "Greenville" #~ msgstr "Greenville" #~ msgctxt "City in Mississippi, United States" #~ msgid "Greenville" #~ msgstr "Greenville" #~ msgctxt "City in South Carolina, United States" #~ msgid "Greenville" #~ msgstr "Greenville" #~ msgctxt "City in Texas, United States" #~ msgid "Greenville" #~ msgstr "Greenville" #~ msgctxt "City in Mississippi, United States" #~ msgid "Greenwood" #~ msgstr "Greenwood" #~ msgctxt "City in South Carolina, United States" #~ msgid "Greenwood" #~ msgstr "Greenwood" #~ msgid "Greer" #~ msgstr "Greer" #~ msgid "Greybull" #~ msgstr "Greybull" #~ msgid "Groton" #~ msgstr "Groton" #~ msgid "Grove" #~ msgstr "Grove" #~ msgid "Gulfport" #~ msgstr "Gulfport" #~ msgid "Gulkana" #~ msgstr "Gulkana" #~ msgid "Gunnison" #~ msgstr "Gunnison" #~ msgid "Gustavus" #~ msgstr "Gustavus" #~ msgid "Guthrie" #~ msgstr "Guthrie" #~ msgid "Guymon" #~ msgstr "Guymon" #~ msgid "Hagerstown" #~ msgstr "Hagerstown" #~ msgid "Hailey" #~ msgstr "Hailey" #~ msgid "Haines" #~ msgstr "Haines" #~ msgid "Haleyville" #~ msgstr "Haleyville" #~ msgid "Hallock" #~ msgstr "Hallock" #~ msgctxt "City in Ohio, United States" #~ msgid "Hamilton" #~ msgstr "Hamilton" #~ msgid "Hammond" #~ msgstr "Hammond" #~ msgid "Hampton" #~ msgstr "Hampton" #~ msgid "Hancock" #~ msgstr "Hancock" #~ msgctxt "City in California, United States" #~ msgid "Hanford" #~ msgstr "Hanford" #~ msgctxt "City in Washington, United States" #~ msgid "Hanford" #~ msgstr "Hanford" #~ msgid "Hanksville" #~ msgstr "Hanksville" #~ msgid "Harbor Springs" #~ msgstr "Harbor Springs" #~ msgid "Harlan" #~ msgstr "Harlan" #~ msgid "Harlingen" #~ msgstr "Harlingen" #~ msgctxt "City in Illinois, United States" #~ msgid "Harrisburg" #~ msgstr "Harrisburg" #~ msgctxt "City in Pennsylvania, United States" #~ msgid "Harrisburg" #~ msgstr "Harrisburg" #~ msgid "Harrison" #~ msgstr "Harrison" #~ msgid "Hartford" #~ msgstr "Hartford" #~ msgid "Hastings" #~ msgstr "Hastings" #~ msgid "Hatteras" #~ msgstr "Hatteras" #~ msgid "Hattiesburg" #~ msgstr "Hattiesburg" #~ msgid "Havelock" #~ msgstr "Havelock" #~ msgid "Havre" #~ msgstr "Havre" #~ msgid "Hawthorne" #~ msgstr "Hawthorne" #~ msgid "Hayden" #~ msgstr "Hayden" #~ msgid "Hays" #~ msgstr "Hays" #~ msgctxt "City in California, United States" #~ msgid "Hayward" #~ msgstr "Hayward" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Hayward" #~ msgstr "Hayward" #~ msgid "Healy" #~ msgstr "Healy" #~ msgid "Hearne" #~ msgstr "Hearne" #~ msgid "Hebbronville" #~ msgstr "Hebbronville" #~ msgctxt "City in Nebraska, United States" #~ msgid "Hebron" #~ msgstr "Hebron" #~ msgid "Helena" #~ msgstr "Helena" #~ msgctxt "City in Kentucky, United States" #~ msgid "Henderson" #~ msgstr "Henderson" #~ msgctxt "City in Nevada, United States" #~ msgid "Henderson" #~ msgstr "Henderson" #~ msgid "Hermiston" #~ msgstr "Hermiston" #~ msgid "Hettinger" #~ msgstr "Hettinger" #~ msgid "Hialeah" #~ msgstr "Hialeah" #~ msgid "Hibbing" #~ msgstr "Hibbing" #~ msgid "Hickory" #~ msgstr "Hickory" #~ msgid "Hicks" #~ msgstr "Hicks" #~ msgid "Hill City" #~ msgstr "Hill City" #~ msgid "Hillsboro" #~ msgstr "Hillsboro" #~ msgid "Hillsdale" #~ msgstr "Hillsdale" #~ msgid "Hillsville" #~ msgstr "Hillsville" #~ msgid "Hilo" #~ msgstr "Hilo" #~ msgid "Hilton Head Island" #~ msgstr "Hilton Head Island" #~ msgid "Hinesville" #~ msgstr "Hinesville" #~ msgctxt "City in Oklahoma, United States" #~ msgid "Hobart" #~ msgstr "Hobart" #~ msgid "Hobbs" #~ msgstr "Hobbs" #~ msgid "Hoffman" #~ msgstr "Hoffman" #~ msgid "Holdrege" #~ msgstr "Holdrege" #~ msgid "Holland" #~ msgstr "Holland" #~ msgid "Hollywood" #~ msgstr "Hollywood" #~ msgid "Homer" #~ msgstr "Homer" #~ msgid "Homestead" #~ msgstr "Homestead" #~ msgid "Hondo" #~ msgstr "Hondo" #~ msgid "Honolulu" #~ msgstr "Honolulu" #~ msgid "Hoonah" #~ msgstr "Hoonah" #~ msgid "Hooper Bay" #~ msgstr "Hooper Bay" #~ msgid "Hoquiam" #~ msgstr "Hoquiam" #~ msgctxt "City in Arkansas, United States" #~ msgid "Hot Springs" #~ msgstr "Hot Springs" #~ msgctxt "City in Virginia, United States" #~ msgid "Hot Springs" #~ msgstr "Hot Springs" #~ msgid "Houghton Lake" #~ msgstr "Jezero Houghton" #~ msgid "Houlton" #~ msgstr "Houlton" #~ msgid "Houma" #~ msgstr "Houma" #~ msgid "Houston" #~ msgstr "Houston" #~ msgid "Howell" #~ msgstr "Howell" #~ msgid "Huntington" #~ msgstr "Huntington" #~ msgid "Huntington Beach" #~ msgstr "Huntington Beach" #~ msgctxt "City in Alabama, United States" #~ msgid "Huntsville" #~ msgstr "Huntsville" #~ msgctxt "City in Texas, United States" #~ msgid "Huntsville" #~ msgstr "Huntsville" #~ msgid "Huron" #~ msgstr "Huron" #~ msgid "Huslia" #~ msgstr "Huslia" #~ msgctxt "City in Kansas, United States" #~ msgid "Hutchinson" #~ msgstr "Hutchinson" #~ msgctxt "City in Minnesota, United States" #~ msgid "Hutchinson" #~ msgstr "Hutchinson" #~ msgid "Hyannis" #~ msgstr "Hyannis" #~ msgid "Hydaburg" #~ msgstr "Hydaburg" #~ msgid "Idabel" #~ msgstr "Idabel" #~ msgid "Idaho Falls" #~ msgstr "Idaho slapovi" #~ msgctxt "City in California, United States" #~ msgid "Imperial" #~ msgstr "Imperial" #~ msgctxt "City in Nebraska, United States" #~ msgid "Imperial" #~ msgstr "Imperial" #~ msgid "Imperial Beach" #~ msgstr "Imperial Beach" #~ msgid "Independence" #~ msgstr "Independence" #~ msgctxt "City in Pennsylvania, United States" #~ msgid "Indiana" #~ msgstr "Indiana" #~ msgid "Indianapolis" #~ msgstr "Indianapolis" #~ msgid "Indiantown" #~ msgstr "Indiantown" #~ msgid "Inglewood" #~ msgstr "Inglewood" #~ msgid "International Falls" #~ msgstr "International slapovi" #~ msgid "Inver Grove Heights" #~ msgstr "Inver Grove Heights" #~ msgid "Inyokern" #~ msgstr "Inyokern" #~ msgid "Iowa City" #~ msgstr "Iowa City" #~ msgid "Iron Mountain" #~ msgstr "Iron Mountain" #~ msgid "Ironwood" #~ msgstr "Ironwood" #~ msgid "Irvine" #~ msgstr "Irvine" #~ msgid "Irving" #~ msgstr "Irving" #~ msgid "Islip" #~ msgstr "Islip" #~ msgid "Ithaca" #~ msgstr "Ithaca" #~ msgctxt "City in Kentucky, United States" #~ msgid "Jackson" #~ msgstr "Jackson" #~ msgctxt "City in Michigan, United States" #~ msgid "Jackson" #~ msgstr "Jackson" #~ msgctxt "City in Minnesota, United States" #~ msgid "Jackson" #~ msgstr "Jackson" #~ msgctxt "City in Mississippi, United States" #~ msgid "Jackson" #~ msgstr "Jackson" #~ msgctxt "City in Tennessee, United States" #~ msgid "Jackson" #~ msgstr "Jackson" #~ msgctxt "City in Wyoming, United States" #~ msgid "Jackson" #~ msgstr "Jackson" #~ msgctxt "City in Florida, United States" #~ msgid "Jacksonville" #~ msgstr "Jacksonville" #~ msgctxt "City in Illinois, United States" #~ msgid "Jacksonville" #~ msgstr "Jacksonville" #~ msgctxt "City in North Carolina, United States" #~ msgid "Jacksonville" #~ msgstr "Jacksonville" #~ msgctxt "City in Texas, United States" #~ msgid "Jacksonville" #~ msgstr "Jacksonville" #~ msgid "Jaffrey" #~ msgstr "Jaffrey" #~ msgctxt "City in New York, United States" #~ msgid "Jamestown" #~ msgstr "Jamestown" #~ msgctxt "City in North Dakota, United States" #~ msgid "Jamestown" #~ msgstr "Jamestown" #~ msgid "Janesville" #~ msgstr "Janesville" #~ msgctxt "City in Texas, United States" #~ msgid "Jasper" #~ msgstr "Jasper" #~ msgid "Jefferson" #~ msgstr "Jefferson" #~ msgid "Jefferson City" #~ msgstr "Jefferson City" #~ msgid "Jerome" #~ msgstr "Jerome" #~ msgid "Jersey City" #~ msgstr "Jersey City" #~ msgid "Johnstown" #~ msgstr "Johnstown" #~ msgid "Joliet" #~ msgstr "Joliet" #~ msgid "Jonesboro" #~ msgstr "Jonesboro" #~ msgid "Joplin" #~ msgstr "Joplin" #~ msgctxt "City in Montana, United States" #~ msgid "Jordan" #~ msgstr "Jordan" #~ msgid "Juliustown" #~ msgstr "Juliustown" #~ msgid "Junction" #~ msgstr "Junction" #~ msgid "Junction City" #~ msgstr "Junction City" #~ msgctxt "City in Alaska, United States" #~ msgid "Juneau" #~ msgstr "Juneau" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Juneau" #~ msgstr "Juneau" #~ msgid "Kahului" #~ msgstr "Kahului" #~ msgid "Kailua" #~ msgstr "Kailua" #~ msgid "Kaiser" #~ msgstr "Kaiser" #~ msgid "Kake" #~ msgstr "Kake" #~ msgid "Kaktovik" #~ msgstr "Kaktovik" #~ msgid "Kalamazoo" #~ msgstr "Kalamazoo" #~ msgid "Kalispell" #~ msgstr "Kalispell" #~ msgid "Kaltag" #~ msgstr "Kaltag" #~ msgid "Kankakee" #~ msgstr "Kankakee" #~ msgctxt "City in Kansas, United States" #~ msgid "Kansas City" #~ msgstr "Kansas City" #~ msgctxt "City in Missouri, United States" #~ msgid "Kansas City" #~ msgstr "Kansas City" #~ msgid "Kaumalapau" #~ msgstr "Kaumalapau" #~ msgid "Kaunakakai" #~ msgstr "Kaunakakai" #~ msgid "Kearney" #~ msgstr "Kearney" #~ msgid "Keene" #~ msgstr "Keene" #~ msgid "Kekaha" #~ msgstr "Kekaha" #~ msgid "Kelso" #~ msgstr "Kelso" #~ msgid "Kenai" #~ msgstr "Kenai" #~ msgid "Kenansville" #~ msgstr "Kenansville" #~ msgid "Kenosha" #~ msgstr "Kenosha" #~ msgid "Keokuk" #~ msgstr "Keokuk" #~ msgid "Kerrville" #~ msgstr "Kerrville" #~ msgid "Ketchikan" #~ msgstr "Ketchikan" #~ msgid "Key West" #~ msgstr "Key West" #~ msgid "Kill Devil Hills" #~ msgstr "Kill Devil Hills" #~ msgid "Killeen" #~ msgstr "Killeen" #~ msgid "Kimball" #~ msgstr "Kimball" #~ msgid "King Salmon" #~ msgstr "King Salmon" #~ msgid "Kingman" #~ msgstr "Kingman" #~ msgid "Kingsport" #~ msgstr "Kingsport" #~ msgid "Kingsville" #~ msgstr "Kingsville" #~ msgid "Kinross" #~ msgstr "Kinross" #~ msgid "Kinston" #~ msgstr "Kinston" #~ msgid "Kipnuk" #~ msgstr "Kipnuk" #~ msgid "Kirksville" #~ msgstr "Kirksville" #~ msgid "Kivalina" #~ msgstr "Kivalina" #~ msgid "Klamath Falls" #~ msgstr "Klamath slapovi" #~ msgid "Klawock" #~ msgstr "Klawock" #~ msgid "Knob Noster" #~ msgstr "Knob Noster" #~ msgctxt "City in Iowa, United States" #~ msgid "Knoxville" #~ msgstr "Knoxville" #~ msgctxt "City in Tennessee, United States" #~ msgid "Knoxville" #~ msgstr "Knoxville" #~ msgid "Kodiak" #~ msgstr "Kodiak" #~ msgid "Kokomo" #~ msgstr "Kokomo" #~ msgid "Kotzebue" #~ msgstr "Kotzebue" #~ msgid "Koyuk" #~ msgstr "Koyuk" #~ msgid "Kustatan" #~ msgstr "Kustatan" #~ msgid "La Crosse" #~ msgstr "La Crosse" #~ msgid "La Grande" #~ msgstr "La Grande" #~ msgctxt "City in Georgia, United States" #~ msgid "La Grange" #~ msgstr "La Grange" #~ msgctxt "City in Texas, United States" #~ msgid "La Grange" #~ msgstr "La Grange" #~ msgid "La Junta" #~ msgstr "La Junta" #~ msgid "La Verne" #~ msgstr "La Verne" #~ msgid "La Veta" #~ msgstr "La Veta" #~ msgid "Lacon" #~ msgstr "Lacon" #~ msgid "Laconia" #~ msgstr "Laconia" #~ msgid "Ladysmith" #~ msgstr "Ladysmith" #~ msgctxt "City in Indiana, United States" #~ msgid "Lafayette" #~ msgstr "Lafayette" #~ msgctxt "City in Louisiana, United States" #~ msgid "Lafayette" #~ msgstr "Lafayette" #~ msgid "Lahaina" #~ msgstr "Lahaina" #~ msgid "Lake Charles" #~ msgstr "Lake Charles" #~ msgid "Lake Minchumina" #~ msgstr "Lake Minchumina" #~ msgid "Lakeland" #~ msgstr "Lakeland" #~ msgid "Lakeview" #~ msgstr "Lakeview" #~ msgid "Lakewood" #~ msgstr "Lakewood" #~ msgid "Lamar" #~ msgstr "Lamar" #~ msgid "Lambertville" #~ msgstr "Lambertville" #~ msgid "Lamoni" #~ msgstr "Lamoni" #~ msgctxt "City in California, United States" #~ msgid "Lancaster" #~ msgstr "Lancaster" #~ msgctxt "City in Ohio, United States" #~ msgid "Lancaster" #~ msgstr "Lancaster" #~ msgctxt "City in Pennsylvania, United States" #~ msgid "Lancaster" #~ msgstr "Lancaster" #~ msgctxt "City in Texas, United States" #~ msgid "Lancaster" #~ msgstr "Lancaster" #~ msgid "Land O' Lakes" #~ msgstr "Land O' Lakes" #~ msgid "Lander" #~ msgstr "Lander" #~ msgid "Lansing" #~ msgstr "Lansing" #~ msgid "Laramie" #~ msgstr "Laramie" #~ msgid "Laredo" #~ msgstr "Laredo" #~ msgid "Las Cruces" #~ msgstr "Las Cruces" #~ msgctxt "City in Nevada, United States" #~ msgid "Las Vegas" #~ msgstr "Las Vegas" #~ msgctxt "City in New Mexico, United States" #~ msgid "Las Vegas" #~ msgstr "Las Vegas" #~ msgid "Latrobe" #~ msgstr "Latrobe" #~ msgctxt "City in Kansas, United States" #~ msgid "Lawrence" #~ msgstr "Lawrence" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Lawrence" #~ msgstr "Lawrence" #~ msgctxt "City in Georgia, United States" #~ msgid "Lawrenceville" #~ msgstr "Lawrenceville" #~ msgctxt "City in Illinois, United States" #~ msgid "Lawrenceville" #~ msgstr "Lawrenceville" #~ msgid "Lawton" #~ msgstr "Lawton" #~ msgid "Le Mars" #~ msgstr "Le Mars" #~ msgid "Leadville" #~ msgstr "Leadville" #~ msgctxt "City in New Hampshire, United States" #~ msgid "Lebanon" #~ msgstr "Lebanon" #~ msgctxt "City in Florida, United States" #~ msgid "Leesburg" #~ msgstr "Leesburg" #~ msgctxt "City in Virginia, United States" #~ msgid "Leesburg" #~ msgstr "Leesburg" #~ msgid "Leeville" #~ msgstr "Leeville" #~ msgid "Lemoore" #~ msgstr "Lemoore" #~ msgid "Lewisburg" #~ msgstr "Lewisburg" #~ msgid "Lewiston" #~ msgstr "Lewiston" #~ msgid "Lewistown" #~ msgstr "Lewistown" #~ msgctxt "City in Kentucky, United States" #~ msgid "Lexington" #~ msgstr "Lexington" #~ msgctxt "City in Nebraska, United States" #~ msgid "Lexington" #~ msgstr "Lexington" #~ msgctxt "City in North Carolina, United States" #~ msgid "Lexington" #~ msgstr "Lexington" #~ msgid "Liberal" #~ msgstr "Liberal" #~ msgid "Lihue" #~ msgstr "Lihue" #~ msgctxt "City in Ohio, United States" #~ msgid "Lima" #~ msgstr "Lima" #~ msgid "Lime Village" #~ msgstr "Lime Village" #~ msgid "Limon" #~ msgstr "Limon" #~ msgctxt "City in Illinois, United States" #~ msgid "Lincoln" #~ msgstr "Lincoln" #~ msgctxt "City in Nebraska, United States" #~ msgid "Lincoln" #~ msgstr "Lincoln" #~ msgctxt "City in Illinois, United States" #~ msgid "Litchfield" #~ msgstr "Litchfield" #~ msgctxt "City in Minnesota, United States" #~ msgid "Litchfield" #~ msgstr "Litchfield" #~ msgid "Little Falls" #~ msgstr "Slapovi Little" #~ msgid "Little Rock" #~ msgstr "Little Rock" #~ msgid "Livermore" #~ msgstr "Livermore" #~ msgid "Livingston" #~ msgstr "Livingston" #~ msgid "Livonia" #~ msgstr "Livonia" #~ msgid "Llano" #~ msgstr "Llano" #~ msgid "Logan" #~ msgstr "Logan" #~ msgid "Lompoc" #~ msgstr "Lompoc" #~ msgctxt "City in Kentucky, United States" #~ msgid "London" #~ msgstr "London" #~ msgid "Lone Rock" #~ msgstr "Lone Rock" #~ msgid "Long Beach" #~ msgstr "Long Beach" #~ msgid "Longview" #~ msgstr "Longview" #~ msgid "Longville" #~ msgstr "Longville" #~ msgid "Los Alamitos" #~ msgstr "Los Alamitos" #~ msgid "Los Alamos" #~ msgstr "Los Alamos" #~ msgid "Los Angeles" #~ msgstr "Los Angeles" #~ msgid "Louisa" #~ msgstr "Louisa" #~ msgid "Louisburg" #~ msgstr "Louisburg" #~ msgid "Louisville" #~ msgstr "Louisville" #~ msgid "Lovelock" #~ msgstr "Lovelock" #~ msgctxt "City in Idaho, United States" #~ msgid "Lowell" #~ msgstr "Lowell" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Lowell" #~ msgstr "Lowell" #~ msgid "Lubbock" #~ msgstr "Lubbock" #~ msgid "Ludington" #~ msgstr "Ludington" #~ msgid "Lufkin" #~ msgstr "Lufkin" #~ msgid "Lumberton" #~ msgstr "Lumberton" #~ msgid "Luverne" #~ msgstr "Luverne" #~ msgid "Lynchburg" #~ msgstr "Lynchburg" #~ msgid "Mackinac Island" #~ msgstr "Mackinac Island" #~ msgid "Macomb" #~ msgstr "Macomb" #~ msgid "Macon" #~ msgstr "Macon" #~ msgid "Madera" #~ msgstr "Madera" #~ msgctxt "City in Minnesota, United States" #~ msgid "Madison" #~ msgstr "Madison" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Madison" #~ msgstr "Madison" #~ msgctxt "City in Idaho, United States" #~ msgid "Malta" #~ msgstr "Malta" #~ msgid "Manassas" #~ msgstr "Manassas" #~ msgctxt "City in New Hampshire, United States" #~ msgid "Manchester" #~ msgstr "Manchester" #~ msgid "Manhattan" #~ msgstr "Manhattan" #~ msgid "Manistee" #~ msgstr "Manistee" #~ msgid "Manistique" #~ msgstr "Manistique" #~ msgid "Manitowoc" #~ msgstr "Manitowoc" #~ msgid "Mankato" #~ msgstr "Mankato" #~ msgid "Manley Hot Springs" #~ msgstr "Manley Hot Springs" #~ msgid "Mansfield" #~ msgstr "Mansfield" #~ msgid "Manteo" #~ msgstr "Manteo" #~ msgid "Maple Lake" #~ msgstr "Jezero Maple" #~ msgid "Marathon" #~ msgstr "Marathon" #~ msgid "Marfa" #~ msgstr "Marfa" #~ msgid "Marianna" #~ msgstr "Marianna" #~ msgid "Marietta" #~ msgstr "Marietta" #~ msgctxt "City in Illinois, United States" #~ msgid "Marion" #~ msgstr "Marion" #~ msgctxt "City in Ohio, United States" #~ msgid "Marion" #~ msgstr "Marion" #~ msgctxt "City in Virginia, United States" #~ msgid "Marion" #~ msgstr "Marion" #~ msgid "Marquette" #~ msgstr "Marquette" #~ msgctxt "City in Michigan, United States" #~ msgid "Marshall" #~ msgstr "Marshall" #~ msgctxt "City in Minnesota, United States" #~ msgid "Marshall" #~ msgstr "Marshall" #~ msgid "Marshalltown" #~ msgstr "Marshalltown" #~ msgid "Marshfield" #~ msgstr "Marshfield" #~ msgid "Martinsburg" #~ msgstr "Martinsburg" #~ msgid "Martinsville" #~ msgstr "Martinsville" #~ msgctxt "City in California, United States" #~ msgid "Marysville" #~ msgstr "Marysville" #~ msgctxt "City in Michigan, United States" #~ msgid "Marysville" #~ msgstr "Marysville" #~ msgid "Mason" #~ msgstr "Mason" #~ msgid "Mason City" #~ msgstr "Mason City" #~ msgid "Massena" #~ msgstr "Massena" #~ msgid "Mattoon" #~ msgstr "Mattoon" #~ msgid "Maxton" #~ msgstr "Maxton" #~ msgid "Mayport" #~ msgstr "Mayport" #~ msgid "McAlester" #~ msgstr "McAlester" #~ msgid "McAllen" #~ msgstr "McAllen" #~ msgid "McCall" #~ msgstr "McCall" #~ msgid "McCarthy" #~ msgstr "McCarthy" #~ msgid "McComb" #~ msgstr "McComb" #~ msgid "McCook" #~ msgstr "McCook" #~ msgid "McGrath" #~ msgstr "McGrath" #~ msgid "McGregor" #~ msgstr "McGregor" #~ msgid "McKinley Park" #~ msgstr "McKinley Park" #~ msgid "McKinney" #~ msgstr "McKinney" #~ msgid "McMinnville" #~ msgstr "McMinnville" #~ msgid "Meacham" #~ msgstr "Meacham" #~ msgid "Meadville" #~ msgstr "Meadville" #~ msgctxt "City in Oregon, United States" #~ msgid "Medford" #~ msgstr "Medford" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Medford" #~ msgstr "Medford" #~ msgid "Medicine Lodge" #~ msgstr "Medicine Lodge" #~ msgid "Meeker" #~ msgstr "Meeker" #~ msgid "Mekoryuk" #~ msgstr "Mekoryuk" #~ msgctxt "City in Florida, United States" #~ msgid "Melbourne" #~ msgstr "Melbourne" #~ msgid "Melfa" #~ msgstr "Melfa" #~ msgid "Memphis" #~ msgstr "Memphis" #~ msgid "Mena" #~ msgstr "Mena" #~ msgid "Menominee" #~ msgstr "Menominee" #~ msgid "Menomonie" #~ msgstr "Menomonie" #~ msgid "Merced" #~ msgstr "Merced" #~ msgid "Mercury" #~ msgstr "Mercury" #~ msgid "Meriden" #~ msgstr "Meriden" #~ msgid "Meridian" #~ msgstr "Meridian" #~ msgid "Merrill" #~ msgstr "Merrill" #~ msgid "Mesa" #~ msgstr "Mesa" #~ msgid "Mesquite" #~ msgstr "Mesquite" #~ msgid "Metlakatla" #~ msgstr "Metlakatla" #~ msgid "Metropolis" #~ msgstr "Metropolis" #~ msgctxt "City in Florida, United States" #~ msgid "Miami" #~ msgstr "Miami" #~ msgid "Middlesboro" #~ msgstr "Middlesboro" #~ msgid "Midland" #~ msgstr "Midland" #~ msgid "Midlothian" #~ msgstr "Midlothian" #~ msgid "Miles City" #~ msgstr "Miles City" #~ msgid "Milford" #~ msgstr "Milford" #~ msgid "Milledgeville" #~ msgstr "Milledgeville" #~ msgid "Millington" #~ msgstr "Millington" #~ msgid "Millinocket" #~ msgstr "Millinocket" #~ msgid "Millville" #~ msgstr "Millville" #~ msgid "Milton" #~ msgstr "Milton" #~ msgid "Milwaukee" #~ msgstr "Milwaukee" #~ msgid "Mineral Wells" #~ msgstr "Mineral Wells" #~ msgid "Minneapolis" #~ msgstr "Minneapolis" #~ msgid "Minot" #~ msgstr "Minot" #~ msgid "Missoula" #~ msgstr "Missoula" #~ msgid "Mitchell" #~ msgstr "Mitchell" #~ msgid "Moab" #~ msgstr "Moab" #~ msgid "Mobile" #~ msgstr "Mobile" #~ msgid "Mobridge" #~ msgstr "Mobridge" #~ msgid "Modesto" #~ msgstr "Modesto" #~ msgid "Moline" #~ msgstr "Moline" #~ msgctxt "City in Louisiana, United States" #~ msgid "Monroe" #~ msgstr "Monroe" #~ msgctxt "City in Michigan, United States" #~ msgid "Monroe" #~ msgstr "Monroe" #~ msgctxt "City in North Carolina, United States" #~ msgid "Monroe" #~ msgstr "Monroe" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Monroe" #~ msgstr "Monroe" #~ msgid "Montague" #~ msgstr "Montague" #~ msgid "Montauk" #~ msgstr "Montauk" #~ msgid "Monterey" #~ msgstr "Monterey" #~ msgctxt "City in Minnesota, United States" #~ msgid "Montevideo" #~ msgstr "Montevideo" #~ msgctxt "City in Alabama, United States" #~ msgid "Montgomery" #~ msgstr "Montgomery" #~ msgctxt "City in New York, United States" #~ msgid "Montgomery" #~ msgstr "Montgomery" #~ msgctxt "City in Arkansas, United States" #~ msgid "Monticello" #~ msgstr "Monticello" #~ msgctxt "City in Iowa, United States" #~ msgid "Monticello" #~ msgstr "Monticello" #~ msgctxt "City in New York, United States" #~ msgid "Monticello" #~ msgstr "Monticello" #~ msgid "Montrose" #~ msgstr "Montrose" #~ msgid "Moorhead" #~ msgstr "Moorhead" #~ msgid "Moose Lake" #~ msgstr "Jezero Moose" #~ msgid "Mora" #~ msgstr "Mora" #~ msgid "Morgantown" #~ msgstr "Morgantown" #~ msgid "Moriarty" #~ msgstr "Moriarty" #~ msgctxt "City in Illinois, United States" #~ msgid "Morris" #~ msgstr "Morris" #~ msgctxt "City in Minnesota, United States" #~ msgid "Morris" #~ msgstr "Morris" #~ msgid "Morristown" #~ msgstr "Morristown" #~ msgid "Morrisville" #~ msgstr "Morrisville" #~ msgctxt "City in Idaho, United States" #~ msgid "Moscow" #~ msgstr "Moscow" #~ msgid "Moses Lake" #~ msgstr "Jezero Moses" #~ msgid "Mosinee" #~ msgstr "Mosinee" #~ msgid "Moultrie" #~ msgstr "Moultrie" #~ msgid "Mount Airy" #~ msgstr "Mount Airy" #~ msgid "Mount Carmel" #~ msgstr "Mount Carmel" #~ msgid "Mount Holly" #~ msgstr "Mount Holly" #~ msgid "Mount Ida" #~ msgstr "Mount Ida" #~ msgctxt "City in Iowa, United States" #~ msgid "Mount Pleasant" #~ msgstr "Mount Pleasant" #~ msgctxt "City in Michigan, United States" #~ msgid "Mount Pleasant" #~ msgstr "Mount Pleasant" #~ msgctxt "City in Texas, United States" #~ msgid "Mount Pleasant" #~ msgstr "Mount Pleasant" #~ msgid "Mount Pocono" #~ msgstr "Mount Pocono" #~ msgid "Mount Shasta" #~ msgstr "Mount Shasta" #~ msgid "Mount Vernon" #~ msgstr "Mount Vernon" #~ msgid "Mount Wilson" #~ msgstr "Mount Wilson" #~ msgctxt "City in Arkansas, United States" #~ msgid "Mountain Home" #~ msgstr "Mountain Home" #~ msgctxt "City in Idaho, United States" #~ msgid "Mountain Home" #~ msgstr "Mountain Home" #~ msgid "Mountain View" #~ msgstr "Mountain View" #~ msgid "Muldraugh" #~ msgstr "Muldraugh" #~ msgid "Mullan" #~ msgstr "Mullan" #~ msgid "Muncie" #~ msgstr "Muncie" #~ msgid "Munising" #~ msgstr "Munising" #~ msgid "Muscatine" #~ msgstr "Muscatine" #~ msgid "Muscle Shoals" #~ msgstr "Muscle Shoals" #~ msgid "Muskegon" #~ msgstr "Muskegon" #~ msgid "Muskogee" #~ msgstr "Muskogee" #~ msgid "Myrtle Beach" #~ msgstr "Myrtle Beach" #~ msgid "Nabesna" #~ msgstr "Nabesna" #~ msgid "Nacogdoches" #~ msgstr "Nacogdoches" #~ msgid "Nantucket" #~ msgstr "Nantucket" #~ msgid "Napa" #~ msgstr "Napa" #~ msgid "Naperville" #~ msgstr "Naperville" #~ msgctxt "City in Florida, United States" #~ msgid "Naples" #~ msgstr "Naples" #~ msgid "Nashua" #~ msgstr "Nashua" #~ msgid "Nashville" #~ msgstr "Nashville" #~ msgid "Natchez" #~ msgstr "Natchez" #~ msgid "Natchitoches" #~ msgstr "Natchitoches" #~ msgid "Nebraska City" #~ msgstr "Nebraska City" #~ msgid "Needles" #~ msgstr "Needles" #~ msgid "Nenana" #~ msgstr "Nenana" #~ msgid "New Bedford" #~ msgstr "New Bedford" #~ msgid "New Bern" #~ msgstr "New Bern" #~ msgid "New Braunfels" #~ msgstr "New Braunfels" #~ msgid "New Castle" #~ msgstr "New Castle" #~ msgid "New Haven" #~ msgstr "New Haven" #~ msgid "New Iberia" #~ msgstr "New Iberia" #~ msgid "New Orleans" #~ msgstr "New Orleans" #~ msgid "New Philadelphia" #~ msgstr "New Philadelphia" #~ msgid "New Richmond" #~ msgstr "New Richmond" #~ msgid "New Smyrna Beach" #~ msgstr "New Smyrna Beach" #~ msgid "New Ulm" #~ msgstr "New Ulm" #~ msgctxt "City in New York, United States" #~ msgid "New York" #~ msgstr "New York" #~ msgctxt "City in New Jersey, United States" #~ msgid "Newark" #~ msgstr "Newark" #~ msgctxt "City in Ohio, United States" #~ msgid "Newark" #~ msgstr "Newark" #~ msgid "Newberry" #~ msgstr "Newberry" #~ msgid "Newburgh" #~ msgstr "Newburgh" #~ msgid "Newhalen" #~ msgstr "Newhalen" #~ msgid "Newhall" #~ msgstr "Newhall" #~ msgid "Newnan" #~ msgstr "Newnan" #~ msgctxt "City in Oregon, United States" #~ msgid "Newport" #~ msgstr "Newport" #~ msgctxt "City in Rhode Island, United States" #~ msgid "Newport" #~ msgstr "Newport" #~ msgid "Newport News" #~ msgstr "Newport News" #~ msgid "Newton" #~ msgstr "Newton" #~ msgid "Niagara Falls" #~ msgstr "Niagarini slapovi" #~ msgid "Noatak" #~ msgstr "Noatak" #~ msgid "Nogales" #~ msgstr "Nogales" #~ msgid "Nome" #~ msgstr "Nome" #~ msgctxt "City in Nebraska, United States" #~ msgid "Norfolk" #~ msgstr "Norfolk" #~ msgctxt "City in Virginia, United States" #~ msgid "Norfolk" #~ msgstr "Norfolk" #~ msgid "Norman" #~ msgstr "Norman" #~ msgid "North Adams" #~ msgstr "North Adams" #~ msgid "North Bend" #~ msgstr "North Bend" #~ msgid "North Las Vegas" #~ msgstr "Sjeverni Las Vegas" #~ msgid "North Myrtle Beach" #~ msgstr "North Myrtle Beach" #~ msgid "North Platte" #~ msgstr "North Platte" #~ msgid "North Wilkesboro" #~ msgstr "North Wilkesboro" #~ msgid "Northway" #~ msgstr "Northway" #~ msgid "Norwalk" #~ msgstr "Norwalk" #~ msgid "Norwood" #~ msgstr "Norwood" #~ msgid "Nuiqsut" #~ msgstr "Nuiqsut" #~ msgid "O'Neill" #~ msgstr "O'Neill" #~ msgid "Oak Harbor" #~ msgstr "Oak Harbor" #~ msgid "Oak Island" #~ msgstr "Oak otok" #~ msgid "Oak Ridge" #~ msgstr "Oak Ridge" #~ msgid "Oakdale" #~ msgstr "Oakdale" #~ msgid "Oakland" #~ msgstr "Oakland" #~ msgid "Ocala" #~ msgstr "Ocala" #~ msgid "Ocean City" #~ msgstr "Ocean City" #~ msgid "Oceanside" #~ msgstr "Oceanside" #~ msgid "Odessa" #~ msgstr "Odessa" #~ msgid "Oelwein" #~ msgstr "Oelwein" #~ msgid "Ogallala" #~ msgstr "Ogallala" #~ msgid "Ogden" #~ msgstr "Ogden" #~ msgid "Okeechobee" #~ msgstr "Okeechobee" #~ msgid "Oklahoma City" #~ msgstr "Oklahoma City" #~ msgid "Okmulgee" #~ msgstr "Okmulgee" #~ msgid "Olathe" #~ msgstr "Olathe" #~ msgid "Olive Branch" #~ msgstr "Olive Branch" #~ msgid "Olivia" #~ msgstr "Olivia" #~ msgid "Olney" #~ msgstr "Olney" #~ msgid "Olympia" #~ msgstr "Olympia" #~ msgid "Omaha" #~ msgstr "Omaha" #~ msgid "Omak" #~ msgstr "Omak" #~ msgctxt "City in California, United States" #~ msgid "Ontario" #~ msgstr "Ontario" #~ msgctxt "City in Oregon, United States" #~ msgid "Ontario" #~ msgstr "Ontario" #~ msgctxt "City in California, United States" #~ msgid "Orange" #~ msgstr "Orange" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Orange" #~ msgstr "Orange" #~ msgctxt "City in Texas, United States" #~ msgid "Orange" #~ msgstr "Orange" #~ msgctxt "City in Virginia, United States" #~ msgid "Orange" #~ msgstr "Orange" #~ msgid "Orange City" #~ msgstr "Orange City" #~ msgid "Orangeburg" #~ msgstr "Orangeburg" #~ msgid "Ord" #~ msgstr "Ord" #~ msgid "Orlando" #~ msgstr "Orlando" #~ msgid "Ormond Beach" #~ msgstr "Ormond Beach" #~ msgid "Oroville" #~ msgstr "Oroville" #~ msgid "Orr" #~ msgstr "Orr" #~ msgid "Ortonville" #~ msgstr "Ortonville" #~ msgid "Osceola" #~ msgstr "Osceola" #~ msgid "Oscoda" #~ msgstr "Oscoda" #~ msgid "Oshkosh" #~ msgstr "Oshkosh" #~ msgid "Oskaloosa" #~ msgstr "Oskaloosa" #~ msgid "Ottumwa" #~ msgstr "Ottumwa" #~ msgid "Overland Park" #~ msgstr "Overland Park" #~ msgid "Owatonna" #~ msgstr "Owatonna" #~ msgid "Owensboro" #~ msgstr "Owensboro" #~ msgid "Owosso" #~ msgstr "Owosso" #~ msgctxt "City in Connecticut, United States" #~ msgid "Oxford" #~ msgstr "Oxford" #~ msgctxt "City in Mississippi, United States" #~ msgid "Oxford" #~ msgstr "Oxford" #~ msgctxt "City in North Carolina, United States" #~ msgid "Oxford" #~ msgstr "Oxford" #~ msgid "Oxnard" #~ msgstr "Oxnard" #~ msgid "Ozark" #~ msgstr "Ozark" #~ msgid "Paducah" #~ msgstr "Paducah" #~ msgid "Page" #~ msgstr "Page" #~ msgid "Pagosa Springs" #~ msgstr "Pagosa Springs" #~ msgid "Palacios" #~ msgstr "Palacios" #~ msgid "Palestine" #~ msgstr "Palestine" #~ msgid "Palm Springs" #~ msgstr "Palm Springs" #~ msgid "Palmdale" #~ msgstr "Palmdale" #~ msgid "Palmer" #~ msgstr "Palmer" #~ msgid "Palo Alto" #~ msgstr "Palo Alto" #~ msgid "Pampa" #~ msgstr "Pampa" #~ msgid "Panama City" #~ msgstr "Panama City" #~ msgctxt "City in Illinois, United States" #~ msgid "Paris" #~ msgstr "Paris" #~ msgctxt "City in Texas, United States" #~ msgid "Paris" #~ msgstr "Paris" #~ msgid "Park Rapids" #~ msgstr "Park Rapids" #~ msgid "Parkersburg" #~ msgstr "Parkersburg" #~ msgid "Parsons" #~ msgstr "Parsons" #~ msgctxt "City in California, United States" #~ msgid "Pasadena" #~ msgstr "Pasadena" #~ msgctxt "City in Texas, United States" #~ msgid "Pasadena" #~ msgstr "Pasadena" #~ msgid "Pascagoula" #~ msgstr "Pascagoula" #~ msgid "Pasco" #~ msgstr "Pasco" #~ msgid "Paso Robles" #~ msgstr "Paso Robles" #~ msgid "Paterson" #~ msgstr "Paterson" #~ msgid "Patterson" #~ msgstr "Patterson" #~ msgid "Patuxent" #~ msgstr "Patuxent" #~ msgid "Pauls Valley" #~ msgstr "Pauls Valley" #~ msgid "Pawtucket" #~ msgstr "Pawtucket" #~ msgid "Paxson" #~ msgstr "Paxson" #~ msgid "Paynesville" #~ msgstr "Paynesville" #~ msgid "Peason" #~ msgstr "Peason" #~ msgid "Pecos" #~ msgstr "Pecos" #~ msgid "Pella" #~ msgstr "Pella" #~ msgid "Pellston" #~ msgstr "Pellston" #~ msgid "Pembroke Pines" #~ msgstr "Pembroke Pines" #~ msgid "Pendleton" #~ msgstr "Pendleton" #~ msgid "Penn Yan" #~ msgstr "Penn Yan" #~ msgid "Pensacola" #~ msgstr "Pensacola" #~ msgctxt "City in Arizona, United States" #~ msgid "Peoria" #~ msgstr "Peoria" #~ msgctxt "City in Illinois, United States" #~ msgid "Peoria" #~ msgstr "Peoria" #~ msgid "Perry" #~ msgstr "Perry" #~ msgid "Perryton" #~ msgstr "Perryton" #~ msgctxt "City in Illinois, United States" #~ msgid "Peru" #~ msgstr "Peru" #~ msgctxt "City in Indiana, United States" #~ msgid "Peru" #~ msgstr "Peru" #~ msgctxt "City in Alaska, United States" #~ msgid "Petersburg" #~ msgstr "Petersburg" #~ msgctxt "City in Virginia, United States" #~ msgid "Petersburg" #~ msgstr "Petersburg" #~ msgctxt "City in West Virginia, United States" #~ msgid "Petersburg" #~ msgstr "Petersburg" #~ msgid "Philadelphia" #~ msgstr "Philadelphia" #~ msgid "Philip" #~ msgstr "Philip" #~ msgid "Phillips" #~ msgstr "Phillips" #~ msgid "Phoenix" #~ msgstr "Phoenix" #~ msgid "Pierre" #~ msgstr "Pierre" #~ msgid "Pine Bluff" #~ msgstr "Pine Bluff" #~ msgid "Pine Ridge" #~ msgstr "Pine Ridge" #~ msgid "Pine River" #~ msgstr "Pine River" #~ msgid "Pinedale" #~ msgstr "Pinedale" #~ msgid "Pinehurst" #~ msgstr "Pinehurst" #~ msgid "Pipestone" #~ msgstr "Pipestone" #~ msgid "Pittsburgh" #~ msgstr "Pittsburgh" #~ msgctxt "City in Illinois, United States" #~ msgid "Pittsfield" #~ msgstr "Pittsfield" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Pittsfield" #~ msgstr "Pittsfield" #~ msgid "Placer" #~ msgstr "Placer" #~ msgid "Plainview" #~ msgstr "Plainview" #~ msgid "Plano" #~ msgstr "Plano" #~ msgid "Platinum" #~ msgstr "Platinum" #~ msgid "Plattsburgh" #~ msgstr "Plattsburgh" #~ msgid "Plattsmouth" #~ msgstr "Plattsmouth" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Plymouth" #~ msgstr "Plymouth" #~ msgctxt "City in New Hampshire, United States" #~ msgid "Plymouth" #~ msgstr "Plymouth" #~ msgid "Pocatello" #~ msgstr "Pocatello" #~ msgid "Pohick" #~ msgstr "Pohick" #~ msgid "Point Hope" #~ msgstr "Point Hope" #~ msgid "Point Lay" #~ msgstr "Point Lay" #~ msgid "Point Pleasant" #~ msgstr "Point Pleasant" #~ msgid "Pomona" #~ msgstr "Pomona" #~ msgid "Pompano Beach" #~ msgstr "Pompano Beach" #~ msgid "Ponca City" #~ msgstr "Ponca City" #~ msgctxt "City in Illinois, United States" #~ msgid "Pontiac" #~ msgstr "Pontiac" #~ msgctxt "City in Michigan, United States" #~ msgid "Pontiac" #~ msgstr "Pontiac" #~ msgid "Poplar Bluff" #~ msgstr "Poplar Bluff" #~ msgid "Port Alexander" #~ msgstr "Port Alexander" #~ msgid "Port Alsworth" #~ msgstr "Port Alsworth" #~ msgid "Port Angeles" #~ msgstr "Port Angeles" #~ msgid "Port Aransas" #~ msgstr "Port Aransas" #~ msgid "Port Heiden" #~ msgstr "Port Heiden" #~ msgid "Port Hope" #~ msgstr "Port Hope" #~ msgid "Port Isabel" #~ msgstr "Port Isabel" #~ msgid "Port Lavaca" #~ msgstr "Port Lavaca" #~ msgid "Porterville" #~ msgstr "Porterville" #~ msgctxt "City in Maine, United States" #~ msgid "Portland" #~ msgstr "Portland" #~ msgctxt "City in Oregon, United States" #~ msgid "Portland" #~ msgstr "Portland" #~ msgctxt "City in New Hampshire, United States" #~ msgid "Portsmouth" #~ msgstr "Portsmouth" #~ msgctxt "City in Virginia, United States" #~ msgid "Portsmouth" #~ msgstr "Portsmouth" #~ msgid "Poteau" #~ msgstr "Poteau" #~ msgid "Pottstown" #~ msgstr "Pottstown" #~ msgid "Poughkeepsie" #~ msgstr "Poughkeepsie" #~ msgid "Prairie du Chien" #~ msgstr "Prairie du Chien" #~ msgid "Pratt" #~ msgstr "Pratt" #~ msgid "Prescott" #~ msgstr "Prescott" #~ msgid "Presque Isle" #~ msgstr "Presque Isle" #~ msgid "Preston" #~ msgstr "Preston" #~ msgid "Price" #~ msgstr "Price" #~ msgctxt "City in Minnesota, United States" #~ msgid "Princeton" #~ msgstr "Princeton" #~ msgid "Providence" #~ msgstr "Providence" #~ msgid "Provincetown" #~ msgstr "Provincetown" #~ msgid "Provo" #~ msgstr "Provo" #~ msgid "Pueblo" #~ msgstr "Pueblo" #~ msgid "Punta Gorda" #~ msgstr "Punta Gorda" #~ msgid "Quakertown" #~ msgstr "Quakertown" #~ msgid "Quantico" #~ msgstr "Quantico" #~ msgid "Quillayute" #~ msgstr "Quillayute" #~ msgid "Quincy" #~ msgstr "Quincy" #~ msgid "Racine" #~ msgstr "Racine" #~ msgid "Raleigh" #~ msgstr "Raleigh" #~ msgid "Ramona" #~ msgstr "Ramona" #~ msgid "Rancho Cucamonga" #~ msgstr "Rancho Cucamonga" #~ msgid "Rantoul" #~ msgstr "Rantoul" #~ msgid "Rapid City" #~ msgstr "Rapid City" #~ msgid "Raton" #~ msgstr "Raton" #~ msgid "Rawlins" #~ msgstr "Rawlins" #~ msgid "Reading" #~ msgstr "Reading" #~ msgid "Red Bluff" #~ msgstr "Red Bluff" #~ msgid "Red Oak" #~ msgstr "Red Oak" #~ msgid "Red Wing" #~ msgstr "Red Wing" #~ msgid "Redding" #~ msgstr "Redding" #~ msgid "Redmond" #~ msgstr "Redmond" #~ msgid "Redwood Falls" #~ msgstr "Redwood slapovi" #~ msgid "Reno" #~ msgstr "Reno" #~ msgid "Renton" #~ msgstr "Renton" #~ msgid "Rexburg" #~ msgstr "Rexburg" #~ msgid "Rhinelander" #~ msgstr "Rhinelander" #~ msgid "Rice Lake" #~ msgstr "Rice jezero" #~ msgctxt "City in Virginia, United States" #~ msgid "Richmond" #~ msgstr "Richmond" #~ msgid "Rifle" #~ msgstr "Rifle" #~ msgid "Riverside" #~ msgstr "Riverside" #~ msgid "Riverton" #~ msgstr "Riverton" #~ msgid "Roanoke" #~ msgstr "Roanoke" #~ msgid "Roanoke Rapids" #~ msgstr "Roanoke Rapids" #~ msgid "Robinson" #~ msgstr "Robinson" #~ msgid "Rochelle" #~ msgstr "Rochelle" #~ msgctxt "City in Minnesota, United States" #~ msgid "Rochester" #~ msgstr "Rochester" #~ msgctxt "City in New Hampshire, United States" #~ msgid "Rochester" #~ msgstr "Rochester" #~ msgctxt "City in New York, United States" #~ msgid "Rochester" #~ msgstr "Rochester" #~ msgid "Rock Hill" #~ msgstr "Rock Hill" #~ msgid "Rock Springs" #~ msgstr "Rock Springs" #~ msgid "Rockford" #~ msgstr "Rockford" #~ msgid "Rockland" #~ msgstr "Rockland" #~ msgid "Rockport" #~ msgstr "Rockport" #~ msgid "Rocksprings" #~ msgstr "Rocksprings" #~ msgid "Rocky Mount" #~ msgstr "Rocky Mount" #~ msgid "Roe" #~ msgstr "Roe" #~ msgid "Rogers" #~ msgstr "Rogers" #~ msgid "Rogers City" #~ msgstr "Rogers City" #~ msgctxt "City in Georgia, United States" #~ msgid "Rome" #~ msgstr "Rome" #~ msgctxt "City in New York, United States" #~ msgid "Rome" #~ msgstr "Rome" #~ msgctxt "City in Oregon, United States" #~ msgid "Rome" #~ msgstr "Rome" #~ msgctxt "City in Minnesota, United States" #~ msgid "Roseau" #~ msgstr "Roseau" #~ msgid "Roseburg" #~ msgstr "Roseburg" #~ msgid "Roswell" #~ msgstr "Roswell" #~ msgid "Roxboro" #~ msgstr "Roxboro" #~ msgid "Ruidoso" #~ msgstr "Ruidoso" #~ msgid "Rush City" #~ msgstr "Rush City" #~ msgid "Russell" #~ msgstr "Russell" #~ msgid "Russellville" #~ msgstr "Russellville" #~ msgid "Ruston" #~ msgstr "Ruston" #~ msgid "Rutland" #~ msgstr "Rutland" #~ msgid "Sacramento" #~ msgstr "Sacramento" #~ msgid "Safford" #~ msgstr "Safford" #~ msgid "Saginaw" #~ msgstr "Saginaw" #~ msgid "Saguache" #~ msgstr "Saguache" #~ msgid "Saint Cloud" #~ msgstr "Saint Cloud" #~ msgctxt "City in Alaska, United States" #~ msgid "Saint George" #~ msgstr "Saint George" #~ msgctxt "City in Michigan, United States" #~ msgid "Saint James" #~ msgstr "Saint James" #~ msgctxt "City in Minnesota, United States" #~ msgid "Saint James" #~ msgstr "Saint James" #~ msgid "Saint Johns" #~ msgstr "Saint Johns" #~ msgid "Saint Johnsbury" #~ msgstr "Saint Johnsbury" #~ msgid "Saint Marys" #~ msgstr "Saint Marys" #~ msgid "Saint Marys City" #~ msgstr "Saint Marys City" #~ msgid "Saint Paul" #~ msgstr "Saint Paul" #~ msgctxt "City in Illinois, United States" #~ msgid "Salem" #~ msgstr "Salem" #~ msgctxt "City in Oregon, United States" #~ msgid "Salem" #~ msgstr "Salem" #~ msgid "Salida" #~ msgstr "Salida" #~ msgid "Salina" #~ msgstr "Salina" #~ msgid "Salinas" #~ msgstr "Salinas" #~ msgctxt "City in Maryland, United States" #~ msgid "Salisbury" #~ msgstr "Salisbury" #~ msgctxt "City in North Carolina, United States" #~ msgid "Salisbury" #~ msgstr "Salisbury" #~ msgid "Sallisaw" #~ msgstr "Sallisaw" #~ msgid "Salmon" #~ msgstr "Salmon" #~ msgid "Salt Lake City" #~ msgstr "Salt Lake City" #~ msgid "San Angelo" #~ msgstr "San Angelo" #~ msgid "San Antonio" #~ msgstr "San Antonio" #~ msgid "San Bernardino" #~ msgstr "San Bernardino" #~ msgid "San Carlos" #~ msgstr "San Carlos" #~ msgid "San Diego" #~ msgstr "San Diego" #~ msgid "San Francisco" #~ msgstr "San Francisco" #~ msgid "San Jose" #~ msgstr "San Jose" #~ msgid "San Luis Obispo" #~ msgstr "San Luis Obispo" #~ msgid "Sand Point" #~ msgstr "Sand Point" #~ msgid "Sandberg" #~ msgstr "Sandberg" #~ msgid "Sandpoint" #~ msgstr "Sandpoint" #~ msgid "Sandwich" #~ msgstr "Sandwich" #~ msgctxt "City in Maine, United States" #~ msgid "Sanford" #~ msgstr "Sanford" #~ msgctxt "City in North Carolina, United States" #~ msgid "Sanford" #~ msgstr "Sanford" #~ msgid "Santa Ana" #~ msgstr "Santa Ana" #~ msgid "Santa Barbara" #~ msgstr "Santa Barbara" #~ msgctxt "City in California, United States" #~ msgid "Santa Clara" #~ msgstr "Santa Clara" #~ msgctxt "City in Utah, United States" #~ msgid "Santa Clara" #~ msgstr "Santa Clara" #~ msgid "Santa Fe" #~ msgstr "Santa Fe" #~ msgctxt "City in California, United States" #~ msgid "Santa Maria" #~ msgstr "Santa Maria" #~ msgid "Santa Monica" #~ msgstr "Santa Monica" #~ msgid "Santa Rosa" #~ msgstr "Santa Rosa" #~ msgid "Saranac Lake" #~ msgstr "Jezero Saranac" #~ msgid "Sarasota" #~ msgstr "Sarasota" #~ msgid "Sault Ste. Marie" #~ msgstr "Sault Ste. Marie" #~ msgid "Savanna" #~ msgstr "Savanna" #~ msgid "Savannah" #~ msgstr "Savannah" #~ msgid "Savoonga" #~ msgstr "Savoonga" #~ msgid "Scammon Bay" #~ msgstr "Scammon Bay" #~ msgid "Scappoose" #~ msgstr "Scappoose" #~ msgid "Scottsbluff" #~ msgstr "Scottsbluff" #~ msgid "Scottsdale" #~ msgstr "Scottsdale" #~ msgid "Searcy" #~ msgstr "Searcy" #~ msgid "Seattle" #~ msgstr "Seattle" #~ msgid "Sedalia" #~ msgstr "Sedalia" #~ msgid "Selawik" #~ msgstr "Selawik" #~ msgid "Seldovia" #~ msgstr "Seldovia" #~ msgid "Selinsgrove" #~ msgstr "Selinsgrove" #~ msgctxt "City in Oklahoma, United States" #~ msgid "Seminole" #~ msgstr "Seminole" #~ msgctxt "City in Texas, United States" #~ msgid "Seminole" #~ msgstr "Seminole" #~ msgid "Seward" #~ msgstr "Seward" #~ msgid "Shawnee" #~ msgstr "Shawnee" #~ msgid "Sheboygan" #~ msgstr "Sheboygan" #~ msgid "Shelby" #~ msgstr "Shelby" #~ msgid "Shelbyville" #~ msgstr "Shelbyville" #~ msgid "Sheldon" #~ msgstr "Sheldon" #~ msgid "Shelton" #~ msgstr "Shelton" #~ msgid "Shenandoah" #~ msgstr "Shenandoah" #~ msgid "Sheridan" #~ msgstr "Sheridan" #~ msgid "Sherman" #~ msgstr "Sherman" #~ msgid "Shirley" #~ msgstr "Shirley" #~ msgid "Shishmaref" #~ msgstr "Shishmaref" #~ msgid "Show Low" #~ msgstr "Show Low" #~ msgid "Shreveport" #~ msgstr "Shreveport" #~ msgctxt "City in Montana, United States" #~ msgid "Sidney" #~ msgstr "Sidney" #~ msgctxt "City in Nebraska, United States" #~ msgid "Sidney" #~ msgstr "Sidney" #~ msgid "Sierra Vista" #~ msgstr "Sierra Vista" #~ msgid "Siloam Springs" #~ msgstr "Siloam Springs" #~ msgid "Silver Bay" #~ msgstr "Silver Bay" #~ msgid "Silver City" #~ msgstr "Silver City" #~ msgid "Simi Valley" #~ msgstr "Simi Valley" #~ msgid "Sioux City" #~ msgstr "Sioux City" #~ msgid "Sioux Falls" #~ msgstr "Sioux slapovi" #~ msgid "Siren" #~ msgstr "Siren" #~ msgid "Sisseton" #~ msgstr "Sisseton" #~ msgid "Sitka" #~ msgstr "Sitka" #~ msgid "Skagway" #~ msgstr "Skagway" #~ msgid "Slayton" #~ msgstr "Slayton" #~ msgid "Sleetmute" #~ msgstr "Sleetmute" #~ msgid "Slidell" #~ msgstr "Slidell" #~ msgid "Smithfield" #~ msgstr "Smithfield" #~ msgid "Smyrna" #~ msgstr "Smyrna" #~ msgid "Snyder" #~ msgstr "Snyder" #~ msgid "Soda Springs" #~ msgstr "Soda Springs" #~ msgid "Soldotna" #~ msgstr "Soldotna" #~ msgid "Somerset" #~ msgstr "Somerset" #~ msgid "Somerville" #~ msgstr "Somerville" #~ msgctxt "City in Texas, United States" #~ msgid "Sonora" #~ msgstr "Sonora" #~ msgid "South Bend" #~ msgstr "Južni Bend" #~ msgid "South Haven" #~ msgstr "South Haven" #~ msgid "South Hill" #~ msgstr "South Hill" #~ msgid "South Lake Tahoe" #~ msgstr "South Lake Tahoe" #~ msgctxt "City in Illinois, United States" #~ msgid "Sparta" #~ msgstr "Sparta" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Sparta" #~ msgstr "Sparta" #~ msgid "Spencer" #~ msgstr "Spencer" #~ msgid "Spofford" #~ msgstr "Spofford" #~ msgid "Spokane" #~ msgstr "Spokane" #~ msgid "Springdale" #~ msgstr "Springdale" #~ msgctxt "City in Colorado, United States" #~ msgid "Springfield" #~ msgstr "Springfield" #~ msgctxt "City in Florida, United States" #~ msgid "Springfield" #~ msgstr "Springfield" #~ msgctxt "City in Illinois, United States" #~ msgid "Springfield" #~ msgstr "Springfield" #~ msgctxt "City in Massachusetts, United States" #~ msgid "Springfield" #~ msgstr "Springfield" #~ msgctxt "City in Missouri, United States" #~ msgid "Springfield" #~ msgstr "Springfield" #~ msgctxt "City in Ohio, United States" #~ msgid "Springfield" #~ msgstr "Springfield" #~ msgctxt "City in Vermont, United States" #~ msgid "Springfield" #~ msgstr "Springfield" #~ msgid "St. Louis" #~ msgstr "St. Louis" #~ msgid "Stafford" #~ msgstr "Stafford" #~ msgid "Stamford" #~ msgstr "Stamford" #~ msgid "Stampede" #~ msgstr "Stampede" #~ msgctxt "City in Idaho, United States" #~ msgid "Stanley" #~ msgstr "Stanley" #~ msgid "Stanton" #~ msgstr "Stanton" #~ msgid "Staples" #~ msgstr "Staples" #~ msgid "State College" #~ msgstr "State College" #~ msgid "Statesboro" #~ msgstr "Statesboro" #~ msgid "Statesville" #~ msgstr "Statesville" #~ msgid "Staunton" #~ msgstr "Staunton" #~ msgid "Steamboat Springs" #~ msgstr "Steamboat Springs" #~ msgctxt "City in Texas, United States" #~ msgid "Stephenville" #~ msgstr "Stephenville" #~ msgid "Sterling" #~ msgstr "Sterling" #~ msgid "Sterling Heights" #~ msgstr "Sterling Heights" #~ msgid "Stevens Point" #~ msgstr "Stevens Point" #~ msgid "Stillwater" #~ msgstr "Stillwater" #~ msgctxt "City in California, United States" #~ msgid "Stockton" #~ msgstr "Stockton" #~ msgid "Storm Lake" #~ msgstr "Jezero Storm" #~ msgid "Stuart" #~ msgstr "Stuart" #~ msgid "Sturgeon Bay" #~ msgstr "Sturgeon Bay" #~ msgid "Sturgis" #~ msgstr "Sturgis" #~ msgctxt "City in Arkansas, United States" #~ msgid "Stuttgart" #~ msgstr "Stuttgart" #~ msgid "Suffolk" #~ msgstr "Suffolk" #~ msgid "Sulphur Springs" #~ msgstr "Sulphur Springs" #~ msgid "Sunnyvale" #~ msgstr "Sunnyvale" #~ msgid "Superior" #~ msgstr "Superior" #~ msgid "Sussex" #~ msgstr "Sussex" #~ msgctxt "City in Alaska, United States" #~ msgid "Sutton" #~ msgstr "Sutton" #~ msgctxt "City in West Virginia, United States" #~ msgid "Sutton" #~ msgstr "Sutton" #~ msgid "Sweetwater" #~ msgstr "Sweetwater" #~ msgid "Sylvania" #~ msgstr "Sylvania" #~ msgid "Syracuse" #~ msgstr "Syracuse" #~ msgid "Tacoma" #~ msgstr "Tacoma" #~ msgid "Tahlequah" #~ msgstr "Tahlequah" #~ msgid "Takotna" #~ msgstr "Takotna" #~ msgid "Talkeetna" #~ msgstr "Talkeetna" #~ msgid "Tallahassee" #~ msgstr "Tallahassee" #~ msgid "Tampa" #~ msgstr "Tampa" #~ msgid "Tanana" #~ msgstr "Tanana" #~ msgid "Taos" #~ msgstr "Taos" #~ msgid "Tarryall" #~ msgstr "Tarryall" #~ msgid "Taylorville" #~ msgstr "Taylorville" #~ msgid "Tekamah" #~ msgstr "Tekamah" #~ msgid "Telluride" #~ msgstr "Telluride" #~ msgid "Tempe" #~ msgstr "Tempe" #~ msgid "Temple" #~ msgstr "Hram" #~ msgid "Terre Haute" #~ msgstr "Terre Haute" #~ msgid "Terrell" #~ msgstr "Terrell" #~ msgid "Teterboro" #~ msgstr "Teterboro" #~ msgid "Texarkana" #~ msgstr "Texarkana" #~ msgid "The Dalles" #~ msgstr "The Dalles" #~ msgid "The Villages" #~ msgstr "The Villages" #~ msgid "Thedford" #~ msgstr "Thedford" #~ msgid "Thief River Falls" #~ msgstr "Slapovi rijeke Thief" #~ msgid "Thomaston" #~ msgstr "Thomaston" #~ msgid "Thomson" #~ msgstr "Thomson" #~ msgid "Thousand Oaks" #~ msgstr "Thousand Oaks" #~ msgid "Tillicum" #~ msgstr "Tillicum" #~ msgid "Tin City" #~ msgstr "Tin City" #~ msgid "Titusville" #~ msgstr "Titusville" #~ msgid "Togiak" #~ msgstr "Togiak" #~ msgid "Toledo" #~ msgstr "Toledo" #~ msgid "Tomahawk" #~ msgstr "Tomahawk" #~ msgid "Tonopah" #~ msgstr "Tonopah" #~ msgid "Topeka" #~ msgstr "Topeka" #~ msgid "Torrance" #~ msgstr "Torrance" #~ msgid "Torreon" #~ msgstr "Torreon" #~ msgid "Torrington" #~ msgstr "Torrington" #~ msgid "Tracy" #~ msgstr "Tracy" #~ msgid "Traverse City" #~ msgstr "Traverse City" #~ msgctxt "City in New Jersey, United States" #~ msgid "Trenton" #~ msgstr "Trenton" #~ msgctxt "City in Colorado, United States" #~ msgid "Trinidad" #~ msgstr "Trinidad" #~ msgctxt "City in Alabama, United States" #~ msgid "Troy" #~ msgstr "Troy" #~ msgctxt "City in Michigan, United States" #~ msgid "Troy" #~ msgstr "Troy" #~ msgid "Truckee" #~ msgstr "Truckee" #~ msgid "Truth or Consequences" #~ msgstr "Istina ili posljedice" #~ msgid "Tucson" #~ msgstr "Tucson" #~ msgid "Tucumcari" #~ msgstr "Tucumcari" #~ msgid "Tulsa" #~ msgstr "Tulsa" #~ msgid "Tunica" #~ msgstr "Tunica" #~ msgid "Tupelo" #~ msgstr "Tupelo" #~ msgid "Tuscaloosa" #~ msgstr "Tuscaloosa" #~ msgid "Twentynine Palms" #~ msgstr "Twentynine Palms" #~ msgid "Twin Falls" #~ msgstr "Twin Falls" #~ msgid "Two Harbors" #~ msgstr "Two Harbors" #~ msgid "Tyler" #~ msgstr "Tyler" #~ msgid "Ukiah" #~ msgstr "Ukiah" #~ msgid "Unalakleet" #~ msgstr "Unalakleet" #~ msgid "Unalaska" #~ msgstr "Unalaska" #~ msgid "Unity Village" #~ msgstr "Unity Village" #~ msgid "Universal City" #~ msgstr "Universal City" #~ msgid "Uvalde" #~ msgstr "Uvalde" #~ msgid "Vacaville" #~ msgstr "Vacaville" #~ msgid "Valdez" #~ msgstr "Valdez" #~ msgid "Valdosta" #~ msgstr "Valdosta" #~ msgid "Valentine" #~ msgstr "Valentine" #~ msgid "Vallejo" #~ msgstr "Vallejo" #~ msgctxt "City in Florida, United States" #~ msgid "Valparaiso" #~ msgstr "Valparaiso" #~ msgctxt "City in Indiana, United States" #~ msgid "Valparaiso" #~ msgstr "Valparaiso" #~ msgid "Van Nuys" #~ msgstr "Van Nuys" #~ msgctxt "City in Washington, United States" #~ msgid "Vancouver" #~ msgstr "Vancouver" #~ msgid "Ventura" #~ msgstr "Ventura" #~ msgid "Vernal" #~ msgstr "Vernal" #~ msgctxt "City in Texas, United States" #~ msgid "Vernon" #~ msgstr "Vernon" #~ msgid "Vero Beach" #~ msgstr "Vero Beach" #~ msgctxt "City in Missouri, United States" #~ msgid "Vichy" #~ msgstr "Vichy" #~ msgid "Vicksburg" #~ msgstr "Vicksburg" #~ msgctxt "City in Texas, United States" #~ msgid "Victoria" #~ msgstr "Victoria" #~ msgid "Victorville" #~ msgstr "Victorville" #~ msgid "Vidalia" #~ msgstr "Vidalia" #~ msgid "Vilano Beach" #~ msgstr "Vilano Beach" #~ msgid "Vineyard Haven" #~ msgstr "Vineyard Haven" #~ msgid "Vinton" #~ msgstr "Vinton" #~ msgid "Virginia Beach" #~ msgstr "Virginia Beach" #~ msgid "Visalia" #~ msgstr "Visalia" #~ msgid "Waco" #~ msgstr "Waco" #~ msgid "Wadena" #~ msgstr "Wadena" #~ msgid "Wadesboro" #~ msgstr "Wadesboro" #~ msgid "Wahiawā" #~ msgstr "Wahiawā" #~ msgid "Wahpeton" #~ msgstr "Wahpeton" #~ msgid "Waiki‘i" #~ msgstr "Waiki‘i" #~ msgid "Wainwright" #~ msgstr "Wainwright" #~ msgid "Wakefield" #~ msgstr "Wakefield" #~ msgid "Walla Walla" #~ msgstr "Walla Walla" #~ msgid "Walnut Ridge" #~ msgstr "Walnut Ridge" #~ msgid "Warner Robins" #~ msgstr "Warner Robins" #~ msgid "Warren" #~ msgstr "Warren" #~ msgid "Warroad" #~ msgstr "Warroad" #~ msgctxt "City in Indiana, United States" #~ msgid "Warsaw" #~ msgstr "Warsaw" #~ msgid "Waseca" #~ msgstr "Waseca" #~ msgctxt "City in District of Columbia, United States" #~ msgid "Washington" #~ msgstr "Washington" #~ msgctxt "City in Iowa, United States" #~ msgid "Washington" #~ msgstr "Washington" #~ msgctxt "City in North Carolina, United States" #~ msgid "Washington" #~ msgstr "Washington" #~ msgctxt "City in Pennsylvania, United States" #~ msgid "Washington" #~ msgstr "Washington" #~ msgid "Wasilla" #~ msgstr "Wasilla" #~ msgid "Waskish" #~ msgstr "Waskish" #~ msgid "Waterbury" #~ msgstr "Waterbury" #~ msgctxt "City in Iowa, United States" #~ msgid "Waterloo" #~ msgstr "Waterloo" #~ msgctxt "City in New York, United States" #~ msgid "Watertown" #~ msgstr "Watertown" #~ msgctxt "City in South Dakota, United States" #~ msgid "Watertown" #~ msgstr "Watertown" #~ msgctxt "City in Wisconsin, United States" #~ msgid "Watertown" #~ msgstr "Watertown" #~ msgid "Waterville" #~ msgstr "Waterville" #~ msgid "Watsonville" #~ msgstr "Watsonville" #~ msgid "Waukegan" #~ msgstr "Waukegan" #~ msgid "Waukesha" #~ msgstr "Waukesha" #~ msgid "Waupaca" #~ msgstr "Waupaca" #~ msgid "Wausau" #~ msgstr "Wausau" #~ msgid "Wautoma" #~ msgstr "Wautoma" #~ msgid "Waycross" #~ msgstr "Waycross" #~ msgid "Wayne" #~ msgstr "Wayne" #~ msgid "Waynesville" #~ msgstr "Waynesville" #~ msgid "Weatherford" #~ msgstr "Weatherford" #~ msgid "Webster City" #~ msgstr "Webster City" #~ msgid "Wellsville" #~ msgstr "Wellsville" #~ msgid "Wenatchee" #~ msgstr "Wenatchee" #~ msgid "Wendover" #~ msgstr "Wendover" #~ msgid "Weslaco" #~ msgstr "Weslaco" #~ msgid "West Bend" #~ msgstr "West Bend" #~ msgid "West Chicago" #~ msgstr "Zapadni Chicago" #~ msgid "West Covina" #~ msgstr "West Covina" #~ msgid "West Memphis" #~ msgstr "Zapadni Memphis" #~ msgid "West Palm Beach" #~ msgstr "West Palm Beach" #~ msgid "West Plains" #~ msgstr "West Plains" #~ msgid "West Point" #~ msgstr "West Point" #~ msgid "West Thumb" #~ msgstr "West Thumb" #~ msgid "West Valley City" #~ msgstr "West Valley City" #~ msgid "Westerly" #~ msgstr "Westerly" #~ msgid "Westfield" #~ msgstr "Westfield" #~ msgid "Westhampton Beach" #~ msgstr "Westhampton Beach" #~ msgid "Westminster" #~ msgstr "Westminster" #~ msgid "Wharton" #~ msgstr "Wharton" #~ msgid "Wheaton" #~ msgstr "Wheaton" #~ msgid "Wheeling" #~ msgstr "Wheeling" #~ msgid "White Plains" #~ msgstr "White Plains" #~ msgid "Whitefield" #~ msgstr "Whitefield" #~ msgid "Whittier" #~ msgstr "Whittier" #~ msgid "Wichita" #~ msgstr "Wichita" #~ msgid "Wichita Falls" #~ msgstr "Slapovi Wichita" #~ msgid "Wilkes-Barre" #~ msgstr "Wilkes - Barre" #~ msgid "Williamsburg" #~ msgstr "Williamsburg" #~ msgid "Williamsport" #~ msgstr "Williamsport" #~ msgid "Williston" #~ msgstr "Williston" #~ msgid "Willow" #~ msgstr "Willow" #~ msgctxt "City in Delaware, United States" #~ msgid "Wilmington" #~ msgstr "Wilmington" #~ msgctxt "City in North Carolina, United States" #~ msgid "Wilmington" #~ msgstr "Wilmington" #~ msgctxt "City in Ohio, United States" #~ msgid "Wilmington" #~ msgstr "Wilmington" #~ msgid "Winchester" #~ msgstr "Winchester" #~ msgid "Winder" #~ msgstr "Winder" #~ msgid "Windom" #~ msgstr "Windom" #~ msgid "Window Rock" #~ msgstr "Window Rock" #~ msgid "Windsor Locks" #~ msgstr "Windsor Locks" #~ msgid "Winfield" #~ msgstr "Winfield" #~ msgid "Wink" #~ msgstr "Wink" #~ msgid "Winnemucca" #~ msgstr "Winnemucca" #~ msgid "Winona" #~ msgstr "Winona" #~ msgid "Winslow" #~ msgstr "Winslow" #~ msgid "Winston-Salem" #~ msgstr "Winston - Salem" #~ msgid "Winter Haven" #~ msgstr "Winter Haven" #~ msgid "Winterville" #~ msgstr "Winterville" #~ msgid "Wiscasset" #~ msgstr "Wiscasset" #~ msgid "Wisconsin Rapids" #~ msgstr "Wisconsin Rapids" #~ msgid "Wise" #~ msgstr "Wise" #~ msgid "Wolf Point" #~ msgstr "Wolf Point" #~ msgid "Woodruff" #~ msgstr "Woodruff" #~ msgid "Wooster" #~ msgstr "Wooster" #~ msgid "Worcester" #~ msgstr "Worcester" #~ msgid "Worland" #~ msgstr "Worland" #~ msgid "Worthington" #~ msgstr "Worthington" #~ msgid "Wrangell" #~ msgstr "Wrangell" #~ msgctxt "City in Wyoming, United States" #~ msgid "Wyoming" #~ msgstr "Wyoming" #~ msgid "Yakima" #~ msgstr "Yakima" #~ msgid "Yakutat" #~ msgstr "Yakutat" #~ msgid "Yankton" #~ msgstr "Yankton" #~ msgid "Yonkers" #~ msgstr "Yonkers" #~ msgctxt "City in Nebraska, United States" #~ msgid "York" #~ msgstr "York" #~ msgctxt "City in Pennsylvania, United States" #~ msgid "York" #~ msgstr "York" #~ msgid "Youngstown" #~ msgstr "Youngstown" #~ msgid "Yuma" #~ msgstr "Yuma" #~ msgid "Zanesville" #~ msgstr "Zanesville" #~ msgid "Wake Island, Wake Island Army Airfield Airport" #~ msgstr "Otok Wake, vojna zrakoplovna luka" #~ msgid "Charlotte Amalie" #~ msgstr "Charlotte Amalie" #~ msgid "Christiansted" #~ msgstr "Christiansted" #~ msgid "Carrasco" #~ msgstr "Carrasco" #~ msgid "Colonia" #~ msgstr "Colonia" #~ msgid "Durazno" #~ msgstr "Durazno" #~ msgid "Maldonado" #~ msgstr "Maldonado" #~ msgctxt "City in Uruguay" #~ msgid "Montevideo" #~ msgstr "Montevideo" #~ msgid "Nukus" #~ msgstr "Nukus" #~ msgid "Samarqand" #~ msgstr "Samarqand" #~ msgid "Tashkent" #~ msgstr "Tashkent" #~ msgid "Termiz" #~ msgstr "Termiz" #~ msgid "Urganch" #~ msgstr "Urganch" #~ msgid "Acarigua" #~ msgstr "Acarigua" #~ msgctxt "City in Venezuela" #~ msgid "Barcelona" #~ msgstr "Barcelona" #~ msgid "Barinas" #~ msgstr "Barinas" #~ msgid "Barquisimeto" #~ msgstr "Barquisimeto" #~ msgid "Calabozo" #~ msgstr "Calabozo" #~ msgid "Caracas" #~ msgstr "Caracas" #~ msgid "Ciudad Bolívar" #~ msgstr "Ciudad Bolívar" #~ msgid "Coro" #~ msgstr "Coro" #~ msgid "El Variante" #~ msgstr "El Variante" #~ msgid "El Vigía" #~ msgstr "El Vigía" #~ msgid "Guanare" #~ msgstr "Guanare" #~ msgid "Guaricure" #~ msgstr "Guaricure" #~ msgid "Guasdalito" #~ msgstr "Guasdalito" #~ msgid "Güiria" #~ msgstr "Güiria" #~ msgid "La Chica" #~ msgstr "La Chica" #~ msgid "Maracaibo" #~ msgstr "Maracaibo" #~ msgid "Maracay" #~ msgstr "Maracay" #~ msgid "Maturín" #~ msgstr "Maturín" #~ msgid "Mene Grande" #~ msgstr "Mene Grande" #~ msgid "Morocure" #~ msgstr "Morocure" #~ msgctxt "City in Venezuela" #~ msgid "Mérida" #~ msgstr "Mérida" #~ msgid "Paramillo" #~ msgstr "Paramillo" #~ msgid "Puerto Ayacucho" #~ msgstr "Puerto Ayacucho" #~ msgid "Puerto Borburata" #~ msgstr "Puerto Borburata" #~ msgid "San Antonio del Táchira" #~ msgstr "San Antonio del Táchira" #~ msgid "San Felipe" #~ msgstr "San Felipe" #~ msgctxt "City in Venezuela" #~ msgid "San Fernando" #~ msgstr "San Fernando" #~ msgid "San Juan de los Morros" #~ msgstr "San Juan de los Morros" #~ msgid "San Tomé" #~ msgstr "San Tomé" #~ msgid "Santa Bárbara" #~ msgstr "Santa Bárbara" #~ msgctxt "City in Venezuela" #~ msgid "Valencia" #~ msgstr "Valencia" #~ msgid "Valera" #~ msgstr "Valera" #~ msgid "Da Nang" #~ msgstr "Da Nang" #~ msgid "Hanoi" #~ msgstr "Hanoj" #~ msgid "Ho Chi Minh City" #~ msgstr "Ho Ši Min" #~ msgid "Mata'utu" #~ msgstr "Mata'utu" #~ msgid "'Adan" #~ msgstr "'Adan" #~ msgid "'Ataq" #~ msgstr "'Ataq" #~ msgid "Al Hudaydah" #~ msgstr "Al Hudaydah" #~ msgid "Ma'rib" #~ msgstr "Ma'rib" #~ msgid "Mori" #~ msgstr "Mori" #~ msgid "Sa'dah" #~ msgstr "Sa'dah" #~ msgid "Sanaa" #~ msgstr "Sanaa" #~ msgid "Say'un" #~ msgstr "Say'un" #~ msgid "Ta'izz" #~ msgstr "Ta'izz" #~ msgid "Chinganze" #~ msgstr "Chinganze" #~ msgid "Livingstone" #~ msgstr "Livingstone" #~ msgid "Lusaka" #~ msgstr "Lusaka" #~ msgid "Ndola" #~ msgstr "Ndola" #~ msgid "Mariehamn" #~ msgstr "Mariehamn" #~ msgid "Donakonda" #~ msgstr "Donakonda" #~ msgid "Warangal" #~ msgstr "Warangal" #~ msgid "Abbeville" #~ msgstr "Abbeville" #~ msgid "Acon" #~ msgstr "Acon" #~ msgid "Ambérieu-en-Bugey" #~ msgstr "Ambérieu-en-Bugey" #~ msgid "Avord" #~ msgstr "Avord" #~ msgid "Cazaux" #~ msgstr "Cazaux" #~ msgid "Châlons-en-Champagne" #~ msgstr "Châlons-en-Champagne" #~ msgid "Châteaudun" #~ msgstr "Châteaudun" #~ msgid "Creil" #~ msgstr "Creil" #~ msgid "Kowloon" #~ msgstr "Kowloon" #~ msgid "Shahin Shahr" #~ msgstr "Shahin Shahr" #~ msgid "Monaghan" #~ msgstr "Monaghan" #~ msgid "Elat" #~ msgstr "Elat" #~ msgid "Mahanayim" #~ msgstr "Mahanayim" #~ msgid "Mahane Yisra'el" #~ msgstr "Mahane Yisra'el" #~ msgid "Ramot Remez" #~ msgstr "Ramot Remez" #~ msgid "Valkenburg" #~ msgstr "Valkenburg" #~ msgid "Flesland" #~ msgstr "Flesland" #~ msgid "Strigino" #~ msgstr "Strigino" #~ msgid "Dubnica nad Váhom" #~ msgstr "Dubnica nad Váhom" #~ msgid "Martin" #~ msgstr "Martin" #~ msgid "Nové Zámky" #~ msgstr "Nové Zámky" #~ msgid "Partizánske" #~ msgstr "Partizánske" #~ msgid "Ružomberok" #~ msgstr "Ružomberok" #~ msgid "Spišská Nová Ves" #~ msgstr "Spišská Nová Ves" #~ msgid "Svidník" #~ msgstr "Svidník" #~ msgid "Trenčín" #~ msgstr "Trenčín" #~ msgid "Chagor" #~ msgstr "Chagor" #~ msgid "Kiev" #~ msgstr "Kiev" #~ msgid "Lakeside" #~ msgstr "Lakeside" #~ msgid "Willow Grove" #~ msgstr "Willow Grove" #~ msgid "Liguria" #~ msgstr "Ligurija" #~ msgid "Sardinia" #~ msgstr "Sardinija" #~ msgid "Friuli-Venezia Giulia" #~ msgstr "Furlanija-Julijska krajina" #~ msgid "Puglia" #~ msgstr "Apulija" #~ msgid "Lombardy" #~ msgstr "Lombardija" #~ msgid "Emilia-Romagna" #~ msgstr "Emilia-Romagna" #~ msgid "Trentino-Alto Adige" #~ msgstr "Trentino-Južni Tirol" #~ msgid "Val d'Aosta" #~ msgstr "Valle d'Aosta" #~ msgid "Campania" #~ msgstr "Kampanija" #~ msgid "Piedmont" #~ msgstr "Pijemont" #~ msgid "Sicily" #~ msgstr "Sicilija" #~ msgid "Calabria" #~ msgstr "Kalabrija" #~ msgid "Tuscany" #~ msgstr "Toskana" #~ msgid "Lazio" #~ msgstr "Lacij" #~ msgid "Marche" #~ msgstr "Marke" #~ msgid "Umbria" #~ msgstr "Umbrija" #~ msgid "Abruzzo" #~ msgstr "Abruzzo" #~ msgid "Veneto" #~ msgstr "Veneto" gnome-keysign-1.3.0/keysign/locale/hu/000077500000000000000000000000001431057335600176225ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/hu/LC_MESSAGES/000077500000000000000000000000001431057335600214075ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/hu/LC_MESSAGES/keysign.po000066400000000000000000000364651431057335600234360ustar00rootroot00000000000000# Hungarian translation for gnome-keysign. # Copyright (C) 2019, 2021 Free Software Foundation, Inc. # This file is distributed under the same license as the gnome-keysign package. # # Norbert Makula , 2019. # Balázs Meskó , 2019. # Balázs Úr , 2019, 2021. msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2021-09-14 01:57+0200\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 19.12.3\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " A GNOME Kulcsaláíró lehetővé teszi, hogy OpenPGP kulcsokat írjon\n" " alá kényelmesen és biztonságosan a helyi hálózaton vagy\n" " Bluetoothon keresztül.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Képes leolvasni egy másik kulcs vonalkódját, és biztonságosan\n" " átküldeni a kulcsot, így egyszerű kétszereplős kulcsaláírást\n" " biztosít. Követi a legjobb gyakorlatokat azáltal, hogy a\n" " felhasználó által beállított levelezőprogramot használja a\n" " kulcs UID-jaihoz tartozó titkosított aláírások elküldéséhez.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Kulcsaláíró" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Egy kulcsaláíró segédprogram, hogy kényelmesen cserélhessen OpenPGP " "kulcsokat a barátaival" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;kulcs;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Küldés" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Fogadás" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Ajánló kulcs: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Felfedezési információ: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Nyomja meg az Entert a leállításhoz" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Meg kell adnia egy argumentumot a kulcs azonosításához" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth nem érhető el" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Nyomja meg az Entert a megszakításhoz" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Kulcs sikeresen elküldve" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Hiba történt: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Nyomja meg az Entert a kilépéshez" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "A kulcs letöltésének kísérlete, kérem várjon" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Nem indítható el az Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "A Kulcsaláíró nem tudja automatikusan elindítani az Avahit. A probléma " "megoldásához megpróbálhatja végrehajtani a „systemctl start avahi-daemon” " "parancsot." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Hibát észleltünk" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Egy programozási hibát észleltünk." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Figyelmen kívül hagyhatja ezt a hibát, és folytathatja a munkát, de váratlan " "eredményeket tapasztalhat.\n" "\n" "Értesítse a fejlesztőket erről a problémáról a hibakövetőn keresztül, ha még " "senki más nem jelentette." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Keresés a hibakövetőben…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Jelentés…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Hiba figyelmen kívül hagyása" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Kilépés a GNOME Kulcsaláíróból" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Részletek…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Kivétel történt a kivétel elemzésekor." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Leírás\n" "\n" " Adjon egy rövid, beszédes (angol) címet a jelentésnek.\n" " Használjon valami ilyesmit a címhez:\n" " \"{funkció-amely-nem-működik}: {mi-romlott-el}\"\n" " ha lehetséges.\n" " Aztán cserélje ki ezt a szöveget a\n" " hiba hosszabb (angol) leírására.\n" " A képernyőképek és a videók is nagyszerűek!\n" "\n" " #### Reprodukálási lépések\n" "\n" " Mondja el, hogy mit csinált, amikor megjelent\n" " a hibaüzenet Ha tud lépésről lépésre szóló\n" " utasításokat adni a hiba reprodukálásáról,\n" " az még jobb.\n" "\n" " #### Nyomkövetés\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Lejárat: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Kulcs aláírása" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Válasszon fájlt a mentéshez" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "A GNOME Kulcsaláíró kiszolgálók nem érhetőek el :-(\n" "Keressen egy barátot, akivel a GNOME Kulcsaláírót fogja használni.\n" "Kapcsolódási problémái is lehetnek.\n" "További információkért nézze meg a dokumentációt." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Más kulcsának aláírásához olvassa le a QR-kódját vagy adja meg a " "biztonsági kódot" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Integrált webkamera" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Biztonsági kód" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Vonalkód leolvasása" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Kulcsadatok letöltése. Kérem várjon…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "A kulcs letöltése megszakadt!" #: keysign/receive.ui:346 #| msgid "Display more details for the error." msgid "Show details about the error" msgstr "Részletek megjelenítése a hibával kapcsolatban" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Hiba a tanúsítványok előállításakor ☹\n" "Valami elromlott. Valamikor a jelmondatot nem helyesen adták meg.\n" "A „megerősítés” gombra kattintva újra megpróbálhatja." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Különálló fájlokként menti az előállított tanúsítványokat egy egyéni " "könyvtárba" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importálja az előállított tanúsítványok átmeneti verzióját a helyi " "kulcstartóba" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "A tanúsítványok sikeresen elő lettek állítva.\n" "Importálhat egy átmeneti aláírást a kulcs használatának megkezdéséhez, " "mintha az már megfelelően ellenőrizve lett volna.\n" "További információkért nézze meg a dokumentációt." #: keysign/receive.ui:541 msgid "Key" msgstr "Kulcs" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID-k" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "A kulcs aláírásához erősítse meg, hogy a következő kulcsot akarja aláírni.\n" "Ez egy e-mailt fog előállítani, amelyet el kell küldeni az aláírási folyamat " "befejezéséhez." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "_Megerősítés" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "A következő UID-k aláírása:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Még mindig nem sikerült internetkapcsolatot szerezni. Lassúnak tűnik vagy " "nem érhető el." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Nincs internetkapcsolat!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Kulcs sikeresen elküldve.\n" "Hamarosan meg kell kapnia az e-mailt az aláírással." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Nem sikerült biztonságos kapcsolatot kiépíteni.\n" "Vagy hibás kódot adott meg a partnere, vagy valaki megpróbálta elfogni a " "kapcsolatát" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Váratlan hiba történt:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Kulcs kiválasztása és küldése" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Kulcs kiválasztása és küldése" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Az internet használata a tanúsítvány átviteléhez is" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Nincs egyetlen kulcsa sem.\n" "Használja például a Seahorse programot a létrehozáshoz." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Nagyon lassú vagy nincs internetkapcsolat." #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Az aláírás sikeresen importálva lett!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Visszaadja a megkapott tanúsítványt a küldőnek, azért hogy a küldő " "használhassa az OpenPGP tanúsítványát" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Több részlet megjelenítése a hibánál." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Hiba történt az aláírás importálásának kísérlete közben." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Válassza ki az aláírandó kulcsot" #: keysign/send.ui:443 msgid "Times signed" msgstr "Aláírások száma" #: keysign/send.ui:510 msgid "Keylist" msgstr "Kulcslista" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "A kulcs aláírásához a másik személynek meg kell adnia a biztonsági " "kódját, vagy le kell olvasnia a QR-kódját" #: keysign/send.ui:557 msgid "Key Details" msgstr "Kulcs részletei" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Ujjlenyomat" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR-kód" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Kedves $uid,\n" "\n" "\n" "Aláírtam a kulcsodat:\n" "\n" " $fingerprint\n" "\n" "\n" "Köszönöm, hogy aláírhattam a kulcsod.\n" "\n" "--\n" "GNOME Kulcsaláíró\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Hibás üzenethitelesítő-kód" gnome-keysign-1.3.0/keysign/locale/id/000077500000000000000000000000001431057335600176025ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/id/LC_MESSAGES/000077500000000000000000000000001431057335600213675ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/id/LC_MESSAGES/keysign.po000066400000000000000000000356271431057335600234150ustar00rootroot00000000000000# Indonesian translation for gnome-keysign. # Copyright (C) 2018 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Kukuh Syafaat , 2018-2020. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-05-31 17:44+0700\n" "Last-Translator: Andika Triwidada \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural= n!=1;\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME-Keysign memungkinkan penandatanganan kunci OpenPGP dengan nyaman " "dan aman\n" " melalui jaringan lokal atau Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Ini dapat memindai kode kunci lain dan mentransfer kunci secara " "aman, \n" " memungkinkan sesi penandatanganan dua-pihak kasual.\n" " Ini mengikuti praktik terbaik dengan mengirimkan tanda tangan " "terenkripsi\n" " ke UID kunci menggunakan klien Surel yang dikonfigurasi pengguna\n" " untuk digunakan.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Penolong penandatanganan kunci untuk memungkinkan Anda untuk secara nyaman " "bertukar kunci OpenPGP dengan seorang teman" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;kunci;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Kirim" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Terima" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Kunci penawaran: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Info penemuan: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Tekan Enter untuk berhenti" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Anda harus memberikan argumen untuk mengidentifikasi kunci" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth tidak tersedia" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Tekan Enter untuk membatalkan" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Kunci berhasil dikirim" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Terjadi kesalahan: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Tekan Enter untuk keluar" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Mencoba mengunduh kunci, harap tunggu" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Tidak Dapat Memulai Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysign tidak dapat memulai Avahi secara otomatis. Anda dapat mencoba " "menjalankan `systemctl start avahi-daemon` untuk menyelesaikan masalah ini." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Kutu Terdeteksi" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Kesalahan pemrograman telah terdeteksi." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Anda mungkin dapat mengabaikan kesalahan ini dan terus bekerja, tetapi Anda " "mungkin mendapatkan hasil yang tidak diharapkan.\n" "\n" "Beri tahu pengembang tentang hal ini menggunakan pelacak masalah jika belum " "ada yang melaporkannya." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Cari Pelacak..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Laporkan..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Abaikan Kesalahan" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Keluar GNOME Keysign" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Detail..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Pengecualian saat menganalisis pengecualian." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Deskripsi\n" "\n" "             Berikan laporan ini judul deskriptif singkat.\n" "             Gunakan sesuatu seperti\n" "             \"{fitur-yang-rusak}: {apa-yang-salh}\"\n" "             untuk judul, jika Anda bisa.\n" "             Kemudian mohon ganti teks ini\n" "             dengan deskripsi kutu yang lebih panjang.\n" "             Tangkapan layar atau video juga bagus!\n" "\n" "             #### Langkah-langkah untuk mereproduksi\n" "\n" "             Tolong beri tahu kami apa yang Anda lakukan\n" "             ketika pesan kesalahan muncul.\n" "             Jika Anda dapat memberikan petunjuk langkah demi langkah\n" "             tentang cara mereproduksi kutu,\n" "             itu lebih baik.\n" "\n" "             #### Melacak kembali\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Kedaluwarsa: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Kunci Tanda Tangan" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Pilih berkas untuk disimpan" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Tidak ada peladen GNOME Keysign di sekitar Anda :-(\n" "Temukan teman untuk menggunakan GNOME Keysign.\n" "Anda mungkin juga mengalami masalah konektivitas.\n" "Untuk informasi lebih lanjut, kunjungi di sini." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Untuk menandatangani kunci seseorang, pindai QR mereka atau masukkan " "kode keamanan" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Kamera Web Terpadu" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Kode Keamanan" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Pindai Kode Batang" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Mengunduh data-kunci. Mohon tunggu..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Unduhan kunci terputus!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Tampilkan detil lebih lanjut tentang galat" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Galat saat membuat sertifikasi ☹\n" "Ada sesuatu yang salah. Terkadang, frasa sandi tidak dimasukkan dengan " "benar.\n" "Anda dapat mencoba lagi dengan mengklik tombol \"konfirmasi\"." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Simpan sertifikasi yang dihasilkan sebagai berkas terpisah di direktori " "khusus" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Impor versi sementara dari sertifikasi yang diproduksi ke ring kunci lokal" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Sertifikasi berhasil dihasilkan.\n" "Anda dapat mengimpor tanda tangan sementara untuk mulai menggunakan kunci " "seolah-olah sudah diverifikasi dengan benar.\n" "Untuk informasi lebih lanjut, kunjungi dokumentasi." #: keysign/receive.ui:541 msgid "Key" msgstr "Kunci" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Untuk menandatangani kunci, konfirmasikan bahwa Anda ingin menandatangani " "kunci berikut.\n" "Ini akan menghasilkan surel yang harus dikirim untuk menyelesaikan proses " "penandatanganan." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "K_onfirmasi" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Menandatangani UID berikut:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Masih mencoba mendapatkan koneksi ke Internet. Tampaknya lambat atau tidak " "tersedia." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Tidak ada koneksi internet!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Kunci berhasil dikirim.\n" "Anda harus segera menerima surel dengan tanda tangan." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Tidak dapat membuat sambungan aman.\n" "Entah pasangan Anda memasukkan kode yang salah atau seseorang mencoba " "mencegat koneksi Anda" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Kesalahan tak terduga terjadi:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Pilih dan kirim kunci" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Pilih dan Kirim kunci" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Gunakan juga Internet untuk mentransfer sertifikat" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Anda tidak memiliki kunci apa pun!\n" "Silakan gunakan, mis. Seahorse untuk membuatnya." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Koneksi internet sangat lambat atau tidak ada!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Tanda tangan telah berhasil diimpor!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Mengembalikan sertifikasi yang diterima kembali ke pengirim, sehingga " "pengirim dapat menggunakan sertifikat OpenPGP Anda" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Tampilkan detil lebih lanjut untuk galat tersebut." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Timbul galat saat coba mengimpor tanda tangan." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Pilih kunci untuk menandatangani" #: keysign/send.ui:443 msgid "Times signed" msgstr "Jumlah tanda tangan" #: keysign/send.ui:510 msgid "Keylist" msgstr "Daftar kunci" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Untuk memasukkan kunci yang ditandatangani, orang lain harus " "memasukkan kode keamanan, atau memindai kode QR" #: keysign/send.ui:557 msgid "Key Details" msgstr "Detail Kunci" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Sidik Jari" #: keysign/send.ui:736 msgid "QR Code" msgstr "Kode QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Hai $uid,\n" "\n" "\n" "Saya baru saja menandatangani kunci Anda\n" "\n" "       $sidikjari\n" "\n" "\n" "Terima kasih telah mengizinkan saya menandatangani kunci Anda!\n" "\n" "-\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Kode autentikasi pesan salah" gnome-keysign-1.3.0/keysign/locale/it/000077500000000000000000000000001431057335600176225ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/it/LC_MESSAGES/000077500000000000000000000000001431057335600214075ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/it/LC_MESSAGES/keysign.po000066400000000000000000000336541431057335600234330ustar00rootroot00000000000000# Italian translations for gnome-keysign. # Copyright (C) 2017 Tobias Mueller # Copyright (C) 2018, 2019, 2020 The Free Software Foundation, Inc. # This file is distributed under the same license as the gnome-keysign # project. # Ludovico de Nittis , 2017, 2018. # Milo Casagrande , 2019, 2020. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign 0.9\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2020-07-13 10:07+0000\n" "PO-Revision-Date: 2020-09-10 11:32+0200\n" "Last-Translator: Milo Casagrande \n" "Language-Team: it \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Generated-By: Babel 2.5.1\n" "X-Generator: Poedit 2.4.1\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME-Keysign permette di firmare chiavi OpenPGP in modo semplice e " "sicuro\n" " utilizzando la rete locale o il Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " È possibile leggere il codice a barre di un altro e trasferire la " "chiave\n" " in modo sicuro, permettendo a due persone di effettuare una sessione " "di\n" " firma delle chiavi.\n" " Segue le linee guida inviando le firme cifrate agli UID della chiave\n" " utilizzando il client email configurato dall'utente.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Un programma di aiuto alla firma delle chiavi che permette di scambiare " "chiavi OpnePGP con un amico in modo semplice" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;chiave;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:187 msgid "Send" msgstr "Invia" #: keysign/app.py:189 keysign/receive.py:272 msgid "Receive" msgstr "Ricevi" #: keysign/app.ui:62 keysign/send.ui:54 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Invio della chiave: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informazioni per la ricerca: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Premere Invio per fermare" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "È necessario fornire un argomento per identificare la chiave" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Porta: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth non disponibile" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Premere Invio per annullare" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Chiave inviata con successo" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Errore: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Premere Invio per uscire" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "La chiave viene scaricata, attendere" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Impossibile avviare Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Impossibile avviare automaticamente Avahi. È possibile eseguire «systemctl " "start avahi-daemon» per cercare di risolvere il problema." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Ok" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Rilevato errore" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "È stato trovato un errore di programmazione." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Dovrebbe essere possibile continuare il lavoro ignorando l'errore, ma " "potrebbero verificarsi risultati non previsti.\n" "\n" "È utile segnalare questo problema agli sviluppatori utilizzando il sistema " "di tracciamento dei bug." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Cerca sul tracker..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Segnala..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignora errore" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Chiudi GNOME Keysign" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Dettagli..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Eccezione mentre si analizzava l'eccezione." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Descrizione\n" "\n" " Dare a questa segnalazione un breve titolo descrittivo.\n" " Se possibile, per il titolo usare una cosa simile a\n" " \"{funzione-con-il-problema}: {cosa-non-ha-funzionato}\"\n" " Inoltre sostituire questo testo\n" " con una descrizione più dettagliata del bug.\n" " Immagini o video sono molto apprezzati!\n" "\n" " #### Passi per riprodurlo\n" "\n" " Descrivere quello che si stava facendo\n" " quando si è presentato il messaggio di errore.\n" " Se possibile, fornire istruzioni passo passo\n" " su come riprodurre il bug.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Scadenza: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Firma chiave" #: keysign/receive.py:218 msgid "Select file for saving" msgstr "Scegliere file da salvare" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Nessun server di GNOME Keysign nelle vicinanze.\n" "Cercare un amico con cui usare GNOME Keysign.\n" "Potrebbe anche essere un problema di connettività.\n" "Per maggiori informazioni consultare la documentazione." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Per firmare la chiave di qualcuno, leggere il loro QR o inserire il " "codice di sicurezza" #: keysign/receive.ui:127 msgid "Camera" msgstr "Fotocamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Fotocamera integrata" #: keysign/receive.ui:179 keysign/send.ui:568 msgid "Security Code" msgstr "Codice di sicurezza" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Scansiona codice a barre" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Scaricamento dati, attendere..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Scaricamento della chiave interrotto." #: keysign/receive.ui:345 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Salva le certificazioni create come file separati in una directory " "personalizzata" #: keysign/receive.ui:360 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importa nel portachiavi una versione temporanea delle certificazioni create" #: keysign/receive.ui:403 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Certificazioni create con successo.\n" "È possibile importare una firma temporanea per utilizzare la chiave come se " "fosse stata verificata correttamente.\n" "Per maggiori informazioni consultare la documentazione." #: keysign/receive.ui:446 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Per firmare la chiave, confermare di voler firmare la chiave seguente.\n" "Questo genererà un'email che dovrà essere inviata per poter completare il " "processo di firma." #: keysign/receive.ui:474 msgid "Key" msgstr "Chiave" #: keysign/receive.ui:507 keysign/send.ui:493 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "C_onferma" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "Firmando i seguenti UID:" #: keysign/send.py:207 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Tentativo di connessione a Internet in corso. La rete sembra essere lenta o " "non disponibile." #: keysign/send.py:213 msgid "There isn't an Internet connection!" msgstr "Non c'è una connessione a Internet." #: keysign/send.py:219 keysign/send.ui:267 msgid "The signature has been successfully imported!" msgstr "La firma è stata importata con successo." #: keysign/send.py:225 msgid "" "An error occurred while trying to import the signature.\n" "Please double check the correctness of the chosen signature." msgstr "" "Si è verificato un errore nell'importare la firma.\n" "Assicurarsi accuratamente della correttezza della firma selezionata." #: keysign/send.py:254 keysign/send.ui:678 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Chiave inviata con successo.\n" "Si dovrebbe ricevere presto una email con la firma." #: keysign/send.py:259 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Impossibile stabilire una connessione sicura.\n" "O l'altra parte ha inserito un codice errato o qualcuno ha tentato di " "intercettare la connessione" #: keysign/send.py:263 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Si è verificato un errore non previsto:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Scegliere e inviare la chiave" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Scegliere e inviare la chiave" #: keysign/send.ui:121 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Nessuna chiave presente.\n" "Crearne una usando per esempio «Seahorse»." #: keysign/send.ui:198 msgid "Very slow or no Internet connection!" msgstr "Connessione a Internet molto lenta o assente." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:322 msgid "Select a key for signing" msgstr "Scegliere una chiave da firmare" #: keysign/send.ui:338 msgid "Times signed" msgstr "Volte firmata" #: keysign/send.ui:405 msgid "Keylist" msgstr "Elenco chiavi" #: keysign/send.ui:425 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Per avere la chiave firmata, l'altra persona deve inserire il codice " "di sicurezza, o leggere il codice QR" #: keysign/send.ui:452 msgid "Key Details" msgstr "Dettagli chiave" #: keysign/send.ui:477 msgid "Fingerprint" msgstr "Impronta" #: keysign/send.ui:631 msgid "QR Code" msgstr "Codice QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Ciao $uid,\n" "\n" "\n" "ho appena firmato la tua chiave\n" "\n" " $fingerprint\n" "\n" "\n" "Grazie per avermi consentito di firmare la tua chiave!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Codice autenticazione messaggio errato" gnome-keysign-1.3.0/keysign/locale/nl/000077500000000000000000000000001431057335600176175ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/nl/LC_MESSAGES/000077500000000000000000000000001431057335600214045ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/nl/LC_MESSAGES/keysign.po000066400000000000000000000362441431057335600234260ustar00rootroot00000000000000# Dutch translation for gnome-keysign. # Copyright (C) 2019 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Nathan Follens , 2019-2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2021-09-07 20:58+0200\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " Gnome Keysign laat u eenvoudig en veilig OpenPGP-sleutels " "ondertekenen\n" " via het lokale netwerk of Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Het kan de barcode van een andere sleutel scannen en de sleutel veilig " "overdragen,\n" " wat informele sleutelondertekeningssessies tussen twee partijen " "mogelijk maakt.\n" " Het verzendt de versleutelde ondertekeningen naar de UID’s van een " "sleutel\n" " met de door de gebruiker ingestelde e-mailcliënt.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Een hulpprogramma dat u eenvoudig OpenPGP-sleutels laat uitwisselen met een " "vriend" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;sleutel;versleuteling;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Verzenden" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Ontvangen" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Sleutel wordt aangeboden: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Ontdekkingsinfo: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Druk op Enter om te stoppen" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "U dient een parameter in te voeren om de sleutel te identificeren" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Poort: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth niet beschikbaar" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Druk op Enter om te annuleren" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Sleutel verzonden" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Er is een fout opgetreden: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Druk op Enter om af te sluiten" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Poging tot downloaden van sleutel, even geduld" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Kan Avahi niet starten" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysign kan Avahi niet automatisch starten. U kunt `systemctl start avahi-" "daemon` proberen uitvoeren om dit probleem op te lossen." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Oké" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Fout gedetecteerd" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Er is een programmeerfout gedetecteerd." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "U kunt deze fout negeren en verderwerken, maar dit kan tot onverwachte " "resultate leiden.\n" "\n" "Gelieve de ontwikkelaars over deze fout te informeren indien niemand anders " "dit al heeft gedaan." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Tracker doorzoeken…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Melden…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Fout negeren" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Gnome Keysign afsluiten" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Details…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Uitzondering bij analyseren van uitzondering." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Beschrijving\n" "\n" " Geef deze melding een korte, beschrijvende titel.\n" " Gebruik iets als\n" " \"{functie-die-niet-juist-werkt}: {wat-ging-er-mis}\"\n" " als titel, indien mogelijk.\n" " Vervang dan deze tekst met\n" " een uitgebreidere beschrijving van de fout.\n" " Schermafdrukken of filmpjes zijn ook nuttig!\n" "\n" " #### Stappen om te reproduceren\n" "\n" " Vertel ons wat u aan het doen was\n" " toen het foutbericht te voorschijn kwam.\n" " Als u stap-voor-stap-instructies kunt geven\n" " over hoe u de fout kunt reproduceren,\n" " is dat nog beter.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Verloopt: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Sleutel ondertekenen" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Kies een bestand om op te slaan" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Geen Gnome Keysign-servers in de buurt :-(\n" "Probeer Gnome Keysign uit met een vriend.\n" "U kunt mogelijk last ondervinden van verbindingsproblemen.\n" "Bekijk de " "documentatie voor meer informatie." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Om iemands sleutel te ondertekenen, scant u hun QR-code of voert u de " "beveiligingscode in" #: keysign/receive.ui:127 msgid "Camera" msgstr "Camera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Geïntegreerde webcam" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Beveiligingscode" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Barcode scannen" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Sleutelgegevens worden gedownload. Even geduld…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Downloaden van sleutel onderbroken!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Informatie over de fout weergeven" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Fout bij produceren van certificaten ☹\n" "Er is iets misgegaan. Mogelijk is het wachtwoord niet correct ingevoerd.\n" "U kunt het opnieuw proberen door op de knop ‘Bevestigen’ te drukken." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Slaat de geproduceerde certificaten op als aparte bestanden in een map naar " "keuze" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Leest een tijdelijke versie van de geproduceerde certificaten in de lokale " "sleutelbos in" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Certificaten geproduceerd.\n" "U kunt een tijdelijke ondertekening inlezen om de sleutel al te gebruiken " "alsof hij reeds volledig geverifieerd is.\n" "Bekijk de documentatie voor meer informatie." #: keysign/receive.ui:541 msgid "Key" msgstr "Sleutel" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID’s" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Om de sleutel te onderteken, bevestigt u dat u volgende sleutel wilt " "ondertekenen.\n" "Dit zal een e-mail genereren die verzonden meot worden om het " "ondertekeningsproces te voltooien." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "B_evestigen" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Volgende UID’s worden ondertekend:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Nog steeds geen toegang tot het internet. Het lijkt traag of niet " "beschikbaar te zijn." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Er is geen internetverbinding!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Sleutel verzonden.\n" "U ontvangt normaal gezien binnenkort een e-mail met de ondertekening." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Kon geen beveiligde verbinding instellen.\n" "Uw partner heeft een verkeerde code ingevoerd, of iemand heeft uw verbinding " "proberen onderscheppen" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Er is een onverwachte fout opgetreden:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Sleutel kiezen en verzenden" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Sleutel kiezen en verzenden" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Gebruik ook het internet om het certificaat over te dragen" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "U heeft geen sleutels!\n" "Gebruik bv. Seahorse om er een aan te maken." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Zeer trage of geen internetverbinding!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "De ondertekening is ingelezen!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Stuurt het ontvangen certificaat terug naar de afzender, zodat de afzender " "gebruik kan maken van uw OpenPGP-certificaat" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Meer informatie over de fout weergeven." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Er is een fout opgetreden bij het inlezen van de ondertekening." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Selecteer een sleutel voor ondertekenen" #: keysign/send.ui:443 msgid "Times signed" msgstr "Aantal keer ondertekend" #: keysign/send.ui:510 msgid "Keylist" msgstr "Sleutellijst" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Om de sleutel te laten ondertekenen, moet de andere persoon de " "beveiligingscode invoeren of de QR-code scannen" #: keysign/send.ui:557 msgid "Key Details" msgstr "Sleuteldetails" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Vingerafdruk" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR-code" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Hallo $uid,\n" "\n" "\n" "Ik heb uw sleutel net ondertekend\n" "\n" " $fingerprint\n" "\n" "\n" "Bedankt dat ik uw sleutel mocht ondertekenen!\n" "\n" "--\n" "Gnome Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Verkeerde berichtauthenticatiecode" #~ msgid "" #~ "Uses the Internet to transport the key rather than the local network and " #~ "Bluetooth (if available)" #~ msgstr "" #~ "Gebruikt het internet om de sleutel te transporteren in plaats van het " #~ "lokale netwerk en Bluetooth (indien beschikbaar)" #~ msgid "Translated for gettext (C)" #~ msgstr "Vertaald voor gettext (C)" #~ msgid "Translated for Python (C)" #~ msgstr "Vertaald voor Python (C)" gnome-keysign-1.3.0/keysign/locale/pl/000077500000000000000000000000001431057335600176215ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/pl/LC_MESSAGES/000077500000000000000000000000001431057335600214065ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/pl/LC_MESSAGES/keysign.po000066400000000000000000000355601431057335600234300ustar00rootroot00000000000000# Polish translation for gnome-keysign. # Copyright © 2018-2021 the gnome-keysign authors. # This file is distributed under the same license as the gnome-keysign package. # Piotr Drąg , 2018-2021. # Aviary.pl , 2018-2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-04-18 12:25+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Keysign umożliwia wygodne i bezpieczne podpisywanie kluczy\n" " OpenPGP przez sieć lokalną lub Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Można zeskanować kod kreskowy innego klucza i bezpiecznie go\n" " przesłać, co umożliwia przeprowadzanie nieformalnych sesji\n" " podpisywania kluczy przez dwie osoby.\n" " Program używa sprawdzonych zasad, wysyłając zaszyfrowane podpisy\n" " do UID klucza za pomocą klienta poczty skonfigurowanego przez\n" " użytkownika.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Pomocnik podpisywania kluczy umożliwiający wygodną wymianę kluczy OpenPGP ze " "znajomymi" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "gpg;gnupg;klucz;openpgp;podpisz;podpisywanie;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Wyślij" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Odbierz" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Proponowany klucz: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informacje o wykrywaniu: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Naciśnięcie klawisza Enter zatrzyma" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Należy podać parametr, aby zidentyfikować klucz" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth jest niedostępny" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Naciśnięcie klawisza Enter anuluje" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Pomyślnie wysłano klucz" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Wystąpił błąd: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Naciśnięcie klawisza Enter zakończy" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Próba pobrania klucza, proszę czekać" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Nie można uruchomić usługi Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Nie można automatycznie uruchomić usługi Avahi. Można spróbować wykonać " "polecenie „systemctl start avahi-daemon”, aby rozwiązać ten problem." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Wykryto błąd" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Wykryto błąd programu." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Być może można zignorować ten błąd i kontynuować działanie, ale może to " "spowodować nieoczekiwane wyniki.\n" "\n" "Proszę poinformować o tym programistów za pomocą systemu śledzenia błędów " "(w języku angielskim), jeśli nikt jeszcze tego nie zrobił." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Przeszukaj system śledzenia błędów…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Zgłoś…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Zignoruj błąd" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Zakończ program" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Szczegóły…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Wyjątek podczas analizowania wyjątku." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Opis\n" "\n" " Nadaj temu zgłoszeniu krótki opisowy tytuł.\n" " Napisz coś w stylu\n" " „{funkcja, która nie działa}: {co się zepsuło}”\n" " jako tytuł, jeśli możesz.\n" " Następnie zastąp ten tekst\n" " dłuższym opisem błędu.\n" " Zrzuty ekranu i nagrania też są przydatne!\n" "\n" " #### Jak powtórzyć\n" "\n" " Powiedz nam, co próbowano zrobić,\n" " kiedy pojawił się błąd.\n" " Jeśli możesz podać instrukcje krok po kroku\n" " jak powtórzyć błąd,\n" " to nawet lepiej.\n" "\n" " #### Wyjątek\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Wygasa: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Podpisz klucz" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Wybór pliku do zapisania" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Nie ma żadnych serwerów GNOME Keysign. ☹\n" "Należy znaleźć znajomego, aby móc użyć GNOME Keysign.\n" "Mogą też występować problemy z łącznością.\n" "Dokumentacja zawiera więcej informacji." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Aby podpisać czyjś klucz, należy zeskanować jego kod QR lub wpisać " "kod zabezpieczeń" #: keysign/receive.ui:127 msgid "Camera" msgstr "Aparat" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Zintegrowana kamerka internetowa" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Kod zabezpieczeń" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Zeskanuj kod kreskowy" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Pobieranie danych klucza. Proszę czekać…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Pobieranie klucza zostało przerwane." #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Wyświetla informacje o błędzie" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Błąd podczas tworzenia certyfikacji. ☹\n" "Coś się nie powiodło. Czasami okazuje się, że hasło zostało błędnie podane.\n" "Można spróbować ponownie klikając przycisk „Potwierdź”." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Zapisuje utworzone certyfikaty jako oddzielne pliki w niestandardowym " "katalogu" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importuje tymczasową wersję utworzonych certyfikatów do lokalnej bazy kluczy" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Pomyślnie utworzono certyfikaty.\n" "Można zaimportować tymczasowy podpis, aby zacząć używać klucza, tak jakby " "już został poprawnie sprawdzony.\n" "Dokumentacja zawiera więcej informacji." #: keysign/receive.ui:541 msgid "Key" msgstr "Klucz" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Aby podpisać klucz, należy potwierdzić, że ma zostać podpisany poniższy " "klucz.\n" "Utworzy to wiadomość e-mail, którą należy wysłać, aby ukończyć proces " "podpisywania." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "P_otwierdź" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Podpisywanie tych UID:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Nadal trwa próba uzyskania połączenia z Internetem. Jest ono wolne lub " "niedostępne." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Nie ma połączenia z Internetem." #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Pomyślnie wysłano klucz.\n" "Wkrótce powinna przyjść wiadomość e-mail z podpisem." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Nie można nawiązać bezpiecznego połączenia.\n" "Partner wpisał błędny kod lub ktoś próbuje przechwycić połączenie" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Wystąpił nieoczekiwany błąd:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Wybierz i wyślij klucz" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Wybierz i wyślij klucz" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Używa także Internetu do przesłania certyfikatu" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Nie ma żadnych kluczy.\n" "Proszę użyć np. programu Seahorse i utworzyć jakiś." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Bardzo wolne lub niedziałające połączenie z Internetem." #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Pomyślnie zaimportowano podpis." #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Zwraca otrzymany certyfikat z powrotem do nadawcy, aby nadawca mógł używać " "certyfikatu OpenPGP użytkownika" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Wyświetla więcej informacji o błędzie" #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Wystąpił błąd podczas importowania podpisu." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Wybór klucza do podpisania" #: keysign/send.ui:443 msgid "Times signed" msgstr "Ile razy podpisano" #: keysign/send.ui:510 msgid "Keylist" msgstr "Lista kluczy" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Aby klucz został podpisany, druga osoba musi wpisać kod zabezpieczeń " "lub zeskanować kod QR" #: keysign/send.ui:557 msgid "Key Details" msgstr "Informacje o kluczu" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Odcisk" #: keysign/send.ui:736 msgid "QR Code" msgstr "Kod QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Cześć, $uid,\n" "\n" "\n" "Twój klucz został podpisany\n" "\n" " $fingerprint\n" "\n" "\n" "Dzięki za pozwolenie mi na podpisanie Twojego klucza!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Błędny kod uwierzytelnienia wiadomości" gnome-keysign-1.3.0/keysign/locale/pt_BR/000077500000000000000000000000001431057335600202145ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001431057335600220015ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/pt_BR/LC_MESSAGES/keysign.po000066400000000000000000000357721431057335600240300ustar00rootroot00000000000000# Portuguese (Brazil) translations for gnome-keysign. # Copyright (C) 2021 Tobias Mueller # This file is distributed under the same license as the gnome-keysign project. # Rafael Fontenelle , 2017-2019. # Enrico Nicoletto , 2020-2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-04-16 20:47-0300\n" "Last-Translator: Enrico Nicoletto \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 2.4.2\n" "Generated-By: Babel 2.5.1\n" "X-Project-Style: gnome\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Keysign permite assinar chaves OpenPGP de forma\n" " confortável e segura por meio da rede local ou do Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Ele pode escanear o código de barras de outra tecla e\n" " transferir a chave com segurança, permitindo sessões\n" " informais de sinalização de duas partes.\n" " Ele segue as práticas recomendadas enviando as assinaturas\n" " criptografadas para os UIDs de uma chave usando o cliente\n" " de e-mail que o usuário configurou para usar.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Um auxiliar de assinatura de chaves para permitir que você troque " "confortavelmente as chaves do OpenPGP com um amigo" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;chave;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Enviar" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Receber" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Oferecendo chave: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Info da descoberta: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Pressione Enter para interromper" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Você deve fornecer um argumento para identificar a chave" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Porta: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth não disponível" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Pressione Enter para cancelar" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Chave enviada com sucesso" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Ocorreu um erro: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Pressione Enter para sair" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Tentando baixar a chave, por favor aguarde" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Não foi possível iniciar o Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "O Keysign não conseguiu iniciar automaticamente o Avahi. Você pode tentar " "executar `systemctl start avahi-daemon` para resolver este problema." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Erro detectado" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Um erro de programação foi detectado." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Você pode ser capaz de ignorar esse erro e seguir usando, mas você pode " "obter resultados inesperados.\n" "\n" "Por favor, avise aos desenvolvedores sobre isso usando o rastreador de erros " "caso isso ainda não tenha sido relatado por outra pessoa." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Pesquisar no rastreador…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Relatar…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignorar erro" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Sair do GNOME Keysign" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Detalhes…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Exceção enquanto analisava a exceção." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Dê a esse relatório um título descritivo curto.\n" " Use algo como\n" " “{recurso-que-falhou}: {o-que-deu-errado}”\n" " como o título, se for possível.\n" " Então, por favor, substitua esse texto\n" " com uma descrição mais longa do erro.\n" " Capturas de telas ou vídeos são bem-vindos também!\n" "\n" " #### Steps to reproduce\n" "\n" " Por favor, nos diga o que você estava fazendo\n" " quando a mensagem de erro surgiu.\n" " Se você puder fornecer o passo a passo\n" " sobre como reproduzir este erro,\n" " melhor ainda.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Expira: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Assinar chave" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Selecione um arquivo para salvar" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Nenhum servidor do GNOME Keysign por aí :-(\n" "Encontre um amigo para usar GNOME Keysign com.\n" "Você também pode sofrer de problemas de conectividade.\n" "Para mais informações, visite a documentação." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Para assinar a chave de alguém, leia o QR da pessoa ou digite o " "código de segurança" #: keysign/receive.ui:127 msgid "Camera" msgstr "Câmera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Webcam integrada" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Código de segurança" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Ler código de barra" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Baixando dados da chave. Por favor, aguarde…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Obtenção da chave foi interrompida!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Mostra detalhes sobre o erro" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Erro na produção de certificados ☹\n" "Algo deu errado. Talvez a senha não tenha sido digitada corretamente.\n" "Você pode tentar novamente ao clicar no botão \"confirmar\"." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Salva os certificados produzidos como arquivos separados em um diretório " "personalizado" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importa uma versão temporária dos certificados produzidos no chaveiro local" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Certificados produzidos com sucesso.\n" "Você pode importar uma assinatura temporária para iniciar usando a chave " "como se ela já tivesse sido verificada adequadamente.\n" "Para mais informações, visite a documentação." #: keysign/receive.ui:541 msgid "Key" msgstr "Chave" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UIDs" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Para assinar a chave, confirme que você deseja assinar a chave a seguir.\n" "Isso vai gerar um e-mail que deve ser enviado para completar o processo de " "assinatura." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "C_onfirmar" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Assinando os seguintes UIDs:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Ainda tentando obter uma conexão com a Internet. Parece ser lento ou " "indisponível." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Não há conexão com a Internet!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Chave enviada com sucesso.\n" "Você deve receber em breve um e-mail com a assinatura." # Traduzi "partner" para "pessoa" para evitar lidar com gênero de "parceiro(a)" -- Rafael Fontenelle #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Não foi possível estabelecer uma conexão segura.\n" "A outra pessoa digitou um código errado ou alguém tentou interceptar sua " "conexão" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Ocorreu um erro inesperado:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Selecionar e enviar a chave" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Selecionar e enviar chave" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Use também a Internet para transferir o certificado" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Você tem nenhuma chave!\n" "Por favor use, p.ex., Seahorse para criar uma." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Conexão muito lenta ou sem conexão com a Internet!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "A assinatura foi importada com sucesso!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Retorna a certificação recebida de volta ao remetente, para que o remetente " "possa fazer uso do seu certificado OpenPGP" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Exibir mais detalhes sobre o erro." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Ocorreu um erro ao tentar importar a assinatura." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Selecione uma chave para assinar" #: keysign/send.ui:443 msgid "Times signed" msgstr "Quantidade de assinaturas" #: keysign/send.ui:510 msgid "Keylist" msgstr "Lista de chaves" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Para ter uma chave assinada, a outra pessoa deve digitar o código de " "segurança ou ler o código QR" #: keysign/send.ui:557 msgid "Key Details" msgstr "Detalhes da chave" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Impressão digital" #: keysign/send.ui:736 msgid "QR Code" msgstr "Código QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Olá $uid,\n" "\n" "\n" "Eu acabei de assinar sua chave\n" "\n" " $fingerprint\n" "\n" "\n" "Obrigado por me deixar assiná-la!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Código de autenticação de mensagem errado" gnome-keysign-1.3.0/keysign/locale/ro/000077500000000000000000000000001431057335600176265ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/ro/LC_MESSAGES/000077500000000000000000000000001431057335600214135ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/ro/LC_MESSAGES/keysign.po000066400000000000000000000362641431057335600234370ustar00rootroot00000000000000# Romanian translation for gnome-keysign. # Copyright (C) 2020 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Florentina Mușat , 2020. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-05-05 13:59+0200\n" "Last-Translator: Florentina Mușat \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "X-Generator: Poedit 2.4.2\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " Semnează cheia GNOME vă permite să semnați chei OpenPGP comfortabil și " "sigur\n" " via rețelei locale sau Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Poate să scaneze codul de bare a unei alte chei și să transfere cheia " "sigur,\n" " permițând pentru sesiuni cazuale de semnat de cheie din două părți.\n" " Urmărește cele mai bune practici prin trimiterea de semnături " "criptate\n" " la UID-urile unei chei utilizând clientul de Email pe care " "utilizatorul l-a configurat\n" " pentru utilizare.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Semnează cheia" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Un ajutor de semnat cheia pentru a vă permite să schimbați chei OpenPGP " "confortabil cu un prieten" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;cheie;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Trimite" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Primește" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Oferind cheia: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informații de descoperire: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Apăsați Enter pentru a opri" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Trebuie să furnizați un argument pentru a identifica cheia" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth nu este disponibil" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Apăsați Enter pentru a anula" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Cheia trimisă cu succes" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "A apărut o eroare: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Apăsați Enter pentru a ieși" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Se încearcă să se descarce cheia, așteptați" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Nu se poate porni Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Semnează cheia nu poate să pornească automat Avahi. Puteți încerca să " "executați „systemctl start avahi-daemon” pentru rezolvarea acestei probleme." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Defecțiune detectată" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "A fost detectată o eroare de programare." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Este posibil să puteți ignora această eroare și să continuați să lucrați, " "dar puteți obține rezultate neașteptate.\n" "\n" "Spuneți dezvoltatorilor despre acest lucru utilizând urmăritorul de probleme " "dacă nimeni nu a raportat-o încă." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Caută urmăritor..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Raportează..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignoră eroarea" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Ieșire din Semnează cheia GNOME" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Detalii..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Excepție în timpul analizării excepției." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Descriere\n" "\n" " Dați acestui raport un scurt titlu descriptiv.\n" " Utilizați ceva precum\n" " „{funcționalitate-care-s-a-defectat}: {ce-a-mers-greșit}”\n" " pentru titlu, dacă puteți.\n" " Apoi înlocuiți acest text\n" " cu o descriere mai lungă a defecțiunii.\n" " Capturile de ecran sau video-urile sunt și ele grozave!\n" "\n" " #### Pași de reproducere\n" "\n" " Spuneți-ne ce făceați\n" " când a apărut mesajul de eroare.\n" " Dacă puteți furniza instrucțiuni pas-cu-pas\n" " despre cum să se reproducă defecțiunea,\n" " asta e și mai bine.\n" "\n" " #### Urmărire\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Expiră: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Semnează cheia" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Selectează fișierul pentru salvare" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Nu există servere Semnează cheia GNOME prin preajmă :-(\n" "Găsește un prieten cu care să utilizați Semnează cheia GNOME.\n" "Puteți, de asemenea, suferi de probleme de conectivitate.\n" "Pentru mai multe informații vizitați documentația." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Pentru a semna cheia cuiva, scanați codul lor QR sau introduceți " "codul de securitate" #: keysign/receive.ui:127 msgid "Camera" msgstr "Camera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Cameră web integrată" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Cod de securitate" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Scanează codul de bare" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Se descarcă datele cheii. Așteptați..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Descărcarea cheii a fost întreruptă!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Afișează detalii pentru eroare" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Eroare la producerea certificărilor ☹\n" "Ceva nu a funcționat. O dată, fraza parolă nu a fost introdusă corect.\n" "Puteți încerca din nou apăsând butonul „Confirmă”." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Salvează certificările produse ca fișiere separate într-un director " "personalizat" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importă o versiune temporară a certificărilor produce în inelul de chei local" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "S-au produs cu succes certificările.\n" "Puteți importa o semnătură temporară pentru a începe să utilizați cheia ca " "și cum ar fi fost deja verificată cum trebuie.\n" "Pentru mai multe informații vizitați documentația." #: keysign/receive.ui:541 msgid "Key" msgstr "Tastă" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID-uri" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Pentru a semna cheia, confirmați că doriți să semnați următoarea cheie.\n" "Acest lucru va genera un email care trebuie trimis pentru a completa " "procesul de semnare." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "C_onfirmă" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Se semnează următoarele UID-uri:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Se încearcă încă să se obțină o conexiune la Internet. Se pare că este lentă " "sau nedisponibilă." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Nu există o conexiune la Internet!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Cheie trimisă cu succes.\n" "Ar trebui să primiți în curând un email cu semnătura." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Nu s-a putut stabili o conexiune sigură.\n" "Ori partenerul dumneavoastră a introdus un cod greșit ori cineva a încercat " "să vă intercepteze conexiunea" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "A apărut o eroare neașteptată:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Selectați și trimiteți cheia" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Selectați și trimiteți cheia" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Utilizează de asemenea internetul pentru a transfera certificatul" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Nu aveți nicio cheie!\n" "Utilizați, de ex. Seahorse pentru a crea una." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Conexiune la Internet foarte înceată sau inexistentă!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Semnătura a fost importată cu succes!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Întoarce certificarea primită înapoi la expeditor, pentru ca expeditorul să " "vă poată utiliza certificatul OpenPGP" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Afișează mai multe detalii pentru eroare." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "A apărut o eroare în timpul încercării de importare a semnăturii." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Selectați o cheie pentru semnare" #: keysign/send.ui:443 msgid "Times signed" msgstr "De câte ori a fost semnată" #: keysign/send.ui:510 msgid "Keylist" msgstr "Listă de chei" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Pentru a avea cheia semnată, cealaltă persoană trebuie să introducă " "codul de securitate, sau să scaneze codul QR" #: keysign/send.ui:557 msgid "Key Details" msgstr "Detalii cheie" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Amprentă" #: keysign/send.ui:736 msgid "QR Code" msgstr "Cod QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Bună $uid,\n" "\n" "\n" "Tocmai ți-am semnat cheia\n" "\n" " $fingerprint\n" "\n" "\n" "Mulțumesc pentru că m-ai lăsat să îți semnez cheia!\n" "\n" "--\n" "Semnează cheia GNOME\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Cod de autentificare de mesaj greșit" gnome-keysign-1.3.0/keysign/locale/sl/000077500000000000000000000000001431057335600176245ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/sl/LC_MESSAGES/000077500000000000000000000000001431057335600214115ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/sl/LC_MESSAGES/keysign.po000066400000000000000000000226031431057335600234250ustar00rootroot00000000000000# Slovenian translation for gnome-keysign. # Copyright (C) 2020 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # # Matej Urbančič , 2020–. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2020-04-03 12:02+0000\n" "PO-Revision-Date: 2020-06-16 21:25+0200\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 2.3\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "" #: keysign/app.py:187 msgid "Send" msgstr "Pošlji" #: keysign/app.py:189 keysign/receive.py:272 msgid "Receive" msgstr "Sprejmi" #: keysign/app.ui:62 keysign/send.ui:54 msgid "Internet" msgstr "Splet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Vrata: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "V redu" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "" #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Poročilo ..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Prezri napako" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Podrobnosti ..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "" #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "" #: keysign/receive.py:158 msgid "Sign Key" msgstr "Podpis ključa" #: keysign/receive.py:218 msgid "Select file for saving" msgstr "" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" #: keysign/receive.ui:127 msgid "Camera" msgstr "" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "" #: keysign/receive.ui:179 keysign/send.ui:568 msgid "Security Code" msgstr "" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Preberi črtno kodo" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "" #: keysign/receive.ui:345 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" #: keysign/receive.ui:360 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" #: keysign/receive.ui:403 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" #: keysign/receive.ui:446 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" #: keysign/receive.ui:474 msgid "Key" msgstr "Ključ" #: keysign/receive.ui:507 keysign/send.ui:493 msgid "UIDs" msgstr "" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "P_otrdi" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "" #: keysign/send.py:207 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" #: keysign/send.py:213 msgid "There isn't an Internet connection!" msgstr "" #: keysign/send.py:219 keysign/send.ui:267 msgid "The signature has been successfully imported!" msgstr "" #: keysign/send.py:225 msgid "" "An error occurred while trying to import the signature.\n" "Please double check the correctness of the chosen signature." msgstr "" #: keysign/send.py:254 keysign/send.ui:678 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" #: keysign/send.py:259 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" #: keysign/send.py:263 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" #: keysign/send.ui:7 msgid "Select and send key" msgstr "" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "" #: keysign/send.ui:121 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" #: keysign/send.ui:198 msgid "Very slow or no Internet connection!" msgstr "" #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:322 msgid "Select a key for signing" msgstr "Izbor ključa za pospisovanje" #: keysign/send.ui:338 msgid "Times signed" msgstr "" #: keysign/send.ui:405 msgid "Keylist" msgstr "Seznam ključev" #: keysign/send.ui:425 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" #: keysign/send.ui:452 msgid "Key Details" msgstr "Podrobnosti ključa" #: keysign/send.ui:477 msgid "Fingerprint" msgstr "Prstni odtis" #: keysign/send.ui:631 msgid "QR Code" msgstr "Koda QR" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "" gnome-keysign-1.3.0/keysign/locale/sr/000077500000000000000000000000001431057335600176325ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/sr/LC_MESSAGES/000077500000000000000000000000001431057335600214175ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/sr/LC_MESSAGES/keysign.po000066400000000000000000000432631431057335600234400ustar00rootroot00000000000000# Serbian translation for gnome-keysign. # Copyright © 2021 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Мирослав Николић , 2021. msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2021-09-18 09:01+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: српски \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "Generated-By: Babel 2.6.0\n" "X-Project-Style: gnome\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " Гномов Потпис кључа допушта потписивање ОпенПГП кључева удобно и " "безбедно\n" " путем локалне мреже или Блутута.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Може да скенира бар код другог кључа и да безбедно пренесе кључ,\n" " допуштајући случајне дводелне сесије потписивања кључа.\n" " Следи најбољу праксу слањем шифрованих потписа\n" " УИБ-има кључа користећи клијента е-поште кога је\n" " корисник подесио за коришћење.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Потпис кључа" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Помоћник потписивања кључа који вам омогућава да удобно измените ОпенПГП " "кључеве са пријатељем" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "питон;гпг;гнупг;кључ;опенгп;python;gpg;gnupg;key;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Пошаљи" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Прими" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Интернет" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Нудим кључ: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Подаци открића: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Притисните „Унеси“ да зауставите" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Морате доставити аргумент да одредите кључ" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Прикључник: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Блутут није доступан" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Притисните „Унеси“ да откажете" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Кључ је успешно послат" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Дошло је до грешке: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Притисните „Унеси“ да изађете" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Покушавам да преузмем кључ, сачекајте" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Не могу да покренем Авахи" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Потпис кључа није могао сам да покрене Авахи. Можете покушати да извршите " "„systemctl start avahi-daemon“ за решавање овог проблема." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "У реду" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Грешка је откривена" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Откривена је грешка у програмирању." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Можда ћете моћи да занемарите ову грешку и да наставите да радите, али " "можете добити неочекиване резултате.\n" "\n" "Обавестите програмере о овоме помоћу програма за праћење проблема ако то још " "нико није пријавио." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Претражи Пратиоца..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Извести..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Занемари грешку" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Изађите из Гном потписа кључа" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Детаљи..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Изузетак приликом анализе изузетка." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Опис\n" "\n" " Дајте овом извештају кратак описни наслов.\n" " Користите нешто као\n" " „{оштећена-функција}: {шта-се-лоше-десило}“\n" " за наслов, ако можете.\n" " Затим замените овај текст\n" " са дужим описом грешке.\n" " Снимци екрана или снимци су добри, такође!\n" "\n" " #### Кораци за репродукцију\n" "\n" " Реците нам шта сте радили када\n" " се појавила порука грешке.\n" " Ако можете доставите упутства корак по\n" " корак о томе како да репродукујемо грешку,\n" " било би још боље.\n" "\n" " #### Повратница\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Истиче: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Потпиши кључ" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Изаберите датотеку за чување" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Нема никаквих сервера Гномовог Потписа кључа :-(\n" "Нађите пријатеља са којим ћете користити Гномов Потпис кључа.\n" "Можда ћете имати проблема са повезивањем.\n" "За више информација посетите документацију." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Да потпишете нечији кључ, скенирајте њихов QR или унесите безбедносну " "шифру" #: keysign/receive.ui:127 msgid "Camera" msgstr "Камера" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Интегрисана веб камерица" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Безбедносна шифра" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Скенирај бар код" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Преузимам податке кључа. Сачекајте..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Преузимање кључа је прекинуто!" #: keysign/receive.ui:346 #| msgid "Display more details for the error." msgid "Show details about the error" msgstr "Прикажите појединости о грешци" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Грешка стварања уверења ☹\n" "Нешто је пошло по злу. Понекад, лозинка није исправно унета.\n" "Можете покушати поново кликом на дугме „потврди“." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Чува произведена уверења као одвојене датотеке у произвољном директоријуму" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Увози привремено издање произведених уверења у локални привезак кључева" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Успешно су произведена уверења.\n" "Можете да увезете привремени потпис да почнете коришћење кључа као да је већ " "уредно потврђен.\n" "За више информација посетите документацију." #: keysign/receive.ui:541 msgid "Key" msgstr "Кључ" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "УИБ-и" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Да потпишете кључ, потврдите да желите да потпишете следећи кључ.\n" "То ће створити е-пошту која мора бити послата да би се завршио поступак " "потписивања." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "_Потврди" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Потписујем следеће УИБ-е:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Још увек покушавам да добавим везу са Интернетом. Изгледа да је спор или " "недоступан." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Нема везе са Интернетом!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Кључ је успешно послат.\n" "Треба ускоро да примите е-пошту са потписом." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Не могу да успоставим безбедну везу.\n" "Или је ваш партнер унео погрешну шифру или је неко покушао да пресретне вашу " "везу" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Дошло је до неочекиване грешке:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Изаберите и пошаљите кључ" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Изабери и пошаљи кључ" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Такође користит Интернет за пренос уверења" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Немате ниједан кључ!\n" "Користите, нпр. Морског коњића да га направите." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Врло спора или нема Интернет везе!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Потпис је успешно увезен!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Враћа примљено уверење пошиљаоцу, тако да пошиљалац може да користи ваше " "ОпенПГП уверење" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Прикажите више појединости о грешци." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Дошло је до грешке приликом покушаја увоза потписа." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Изаберите кључ за потписивање" #: keysign/send.ui:443 msgid "Times signed" msgstr "Времена потписа" #: keysign/send.ui:510 msgid "Keylist" msgstr "Списак кључева" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Да потпишете кључ, друга особа мора да унесе безбедносну шифру, или " "да скенира QR код" #: keysign/send.ui:557 msgid "Key Details" msgstr "Појединости кључа" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Отисак" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR код" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Здраво $uid,\n" "\n" "\n" "Управо сам потписао ваш кључ\n" "\n" " $fingerprint\n" "\n" "\n" "Хвала вам што сте допустили да потпишем ваш кључ!\n" "\n" "--\n" "Гномов Потпис кључа\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Погрешна шифра потврђивања идентитета поруке" gnome-keysign-1.3.0/keysign/locale/sv/000077500000000000000000000000001431057335600176365ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/sv/LC_MESSAGES/000077500000000000000000000000001431057335600214235ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/sv/LC_MESSAGES/keysign.po000066400000000000000000000354471431057335600234510ustar00rootroot00000000000000# Swedish translation for gnome-keysign. # Copyright © 2019-2021 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Anders Jonsson , 2019, 2020, 2021. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-04-15 22:06+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.2\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Nyckelsignering möjliggör enkel och säker signering av\n" " OpenPGP-nycklar via det lokala nätverket eller Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Det kan läsa av en annan nyckels streckkod och överföra nyckeln\n" " säkert, vilket möjliggör enkla signeringssessioner mellan två\n" " parter.\n" " Det följer god praxis genom att skicka de krypterade signaturerna\n" " till en nyckels UID:n med e-postklienten som användaren\n" " konfigurerat för användning.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Nyckelsignering" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "En nyckelsigneringshjälp som låter dig bekvämt utväxla OpenPGP-nycklar med " "en vän" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;nyckel;openpgp;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Skicka" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Ta emot" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Erbjuden nyckel: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Upptäcktsinfo: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Tryck på Retur för att stoppa" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Du måste tillhandahålla ett argument för att identifiera nyckeln" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Port: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth ej tillgängligt" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Tryck på Retur för att avbryta" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Lyckades skicka nyckeln" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Ett fel inträffade: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Tryck på Retur för att avsluta" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Försöker att hämta nyckeln, vänta" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Kunde inte starta Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Nyckelsignering kan inte starta Avahi automatiskt. Du kan försöka köra " "”systemctl start avahi-daemon” för att lösa detta problem." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "OK" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Fel upptäckt" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Ett programmeringsfel har upptäckts." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Du kan möjligen ignorera detta fel och jobba på, men du kan få oväntade " "resultat.\n" "\n" "Berätta gärna om detta fel för utvecklarna genom ärendehanteringssystemet om " "ingen annan rapporterat det ännu." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Sök i ärendesystem…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Rapportera…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ignorera fel" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Avsluta GNOME Nyckelsignering" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Detaljer…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Undantag vid analys av undantaget." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Ge rapporten en kort beskrivande titel.\n" " Något i stil med\n" " \"{funktionalitet-som-felar}: {vad-gick-fel}\"\n" " för titeln om du kan. Se till att åtminstone\n" " titeln, men gärna hela rapporten, är på\n" " engelska om du kan.\n" " Ersätt sedan denna text med en längre\n" " beskrivning av felet.\n" " Skärmbilder och videoklipp är också bra!\n" "\n" " #### Steps to reproduce\n" "\n" " Berätta för oss vad du gjorde när\n" " felmeddelandet poppade upp.\n" " Om du kan tillhandahålla instruktioner\n" " steg för steg på hur felet kan upprepas\n" " så är det ännu bättre.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Går ut: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Signera nyckel" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Välj fil för sparning" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Inga GNOME Nyckelsignering-servrar hittades :-(\n" "Hitta en vän att använda GNOME Nyckelsignering med.\n" "Du kan också vara drabbad av anslutningsproblem.\n" "Besök dokumentationen för mer information." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "För att signera någons nyckel, läs av deras QR-kod eller ange " "säkerhetskoden" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Integrerad webbkamera" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Säkerhetskod" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Läs av streckkod" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Hämtar nyckeldata. Vänta…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Nyckelhämtning avbröts!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Visa detaljer om felet" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Fel vid skapande av certifieringar ☹\n" "Något gick fel. Kanske lösenfrasen inte matades in korrekt.\n" "Du kan försöka igen genom att klicka på knappen ”bekräfta”." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Sparar de skapade certifieringarna som separata filer i en anpassad katalog" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Importerar en temporär version av de skapade certifieringarna till den " "lokala nyckelringen" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Lyckades producera certifieringar.\n" "Du kan importera en tillfällig signatur för att börja använda nyckeln som om " "den redan hade verifierats på rätt sätt.\n" "Besök dokumentationen för mer information." #: keysign/receive.ui:541 msgid "Key" msgstr "Nyckel" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID:n" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "För att signera nyckeln, bekräfta att du vill signera följande nyckel.\n" "Detta kommer att skapa ett e-postmeddelande som måste skickas för att " "slutföra signeringsprocessen." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "_Bekräfta" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Signerar följande UID:n:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Försöker fortfarande få en anslutning till internet. Den verkar vara långsam " "eller ej tillgänglig." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Det finns ingen internetanslutning!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Lyckades skicka nyckel.\n" "Du bör snart få ett e-postmeddelande med signaturen." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Det gick inte att etablera en säker anslutning.\n" "Antingen har din partner angivit en felaktig kod eller så försökte någon " "snappa upp din anslutning" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Ett oväntat fel inträffade:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Välj och skicka nyckel" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Välj och skicka nyckel" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Använd även internet för att överföra certifikatet" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Du har inga nycklar!\n" "Använd exempelvis Seahorse för att skapa en." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "Ingen eller väldigt långsam internetanslutning!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Lyckades importera signaturen!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Skickar tillbaka den mottagna certifieringen till avsändaren, så att " "avsändaren kan använda ditt OpenPGP-certifikat" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Visa mer detaljer för felet." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Ett fel uppstod vid försök att importera signaturen." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Välj en nyckel att signera" #: keysign/send.ui:443 msgid "Times signed" msgstr "Antal gånger signerad" #: keysign/send.ui:510 msgid "Keylist" msgstr "Nyckellista" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "För att nyckeln ska signeras måste den andra personen ange " "säkerhetskoden eller läsa av QR-koden" #: keysign/send.ui:557 msgid "Key Details" msgstr "Nyckeldetaljer" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Fingeravtryck" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR-kod" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Hej $uid,\n" "\n" "\n" "Jag har just signerat din nyckel\n" "\n" " $fingerprint\n" "\n" "\n" "Tack för att jag fick signera din nyckel!\n" "\n" "--\n" "GNOME Nyckelsignering\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Felaktig autentiseringskod för meddelande" gnome-keysign-1.3.0/keysign/locale/tr/000077500000000000000000000000001431057335600176335ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/tr/LC_MESSAGES/000077500000000000000000000000001431057335600214205ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/tr/LC_MESSAGES/keysign.po000066400000000000000000000357501431057335600234430ustar00rootroot00000000000000# Turkish translation for gnome-keysign. # Copyright (C) 2019-2022 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # # Emin Tufan Çetin , 2021, 2022. # Sabri Ünal , 2019, 2022. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2022-05-14 14:41+0300\n" "Last-Translator: Emin Tufan Çetin \n" "Language-Team: Türkçe \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "Generated-By: Babel 2.6.0\n" "X-Generator: Poedit 3.0.1\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Keysign, OpenPGP anahtarlarını yerel ağ veya Bluetooth " "üzerinden\n" " kolay ve güvenle imzalamanızı sağlar.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Başka bir anahtarın barkodunu tarayabilir ve anahtarı güvenle " "aktarabilir,\n" " böylece yaygın çift taraflı anahtar imzalama oturumları yapılabilir.\n" " Şifrelenmiş imzaları, bir anahtarın UIDʼlerini kullanarak, kullanıcıca\n" " belirlenmiş E-posta istemcisine gönderir.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "OpenPGP anahtarlarını karşılıklı alıp vermenizi sağlayan bir anahtar " "imzalama yardımcısı" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;anahtar;openpgp;key;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Gönder" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Al" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "İnternet" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Anahtar teklifleri: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Keşif bilgisi: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Durdurmak için Enter’a bas" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Anahtarı tanımlamak için açıklama giriniz" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Bağlantı Noktası: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Bluetooth erişilebilir değil" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "İptal etmek için Enter’a bas" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Anahtar başarıyla gönderildi" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Hata oluştu: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Çıkış için Enter’a bas" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Anahtar indirilmeye çalışılıyor, lütfen bekleyin" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Avahi Uygulaması Başlatılamadı" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "GNOME Keysing, Avahi uygulamasını kendiliğinden başlatamıyor. Bu sorunu " "çözmek için `systemctl start avahi-daemon` komutunu çalıştırmayı " "deneyebilirsiniz." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Tamam" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Hata Algılandı" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Bir programlama hatası algılandı." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Bu hatayı yok sayıp çalışmayı sürdürebilirsiniz, ancak beklenmedik sorunlar " "yaşayabilirsiniz.\n" "\n" "Henüz bir başkası bildirmediyse, lütfen hata takipçisi kullanarak " "geliştiricileri bu konuda bilgilendirin." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "İzleyici Tara..." #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Bildir..." #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Hataları Görmezden Gel" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "GNOME Keysign uygulamasından çık" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Ayrıntılar..." #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "İstisna incelenirken istisna oluştu." # Hata raporlamaları İngilizce yapılacağı için çeviri yapmaya da gerek yok. #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Geçerlilik süresi: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Anahtar İmzala" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Kaydetmek için dosya seç" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Çevrenizde GNOME Keysign sunucu bulunamadı :-(\n" "Birlikte GNOME Keysign kullanmak için bir arkadaş bulun.\n" "Bağlantı sorunları da yaşıyor olabilirsiniz.\n" "Daha fazla bilgi için belgelendirme sayfamızı ziyaret edebilirsiniz." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Birisinin anahtarını imzalamak için, QR kodunu tara veya güvenlik " "kodunu gir" #: keysign/receive.ui:127 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Tümleşik Kamera" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Güvenlik Kodu" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Barkod Tara" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Anahtar verisi indiriliyor. Lütfen bekleyin..." #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Anahtar indirme kesintiye uğradı!" #: keysign/receive.ui:346 msgid "Show details about the error" msgstr "Hatayla ilgili ayrıntıları göster" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Sertifikalar oluşturulurken hata ☹\n" "Bir şeyler yanlış gitti. Parola metni doğru girilmedi.\n" "\"Onayla\" düğmesine tıklayarak yeniden deneyebilirsiniz." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "Üretilen sertifikaları özel bir dizine ayrı dosyalar olarak kaydeder" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "Üretilen sertifikaların geçici bir sürümünü yerel anahtarlığa aktarır" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Başarıyla üretilen sertifikalar.\n" "Anahtarı, doğru biçimde doğrulanmış gibi kullanmaya başlamak için geçici bir " "imza içe aktarabilirsin.\n" "Daha çok bilgi için belgesini ziyaret edin." #: keysign/receive.ui:541 msgid "Key" msgstr "Anahtar" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID’ler" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Anahtarı imzalamak için, aşağıdaki anahtarı imzalamak istediğinizi " "doğrulayın.\n" "Bu, imzalama işlemini tamamlamak için bir e-posta gönderimi oluşturur." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "_Onayla" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Şu UIDʼler imzalanıyor:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "Hala internete bağlanmaya çalışılıyor. Yavaş veya erişilemez olabilir." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "İnternet bağlantısı yok!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Anahtar başarıyla gönderildi.\n" "Yakında imzalı bir e-posta almalısınız." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Güvenli bağlantı oluşturulamadı.\n" "Eşiniz yanlış kod girmiş olabilir veya birisi bağlantınızı kesmiş olabilir" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Beklenmedik hata oluştu:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Anahtar seç ve gönder" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Anahtar Seç ve Gönder" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Ayrıca, sertifikayı aktarmak için İnternetʼi kullan" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "Anahtarınız yok!\n" "Seahorse veya benzeri programla bir tane oluşturunuz." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "İnternet bağlantınız çok yavaş veya bağlantı yok!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "İmza başarıyla içe aktarıldı!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Alınan sertifikasyonu göndericiye geri döndürür, böylece gönderici OpenPGP " "sertifikanızdan yararlanabilir" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Hata için daha çok ayrıntı göster." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "İmzayı içe aktarmaya çalışırken hata oluştu." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "İmzalamak için anahtar seç" #: keysign/send.ui:443 msgid "Times signed" msgstr "İmzalanma zamanı" #: keysign/send.ui:510 msgid "Keylist" msgstr "Anahtar Listesi" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Anahtarın imzalanması için, diğer kişi güvenlik kodunu girmeli veya " "QR kodunu taramalıdır." #: keysign/send.ui:557 msgid "Key Details" msgstr "Anahtar Ayrıntıları" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Parmak İzi" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR Kodu" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Merhaba $uid,\n" "\n" "\n" "Anahtarınızı imzaladım.\n" "\n" " $fingerprint\n" "\n" "\n" "Anahtarınızı imzalamaya izin verdiğiniz için teşekkür ederim!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Hatalı ileti kimlik doğrulama kodu" #~ msgid "Translated for gettext (C)" #~ msgstr "Gettext (tr) için çevirilmiştir." #~ msgid "Translated for Python (C)" #~ msgstr "Python (tr) için çevirilmiştir." gnome-keysign-1.3.0/keysign/locale/uk/000077500000000000000000000000001431057335600176255ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/uk/LC_MESSAGES/000077500000000000000000000000001431057335600214125ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/uk/LC_MESSAGES/keysign.po000066400000000000000000000451261431057335600234330ustar00rootroot00000000000000# Ukrainian translation for gnome-keysign. # Copyright (C) 2020 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # # Yuri Chornoivan , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-04-15 09:07+0000\n" "PO-Revision-Date: 2021-04-15 18:42+0300\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 20.12.0\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " За допомогою «Підписувача ключів» GNOME ви зможете зручно і безпечно " "підписувати\n" " ключі OpenPGP за допомогою локальної мережі або Bluetooth.\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " Програма може сканувати штрих-код іншого ключа і безпечно перенести " "ключ,\n" " уможливлюючи двобічні сеанси підписування ключів.\n" " У програмі враховано найкращі методики: виконується надсилання " "зашифрованих\n" " підписів до UID ключа за допомогою клієнта електронної пошти, який\n" " налаштовано користувачем.\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Підписувач ключів" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "" "Допоміжна програма для підписування ключів, за допомогою якої ви зможете " "зручно обмінюватися ключами OpenPGP з друзями" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "" "python;gpg;gnupg;key;openpgp;пітон;пайтон;жпж;гпг;ключ;гнупг;опенпг;оупенпг;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "Надіслати" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "Отримати" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "Інтернет" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Пропонований ключ: {}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Дані виявлення: {}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "Натисніть Enter, щоб зупинити" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "Вам слід вказати аргумент для ідентифікації ключа" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC: {}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "Порт: {}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "Немає доступу до Bluetooth" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "Натисніть Enter, щоб скасувати" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Ключ успішно надіслано" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Сталася помилка: {}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "Натисніть Enter, щоб вийти" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Намагаємося отримати ключ, будь ласка, зачекайте" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "Не вдалося запустити Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysign не вдалося автоматично запустити Avahi. Ви можете віддати команду " "«systemctl start avahi-daemon», щоб усунути цю проблему." #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "Гаразд" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "Виявлено ваду" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "Було виявлено помилку у програмному коді." #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "Ви можете проігнорувати це повідомлення про помилку і продовжити обробку, " "але це може призвести до неочікуваних результатів.\n" "\n" "Будь ласка, повідомте про цю помилку розробникам за допомогою системи " "стеження за вадами, якщо про неї ще не повідомлено іншими користувачами." #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "Шукати Tracker…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "Звіт…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "Ігнорувати помилку" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "Вийти з «Підписувача ключів» GNOME" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "Подробиці…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "Виключення під час спроби проаналізувати виключення." #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### Description\n" "\n" " Надайте цьому звіту короткої описової назви.\n" " Скористайтеся таким заголовка форматом:\n" " «{Можливість}: {помилка, яка сталася}»\n" " якщо можна.\n" " Далі, будь ласка, замініть цей текст\n" " довшим описом вади.\n" " Чудовим доповненням будуть знімки вікон та відео!\n" "\n" " #### Steps to reproduce\n" "\n" " Будь ласка, повідомте нам про дії, які ви виконували,\n" " коли сталася помилка.\n" " Буде навіть краще, якщо ви наведете покрокові\n" " настанови щодо відтворення вади.\n" "\n" " #### Traceback\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Строк дії: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Підписати ключ" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "Виберіть файл для збереження" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "Не знайдено серверів «Підписувача ключів» GNOME :-(\n" "Знайдіть приятеля, щоб скористатися «Підписувачем ключів» GNOME.\n" "Також, можливо, у вас є певні проблеми із з'єднанням із мережею.\n" "Щоб дізнатися більше, ознайомтеся із документацією." #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "" "Щоб підписати чийсь ключ, виконайте сканування QR-коду або введіть " "код захисту" #: keysign/receive.ui:127 msgid "Camera" msgstr "Фотоапарат" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "Інтегровано із вебкамерою" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "Код захисту" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "Сканувати штрих-код" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "Отримуємо дані ключа. Будь ласка, зачекайте…" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "Отримання даних ключа було перервано!" #: keysign/receive.ui:346 #| msgid "Display more details for the error." msgid "Show details about the error" msgstr "Показати подробиці щодо помилки" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "Сертифікація із помилками ☹\n" "Щось сталося. Іноді, причиною помилки є неправильно введений пароль.\n" "Ви можете повторити спробу, натиснувши кнопку «Підтвердити»." #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "" "Зберігає створені дані сертифікації як окремі файли у нетиповому каталозі" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "" "Імпортує тимчасову версію створених даних сертифікації до локальної зв'язки " "ключів" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "Сертифікацію успішно виконано.\n" "Ви можете імпортувати тимчасовий підпис, щоб розпочати користуватися ключем " "так, ніби його було належним чином засвідчено.\n" "Щоб дізнатися більше, ознайомтеся із документацією." #: keysign/receive.ui:541 msgid "Key" msgstr "Ключ" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "Щоб підписати ключ, підтвердьте, що ви хочете підписати вказаний нижче " "ключ.\n" "У відповідь буде створено поштове повідомлення, яке слід надіслати, щоб " "завершити процедуру підписування." #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "_Підтвердити" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "Підписуємо такі UID:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "" "Усе ще намагаємося встановити з'єднання із інтернетом. Здається, з'єднання є " "надто повільним або взагалі недоступним." #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "Немає з'єднання із інтернетом!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "Ключ успішно надіслано.\n" "Невдовзі ви маєте отримати поштове повідомлення із підписом." #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "Не вдалося встановити безпечне з'єднання.\n" "Або вашим колегою введено помилковий код, або хтось спробував перехопити " "ваше з'єднання." #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "Сталася неочікувана помилка:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "Виберіть і надішліть ключ" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "Виберіть і надішліть ключ" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "Крім того, скористайтеся інтернетом для передавання сертифіката" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "У вас немає жодного ключа!\n" "Будь ласка, скористайтеся, наприклад, Seahorse для створення ключа." #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "З'єднання із інтернетом є дуже повільним або його немає взагалі!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "Підпис було успішно імпортовано!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "" "Повертає отриманий сертифікат відправнику, щоб відправник міг скористатися " "вашим сертифікатом OpenPGP" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "Показати більше подробиць щодо помилки." #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "Під час спроби імпортувати підпис сталася помилка." #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "Виберіть ключ для підписування" #: keysign/send.ui:443 msgid "Times signed" msgstr "Разів підписано" #: keysign/send.ui:510 msgid "Keylist" msgstr "Список ключів" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "" "Щоб підписати ключ, інша особа має ввести код захисту або виконати " "сканування QR-коду" #: keysign/send.ui:557 msgid "Key Details" msgstr "Параметри ключа" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "Відбиток" #: keysign/send.ui:736 msgid "QR Code" msgstr "QR-код" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "Добрий день, $uid,\n" "\n" "\n" "Мною щойно виконано підписування вашого ключа\n" "\n" " $fingerprint\n" "\n" "\n" "Дякую за можливість підписати ваш ключ!\n" "\n" "--\n" "«Підписувач ключів» GNOME\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "Помилковий код розпізнавання з повідомлення" gnome-keysign-1.3.0/keysign/locale/zh_CN/000077500000000000000000000000001431057335600202075ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/zh_CN/LC_MESSAGES/000077500000000000000000000000001431057335600217745ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/locale/zh_CN/LC_MESSAGES/keysign.po000066400000000000000000000336261431057335600240170ustar00rootroot00000000000000# Chinese (China) translation for gnome-keysign. # Copyright (C) 2020 gnome-keysign's COPYRIGHT HOLDER # This file is distributed under the same license as the gnome-keysign package. # Damned , 2020. # Dingzhong Chen , 2020. # lumingzh , 2022. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2021-05-31 10:45+0000\n" "PO-Revision-Date: 2022-02-07 18:17+0800\n" "Last-Translator: lumingzh \n" "Language-Team: Chinese - China \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "X-Generator: Gtranslator 41.0\n" "Plural-Forms: nplurals=1; plural=0\n" #: data/org.gnome.Keysign.raw.appdata.xml:11 msgid "" "\n" " GNOME Keysign allows signing OpenPGP keys comfortably and securely\n" " via the local network or Bluetooth.\n" " " msgstr "" "\n" " GNOME Keysign 让您通过本地网络或蓝牙轻松、安全地签署 OpenPGP 密钥。\n" " " #: data/org.gnome.Keysign.raw.appdata.xml:15 msgid "" "\n" " It can scan another key's barcode and transfer the key securely,\n" " allowing for casual two-party key signing sessions.\n" " It follows best practises by sending the encrypted signatures\n" " to the UIDs of a key using the Email client the user configured\n" " to use.\n" " " msgstr "" "\n" " 它可以扫描另一个密钥的条形码并安全地传输密钥,从而允许任意两方\n" " 进行密钥签署会话。\n" " 它遵循最佳实践:使用由用户配置使用的电子邮件客户端,将加密签名\n" " 发送到密钥的 UID 。\n" " " #. Name #: data/org.gnome.Keysign.raw.desktop:2 msgid "Keysign" msgstr "Keysign" #. Comment #: data/org.gnome.Keysign.raw.desktop:3 msgid "" "A keysigning helper to enable you to comfortably exchange OpenPGP keys with " "a friend" msgstr "密钥签署助手,让您轻松地与朋友交换 OpenPGP 密钥" #. Keywords #: data/org.gnome.Keysign.raw.desktop:4 msgid "python;gpg;gnupg;key;openpgp;" msgstr "python;gpg;gnupg;key;openpgp;密钥;" #. Icon #: data/org.gnome.Keysign.raw.desktop:7 msgid "org.gnome.Keysign" msgstr "org.gnome.Keysign" #: keysign/app.py:186 msgid "Send" msgstr "发送" #: keysign/app.py:188 keysign/receive.py:279 msgid "Receive" msgstr "接收" #: keysign/app.ui:62 keysign/send.ui:55 msgid "Internet" msgstr "互联网" #: keysign/avahioffer.py:83 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "提供的密钥:{}" #: keysign/avahioffer.py:84 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "发现的信息:{}" #: keysign/avahioffer.py:86 msgid "Press Enter to stop" msgstr "按 Enter 键停止" #: keysign/bluetoothoffer.py:117 msgid "You must provide an argument to identify the key" msgstr "您必须提供标识该密钥的参数" #: keysign/bluetoothoffer.py:128 msgid "HMAC: {}" msgstr "HMAC:{}" #: keysign/bluetoothoffer.py:129 msgid "Port: {}" msgstr "端口:{}" #: keysign/bluetoothoffer.py:132 msgid "Bluetooth not available" msgstr "蓝牙不可用" #: keysign/bluetoothoffer.py:137 msgid "Press Enter to cancel" msgstr "按 Enter 键取消" #: keysign/bluetoothoffer.py:144 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "密钥发送成功" #: keysign/bluetoothoffer.py:146 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "发生错误:{}" #: keysign/bluetoothoffer.py:148 msgid "Press Enter to exit" msgstr "按 Enter 键退出" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "正在尝试下载密钥,请稍候" #: keysign/dialog_avahi.ui:8 msgid "Unable to Start Avahi" msgstr "无法启动 Avahi" #: keysign/dialog_avahi.ui:9 msgid "" "Keysign is unable to automatically start Avahi. You can try to execute " "`systemctl start avahi-daemon` for solving this problem." msgstr "" "Keysign 无法自动启动 Avahi。您可以尝试执行“systemctl start avahi-daemon”以解" "决此问题。" #: keysign/dialog_avahi.ui:23 msgid "OK" msgstr "确定" #: keysign/gtkexcepthook.py:173 msgid "Bug Detected" msgstr "检测到错误" #: keysign/gtkexcepthook.py:175 msgid "A programming error has been detected." msgstr "已检测到程序错误。" #: keysign/gtkexcepthook.py:178 msgid "" "You may be able to ignore this error and carry on working, but you may get " "unexpected results.\n" "\n" "Please tell the developers about this using the issue tracker if no-one else " "has reported it yet." msgstr "" "您或许可以忽略此错误并继续工作,但您可能会得到意外的结果。\n" "\n" "如果还没有其他人报告此错误,请使用问题跟踪器将其告知开发者。" #: keysign/gtkexcepthook.py:187 msgid "Search Tracker..." msgstr "搜索 Tracker…" #: keysign/gtkexcepthook.py:189 msgid "Report..." msgstr "报告…" #: keysign/gtkexcepthook.py:191 msgid "Ignore Error" msgstr "忽略错误" #: keysign/gtkexcepthook.py:192 msgid "Quit GNOME Keysign" msgstr "退出 GNOME Keysign" #: keysign/gtkexcepthook.py:202 msgid "Details..." msgstr "详细信息…" #: keysign/gtkexcepthook.py:229 keysign/gtkexcepthook.py:232 msgid "Exception while analyzing the exception." msgstr "分析异常时又出现了异常。" #. TRANSLATORS: Crash report template for github, preceding a traceback. #. TRANSLATORS: Please ask users kindly to supply at least an English #. TRANSLATORS: title if they are able. #: keysign/gtkexcepthook.py:281 msgid "" " #### Description\n" "\n" " Give this report a short descriptive title.\n" " Use something like\n" " \"{feature-that-broke}: {what-went-wrong}\"\n" " for the title, if you can.\n" " Then please replace this text\n" " with a longer description of the bug.\n" " Screenshots or videos are great, too!\n" "\n" " #### Steps to reproduce\n" "\n" " Please tell us what you were doing\n" " when the error message popped up.\n" " If you can provide step-by-step instructions\n" " on how to reproduce the bug,\n" " that's even better.\n" "\n" " #### Traceback\n" " " msgstr "" " #### 描述\n" "\n" " 请至少为这份报告起个简短的描述性英文标题。\n" " 如果可以,使用类似于\n" " “{feature-that-broke}: {what-went-wrong}”\n" " 的标题。然后将此文本替换为对该错误的更详细\n" " 的描述。截图或视频也可以!\n" "\n" " #### 复现步骤\n" "\n" " 请告知我们当错误消息弹出时您正在做什么。\n" " 如果您能提供关于如何复现该错误的逐步说明,\n" " 会更有帮助。\n" "\n" " #### 追溯\n" " " #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "到期:" #: keysign/receive.py:158 msgid "Sign Key" msgstr "签署密钥" #: keysign/receive.py:225 msgid "Select file for saving" msgstr "选择要保存的文件" #: keysign/receive.ui:53 msgid "" "No GNOME Keysign servers around :-(\n" "Find a friend to use GNOME Keysign with.\n" "You may also suffer from connectivity problems.\n" "For more information visit the documentation." msgstr "" "周围没有 GNOME Keysign 服务器 :-(\n" "查找朋友以与其一起使用 GNOME Keysign。\n" "您也可能是遇到了连接问题。\n" "要了解更多信息,访问文档。" #: keysign/receive.ui:108 msgid "" "To sign someone's key, scan their QR or enter security code" msgstr "要签署某人的密钥,请扫描其二维码或输入安全代码" #: keysign/receive.ui:127 msgid "Camera" msgstr "摄像头" #: keysign/receive.ui:142 msgid "Integrated Web Cam" msgstr "集成网络摄像头" #: keysign/receive.ui:179 keysign/send.ui:673 msgid "Security Code" msgstr "安全代码" #: keysign/receive.ui:212 msgid "Scan Barcode" msgstr "扫描条形码" #: keysign/receive.ui:229 msgid "Downloading key-data. Please wait..." msgstr "正在下载密钥数据。请稍候……" #: keysign/receive.ui:254 msgid "Key download was interrupted!" msgstr "密钥下载已中断!" #: keysign/receive.ui:346 #| msgid "Display more details for the error." msgid "Show details about the error" msgstr "显示该错误详情" #: keysign/receive.ui:379 msgid "" "Error producing certifications ☹\n" "Something went wrong. Sometime, the passphrase was not correctly entered.\n" "You may try again by clicking the \"confirm\" button." msgstr "" "生成证书出错 ☹\n" "有地方出错了。有时候可能没有正确输入密码。\n" "您可以通过点击“确认”按钮重试。" #: keysign/receive.ui:427 msgid "" "Saves the produced certifications as separate files in a custom directory" msgstr "将生成的证书以单独的文件保存在自定义目录中" #: keysign/receive.ui:442 msgid "" "Imports a temporary version of the produced certifications into the local " "keyring" msgstr "将生成的证书的临时版本导入到本地密钥环中" #: keysign/receive.ui:485 msgid "" "Successfully produced certifications.\n" "You can import a temporary signature to start using the key as if it had " "already been properly verified.\n" "For more information visit the documentation." msgstr "" "生成证书成功。\n" "您可以导入临时签名以开始使用该密钥,如同该密钥已被验证过一样。\n" "要了解更多信息,访问文档。" #: keysign/receive.ui:541 msgid "Key" msgstr "密钥" #: keysign/receive.ui:574 keysign/send.ui:598 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:651 msgid "" "To sign the key, confirm that you want to sign the following key.\n" "This will generate an email that must be sent in order to complete the " "signing process." msgstr "" "要签署密钥,确认您希望签署下列密钥。\n" "这将生成一封电子邮件,必须将其发送才能完成签署过程。" #: keysign/receive.ui:676 msgid "C_onfirm" msgstr "确认(_O)" #: keysign/receive.ui:798 msgid "Signing the following UIDs:" msgstr "正在签署下列 UID:" #: keysign/send.py:218 msgid "" "Still trying to get a connection to the Internet. It appears to be slow or " "unavailable." msgstr "仍在尝试获取互联网连接。连接似乎很慢或不可用。" #: keysign/send.py:224 msgid "There isn't an Internet connection!" msgstr "没有互联网连接!" #: keysign/send.py:280 keysign/send.ui:783 msgid "" "Key successfully sent.\n" "You should receive soon an email with the signature." msgstr "" "密钥发送成功。\n" "您不久后会收到带有签名的电子邮件。" #: keysign/send.py:285 msgid "" "Could not establish a secure connection.\n" "Either your partner has entered a wrong code or someone tried to intercept " "your connection" msgstr "" "无法建立安全连接。\n" "您的伙伴可能输入了错误的代码,或者某个人试图拦截您的连接" #: keysign/send.py:289 #, python-format msgid "" "An unexpected error occurred:\n" "%s" msgstr "" "发生了意外错误:\n" "%s" #: keysign/send.ui:7 msgid "Select and send key" msgstr "选择并发送密钥" #: keysign/send.ui:13 msgid "Select and Send key" msgstr "选择并发送密钥" #: keysign/send.ui:53 msgid "Also use the Internet to transfer the certificate" msgstr "并使用互联网传输该证书" #: keysign/send.ui:122 msgid "" "You don't have any keys!\n" "Please use, e.g. Seahorse to create one." msgstr "" "您没有任何密钥!\n" "请使用例如 Seahorse 等软件创建一个密钥。" #: keysign/send.ui:199 msgid "Very slow or no Internet connection!" msgstr "非常慢或没有互联网连接!" #: keysign/send.ui:268 msgid "The signature has been successfully imported!" msgstr "已成功导入签名!" #: keysign/send.ui:294 msgid "" "Returns the received certification back to the sender, so that the sender " "can make use of your OpenPGP certificate" msgstr "将接收的证书返回给发件人,以便发件人可以使用您的 openPGP 证书" #: keysign/send.ui:341 msgid "Display more details for the error." msgstr "显示关于错误的更多信息。" #: keysign/send.ui:372 msgid "An error occurred while trying to import the signature." msgstr "尝试导入签名时出错。" #. This refers to the key being certified by someone rather than the key used for #. certifying someone #: keysign/send.ui:427 msgid "Select a key for signing" msgstr "选择要签署的密钥" #: keysign/send.ui:443 msgid "Times signed" msgstr "签署时间" #: keysign/send.ui:510 msgid "Keylist" msgstr "密钥列表" #: keysign/send.ui:530 msgid "" "To have the key signed, the other person must enter the security " "code, or scan the QR code" msgstr "要签署密钥,另一个人必须输入安全代码,或扫描二维码" #: keysign/send.ui:557 msgid "Key Details" msgstr "密钥详细信息" #: keysign/send.ui:582 msgid "Fingerprint" msgstr "指纹" #: keysign/send.ui:736 msgid "QR Code" msgstr "二维码" #: keysign/util.py:231 msgid "" "Hi $uid,\n" "\n" "\n" "I have just signed your key\n" "\n" " $fingerprint\n" "\n" "\n" "Thanks for letting me sign your key!\n" "\n" "--\n" "GNOME Keysign\n" msgstr "" "您好 $uid,\n" "\n" "\n" "我刚刚签署了您的密钥\n" "\n" " $fingerprint\n" "\n" "\n" "感谢您让我签署您的密钥!\n" "\n" "--\n" "GNOME Keysign\n" #: keysign/wormholereceive.py:86 msgid "Wrong message authentication code" msgstr "消息验证代码错误" gnome-keysign-1.3.0/keysign/network/000077500000000000000000000000001431057335600174405ustar00rootroot00000000000000gnome-keysign-1.3.0/keysign/network/AvahiBrowser.py000066400000000000000000000135611431057335600224140ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # Copyright 2014 Andrei Macavei # Copyright 2015 Jody Hansen # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from __future__ import print_function import logging import os import dbus from dbus.mainloop.glib import DBusGMainLoop from gi.repository import GObject if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) __package__ = str('keysign') from .AvahiConstants import AvahiConstants as avahi from ..errors import NoAvahiDbus __all__ = ["AvahiBrowser"] DBusGMainLoop( set_as_default=True ) log = logging.getLogger(__name__) # This should probably be upstreamed. # Unfortunately, upstream seems rather inactive. if getattr(avahi, 'txt_array_to_dict', None) is None: # This has been taken from Gajim # https://dev.gajim.org/gajim/gajim/blob/2d6e7d2e/gajim/common/zeroconf/zeroconf_avahi.py#L131 # it is licensed under the GPLv3. # https://github.com/lathiat/avahi/pull/133 def txt_array_to_dict(txt_array): txt_dict = {} for els in txt_array: key, val = '', None for c in els: c = chr(c) if val is None: if c == '=': val = '' else: key += c else: val += c if val is None: # missing '=' val = '' txt_dict[key] = val return txt_dict setattr(avahi, 'txt_array_to_dict', txt_array_to_dict) class AvahiBrowser(GObject.GObject): __gsignals__ = { str('new_service'): (GObject.SignalFlags.RUN_LAST, None, # name, address (could be an int too (for IPv4)), port, txt_dict (str, str, int, object)), str('remove_service'): (GObject.SignalFlags.RUN_LAST, None, # string 'remove'(placeholder: tuple element must be sequence), name (str, str)), } def __init__(self, loop=None, service='_gnome-keysign._tcp'): GObject.GObject.__init__(self) self.log = logging.getLogger(__name__) self.service = service # It seems that these are different loops..?! self.loop = loop or DBusGMainLoop() self.bus = dbus.SystemBus(mainloop=self.loop) try: self.server = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, '/'), 'org.freedesktop.Avahi.Server') except dbus.exceptions.DBusException as de: log.exception("Avahi cannot be started: %s", de) raise NoAvahiDbus(de) self.sbrowser = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, self.server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, self.service, 'local', dbus.UInt32(0))), avahi.DBUS_INTERFACE_SERVICE_BROWSER) self.sbrowser.connect_to_signal("ItemNew", self.on_new_item) self.sbrowser.connect_to_signal("ItemRemove", self.on_service_removed) def on_new_item(self, interface, protocol, name, stype, domain, flags): self.log.info("Found service '%s' type '%s' domain '%s' ", name, stype, domain) if flags & avahi.LOOKUP_RESULT_LOCAL: # FIXME skip local services pass self.server.ResolveService(interface, protocol, name, stype, domain, avahi.PROTO_UNSPEC, dbus.UInt32(0), reply_handler=self.on_service_resolved, error_handler=self.on_error) def on_service_resolved(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): '''called when the browser successfully found a service''' txt = avahi.txt_array_to_dict(txt) self.log.info("Service resolved; name: '%s', address: '%s'," "port: '%s', and txt: '%s'", name, address, port, txt) retval = self.emit('new_service', name, address, port, txt) self.log.info("emitted '%s'", retval) def on_service_removed(self, interface, protocol, name, stype, domain, flags): '''Emits items to be removed from list of discovered services.''' self.log.info("Service removed; name: '%s'", name) retval = self.emit('remove_service', 'remove', name) self.log.info("emitted '%s'", retval) def on_error(self, *args): print('error_handler') print(args[0]) def main(): loop = GObject.MainLoop() # We're not passing the loop to DBus, because... well, it # does't work... It seems to expect a DBusMainLoop, not # an ordinary main loop... ab = AvahiBrowser() def print_signal(*args): print("Signal ahoi", args) ab.connect('new_service', print_signal) ab.connect('remove_service', print_signal) loop.run() if __name__ == "__main__": main() gnome-keysign-1.3.0/keysign/network/AvahiConstants.py000066400000000000000000000041401431057335600227360ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2018 Ludovico de Nittis # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import sys import dbus if sys.version_info[0] >= 3: unicode = str class AvahiConstants: SERVER_RUNNING = 2 SERVER_COLLISION = 3 ENTRY_GROUP_ESTABLISHED = 2 ENTRY_GROUP_COLLISION = 3 ENTRY_GROUP_FAILURE = 4 PROTO_UNSPEC = -1 IF_UNSPEC = -1 LOOKUP_RESULT_LOCAL = 8 DBUS_NAME = "org.freedesktop.Avahi" DBUS_INTERFACE_SERVER = DBUS_NAME + ".Server" DBUS_PATH_SERVER = "/" DBUS_INTERFACE_ENTRY_GROUP = DBUS_NAME + ".EntryGroup" DBUS_INTERFACE_SERVICE_BROWSER = DBUS_NAME + ".ServiceBrowser" @staticmethod def string_to_byte_array(s): if isinstance(s, unicode): s = s.encode('utf-8') r = [] for c in s: if isinstance(c, int): # Python 3: iterating over bytes yields ints r.append(dbus.Byte(c)) else: # Python 2: iterating over str yields str r.append(dbus.Byte(ord(c))) return r @staticmethod def dict_to_txt_array(txt_dict): l = [] for k, v in txt_dict.items(): if isinstance(k, unicode): k = k.encode('utf-8') if isinstance(v, unicode): v = v.encode('utf-8') l.append(AvahiConstants.string_to_byte_array(b"%s=%s" % (k, v))) return l gnome-keysign-1.3.0/keysign/network/AvahiPublisher.py000066400000000000000000000133411431057335600227220ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # Copyright 2014 Andrei Macavei # Copyright 2015 Jody Hansen # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import os import dbus from dbus.mainloop.glib import DBusGMainLoop from gi.repository import GObject if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) __package__ = str('keysign') from .AvahiConstants import AvahiConstants as avahi DBusGMainLoop(set_as_default=True) class AvahiPublisher: def __init__(self, service_name='Demo Service', service_type='_demo._tcp', service_port=8899, service_txt={}, domain='', host=''): self.log = logging.getLogger(__name__) #self.loop = loop or DBusGMainLoop() self.bus = dbus.SystemBus() self.server = dbus.Interface( self.bus.get_object( avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER ), avahi.DBUS_INTERFACE_SERVER ) self.service_name = service_name #See http://www.dns-sd.org/ServiceTypes.html self.service_type = service_type self.service_port = service_port self.service_txt = avahi.dict_to_txt_array(service_txt) #TXT record for the service self.domain = domain # Domain to publish on, default to .local self.host = host # Host to publish records for, default to localhost self.group = None # Counter so we only rename after collisions a sensible number of times self.rename_count = 12 def add_service(self): if self.group is None: group = dbus.Interface( self.bus.get_object( avahi.DBUS_NAME, self.server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP) group.connect_to_signal('StateChanged', self.entry_group_state_changed) self.group = group self.log.info("Adding service '%s' of type '%s' with fpr '%s'", self.service_name, self.service_type, self.service_txt) group = self.group group.AddService( avahi.IF_UNSPEC, #interface avahi.PROTO_UNSPEC, #protocol dbus.UInt32 (0), #flags self.service_name, self.service_type, self.domain, self.host, dbus.UInt16 (self.service_port), self.service_txt) group.Commit() def remove_service(self): '''Publishes services to be removed with name, stype, and domain.''' self.log.info("Removing with fpr '%s'", self.service_txt) if not self.group is None: self.group.Reset() def server_state_changed(self, state): if state == avahi.SERVER_COLLISION: self.log.warn("Server name collision (%s)", self.service_name) self.remove_service() elif state == avahi.SERVER_RUNNING: self.add_service() def entry_group_state_changed(self, state, error): self.log.debug("state change: %i", state) if state == avahi.ENTRY_GROUP_ESTABLISHED: self.log.info("Service established.") elif state == avahi.ENTRY_GROUP_COLLISION: self.rename_count -= 1 if self.rename_count > 0: name = self.server.GetAlternativeServiceName(self.service_name) self.log.warn("Service name collision, changing name to '%s'", name) self.remove_service() self.add_service() else: # FIXME: max_renames is not defined. We probably want to restructure # this a little bit, anyway. i.e. have a self.max_renames # and a self.rename_count or so m = "No suitable service name found after %i retries, exiting." self.log.error(m, self.max_renames) raise RuntimeError(m % self.max_renames) elif state == avahi.ENTRY_GROUP_FAILURE: m = "Error in group state changed %s" self.log.error(m, error) raise RuntimeError(m % error) DBusGMainLoop( set_as_default=True ) if __name__ == '__main__': ap = AvahiPublisher() ap.add_service() main_loop = GObject.MainLoop() bus = dbus.SystemBus() server = dbus.Interface( bus.get_object( avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER ), avahi.DBUS_INTERFACE_SERVER ) server.connect_to_signal( "StateChanged", ap.server_state_changed ) ap.server_state_changed( server.GetState() ) try: main_loop.run() except KeyboardInterrupt: pass if not ap.group is None: ap.group.Free() gnome-keysign-1.3.0/keysign/network/__init__.py000066400000000000000000000015311431057335600215510ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014 Tobias Mueller # Copyright 2014 Andrei Macavei # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . gnome-keysign-1.3.0/keysign/offer.py000066400000000000000000000045651431057335600174340ustar00rootroot00000000000000import logging from twisted.internet.defer import inlineCallbacks, returnValue from .wormholeoffer import WormholeOffer from .avahioffer import AvahiHTTPOffer try: from .bluetoothoffer import BluetoothOffer except ImportError: BluetoothOffer = None log = logging.getLogger(__name__) class Offer: def __init__(self, key, app_id=None, w_code=None): self.key = key self.app_id = app_id self.w_code = w_code self.w_offer = None self.a_offer = None self.bt_offer = None self.b_data = None @inlineCallbacks def allocate_code(self, worm=True): self.a_offer = AvahiHTTPOffer(self.key) code, a_data = self.a_offer.allocate_code() discovery_data = [a_data] if worm: self.w_offer = WormholeOffer(self.key) w_info = yield self.w_offer.allocate_code() code, w_data = w_info if w_data: discovery_data.append(w_data) if BluetoothOffer: self.bt_offer = BluetoothOffer(self.key) self.b_data = yield self.bt_offer.allocate_code() if self.b_data: discovery_data.append(self.b_data) discovery_data = ";".join(discovery_data) # As design when we use both avahi and wormhole we only display # the wormhole code returnValue((code, discovery_data)) def start(self): avahi_defers = self.a_offer.start() d = [avahi_defers] if avahi_defers else [] if self.w_offer: w_d = self.w_offer.start() d.append(w_d) # If we have a Bluetooth code, so if the Bluetooth has been # correctly initialized if not self.b_data: log.info("Bluetooth as been skipped") else: bt_d = self.bt_offer.start() d.append(bt_d) return d def stop_avahi(self): if self.a_offer: self.a_offer.stop() # We need to deallocate the avahi object or the used port will never be released self.a_offer = None def stop_wormhole(self): if self.w_offer: self.w_offer.stop() self.w_offer = None def stop_bt(self): if self.bt_offer: self.bt_offer.stop() self.bt_offer = None def stop(self): self.stop_avahi() self.stop_wormhole() self.stop_bt() gnome-keysign-1.3.0/keysign/receive.py000077500000000000000000000275671431057335600177670ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import re import os import signal import sys from textwrap import dedent import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GLib gi.require_version('Gst', '1.0') from gi.repository import Gst if __name__ == "__main__": from twisted.internet import gtk3reactor gtk3reactor.install() from twisted.internet import reactor, threads from twisted.internet.defer import inlineCallbacks from wormhole.errors import WrongPasswordError, LonelyError if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .avahidiscovery import AvahiKeysignDiscoveryWithMac from .discover import Discover from .errors import NoBluezDbus, UnpoweredAdapter, NoAdapter from .gpgmeh import openpgpkey_from_data, local_sign_keydata, GPGRuntimeError from .i18n import _ from .keyfprscan import KeyFprScanWidget from .keyconfirm import PreSignWidget from .util import sign_keydata_and_send, fix_infobar, get_local_bt_address log = logging.getLogger(__name__) def remove_whitespace(s): cleaned = re.sub('[\s+]', '', s) return cleaned class ReceiveApp: def __init__(self, builder=None): self.psw = None self.discovery = None self.log = logging.getLogger(__name__) widget_name = "receive_stack" if not builder: ui_file = os.path.join( os.path.dirname(os.path.abspath(__file__)), "receive.ui") builder = Gtk.Builder() builder.add_objects_from_file(ui_file, [widget_name, 'confirm-button-image']) self.accept_button = builder.get_object("confirm_sign_button") old_scanner = builder.get_object("scanner_widget") old_scanner_parent = old_scanner.get_parent() scanner = KeyFprScanWidget() #builder=builder) scanner.connect("changed", self.on_code_changed) scanner.connect("barcode", self.on_barcode) if old_scanner_parent: old_scanner_parent.remove(old_scanner) # Hm. If we don't have an old parent, we never get to see # the newly created scanner. Weird. old_scanner_parent.add(scanner) receive_stack = builder.get_object(widget_name) # It needs to be show()n so that it can be made visible scanner.show() # FIXME: Use "stack_scanner_child" or so as identification # for the stack's scanner child to make it visible when the # app starts # receive_stack.set_visible_child(old_scanner_parent) self.scanner = scanner self.stack = receive_stack self.discovery = AvahiKeysignDiscoveryWithMac() ib = builder.get_object('infobar_discovery') fix_infobar(ib) self.discovery.connect('list-changed', self.on_list_changed, ib) self.discover = None self.rb = builder.get_object('box50') self.result_label = builder.get_object("error_download_label") self.cancel_button = builder.get_object("cancel_download_button") self.redo_button = builder.get_object("redo_download_button") self.redo_button.connect("clicked", self.on_redo_button_clicked) self.cancel_button.connect("clicked", self.on_cancel_button_clicked) # Clear the "downloading" label builder.get_object("label10").set_label("") self.bt_usable = False # We call this in async because it can take several seconds to complete and we don't want # to stall the UI boot. Also we don't care about having this information immediately. threads.deferToThread(self.check_bt_availability) def on_redo_button_clicked(self, button): log.info("redo pressed") self.stack.remove(self.rb) self.discover.start() def on_cancel_button_clicked(self, button): log.info("cancel pressed") self.stack.remove(self.rb) def check_bt_availability(self): try: if get_local_bt_address(): self.bt_usable = True log.debug("A working Bluetooth seems to be available") else: self.bt_usable = False log.debug("There is no usable Bluetooth") except NoBluezDbus as e: log.debug("Bluetooth service seems to be unavailable: %s", e) except NoAdapter as e: log.debug("Bluetooth adapter is not available: %s", e) except UnpoweredAdapter as e: log.debug("Bluetooth adapter is turned off: %s", e) def on_keydata_downloaded(self, keydata, pixbuf=None): key = openpgpkey_from_data(keydata) psw = PreSignWidget(key, pixbuf) psw.connect('sign-key-confirmed', self.on_sign_key_confirmed, keydata) self.stack.add_titled(psw, "presign", _("Sign Key")) psw.set_name("presign") psw.show() self.psw = psw self.stack.set_visible_child(self.psw) def on_message_received(self, key_data, success=True, message=None): if success: self.log.debug("message received") try: self.on_keydata_downloaded(key_data) except ValueError as ve: log.error(ve.args[0]) else: self.stack.add(self.rb) self.result_label.set_label(dedent(message.__doc__)) self.stack.set_visible_child(self.rb) def on_code_changed(self, scanner, entry): self.log.debug("Entry changed %r: %r", scanner, entry) text = entry.get_text() self._receive(text) def on_barcode(self, scanner, barcode, gstmessage, pixbuf): self.log.debug("Scanned barcode %r", barcode) self._receive(barcode) @inlineCallbacks def _receive(self, code): if self.discover: self.discover.stop() self.discover = Discover(code, self.discovery) msg_tuple = yield self.discover.start() key_data, success, message = msg_tuple if message == WrongPasswordError or message == LonelyError: # If a wrong password has been provided or we closed the connection # before a transfer. We do not display that to the user log.info("Waiting for another code") pass else: self.on_message_received(key_data, success, message) def on_sign_key_confirmed(self, keyPreSignWidget, key, keydata): self.log.debug ("Sign key confirmed! %r", key) # We need to prevent tmpfiles from going out of # scope too early so that they don't get deleted try: tmpfiles_plaintext = list(sign_keydata_and_send(keydata)) except GPGRuntimeError as e: self.log.exception("Something went wrong with signing the key") keyPreSignWidget.infobar_success.hide() keyPreSignWidget.infobar_errors.show(e) else: self.log.debug("sign keydata result: %r", tmpfiles_plaintext) # This is unzipping the list of tuples, e.g. [(1,2), (3,4)] becomes [(1,3), (2,4)] self.tmpfiles, plaintexts = zip(*tmpfiles_plaintext) keyPreSignWidget.infobar_errors.hide() keyPreSignWidget.infobar_success.show() def import_clicked(button): self.log.info("Import clicked") local_sign_keydata(keydata) keyPreSignWidget.infobar_import_button.connect("clicked", import_clicked) def save_as_clicked(button): self.log.info("Save as clicked") dialog = Gtk.FileChooserDialog(_("Select file for saving"), self.get_toplevel(), Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK) ) response = dialog.run() if response == Gtk.ResponseType.OK: filename = dialog.get_filename() self.log.info("Saving file to: %r", filename) with open(filename, 'wb') as f: for p in plaintexts: f.write(p) for sigfile in self.tmpfiles: pass # Hrm. Those are the encrypted files, I think. # We probably want to offer the plaintext versions, though #f.write(open(sigfile, 'r').read()) else: self.log.info("Not saving file: %r", response) dialog.destroy() keyPreSignWidget.infobar_save_as_button.connect("clicked", save_as_clicked) # After the user has signed, we switch back to the scanner, # because currently, there is not much to do on the # key confirmation page. log.debug ("Signed the key: %r", self.tmpfiles) # self.stack.set_visible_child_name("scanner") def on_list_changed(self, discovery, number, userdata): """We show an infobar if we can only receive with Avahi and there are zero nearby servers""" ib = userdata if number == 0 and not self.bt_usable: ib.show() elif ib.is_visible(): ib.hide() class App(Gtk.Application): def __init__(self, *args, **kwargs): super(App, self).__init__(*args, **kwargs) self.connect('activate', self.on_activate) self.log = logging.getLogger(__name__) def on_activate(self, app): ui_file = os.path.join( os.path.dirname(os.path.abspath(__file__)), "receive.ui") builder = Gtk.Builder.new_from_file(ui_file) window = Gtk.ApplicationWindow() window.connect("delete-event", self.on_delete_window) window.set_title(_("Receive")) # window.set_size_request(600, 400) #window = self.builder.get_object("appwindow") self.receive = ReceiveApp(builder) receive_stack = self.receive.stack window.add(receive_stack) window.show_all() self.add_window(window) @staticmethod def on_delete_window(*args): reactor.callFromThread(reactor.stop) def main(args=[]): log = logging.getLogger(__name__) log.debug('Running main with args: %s', args) if not args: args = [] Gst.init(None) app = App() try: GLib.unix_signal_add_full(GLib.PRIORITY_HIGH, signal.SIGINT, lambda *args: reactor.callFromThread(reactor.stop), None) except AttributeError: pass reactor.registerGApplication(app) reactor.run() if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') sys.exit(main(sys.argv[1:])) gnome-keysign-1.3.0/keysign/receive.ui000066400000000000000000001074111431057335600177340ustar00rootroot00000000000000 True False gtk-apply True False slide-left-right scanner True False vertical False True False 6 end False False 0 False 16 True False No GNOME Keysign servers around :-( Find a friend to use GNOME Keysign with. You may also suffer from connectivity problems. For more information visit <a href="https://wiki.gnome.org/Apps/Keysign/Doc/NoServers/1">the documentation</a>. True False True 0 False False 0 False True 0 True False 100 100 10 5 vertical 6 True False <small>To sign someone's key, scan their QR or enter security code</small> True 0 False True 1 True False 20 True False <b>Camera</b> True False True 0 True False 0 Integrated Web Cam True True end 1 False True 2 True False vertical True True 3 True False start <b>Security Code</b> True 0 False True 4 fingerprint_entry True True False True 5 True True 2 scanner Scan Barcode True False 20 20 10 10 vertical 6 True False Downloading key-data. Please wait... False True 0 True False True True 1 False Key download was interrupted! True char False True 2 True False gtk-cancel True True True True True False True end 0 gtk-redo True True True True True False True end 1 False True 3 page1 page1 1 Confirm Signing Key True False 20 20 10 10 vertical 6 False error False 6 end gtk-help True True True Show details about the error True True True 0 False False 0 False 16 True True Error producing certifications ☹ Something went wrong. Sometime, the passphrase was not correctly entered. You may try again by clicking the "confirm" button. True False True 0 False False 0 False True 0 False False 6 end gtk-save-as True True True Saves the produced certifications as separate files in a custom directory True True True 0 gtk-jump-to True True True Imports a temporary version of the produced certifications into the local keyring True True True True 1 gtk-go-up True True True True True True True 2 False False 0 False 16 True False Successfully produced certifications. You can import a temporary signature to start using the key as if it had already been properly verified. For more information visit <a href="https://wiki.gnome.org/Apps/Keysign/Doc/ProducedSignatures/1">the documentation</a>. True False True 0 False False 0 False True 1 True False vertical True False 15 2 3 True False vertical True False start Key 0 False True 0 200 True False 23FD 347A 4194 29BA CCD5 E72D 6BC4 7780 54AC D246 True 0 False True 1 True False start 5 UIDs 0 False True 2 True False Zulu Test <foo@example.com> Alpha Bar <example@example.com> True 0 False True 3 False True 0 200 200 True False 5 immediate vertical 200 200 True False end gtk-missing-image False True 0 True True 2 1 True True 1 True False To sign the key, confirm that you want to sign the following key. This will generate an email that must be sent in order to complete the signing process. True 0 False True 2 True True 2 True False 6 C_onfirm confirm_button True True True True True confirm-button-image True True False True end 0 False True end 5 page2 page2 2 True False 20 20 10 10 vertical 6 True False False True 1 True False True True 2 False False True 3 True False gtk-cancel True True True True True False True end 0 False True end 4 True False Signing the following UIDs: False True 5 page3 page3 3 gnome-keysign-1.3.0/keysign/scan_barcode.py000077500000000000000000000316251431057335600207360ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2014, 2015 Tobias Mueller # Copyright 2014 Andrei Macavei # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import signal import sys import gi gi.require_version('Gst', '1.0') gi.require_version('GstVideo', '1.0') gi.require_version('Gtk', '3.0') from gi.repository import GObject from gi.repository import Gst from gi.repository import Gtk, GLib # Because of https://bugzilla.gnome.org/show_bug.cgi?id=698005 from gi.repository import Gtk, GdkPixbuf from gi.repository import GstVideo from gi.repository import Gdk log = logging.getLogger(__name__) class BarcodeReaderGTK(Gtk.Box): __gsignals__ = { str('barcode'): (GObject.SignalFlags.RUN_LAST, None, (str, # The barcode string Gst.Message.__gtype__, # The GStreamer message itself GdkPixbuf.Pixbuf.__gtype__, # The pixbuf which caused # the above string to be decoded ), ) } def __init__(self, *args, **kwargs): super(BarcodeReaderGTK, self).__init__(*args, **kwargs) self.connect('unmap', self.on_unmap) self.connect('map', self.on_map) def on_message(self, bus, message): #log.debug("Message: %s", message) if message: struct = message.get_structure() if struct: struct_name = struct.get_name() #log.debug('Message name: %s', struct_name) if struct_name == 'GstMessageError': err, debug = message.parse_error() log.error('GstError: %s, %s', err, debug) elif struct_name == 'GstMessageWarning': err, debug = message.parse_warning() log.warning('GstWarning: %s, %s', err, debug) elif struct_name == 'barcode': self.timestamp = struct.get_clock_time("timestamp")[1] log.debug ("at %s", self.timestamp) assert struct.has_field('symbol') barcode = struct.get_string('symbol') log.info("Read Barcode: {}".format(barcode)) pixbuf = None if struct.has_field ("frame"): # This is the new zbar, which posts the frame along # with the barcode. sample = struct.get_value ("frame") pixbuf = gst_sample_to_pixbuf(sample) self.emit("barcode", barcode, message, pixbuf) else: # If we do not see the zbar < 1.6, we raise raise Exception("Zbar version is not what we expected") def run(self): p = "autovideosrc \n" #p = "uridecodebin uri=file:///tmp/qr.png " #p = "uridecodebin uri=file:///tmp/v.webm " p += " ! tee name=t \n" p += " t. ! queue ! videoconvert \n" p += " ! zbar cache=true attach_frame=true \n" p += " ! fakesink \n" p += " t. ! queue ! videoconvert \n" p += (" ! gtksink " "sync=false " "name=imagesink " #"max-lateness=2000000000000 " "enable-last-sample=false " "\n" ) pipeline = p log.info("Launching pipeline %s", pipeline) pipeline = Gst.parse_launch(pipeline) self.imagesink = pipeline.get_by_name('imagesink') self.gtksink_widget = self.imagesink.get_property("widget") log.info("About to remove children from %r", self) for child in self.get_children(): log.info("About to remove child: %r", child) self.remove(child) # self.gtksink_widget.set_property("expand", False) log.info("Adding sink widget: %r", self.gtksink_widget) #self.add(self.gtksink_widget) self.pack_start(self.gtksink_widget, True, True, 0) self.gtksink_widget.show() self.pipeline = pipeline bus = pipeline.get_bus() bus.connect('message', self.on_message) bus.add_signal_watch() pipeline.set_state(Gst.State.PLAYING) def pause(self): self.pipeline.set_state(Gst.State.PAUSED) def on_map(self, *args, **kwargs): '''It seems this is called when the widget is becoming visible''' self.run() def on_unmap(self, *args, **kwargs): '''Hopefully called when this widget is hidden, e.g. when the tab of a notebook has changed''' self.pipeline.set_state(Gst.State.PAUSED) # Actually, we stop the thing for real self.pipeline.set_state(Gst.State.NULL) def do_barcode(self, barcode, message, image): "This is called by GObject, I think" log.debug("Emitting a barcode signal %s, %s, %r", barcode, message, image) class ReaderApp(Gtk.Application): '''A simple application for scanning a bar code It makes use of the BarcodeReaderGTK class and connects to its on_barcode signal. You need to have called Gst.init() before creating a BarcodeReaderGTK. ''' def __init__(self, *args, **kwargs): super(ReaderApp, self).__init__(*args, **kwargs) self.connect('activate', self.on_activate) def on_activate(self, data=None): window = Gtk.ApplicationWindow() window.set_title("Gtk Gst Barcode Reader") reader = BarcodeReaderGTK() reader.connect('barcode', self.on_barcode) window.add(reader) window.show_all() self.add_window(window) def on_barcode(self, reader, barcode, message, image): '''All we do is logging the decoded barcode''' logging.info('Barcode decoded: %s', barcode) class SimpleInterface(ReaderApp): '''We tweak the UI of the demo ReaderApp a little''' def on_activate(self, *args, **kwargs): window = Gtk.ApplicationWindow() window.set_title("Simple Barcode Reader") window.set_default_size(400, 300) vbox = Gtk.Box(Gtk.Orientation.HORIZONTAL, 0) vbox.set_margin_top(3) vbox.set_margin_bottom(3) window.add(vbox) reader = BarcodeReaderGTK() reader.connect('barcode', self.on_barcode) vbox.pack_start(reader, True, True, 0) self.reader = reader #self.image = Gtk.Image() # FIXME: We could show a default image like "no barcode scanned just yet" self.image = ScalingImage() self.imagebox = Gtk.Box() #expand=True) self.imagebox.add(self.image) self.imagebox.show() vbox.pack_end(self.imagebox, True, True, 0) self.playButtonImage = Gtk.Image() self.playButtonImage.set_from_stock("gtk-media-play", Gtk.IconSize.BUTTON) self.playButton = Gtk.Button.new() self.playButton.add(self.playButtonImage) self.playButton.connect("clicked", self.playToggled) vbox.pack_end(self.playButton, False, False, 0) window.show_all() self.add_window(window) def playToggled(self, w): self.reader.pause() def on_barcode(self, reader, barcode, message, pixbuf): log.info("Barcode!!1 %r", barcode) # Hrm. Somehow, the Gst Widget is allocating # space relatively aggressively. Our imagebox on # the right side does not get any space. #self.imagebox.remove(self.image) #self.image = ScalingImage(pixbuf) #self.imagebox.pack_start(self.image, True, True, 0) #self.image.set_property('expand', True) #self.image.show() self.image.set_from_pixbuf(pixbuf) # So we just show a window instead... w = Gtk.Window() w.add(ScalingImage(pixbuf)) w.show_all() return False def gst_sample_to_pixbuf(sample): '''Converts the image from a given GstSample to a GdkPixbuf''' caps = Gst.Caps.from_string("video/x-raw,format=RGBA") converted_sample = GstVideo.video_convert_sample(sample, caps, Gst.CLOCK_TIME_NONE) buffer = converted_sample.get_buffer() pixbuf = buffer.extract_dup(0, buffer.get_size()) caps = converted_sample.get_caps() struct = caps.get_structure(0) colorspace = GdkPixbuf.Colorspace.RGB alpha = True bps = 8 width_struct = struct.get_int("width") assert width_struct[0] height_struct = struct.get_int("height") assert height_struct[0] original_width = width_struct[1] original_height = height_struct[1] rowstride_struct = struct.get_int("stride") if rowstride_struct[0] == True: # The stride information might be hidden in the struct. # For now it doesn't work. I think it's the name of the field. rowstride = rowstride_struct[1] else: rowstride = bps / 8 * 4 * original_width gdkpixbuf = GdkPixbuf.Pixbuf.new_from_bytes( GLib.Bytes.new_take(pixbuf), colorspace, alpha, bps, original_width, original_height, rowstride) return gdkpixbuf class ScalingImage(Gtk.DrawingArea): def __init__(self, pixbuf=None, width=None, height=None, rowstride=None): self.pixbuf = pixbuf self.rowstride = rowstride or None super(ScalingImage, self).__init__() #self.set_property("width_request", 400) #self.set_property("height_request", 400) #self.set_property("margin", 10) self.set_property("expand", True) def set_from_pixbuf(self, pixbuf): self.pixbuf = pixbuf self.queue_draw() # def do_size_allocate(self, allocation): # log.debug("Size Allocate %r", allocation) # log.debug("w: %r h: %r", allocation.width, allocation.height) # self.queue_draw() def do_draw(self, cr, pixbuf=None): log.debug('Drawing ScalingImage! %r', self) pixbuf = pixbuf or self.pixbuf if not pixbuf: log.info('No pixbuf to draw! %r', pixbuf) else: original_width = pixbuf.get_width() original_height = pixbuf.get_height() assert original_width > 0 assert original_height > 0 # Scale the pixbuf down to whatever space we have allocation = self.get_allocation() widget_width = allocation.width widget_height = allocation.height # I think we might not need this calculation #widget_size = min(widget_width, widget_height) log.info('Allocated size: %s, %s', widget_width, widget_height) # Fill in background cr.save() #Gtk.render_background(self.get_style_context(), # cr, 0, 0, widget_width, widget_height) #cr.set_source_rgb(1, 1, 1) #cr.paint() # Centering and scaling the image to fit the widget cr.translate(widget_width / 2.0, widget_height / 2.0) scale = min(widget_width / float(original_width), widget_height / float(original_height)) cr.scale(scale, scale) cr.translate(-original_width / 2.0, -original_height / 2.0) # Note: This function is very inefficient # (one could cache the resulting pattern or image surface)! Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0) # Should anyone want to set filters, this is the way to do it. #pattern = cr.get_source() #pattern.set_filter(cairo.FILTER_NEAREST) cr.paint() cr.restore() return #super(ScalingImage, self).do_draw(cr) def main(): logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') # We need to have GStreamer initialised before creating a BarcodeReader Gst.init(sys.argv) app = SimpleInterface() try: # Exit the mainloop if Ctrl+C is pressed in the terminal. GLib.unix_signal_add_full(GLib.PRIORITY_HIGH, signal.SIGINT, lambda *args : app.quit(), None) except AttributeError: # Whatever, it is only to enable Ctrl+C anyways pass app.run() if __name__ == '__main__': main() gnome-keysign-1.3.0/keysign/send.py000066400000000000000000000461751431057335600172670ustar00rootroot00000000000000#!/usr/bin/env python import logging import mailbox import os import signal try: from urllib.parse import unquote except ImportError: from urllib import unquote import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import GLib from gi.repository import Gdk from gpg import errors from wormhole.errors import ServerConnectionError, LonelyError, WrongPasswordError if __name__ == "__main__": from twisted.internet import gtk3reactor gtk3reactor.install() from twisted.internet import reactor from twisted.internet.defer import inlineCallbacks if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) import keysign #mod = __import__('keysign') #sys.modules["keysign"] = mod __package__ = str('keysign') from .keylistwidget import KeyListWidget from .KeyPresent import KeyPresentWidget from .offer import Offer from .util import get_attachments from . import gpgmeh # We import i18n to have the locale set up for Glade from .i18n import _ log = logging.getLogger(__name__) try: from .bluetoothoffer import BluetoothOffer except ImportError: log.exception("cannot import BluetoothOffer") BluetoothOffer = None DRAG_ACTION = Gdk.DragAction.COPY class SendApp: """Common functionality needed when building the sending part This class will automatically start the keyserver and avahi components. It will load a GtkStack from "send.ui" and automatically switch to a newly generate KeyPresentWidget. To switch the stack back and stop the keyserver, you have to call deactivate(). """ def __init__(self, builder=None): self.offer = None self.stack = None self.stack_saved_visible_child = None self.klw = None self.kpw = None ui_file_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "send.ui") if not builder: builder = Gtk.Builder() builder.add_objects_from_file(ui_file_path, ["send_stack"]) keys = gpgmeh.get_usable_secret_keys() klw = KeyListWidget(keys, builder=builder) klw.connect("key-activated", self.on_key_activated) self.klw = klw stack = builder.get_object("send_stack") stack.add(klw) self.stack = stack # This is a dirty hack :-/ # The problem is that the .ui file contains a few widgets # that we (potentially) want to instantiate separately. # Now that may not necessarily be what Gtk people envisioned # so it's not supported nicely. # The actual problem is that the widgets of our desire are # currently attached to a GtkStack. When our custom widget # code runs, it detaches itself from its parent, i.e. the stack. # We need need to instantiate the widget with key, however. fakekey = gpgmeh.Key("","","") kpw = KeyPresentWidget(fakekey, "", builder=builder) self.rb = builder.get_object('resultbox') self.stack.remove(self.rb) self.key = None self.result_label = builder.get_object("result_label") self.success_label = builder.get_object("success_label") self.password_error_label = builder.get_object("password_error_label") self.notify = None self.internet_option = False # Add drag and drop to the keys list widget builder.connect_signals(self) self.label = builder.get_object("keys_listbox") self.label.drag_dest_set(Gtk.DestDefaults.ALL, [], DRAG_ACTION) self.label.drag_dest_set_target_list(None) self.label.drag_dest_add_text_targets() self.label.drag_dest_add_uri_targets() self.rb.connect('drag-data-received', self.on_rb_drag_data_received) # We should probably only accept drag data when we have successfully sent the key. # Now we're unconditionally accepting drags. self.rb.drag_dest_set(Gtk.DestDefaults.ALL, [], DRAG_ACTION) self.rb.drag_dest_set_target_list(None) self.rb.drag_dest_add_text_targets() self.rb.drag_dest_add_uri_targets() self.rb_import_okay = builder.get_object('rb_infobar_import_okay') self.rb_button_ib_return_signature = builder.get_object('rb_return_signature') self.rb_import_error = builder.get_object('rb_infobar_import_error') assert self.rb_import_error self.button_rb_import_error = builder.get_object('rb_import_error_details_button') def on_drag_data_received(self, widget, drag_context, x, y, data, info, time): if self.notify is not None: log.debug("We are trying to send a key, no imports at this stage") return try: self.decrypt_and_import_certifications(data) except errors.GPGMEError as e: self.signature_import_error(e) else: self.signature_imported(decrypted_certifications, sender) def on_rb_drag_data_received(self, widget, drag_context, x, y, data, info, time): try: decrypted_certifications = self.decrypt_and_import_certifications(data) except errors.GPGMEError as e: self.rb_signature_import_error(e) else: self.rb_signature_imported(decrypted_certifications) def decrypt_and_import_certifications(self, data): filename = data.get_text() # If we don't have a filename it means that the user maybe dropped # an attachment or an entire email. if not filename: filename = data.get_data().decode("utf-8") filename = unquote(filename) filename = filename[7:].strip('\r\n\x00') # remove file://, \r\n and NULL log.info("Received file: %s", filename) signatures = get_attachments(filename) if not signatures: with open(filename, "rb") as si: signatures.append(si.read()) # We currently do not know how to obtain the sender of the email. # We could parse the email for a From: header. # But if only the attachment is dropped, we don't have that information. # We could probably find the issuer in the hashed area of the certification packet, # and then try to find that key in our keyring. sender = None decrypted_certifications = [] try: for signature in signatures: decrypted_certification = gpgmeh.decrypt_signature(signature) import_result = gpgmeh.import_signature(decrypted_certification) decrypted_certifications.append(decrypted_certification) except errors.GPGMEError as e: log.exception("Could not import signatures") raise else: return decrypted_certifications @inlineCallbacks def on_key_activated(self, widget, key): # Deactivate any old connection attempt self._deactivate_timer() self.deactivate() self.klw.ib_internet.hide() self.key = key log.info("Activated key %r", key) #### # Start network services self.klw.code_spinner.start() if self.internet_option: #self.kpw.internet_spinner.start() # After 10 seconds without a wormhole code we display an info bar timer = 10 self.notify = reactor.callLater(timer, self.slow_connection) self.offer = Offer(self.key) try: info = yield self.offer.allocate_code(worm=True) except ServerConnectionError: # We are without a working Internet connection so we stop the previously # activated Avahi server and we display an infobar self._deactivate_timer() self.offer.stop_avahi() self.offer = None self.klw.code_spinner.stop() self.no_connection() return code, discovery_data = info self.create_keypresent(code, discovery_data) defers = self.offer.start() for de in defers: # TODO handle errors here? de.addCallback(self._received) else: self.offer = Offer(self.key) info = yield self.offer.allocate_code(worm=False) code, discovery_data = info self.create_keypresent(code, discovery_data) defers = self.offer.start() for de in defers: de.addCallback(self._received) def _received(self, start_data): success, message = start_data if message and type(message) == LonelyError: # This only means that we closed wormhole before a transfer pass elif message and message == "Back": # Simply the return of the back button, no errors here pass elif message and type(message) == ServerConnectionError: self._deactivate_timer() self.deactivate() self.klw.code_spinner.stop() self.no_connection() else: self.show_result(success, message) def on_ib_closed(self, widget, data): if Gtk.ResponseType.CLOSE == data: widget.hide() def slow_connection(self): self.klw.label_ib_internet.set_label(_("Still trying to get a connection to the Internet. " "It appears to be slow or unavailable.")) self.klw.ib_internet.show() log.info("Slow Internet connection") def no_connection(self): self.klw.label_ib_internet.set_label(_("There isn't an Internet connection!")) self.klw.ib_internet.show() log.info("No Internet connection") def signature_imported(self, decrypted_certifications, sender=None): """When we have received, decrypted, and imported a certification, this function will show the infobar and offer to return the certification to the sender. We appreciate that the sender, i.e. an email address, is not always known, simply because that information is currently not included in the certification the attestor sends. """ self.klw.ib_import_okay.show() if not sender: # We do not know where to return the certification to, so we hide the button self.klw.button_ib_import_okay.hide() else: def return_certification(button): log.info("Return certification to %s (%d)", sender, len(decrypted_certifications)) self.klw.button_ib_import_okay.connect('clicked', return_certification) self.klw.button_ib_import_okay.show() log.info("Signature imported") def signature_import_error(self, e): self.klw.ib_import_error.show() # We hide the error details button, because we don't have that functionality just yet self.klw.button_ib_import_error.hide() log.info("Signature import error") def rb_signature_imported(self, decrypted_certifications): self.rb_import_okay.show() sender = None if not sender: # We do not know where to return the certification to, so we hide the button self.rb_button_ib_return_signature.hide() else: def return_certification(button): log.info("Return certification to %s (%d)", sender, len(decrypted_certifications)) self.rb_button_ib_return_signature.connect('clicked', return_certification) self.rb_button_ib_return_signature.show() log.info("Signature imported") def rb_signature_import_error(self, e): self.rb_import_error.show() # We hide the error details button, because we don't have that functionality just yet self.button_rb_import_error.hide() log.info("Signature import error") def create_keypresent(self, discovery_code, discovery_data): self._deactivate_timer() log.info("Use this for discovering the other key: %r", discovery_data) #### # Create widget for key self.kpw = KeyPresentWidget(self.key, discovery_code, discovery_data) #### # Show widget for key self.stack.add(self.kpw) self.stack_saved_visible_child = self.stack.get_visible_child() self.stack.set_visible_child(self.kpw) log.debug('Setting kpw: %r', self.kpw) self.klw.ib_internet.hide() self.klw.code_spinner.stop() def show_result(self, success, message): self._deactivate_offer() self.stack.add(self.rb) self.stack.remove(self.kpw) self.kpw = None if success: self.result_label.hide() self.success_label.show() self.password_error_label.hide() self.stack.set_visible_child(self.rb) else: if type(message) == WrongPasswordError: self.success_label.hide() self.result_label.hide() self.password_error_label.show() else: self.success_label.hide() self.password_error_label.hide() self.result_label.show() self.result_label.set_label(_("An unexpected error occurred:\n%s" % message)) self.stack.set_visible_child(self.rb) def deactivate(self): self._deactivate_offer() #### # Re-set stack to initial position self.set_saved_child_visible() if self.kpw: self.stack.remove(self.kpw) self.kpw = None def set_saved_child_visible(self): if self.stack_saved_visible_child: self.stack.set_visible_child(self.stack_saved_visible_child) self.stack_saved_visible_child = None def set_internet_option(self, value): self._deactivate_timer() self.deactivate() self.klw.ib_internet.hide() self.klw.code_spinner.stop() self.internet_option = value def _deactivate_timer(self): if self.notify and not self.notify.called: self.notify.cancel() self.notify = None def _deactivate_offer(self): # Stop network services if self.offer: self.offer.stop() self.offer = None log.debug("Stopped network services") class App(Gtk.Application): def __init__(self, *args, **kwargs): super(App, self).__init__(*args, **kwargs) self.connect('activate', self.on_activate) self.send_app = None #self.builder = Gtk.Builder.new_from_file('send.ui') def on_activate(self, data=None): ui_file_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), "send.ui") self.builder = Gtk.Builder.new_from_file(ui_file_path) window = self.builder.get_object("appwindow") assert window window.connect("delete-event", self.on_delete_window) self.headerbar = self.builder.get_object("headerbar") hb = self.builder.get_object("headerbutton") hb.connect("clicked", self.on_header_button_clicked) self.header_button = hb self.internet_toggle = self.builder.get_object("internet_toggle") self.internet_toggle.connect("toggled", self.on_toggle_clicked) self.send_app = SendApp(builder=self.builder) ss = self.send_app.stack ss.connect('notify::visible-child', self.on_send_stack_switch) ss.connect('map', self.on_send_stack_mapped) self.send_stack = ss window.show_all() self.add_window(window) @staticmethod def on_delete_window(*args): reactor.callFromThread(reactor.stop) def on_toggle_clicked(self, toggle): log.info("Internet toggled to: %s", toggle.get_active()) self.send_app.set_internet_option(toggle.get_active()) def on_send_stack_switch(self, stack, *args): log.debug("Switched Send Stack! %r", args) current = self.send_app.stack.get_visible_child() if current == self.send_app.klw: log.debug("Key list page now visible") self.on_keylist_mapped(self.send_app.klw) elif current == self.send_app.kpw: log.debug("Key present page now visible") self.on_keypresent_mapped(self.send_app.kpw) elif current == self.send_app.rb: log.debug("Result page now visible") self.on_resultbox_mapped(self.send_app.rb) else: log.error("An unexpected page is now visible: %r", current) def on_resultbox_mapped(self, rb): log.debug("Resultbox becomes visible!") self.header_button.set_sensitive(True) self.header_button.set_image( Gtk.Image.new_from_icon_name("go-previous", Gtk.IconSize.BUTTON)) self.internet_toggle.hide() def on_keylist_mapped(self, keylistwidget): log.debug("Keylist becomes visible!") self.header_button.set_image( Gtk.Image.new_from_icon_name("view-refresh", Gtk.IconSize.BUTTON)) # We don't support refreshing for now. self.header_button.set_sensitive(False) self.internet_toggle.show() def on_send_stack_mapped(self, stack): log.debug("send stack becomes visible!") # Adjust the top bar buttons self.on_send_stack_switch(stack) def on_keypresent_mapped(self, kpw): log.debug("keypresent becomes visible!") self.header_button.set_sensitive(True) self.header_button.set_image( Gtk.Image.new_from_icon_name("go-previous", Gtk.IconSize.BUTTON)) self.internet_toggle.hide() def on_send_header_button_clicked(self, button, *args): # Here we assume that there is only two places where # we could have possibly pressed this button, i.e. # from the keypresentwidget or the result page log.debug("Send Headerbutton %r clicked! %r", button, args) current = self.send_app.stack.get_visible_child() klw = self.send_app.klw kpw = self.send_app.kpw # If we are in the keypresentwidget if current == kpw: self.send_stack.set_visible_child(klw) self.send_app.deactivate() # Else we are in the result page else: self.send_stack.remove(current) self.send_app.set_saved_child_visible() self.send_app.on_key_activated(None, self.send_app.key) def on_header_button_clicked(self, button, *args): log.debug("Headerbutton %r clicked! %r", button, args) return self.on_send_header_button_clicked(button, *args) if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) app = App() try: GLib.unix_signal_add_full(GLib.PRIORITY_HIGH, signal.SIGINT, lambda *args: reactor.callFromThread(reactor.stop), None) except AttributeError: pass reactor.registerGApplication(app) reactor.run() gnome-keysign-1.3.0/keysign/send.ui000066400000000000000000001431211431057335600172410ustar00rootroot00000000000000 False Select and send key True False slide-left-right Keylist True False 10 40 vertical 6 True False True 5 error False 6 end False False 0 False 16 True False You don't have any keys! Please use, e.g. Seahorse to create one. True True 0 True False gtk-dialog-error False True 1 False False 0 True True 0 True False True 5 warning False 6 end False False 0 False 16 True False Very slow or no Internet connection! True True 0 True False gtk-dialog-warning False True 1 False False 0 True True 1 True False True 5 True False 6 end False False 0 False 16 True False The signature has been successfully imported! True True 0 True False gtk-dialog-ok False True 1 gtk-undo True True True Returns the received certification back to the sender, so that the sender can make use of your OpenPGP certificate True True False True 2 False False 0 True True 2 True False True 5 True False 6 end gtk-info True True True Display more details for the error. True True True True 0 False False 0 False 16 True False An error occurred while trying to import the signature. True True 0 True False gtk-dialog-error False True 1 False False 0 True True 3 True False 15 15 vertical True False True False <b>Select a key for signing</b> True 0 False True 0 True False True 0.011764705882352941 <small>Times signed</small> True False True end 1 True False False True 2 False True 0 400 True True never in True False 200 300 True False True True 1 False True 4 keylist Keylist True False 5 10 40 vertical 6 True False start <small>To have the key signed, the other person must enter the security code, or scan the QR code</small> True middle 2 False True 6 1 True False True False vertical 6 True False start <b>Key Details</b> True False True 0 True False 6 True False vertical 6 True False end Fingerprint False True 0 True False end UIDs False True 1 False True 0 True False vertical 6 True False 0 0 False True 0 True False 0 0 True True 1 True True 1 False True 1 True False True False start 10 <b>Security Code</b> True False True 0 False True 2 True True start F289 F7BA 977D F414 3AE9 FDFB F70A 0290 6C30 1813 True False True 4 False True 0 True False vertical 400 400 True False 20 0 none True False <b>QR Code</b> True 0 True True 1 True True 1 True True 2 page1 page1 1 True False 20 20 10 10 vertical 6 True False True 5 True False 6 end False False 0 False 16 True False The signature has been successfully imported! True True 0 True False gtk-dialog-ok False True 1 gtk-undo True True True Returns the received certification back to the sender, so that the sender can make use of your OpenPGP certificate True True False True 2 False False 0 True True 0 True False True 5 True False 6 end gtk-info True True True Display more details for the error. True True True True 0 False False 0 False 16 True False An error occurred while trying to import the signature. True True 0 True False gtk-dialog-error False True 1 False False 0 True True 1 False Could not establish a secure connection. Either your partner has entered a wrong code or someone tried to intercept your connection. center False True 2 True False Key successfully sent. You should receive an email with the signature soon. You can drag and drop the email here to import your certification. center True False True 3 True False An unexpected error occurred. center True char True False True 4 page2 page2 2 headerbar True False Select and Send key Keylist True gtk-go-back True False True True True True True True True True True False True False gtk-network False True 0 True False Also use the Internet to transfer the certificate 5 Internet False True 1 1 gnome-keysign-1.3.0/keysign/sign_and_encrypt.py000066400000000000000000000043731431057335600216560ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2020 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import argparse import logging import sys from .gpgmeh import sign_keydata_and_encrypt, fingerprint_from_keydata def main(): import argparse parser = argparse.ArgumentParser(description="Sign an OpenPGP key from a file. " "The program will open each file, extract exactly one OpenPGP key, " "sign each UID separately, encrypt and write the result out to a file.") parser.add_argument('-v', '--verbose', action='count', default=0, help="Increase detail of logging") parser.add_argument("file", nargs='+', type=argparse.FileType('rb'), help="File containing OpenPGP keys") args = parser.parse_args() log_levels = [logging.WARNING, logging.INFO, logging.DEBUG] log_level = log_levels[min(len(log_levels)-1, args.verbose)] logging.basicConfig(level=log_level) log = logging.getLogger(__name__) log.debug('Running main with args: %s', args) for fhandle in args.file: data = fhandle.read() fingerprint = fingerprint_from_keydata(data) for i, (uid, ciphertext, plaintext) in enumerate(sign_keydata_and_encrypt(keydata=data)): fname = "%s-%d.pgp" % (fingerprint, i) with open(fname, 'wb') as outfile: outfile.write(ciphertext) print ("Written to %s \t for UID %s" % (fname, uid)) if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, format='%(name)s (%(levelname)s): %(message)s') sys.exit(main()) gnome-keysign-1.3.0/keysign/util.py000077500000000000000000000355511431057335600173120ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from __future__ import unicode_literals import hashlib import hmac import json import logging import mailbox import os import shutil from subprocess import call from string import Template from tempfile import NamedTemporaryFile from xml.etree import ElementTree try: from urllib.parse import urlparse, parse_qs from urllib.parse import ParseResult from urllib.parse import quote except ImportError: from urlparse import urlparse, parse_qs from urlparse import ParseResult from urllib2 import quote import requests import dbus from wormhole._wordlist import PGPWordList from _dbus_bindings import BUS_DAEMON_NAME, BUS_DAEMON_PATH, BUS_DAEMON_IFACE import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk, GLib from .errors import NoBluezDbus, UnpoweredAdapter, NoAdapter from .gpgmeh import fingerprint_from_keydata from .gpgmeh import sign_keydata_and_encrypt from .i18n import _ log = logging.getLogger(__name__) def mac_generate(key, data): mac = hmac.new(key, data, hashlib.sha256).hexdigest().upper() log.info("MAC of %r is %r", data[:20], mac[:20]) # Arbitrary truncation to avoid a QR code size increase return mac[:20] def mac_verify(key, data, mac): computed_mac = mac_generate(key, data) result = hmac.compare_digest(mac.upper(), computed_mac.upper()) log.info("MAC of %r seems to be %r. Expected %r (%r)", data[:20], computed_mac[:20], mac[:20], result) return result def _email_portal(to, subject=None, body=None, files=None): # The following checks are to ensure Python 2 compatibility if not hasattr(os, 'O_PATH'): os.O_PATH = 2097152 if not hasattr(os, 'O_CLOEXEC'): os.O_CLOEXEC = 524288 name = "org.freedesktop.portal.Desktop" path = "/org/freedesktop/portal/desktop" bus = dbus.SessionBus() try: proxy = bus.get_object(name, path) except dbus.exceptions.DBusException: log.debug("Desktop portal is not available") return None iface = "org.freedesktop.portal.Email" email = dbus.Interface(proxy, iface) # Apparently we are unable to get the parent window XID from the receive class. # Until this is sorted out, we leave the parent window empty. parent_window = "" attrs = [] # Even if we don't close the file descriptor it should not be a problem because # eventually at runtime it will be automatically closed. # Designing this class we took the recipes one as reference # https://gitlab.gnome.org/GNOME/recipes/blob/4afc9df6/src/gr-mail.c#L293 if files: for file in files: fd = os.open(file, os.O_PATH | os.O_CLOEXEC) attrs.append(dbus.types.UnixFd(fd)) opts = {"subject": subject, "address": to, "body": body, "attachment_fds": attrs} try: ret = email.ComposeEmail(parent_window, opts) return ret except TypeError: log.debug("Email portal is not available") return None def _email_mailto(to, subject=None, body=None, files=None): url = "mailto:" url += "\"{0}\"".format(to) # Apparently we don't need to use urllib.parse.quote_plus if subject: url += "?subject={0}".format(subject) if body: if "?" in url: url += "&body={0}".format(quote(body)) else: url += "?body={0}".format(quote(body)) for file in files: if "?" in url: url += "&attach={0}".format(file) else: url += "?attach={0}".format(file) try: Gtk.show_uri(None, url, Gdk.CURRENT_TIME) return True except GLib.GError as e: log.debug("mailto URI is probably not available: %s", e.message) return None def _email_file(to, from_=None, subject=None, body=None, ccs=None, bccs=None, files=None, utf8=True): """Calls xdg-email with the appropriate options""" cmd = ['xdg-email'] if utf8: cmd += ['--utf8'] if subject: cmd += ['--subject', subject] if body: cmd += ['--body', body] for cc in ccs or []: cmd += ['--cc', cc] for bcc in bccs or []: cmd += ['--bcc', bcc] for file_ in files or []: cmd += ['--attach', file_] if not to: log.error("email_file: We are seeing an empty 'to': %r", to) cmd += [to] log.info("Running %s", cmd) retval = call(cmd) return retval def _using_flatpak(): """Check if we are inside flatpak""" return os.path.exists("/.flatpak-info") def _fix_path_flatpak(files): """In Flatpak the only special path visible also from outside is /var/tmp/ To be able to use the files from the host we change the path to the absolute one. This fix in the future may not be necessary because the portals should be able to automatically handle it.""" part_1 = os.path.expanduser("~/.var/app/") app_id = "org.gnome.Keysign" part_2 = "cache/tmp/" flatpak_path = os.path.join(part_1, app_id, part_2) fixed_files = [] if files: for file in files: base = os.path.basename(file) new_path = os.path.join(flatpak_path, base) shutil.move(file, new_path) fixed_files.append(new_path) return fixed_files def send_email(to, subject=None, body=None, files=None): """Tries to send the email using firstly the portal, then the xdg-email and as a last attempt the mailto uri""" if _using_flatpak(): files = _fix_path_flatpak(files) if _email_portal(to, subject, body, files): return try: _email_file(to=to, subject=subject, body=body, files=files) return except FileNotFoundError: log.debug("xdg-email is not available") if _email_mailto(to, subject, body, files): return log.error("An error occurred trying to compose the email") SUBJECT = 'Your signed key $fingerprint' BODY = '''Hi $uid, I have just signed your key $fingerprint The certification is in an attachment encrypted to your key. You can either drag the attachment into GNOME Keysign or decrypt and import the attachment manually, e.g. gpg --decrypt | gpg --import Thanks for letting me sign your key! And, if you can, send me copy of your key with the new certifications. -- GNOME Keysign ''' DIVIDER = '\n--------\nTranslated version below\n--------\n' BODY_TRANSLATED = _('''Hi $uid, I have just signed your key $fingerprint Thanks for letting me sign your key! -- GNOME Keysign ''') def sign_keydata_and_send(keydata, error_cb=None): """Creates, encrypts, and send signatures for each UID on the key You are supposed to give OpenPGP data which will be passed onto sign_keydata_and_encrypt. For the resulting signatures, emails are created and sent via send_email. Return value: A tuple of a NamedTemporaryFiles used for saving the signatures and the plaintext which got encrypted. If you let the TemporaryFiles go out of scope they should get deleted. But don't delete too early as the MUA needs to pick them up. """ log = logging.getLogger(__name__ + ':sign_keydata') fingerprint = fingerprint_from_keydata(keydata) # FIXME: We should rather use whatever GnuPG tells us keyid = fingerprint[-8:] # We list() the signatures, because we believe that it's more # acceptable if all key operations are done before we go ahead # and spawn an email client. log.info("About to create signatures for key with fpr %r", fingerprint) try: keydata = keydata.encode() except AttributeError: log.debug("keydata is probably already a bytes type") for uid, encrypted_key, plaintext in list(sign_keydata_and_encrypt(keydata, error_cb)): log.info("Using UID: %r", uid) # We expect uid.uid to be a consumable string uid_str = uid.uid ctx = { 'uid' : uid_str, 'fingerprint': fingerprint, 'keyid': keyid, } tmpfile = NamedTemporaryFile(prefix='gnome-keysign-', suffix='.asc', delete=True) filename = tmpfile.name log.info('Writing keydata to %s', filename) tmpfile.write(encrypted_key) # Interesting, sometimes it would not write the # whole thing out, so we better flush here tmpfile.flush() # If we close the actual file descriptor to free # resources. Calling tmpfile.close would get the file deleted. tmpfile.file.close() body = BODY # If the primary language is not English we append the translation if BODY != BODY_TRANSLATED: body += DIVIDER + BODY_TRANSLATED subject = Template(SUBJECT).safe_substitute(ctx) body = Template(body).safe_substitute(ctx) send_email(uid.email, subject, body, [filename]) yield tmpfile, plaintext def format_fingerprint(fpr): """Formats a given fingerprint (160bit, so 20 characters) in the GnuPG typical way """ s = '' for i in range(10): # output 4 chars s += ''.join(fpr[4*i:4*i+4]) # add extra space between the block if i == 4: s += '\n' # except at the end elif i < 9: s += ' ' return s def parse_barcode(barcode_string): """Parses information contained in a barcode It returns a dict with the parsed attributes. We expect the dict to contain at least a 'fingerprint' entry. Others might be added in the future. """ # The string, currently, is of the form # openpgp4fpr:foobar?baz=qux#frag=val # Which urlparse handles perfectly fine. p = urlparse(barcode_string) log.debug("Parsed %r into %r", barcode_string, p) fpr = p.path query = parse_qs(p.query) fragments = parse_qs(p.fragment) rest = {} rest.update(query) rest.update(fragments) # We should probably ensure that we have only one # item for each parameter and flatten them accordingly. rest['fingerprint'] = fpr log.debug('Parsed barcode into %r', rest) return rest FPR_PREFIX = "OPENPGP4FPR:" def strip_fingerprint(input_string): '''Strips a fingerprint of any whitespaces and returns a clean version. It also drops the "OPENPGP4FPR:" prefix from the scanned QR-encoded fingerprints''' # The split removes the whitespaces in the string cleaned = ''.join(input_string.split()) if cleaned.upper().startswith(FPR_PREFIX.upper()): cleaned = cleaned[len(FPR_PREFIX):] log.warning('Cleaned fingerprint to %s', cleaned) return cleaned def download_key_http(address, port): netloc = "[%s]:%d" if ':' in address else "%s:%d" url = ParseResult( scheme='http', # This seems to work well enough with both IPv6 and IPv4 netloc=netloc % (address, port), path='/', params='', query='', fragment='') u = url.geturl() log.debug("Starting HTTP request for %s", u) data = requests.get(u, timeout=5).content log.debug("finished downloading %d bytes", len(data)) return data def encode_message(message): """Serialize a string to json object and encode it in utf-8""" return json.dumps(message).encode("utf-8") def decode_message(message): """deserialize a json returning a string""" return json.loads(message.decode("utf-8")) def is_code_complete(code, length=2): if code[:1].isdigit(): wl = PGPWordList() gc = wl.get_completions words = code.split("-", 1)[-1] return words in gc(words, length) else: return False def fix_infobar(infobar): # Work around https://bugzilla.gnome.org/show_bug.cgi?id=710888 # Taken from here https://phabricator.freedesktop.org/D1103#34aa2703 def make_sure_revealer_does_nothing(widget): if not isinstance(widget, Gtk.Revealer): return widget.set_transition_type(Gtk.RevealerTransitionType.NONE) infobar.forall(make_sure_revealer_does_nothing) def get_local_bt_address(): """Check if there is a powered on Bluetooth device and return his address. This is a blocking method""" available = False bus_name = "org.bluez" timeout = 2 # 2 seconds seems to be enough to start a bus service bus = dbus.SystemBus() try: _start_bus(bus_name, timeout) except dbus.exceptions.DBusException as e: raise NoBluezDbus(e) else: available_bt = _get_available_bt() for bt in available_bt: adapter = dbus.Interface(bus.get_object("org.bluez", bt), "org.freedesktop.DBus.Properties") power = adapter.Get("org.bluez.Adapter1", "Powered") if power: available = adapter.Get("org.bluez.Adapter1", "Address") break if len(available_bt) == 0: # Not a single BT adapter available in the system raise NoAdapter elif not available: # Every BT adapters are powered off raise UnpoweredAdapter return available def _start_bus(bus_name, timeout, flags=0): """Manually start the bus, so we can set a custom timeout""" bus = dbus.SystemBus() bus.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, BUS_DAEMON_IFACE, 'StartServiceByName', 'su', (bus_name, flags), timeout=timeout) def _get_available_bt(): """Returns the list of available Bluetooth""" available_bt = [] bus_name = "org.bluez" object_path = "/org/bluez" bus = dbus.SystemBus() obj = bus.get_object(bus_name, object_path) iface = dbus.Interface(obj, 'org.freedesktop.DBus.Introspectable') xml_string = iface.Introspect() for child in ElementTree.fromstring(xml_string): if child.tag == 'node': bt = '/'.join((object_path, child.attrib['name'])) available_bt.append(bt) return available_bt def get_attachments(filename): mbox = mailbox.mbox(filename) attachments = [] for message in mbox: # Check if there are attachments if message.is_multipart(): for attach in message.get_payload()[1:]: attachments.append(attach.get_payload(decode=True)) return attachments gnome-keysign-1.3.0/keysign/wormholeoffer.py000066400000000000000000000146631431057335600212110ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2017 Ludovico de Nittis # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from __future__ import unicode_literals from binascii import hexlify from textwrap import dedent import logging import os from builtins import input from wormhole.cli.public_relay import RENDEZVOUS_RELAY from wormhole.errors import TransferError, ServerConnectionError, WrongPasswordError, LonelyError import wormhole import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk if __name__ == "__main__": from twisted.internet import gtk3reactor gtk3reactor.install() from twisted.internet import reactor from twisted.internet.defer import inlineCallbacks, returnValue if __name__ == "__main__" and __package__ is None: logging.getLogger().error("You seem to be trying to execute " + "this script directly which is discouraged. " + "Try python -m instead.") parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) os.sys.path.insert(0, parent_dir) os.sys.path.insert(0, os.path.join(parent_dir, 'monkeysign')) __package__ = str('keysign') from .gpgmeh import get_usable_keys, get_public_key_data from .util import encode_message, decode_message log = logging.getLogger(__name__) class WormholeOffer: def __init__(self, key, app_id=None): self.message_def = None self.key = key if not app_id: # the following id is needed for interoperability with wormhole cli app_id = "lothar.com/wormhole/text-or-file-xfer" self.w = wormhole.create(app_id, RENDEZVOUS_RELAY, reactor) @inlineCallbacks def allocate_code(self, code=None): if code: self.w.set_code(code) else: # ServerConnectionError may be raised self.w.allocate_code() code = yield self.w.get_code() log.info("Invitation Code: %s", code) wormhole_data = "WORM={0}".format(code) returnValue((code, wormhole_data)) @inlineCallbacks def start(self): log.info("Wormhole: Sending a message") try: verifier = yield self.w.get_verifier() # TODO maybe we can show it to the user and ask for a confirm that is the right one ver_ascii = hexlify(verifier).decode("ascii") log.info("Verified key: %s", ver_ascii) key_data = get_public_key_data(self.key.fingerprint) kd_decoded = key_data.decode('utf-8') # The message needs to be encoded as a json with "message" and "offer" for ensures # wormhole cli interoperability offer = {"message": kd_decoded} data = {"offer": offer} m = encode_message(data) self.w.send_message(m) # wait for reply # TODO add a timeout? msg = yield self.w.get_message() log.info("Got data, %d bytes" % len(msg)) success, error_msg = self._check_received(msg) self.stop() returnValue((success, error_msg)) except (ServerConnectionError, WrongPasswordError) as e: error = dedent(e.__doc__) log.error("Error: %s" % error) success = False returnValue((success, e)) except LonelyError as le: log.info("Lonely, close() was called before the peer connection could be established") success = False returnValue((success, le)) except Exception as e: error = dedent(e.__doc__) log.error("An unknown error occurred: %s" % error) success = False returnValue((success, e)) def _check_received(self, msg): """If the received message has a field 'answer' that means that the transfer successfully completed. Otherwise something went wrong or we received an unexpected message.""" msg_dict = decode_message(msg) if "error" in msg_dict: error_msg = "A remote error occurred: %s" % msg_dict["error"] success = False error = TransferError(error_msg) log.info(error_msg) elif "answer" in msg_dict: success = True error = None else: success = False error = "Unrecognized message %r" % (msg_dict,) log.info(error) return success, error def stop(self): if self.w: try: self.w.close().addErrback(log.debug) except (TransferError, ServerConnectionError, WrongPasswordError) as error: # These errors should be already handled previously # so here we can safely ignore them log.debug("Error: %s", error.type) self.w = None def main(args): if not args: raise ValueError("You must provide an argument to identify the key") def code_generated(result): code, _ = result print("Discovery info: {}".format(code)) # Wait for the user without blocking everything reactor.callInThread(cancel) def cancel(): input("Press Enter to cancel") offer.stop() reactor.callFromThread(reactor.stop) def received(result): success, error_msg = result if success: print("\nKey successfully sent") else: print("\nAn error occurred: {}".format(error_msg)) # We are still waiting for the user to press Enter print("Press Enter to exit") key = get_usable_keys(pattern=args[0])[0] offer = WormholeOffer(key) offer.allocate_code().addCallback(code_generated) offer.start().addCallback(received) print("Offering key: {}".format(key)) reactor.run() if __name__ == "__main__": import sys main(sys.argv[1:]) gnome-keysign-1.3.0/keysign/wormholereceive.py000066400000000000000000000131601431057335600215210ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2017 Ludovico de Nittis # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . from __future__ import unicode_literals import logging from twisted.internet.defer import inlineCallbacks, returnValue from wormhole.cli.public_relay import RENDEZVOUS_RELAY from wormhole.errors import WrongPasswordError, LonelyError, TransferError import wormhole import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk if __name__ == "__main__": from twisted.internet import gtk3reactor gtk3reactor.install() from twisted.internet import reactor from .gpgmeh import fingerprint_from_keydata from .i18n import _ from .util import decode_message, encode_message, parse_barcode, mac_verify log = logging.getLogger(__name__) class WormholeReceive: def __init__(self, code, mac=None, app_id=None): self.w = None # Check if the given code is a barcode or directly the wormhole code parsed = parse_barcode(code).get("WORM", [None])[0] if parsed: self.code = parsed else: self.code = code if app_id: self.app_id = app_id else: # the following id is needed for interoperability with wormhole cli self.app_id = "lothar.com/wormhole/text-or-file-xfer" self.mac = mac @inlineCallbacks def start(self): log.info("Wormhole: Trying to receive a message with code: %s", self.code) self.stop() self.w = wormhole.create(self.app_id, RENDEZVOUS_RELAY, reactor) # The following mod is required for Python 2 support self.w.set_code("%s" % str(self.code)) try: message = yield self.w.get_message() m = decode_message(message) key_data = None offer = m.get("offer", None) if offer: key_data = offer.get("message", None) if key_data: log.info("Message received: %s", key_data) if self._is_verified(key_data.encode("utf-8")): log.debug("MAC is valid") success = True message = "" # send a reply with a message ack, this also ensures wormhole cli interoperability reply = {"answer": {"message_ack": "ok"}} reply_encoded = encode_message(reply) self.w.send_message(reply_encoded) returnValue((key_data.encode("utf-8"), success, message)) else: log.warning("The received key has a different MAC") self._reply_error(_("Wrong message authentication code")) self._handle_failure(WrongPasswordError()) else: log.info("Unrecognized message: %s", m) self._reply_error("Unrecognized message") self._handle_failure(TransferError()) except WrongPasswordError as wpe: log.info("A wrong password has been used") self._handle_failure(wpe) except LonelyError as le: log.info("Closed the connection before we found anyone") self._handle_failure(le) def _is_verified(self, key_data): if self.mac is None: # Currently the MAC is not mandatory verified = True else: mac_key = fingerprint_from_keydata(key_data) verified = mac_verify(mac_key.encode('ascii'), key_data, self.mac) return verified def _reply_error(self, error_message): reply = {"error": error_message} reply_encoded = encode_message(reply) self.w.send_message(reply_encoded) @inlineCallbacks def stop(self): if self.w: try: yield self.w.close() except Exception as e: print(e) @staticmethod def _handle_failure(error): success = False key_data = None returnValue((key_data, success, type(error))) def main(args): log.debug('Running main with args: %s', args) if not args: raise ValueError("You must provide an argument with the wormhole code") @inlineCallbacks def receive_key(w_code): receive = WormholeReceive(w_code) msg_tuple = yield receive.start() key_data, success, message = msg_tuple if success: print("key received:\n") print(key_data.decode("utf-8")) else: print(message) # Workaround for the send_message reply (until we find a better solution). # If we simply call reactor.stop() the send_message() will never be # completed. I think this happens because we are always in the reactor # thread and send_message is waiting for a context switch. reactor.callLater(1, reactor.stop) print("Trying to download the key, please wait") code = args[0] receive_key(code) reactor.run() if __name__ == "__main__": import sys main(sys.argv[1:]) gnome-keysign-1.3.0/packaging/000077500000000000000000000000001431057335600162225ustar00rootroot00000000000000gnome-keysign-1.3.0/packaging/PKGBUILD000066400000000000000000000021261431057335600173470ustar00rootroot00000000000000# Maintainer: Ludovico de Nittis # Contributor: Profpatsch pkgname=gnome-keysign pkgver=0.9.5 pkgrel=3 pkgdesc="An easier way to sign OpenPGP keys over the local network." arch=('any') url="https://github.com/gnome-keysign/gnome-keysign" license=('GPL3') install=gnome-keysign.install depends=('python' 'python-requests' 'python-gobject' 'python-qrcode' 'python-twisted' 'python-gpgme' 'avahi' 'dbus' 'zbar') optdepends=('python-pybluez') makedepends=('python-setuptools') source=(https://github.com/gnome-keysign/gnome-keysign/archive/${pkgver}.tar.gz "avoid_monkeysign.patch") sha256sums=('0bb55d834f957fe438dc32b311d7035f12cf36af07c3bded462fc9d72451a224' '74a1ac5d76d21977d2a8c3fcbc7630ccf063600ff94a30ba20df47984c44bf2e') prepare() { cd "${pkgname}-${pkgver}" patch -Np1 -i "${srcdir}/avoid_monkeysign.patch" } build() { cd "${pkgname}-${pkgver}" python setup.py build } package() { cd "${pkgname}-${pkgver}" python setup.py install --root="${pkgdir}" --prefix="/usr" --optimize=1 } gnome-keysign-1.3.0/packaging/avoid_monkeysign.patch000066400000000000000000000013001431057335600226020ustar00rootroot00000000000000--- gnome-keysign-0.9.5.orig/setup.py 2017-10-03 13:19:46.000000000 +0200 +++ gnome-keysign-0.9.5.new/setup.py 2017-10-03 15:26:18.639867432 +0200 @@ -65,14 +65,14 @@ 'keysign.compat', 'keysign.network', ], - py_modules = [ - 'monkeysign.msgfmt', - 'monkeysign.translation', - 'monkeysign.gpg', - ], + #py_modules = [ + # 'monkeysign.msgfmt', + # 'monkeysign.translation', + # 'monkeysign.gpg', + #], package_dir={ - 'keysign': 'keysign', - 'monkeysign': 'monkeysign/monkeysign' + 'keysign': 'keysign' + # 'monkeysign': 'monkeysign/monkeysign' }, package_data={ 'keysign': [ gnome-keysign-1.3.0/packaging/gnome-keysign.install000066400000000000000000000005741431057335600223740ustar00rootroot00000000000000post_install() { echo ">>> GNOME Keysign requires a working Avahi local server." echo ">>> Enable it executing 'systemctl enable avahi-daemon'" echo ">>> If you want to also use Bluetooth you need to install" echo ">>> the optional dependency python-pybluez and enable the" echo ">>> Bluetooth daemon with 'systemctl enable bluetooth'" } post_upgrade() { post_install } gnome-keysign-1.3.0/packaging/gnome-keysign.spec000066400000000000000000000032731431057335600216570ustar00rootroot00000000000000%global commit cfcb137edebd6b1b88a7d5a39c6435561ee27eed %global shortcommit %(c=%{commit}; echo ${c:0:7}) Name: gnome-keysign Version: 0.9.7.2 Release: 0.9.7.2.git.%{shortcommit}%{?dist} Summary: GNOME OpenGPG key signing helper License: GPLv3+ URL: https://wiki.gnome.org/GnomeKeysign Source0: https://github.com/GNOME-Keysign/gnome-keysign/archive/%{commit}/%{name}-%{version}-%{shortcommit}.tar.gz BuildRequires: python-devel BuildRequires: python-babel BuildRequires: python-babel-BabelGladeExtractor BuildRequires: /usr/bin/desktop-file-validate Requires: python-gobject gtk3 Requires: dbus-python Requires: gstreamer1-plugins-bad-free-extras gstreamer1-plugins-good Requires: python-qrcode Requires: python-requests avahi-ui-tools Requires: python-twisted Requires: pybluez Requires: gpgme BuildArch: noarch %description OpenGPG key signing helper %prep %setup -qn gnome-keysign-%{commit} %build %{__python} setup.py build %install %{__python} setup.py install -O1 --skip-build --root %{buildroot} %check desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Keysign.desktop %files %doc README.rst %license COPYING %{_bindir}/%{name} %{_bindir}/gks-qrcode %{_datadir}/applications/org.gnome.Keysign.desktop %{_datadir}/metainfo/org.gnome.Keysign.appdata.xml %{_datadir}/icons/hicolor/scalable/apps/org.gnome.Keysign.svg %{python_sitelib}/keysign/ %{python_sitelib}/gnome_keysign-*.egg-info/ %changelog * Sat May 26 2018 Tobias Mueller - 0.9.7.2 - Attempt to update the version * Tue Feb 24 2015 Igor Gnatenko - 0.1-0.git.55f95bd - Initial package gnome-keysign-1.3.0/requirements.txt000066400000000000000000000462221431057335600175700ustar00rootroot00000000000000# # This file is autogenerated by pip-compile with python 3.8 # To update, run: # # pip-compile --generate-hashes # attrs==22.1.0 \ --hash=sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6 \ --hash=sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c # via # autobahn # automat # magic-wormhole # service-identity # twisted autobahn[twisted]==22.7.1 \ --hash=sha256:8b462ea2e6aad6b4dc0ed45fb800b6cbfeb0325e7fe6983907f122f2be4a1fe9 # via magic-wormhole automat==20.2.0 \ --hash=sha256:7979803c74610e11ef0c0d68a2942b152df52da55336e0c9d58daf1831cbdf33 \ --hash=sha256:b6feb6455337df834f6c9962d6ccf771515b7d939bca142b29c20c2376bc6111 # via # magic-wormhole # twisted # txtorcon certifi==2022.9.14 \ --hash=sha256:36973885b9542e6bd01dea287b2b4b3b21236307c56324fcc3f1160f2d655ed5 \ --hash=sha256:e232343de1ab72c2aa521b625c80f699e356830fd0e2c620b465b304b17b0516 # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \ --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \ --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \ --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \ --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \ --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \ --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \ --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \ --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \ --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \ --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \ --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \ --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \ --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \ --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \ --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \ --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \ --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \ --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \ --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \ --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \ --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \ --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \ --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \ --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \ --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \ --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \ --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \ --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \ --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \ --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \ --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \ --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \ --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \ --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \ --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \ --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \ --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \ --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \ --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \ --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \ --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \ --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \ --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \ --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \ --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \ --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \ --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \ --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \ --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \ --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \ --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \ --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \ --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \ --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \ --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \ --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \ --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \ --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \ --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \ --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \ --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \ --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 # via # cryptography # pynacl charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f # via requests click==8.1.3 \ --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 # via magic-wormhole constantly==15.1.0 \ --hash=sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35 \ --hash=sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d # via twisted cryptography==38.0.1 \ --hash=sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a \ --hash=sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f \ --hash=sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0 \ --hash=sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407 \ --hash=sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7 \ --hash=sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6 \ --hash=sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153 \ --hash=sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750 \ --hash=sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad \ --hash=sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6 \ --hash=sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b \ --hash=sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5 \ --hash=sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a \ --hash=sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d \ --hash=sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d \ --hash=sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294 \ --hash=sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0 \ --hash=sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a \ --hash=sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac \ --hash=sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61 \ --hash=sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013 \ --hash=sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e \ --hash=sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb \ --hash=sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9 \ --hash=sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd \ --hash=sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818 # via # autobahn # pyopenssl # service-identity # txtorcon future==0.18.2 \ --hash=sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d # via gnome-keysign (setup.py) hkdf==0.0.3 \ --hash=sha256:622a31c634bc185581530a4b44ffb731ed208acf4614f9c795bdd70e77991dca # via # magic-wormhole # spake2 humanize==4.3.0 \ --hash=sha256:0dfac79fe8c1c0c734c14177b07b857bad9ae30dd50daa0a14e2c3d8054ee0c4 \ --hash=sha256:5dd159c9910cd57b94072e4d7decae097f0eb84c4645153706929a7f127cb2ef # via magic-wormhole hyperlink==21.0.0 \ --hash=sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b \ --hash=sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4 # via # autobahn # twisted idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via # hyperlink # requests # twisted incremental==21.3.0 \ --hash=sha256:02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57 \ --hash=sha256:92014aebc6a20b78a8084cdd5645eeaa7f74b8933f70fa3ada2cfbd1e3b54321 # via # twisted # txtorcon magic-wormhole==0.12.0 \ --hash=sha256:1b0fd8a334da978f3dd96b620fa9b9348cabedf26a87f74baac7a37052928160 \ --hash=sha256:7c9a8d2a6e89314878dda23efc14c78398f1b6eb80e6c86c895c001c888d086e # via gnome-keysign (setup.py) pyasn1==0.4.8 \ --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \ --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba # via # pyasn1-modules # service-identity pyasn1-modules==0.2.8 \ --hash=sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e \ --hash=sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74 # via service-identity pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi pynacl==1.5.0 \ --hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \ --hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \ --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \ --hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \ --hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \ --hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \ --hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \ --hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \ --hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \ --hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543 # via magic-wormhole pyopenssl==22.0.0 \ --hash=sha256:660b1b1425aac4a1bea1d94168a85d99f0b3144c869dd4390d27629d0087f1bf \ --hash=sha256:ea252b38c87425b64116f808355e8da644ef9b07e429398bfece610f893ee2e0 # via twisted qrcode==7.3.1 \ --hash=sha256:375a6ff240ca9bd41adc070428b5dfc1dcfbb0f2507f1ac848f6cded38956578 # via gnome-keysign (setup.py) requests==2.28.1 \ --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 # via gnome-keysign (setup.py) service-identity==21.1.0 \ --hash=sha256:6e6c6086ca271dc11b033d17c3a8bea9f24ebff920c587da090afc9519419d34 \ --hash=sha256:f0b0caac3d40627c3c04d7a51b6e06721857a0e10a8775f2d1d7e72901b3a7db # via twisted six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # via # automat # magic-wormhole # service-identity spake2==0.8 \ --hash=sha256:c17a614b29ee4126206e22181f70a406c618d3c6c62ca6d6779bce95e9c926f4 \ --hash=sha256:ce80705f8516c54364931f3b2c9a917ba001500d7f2fc76a0e8cf3bcaf0e30f7 # via magic-wormhole tqdm==4.64.1 \ --hash=sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4 \ --hash=sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1 # via magic-wormhole twisted[tls]==22.8.0 \ --hash=sha256:8d4718d1e48dcc28933f8beb48dc71cfe77a125e37ad1eb7a3d0acc49baf6c99 \ --hash=sha256:e5b60de39f2d1da153fbe1874d885fe3fcbdb21fcc446fa759a53e8fc3513bed # via # autobahn # gnome-keysign (setup.py) # magic-wormhole # txtorcon txaio==22.2.1 \ --hash=sha256:2e4582b70f04b2345908254684a984206c0d9b50e3074a24a4c55aba21d24d01 \ --hash=sha256:41223af4a9d5726e645a8ee82480f413e5e300dd257db94bc38ae12ea48fb2e5 # via autobahn txtorcon==22.0.0 \ --hash=sha256:824b5df1977bedabfc1c49c9523b8fa1b7cff11d6fee78015df1ce133685779c \ --hash=sha256:89a1b65e32a4b369d67e6c166387fbc468cc5d05227448d239a5e7e9718aa053 # via magic-wormhole typing-extensions==4.3.0 \ --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 # via twisted urllib3==1.26.12 \ --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ --hash=sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997 # via requests zope-interface==5.4.0 \ --hash=sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192 \ --hash=sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702 \ --hash=sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09 \ --hash=sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4 \ --hash=sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a \ --hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \ --hash=sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf \ --hash=sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c \ --hash=sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d \ --hash=sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78 \ --hash=sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83 \ --hash=sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531 \ --hash=sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46 \ --hash=sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021 \ --hash=sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94 \ --hash=sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc \ --hash=sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63 \ --hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \ --hash=sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117 \ --hash=sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25 \ --hash=sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05 \ --hash=sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e \ --hash=sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1 \ --hash=sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004 \ --hash=sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2 \ --hash=sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e \ --hash=sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f \ --hash=sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f \ --hash=sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120 \ --hash=sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f \ --hash=sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1 \ --hash=sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9 \ --hash=sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e \ --hash=sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7 \ --hash=sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8 \ --hash=sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b \ --hash=sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155 \ --hash=sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7 \ --hash=sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c \ --hash=sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325 \ --hash=sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d \ --hash=sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb \ --hash=sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e \ --hash=sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959 \ --hash=sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7 \ --hash=sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920 \ --hash=sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e \ --hash=sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48 \ --hash=sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8 \ --hash=sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4 \ --hash=sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263 # via # autobahn # twisted # txtorcon # WARNING: The following packages were not pinned, but pip requires them to be # pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag. # setuptools gnome-keysign-1.3.0/setup.cfg000066400000000000000000000010411431057335600161130ustar00rootroot00000000000000# Babel configuration [compile_catalog] domain = keysign directory = keysign/locale statistics = true [extract_messages] add_comments = TRANSLATORS: copyright_holder = Tobias Mueller msgid-bugs-address = tobiasmue@gnome.org output_file = keysign/locale/keysign.pot width = 80 [init_catalog] # Call, e.g. setup.py init_catalog --locale=de domain = keysign input_file = keysign/locale/keysign.pot output_dir = keysign/locale [update_catalog] domain = keysign input_file = keysign/locale/keysign.pot output_dir = keysign/locale previous = true gnome-keysign-1.3.0/setup.py000066400000000000000000000150131431057335600160100ustar00rootroot00000000000000#!/usr/bin/env python # from __future__ import print_function # We can't use unicode_literals because there seems to be # a bug in setuptools: # https://stackoverflow.com/a/23175194/2015768 # from __future__ import unicode_literals import codecs import glob import logging from setuptools import setup from setuptools.command.install import install from setuptools.command.test import test as TestCommand from distutils.command.build import build #import py2exe import os import sys logging.basicConfig(level=logging.WARN) # Just in case we're attempting to execute this setup.py # when cwd != thisdir... os.chdir(os.path.dirname(os.path.realpath(__file__))) with open(os.path.join('keysign', '_version.py')) as f: # This should define __version__ exec(f.read()) class BuildWithCompile(build): sub_commands = [('compile_catalog', None)] + build.sub_commands def run(self): from babelglade.translate import translate_desktop_file, translate_appdata_file translate_desktop_file('data/org.gnome.Keysign.raw.desktop', 'data/org.gnome.Keysign.desktop', 'keysign/locale') translate_appdata_file('data/org.gnome.Keysign.raw.appdata.xml', 'data/org.gnome.Keysign.appdata.xml', 'keysign/locale') build.run(self) # Pretty much from http://stackoverflow.com/a/41120180/2015768 class InstallWithCompile(install): def run(self): try: from babel.messages.frontend import compile_catalog compiler = compile_catalog(self.distribution) option_dict = self.distribution.get_option_dict('compile_catalog') compiler.domain = [option_dict['domain'][1]] compiler.directory = option_dict['directory'][1] compiler.run() except Exception as e: print ("Error compiling message catalogs: {}".format(e), file=sys.stderr) print ("Do you have Babel (python-babel) installed?", file=sys.stderr) #super(InstallWithCompile, self).run() install.run(self) class PytestTestCommand(TestCommand): def finalize_options(self): TestCommand.finalize_options(self) self.test_args = [] self.test_suite = True def run_tests(self): print ("We're just running pytest...", file=sys.stderr) import subprocess subprocess.call(['pytest']) setup( name = 'gnome-keysign', version = __version__, description = 'OpenPGP key signing helper', author = 'Tobias Mueller', author_email = 'tobiasmue@gnome.org', url = 'https://wiki.gnome.org/Apps/Keysign', packages = [ 'keysign', 'keysign.compat', 'keysign.network', ], package_dir={ 'keysign': 'keysign', }, package_data={ 'keysign': [ '*.ui', 'locale/*/*/*.mo', # The PO files are added in the MANIFEST, because they # should be part of the source distribution. # 'locale/*/*/*.po' ] }, include_package_data = True, data_files=[ ( 'share/applications', ['data/org.gnome.Keysign.desktop']), ( 'share/metainfo', ['data/org.gnome.Keysign.appdata.xml']), ( 'share/icons/hicolor/scalable/apps', ['data/org.gnome.Keysign.svg']), #( 'share/locale/', # # We cannot use the glob below, because it only copies the file # # into the directory mentioned above, i.e. keysign.po, rather # # than de/LC_MESSAGES/keysign.po including the de/... directories. # ([f for f in glob.glob('keysign/locale/*/*/*.po')] + # [f for f in glob.glob('keysign/locale/*')]) # ), ], #scripts = ['gnome-keysign.py'], install_requires=[ # Note that the dependency on <= 2.2 is only # to not confuse Ubuntu 14.04's pip as that # seems incompatible with a newer requests library. # https://bugs.launchpad.net/ubuntu/+source/python-pip/+bug/1306991 # 'requests<=2.2', # But this version seems to be requiring an old pyopenssl # with SSLv3 support which doesn't work with Ubuntu's 16.04. # So let's require a more modern requests. 'requests>=2.6', 'qrcode', 'twisted[tls]>=17.5.0', 'future', 'magic-wormhole>=0.10.2', # avahi # Also no entry in the cheeseshop # dbus # dbus-python is in the cheeseshop but not pip-able ], extras_require={ 'bluetooth': ['pybluez>=0.22'], }, setup_requires=[ "babel", "BabelGladeExtractor", ], tests_require=[ "pytest", "pytest_twisted", "tox", "pycodestyle", "pylint", ], license='GPLv3+', long_description=open('README.rst').read(), entry_points = { 'console_scripts': [ 'gnome-keysign-sign-key = keysign.SignKey:main', 'gnome-keysign-split-uids = keysign.export_uids:main', ], 'gui_scripts': [ 'gnome-keysign = keysign:main', ], }, classifiers = [ # Maybe not yet... #'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'Intended Audience :: End Users/Desktop', 'Intended Audience :: Information Technology', 'Intended Audience :: Legal Industry', 'Intended Audience :: Telecommunications Industry', 'Programming Language :: Python :: 3', 'License :: OSI Approved :: GNU General Public License (GPL)', 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', 'Operating System :: POSIX :: Linux', 'Environment :: X11 Applications :: GTK', 'Topic :: Desktop Environment', 'Natural Language :: English', 'Topic :: Communications :: Email', 'Topic :: Multimedia :: Video :: Capture', 'Topic :: Security :: Cryptography', 'Topic :: Software Development :: Libraries :: Python Modules', ], message_extractors = { '': [ ('**.raw.desktop', 'babelglade:extract_desktop', None), ('**.raw.appdata.xml', 'babelglade:extract_glade', None), ], 'keysign': [ ('**.py', 'python', None), ('**.ui', 'babelglade:extract_glade', None), ], }, cmdclass={ 'build': BuildWithCompile, #'install': InstallWithCompile, 'test': PytestTestCommand, }, ) gnome-keysign-1.3.0/tests/000077500000000000000000000000001431057335600154405ustar00rootroot00000000000000gnome-keysign-1.3.0/tests/create_attestee.sh000077500000000000000000000011731431057335600211420ustar00rootroot00000000000000#!/bin/bash -ex # A simple helper for creating an environment for the receiver of the newly produced certification ATTESTEE_DIR=/tmp/gks-attestee rm -rf "${ATTESTEE_DIR}.bak" mkdir -p $ATTESTEE_DIR mv -f "$ATTESTEE_DIR" "${ATTESTEE_DIR}.bak" mkdir -p $ATTESTEE_DIR echo -n | env GNUPGHOME=${ATTESTEE_DIR} gpg --pinentry-mode loopback --batch --no-tty --yes --passphrase-fd 0 --quick-generate-key attestee@example.com env GNUPGHOME=${ATTESTEE_DIR} gpg --armor --export attestee@example.com > ${ATTESTEE_DIR}/attestee.pgp.asc echo \"GNUPGHOME=${ATTESTEE_DIR}\" python3 -m keysign.sign_and_encrypt ${ATTESTEE_DIR}/attestee.pgp.asc gnome-keysign-1.3.0/tests/create_attestor.sh000077500000000000000000000011521431057335600211660ustar00rootroot00000000000000#!/bin/bash -ex # A simple helper for creating an environment for the producer of a certification ATTESTOR_DIR=/tmp/gks-attestor rm -rf "${ATTESTOR_DIR}.bak" mkdir -p $ATTESTOR_DIR mv -f "$ATTESTOR_DIR" "${ATTESTOR_DIR}.bak" mkdir -p $ATTESTOR_DIR echo -n | env GNUPGHOME=${ATTESTOR_DIR} gpg --pinentry-mode loopback --batch --no-tty --yes --passphrase-fd 0 --quick-generate-key attestor@example.com env GNUPGHOME=${ATTESTOR_DIR} gpg --armor --export attestor@example.com > ${ATTESTOR_DIR}/attestor.pgp.asc echo env \"GNUPGHOME=${ATTESTOR_DIR}\" python3 -m keysign.sign_and_encrypt ATTESTEE_DIR/attestee.pgp.asc gnome-keysign-1.3.0/tests/fixtures/000077500000000000000000000000001431057335600173115ustar00rootroot00000000000000gnome-keysign-1.3.0/tests/fixtures/alpha.asc000066400000000000000000000050551431057335600210730ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQGiBDbjjp4RBAC2ZbFDX0wmJI8yLDYQdIiZeAuHLmfyHsqXaLGUMZtWiAvn/hNp ctwahmzKm5oXinHUvUkLOQ0s8rOlu15nhw4azc30rTP1LsIkn5zORNnFdgYC6RKy hOeim/63+/yGtdnTm49lVfaCqwsEmBCEkXaeWDGq+ie1b89J89T6n/JquwCgoQkj VeVGG+B/SzJ6+yifdHWQVkcD/RXDyLXX4+WHGP2aet51XlKojWGwsZmc9LPPYhwU /RcUO7ce1QQb0XFlUVFBhY0JQpM/ty/kNi+aGWFzigbQ+HAWZkUvA8+VIAVneN+p +SHhGIyLTXKpAYTq46AwvllZ5Cpvf02Cp/+W1aVyA0qnBWMyeIxXmR9HOi6lxxn5 cjajA/9VZufOXWqCXkBvz4Oy3Q5FbjQQ0/+ty8rDn8OTaiPi41FyUnEi6LO+qyBS 09FjnZj++PkcRcXW99SNxmEJRY7MuNHt5wIvEH2jNEOJ9lszzZFBDbuwsjXHK35+ lPbGEy69xCP26iEafysKKbRXJhE1C+tk8SnK+Gm62sivmK/5arQnQWxmYSBUZXN0 IChkZW1vIGtleSkgPGFsZmFAZXhhbXBsZS5uZXQ+iFgEExECABgDCwoDAxUDAgMW AgECF4ACGQEFAlg/S28ACgkQLXJ8x2hpdzQ3QQCfd6BPvdQcfiZ/4v3PkDXHoUll xFAAoIEDAAuhFt0dcSV4/b2Qe90dMbD2iEYEEBECAAYFAlhAamwACgkQnO4bawWb WY5RDwCeIgi58t2Ebm31GD39lEdn9ZIfjzEAnjLw+ESSEUFwtbW4r9gA5/o1Zlh4 iEYEEBECAAYFAlhAamwACgkQ9woCkGwwGBNRDwCeM7aed2E6hHxjovtOWZMVkc6u oOcAnidWHOPSbamihhOrYkw/IrTe+zxtiF4EEBEIAAYFAlhAamwACgkQHDQZvxv5 jW0COQEApHdOCgih1UcZxTW3L8Eu3Xh6zZRI1XhLrdgbOdj0oqwA/jRz6C3tj4Hd 7wzziNAwqPcGPJ/E/BqduG4H4V46FbyCtClBbHBoYSBUZXN0IChkZW1vIGtleSkg PGFscGhhQGV4YW1wbGUubmV0PohVBBMRAgAVAwsKAwMVAwIDFgIBAheABQJYP0tv AAoJEC1yfMdoaXc0lkYAoIjBvOtkcw4eVdsN9VBEGbU3qpAjAJ4y8BxPPr4w2LAw VicoBp+E5aB0/ohGBBARAgAGBQJYQGpsAAoJEJzuG2sFm1mOoGEAnjD8NM3U1ibI yWKVyX6ANUcO2ME3AKCrRwIILDPDNa5bze3BWlMBGp23QIhGBBARAgAGBQJYQGps AAoJEPcKApBsMBgToGEAnRZDWRCfiz6EqOlIrcmRISDetPKRAJ4siqfCWJZ4VYq/ 6U7c3cZcuqRtP4heBBARCAAGBQJYQGptAAoJEBw0Gb8b+Y1t06MA/08rlWmL2iqm 9i7192n5QMOu/Fy7sNUaH3A7fC9nyZABAP4ttDIlERolAQUdjO7xLvHx08BFXUup rDxc/sJ9d0fZBrQQQWxpY2UgKGRlbW8ga2V5KYhVBBMRAgAVAwsKAwMVAwIDFgIB AheABQJYP0tvAAoJEC1yfMdoaXc0JqoAnjXKojVPqmldCH7qJR2sh2v0RdN2AKCL 27dGMen8UBnQCM+FLM07FjRDxohGBBARAgAGBQJYQGpsAAoJEJzuG2sFm1mOKy0A nAviX6eMrwaUwfp0OAc9Bonh0fVcAJoDtHqJwCBQm9ZfoCEQQxA66DYUlohGBBAR AgAGBQJYQGpsAAoJEPcKApBsMBgTKy0AnRYbLSL7EqsgWPdZFbWOEw7JVKtAAJ9W 0zSR5aca8T+pZjpovDpB59ThfYheBBARCAAGBQJYQGptAAoJEBw0Gb8b+Y1tU4gA /RgIwm/ajs0PlmyKesW2z26V9f1avw1zJNtJjcdC5dwuAP4ky7zvUgr9V8OlYDUB 7MPATjiLPknFvDn1X1OWfgPicrkBDQQ2448PEAQAnI3XH1f0uyN9fZnw72zsHMw7 06g7EW29nD4UDQG4OzRZViSrUa5n39eI7QrfTO+1meVvs0y8F/PvFst5jH68rPLn GSrXz4sTl1T4cop1FBkquvCAKwPLy0lE7jjtCyItOSwIOo8xoTfY4JEEXmcqsbm+ KHv9yYSF/YK4Cf7bIzcAAwcD/Rnl5jKxoucDA96pD2829TKsLFQSau+Xiy8bvOSS DdlyABsOkNBSaeKO3eAQEKgDM7dzjVNTnAlpQ0EQ8Y9Z8pxOWYEQYlaMrnRBC4DZ 2IadzEhLlIOz5BVp/jfhrr8oVVBwKZXsrz9PZLz+e4Yn+siUUvlei9boD9L2ZgSO HakPiEYEGBECAAYFAjbjjw8ACgkQLXJ8x2hpdzQgqQCfcDXmD8uNVdKg/C9vqI3J SndqknsAnRxzVeHi/iJ73OCKtvFrHbV9Gogq =TFxT -----END PGP PUBLIC KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/pubkey-1.asc000066400000000000000000000027211431057335600214400ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.1.0-gitb3c71eb (GNU/Linux) mQGiBDo41NoRBADSfQazKGYf8nokq6zUKH/6INtV6MypSzSGmX2XErnARkIIPPYj cQRQ8zCbGV7ZU2ezVbzhFLUSJveE8PZUzzCrLp1O2NSyBTRcR5HVSXW95nJfY8eV pOvZRAKul0BVLh81kYTsrfzaaCjh9VWNP26LoeN2r+PjZyktXe7gM3C4SwCgoTxK WUVi9HoT2HCLY7p7oig5hEcEALdCJal0UYomX3nJapIVLVZg3vkidr1RICYMb2vz 58i17h8sxEtobD1vdIKNejulntaRAXs4n0tDYD9z7pRlwG1CLz1R9WxYzeOOqUDr fnVXdmU8L/oVWABat8v1V7QQhjMMf+41fuzVwDMMGqjVPLhu4X6wp3A8uyM3YDnQ VMN1A/4n2G5gHoOvjqxn8Ch5tBAdMGfO8gH4RjQOwzm2R1wPQss/yzUN1+tlMZGX K2dQ2FCWC/hDUSNaEQRlI15wxxBNZ2RQwlzE2A8v113DpvyzOtv0QO95gJ1teCXC 7j/BN9asgHaBBc39JLO/TcpuI7Hf8PQ5VcP2F0UE3lczGhXbLLRESm9lIFJhbmRv bSBIYWNrZXIgKHRlc3Qga2V5IHdpdGggcGFzc3BocmFzZSAiYWJjIikgPGpvZUBl eGFtcGxlLmNvbT6IYgQTEQIAIgUCTbdXqQIbIwYLCQgHAwIGFQgCCQoLBBYCAwEC HgECF4AACgkQr4IkT5zZ/VUcCACfQvSPi//9/gBv8SVrK6O4DiyD+jAAn3LEnfF1 4j6MjwlqXTqol2VgQn1yuQENBDo41N0QBACedJb7Qhm50JSPe1V+rSZKLHT5nc3l 2k1n7//wNsJkgDW2J7snIRjGtSzeNxMPh+hVzFidzAf3sbOlARQoBrMPPKpnJWtm 6LEDf2lSwO36l0/bo6qDRmiFRJoHWytTJEjxVwRclVt4bXqHfNw9FKhZZbcKeAN2 oHgmBVSU6edHdwADBQP+OGAkEG4PcfSb8x191R+wkV/q2hA5Ay9z289Dx2rO28CO 4M2fhhcjSmgr6x0DsrkfESCiG47UGJ169eu+QqJwk3HiF4crGN9rE5+VelBVFtrd MWkX2rPLGQWyw8iCZKbeH8g/ujmkaLovSmalzDcLe4v1xSLaP7Fnfzit0iIGZAGI RgQYEQIABgUCOjjU3QAKCRCvgiRPnNn9VVSaAJ9+rj1lIQnRl20i8Rom2Hwbe3re 9QCfSYFnkZUw0yKF2DfCfqrDzdGAsbaIRgQYEQIABgUCOjjU3gAKCRCvgiRPnNn9 Ve4iAJ9FrGMlFR7s+GWf1scTeeyrthKrPQCfSpc/Yps72aFI7hPfyIa9MuerVZ4= =QRit -----END PGP PUBLIC KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/pubkey-2-uids.asc000066400000000000000000000024001431057335600223750ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mI0EWD/sgQEEAM91KvxbtIlraZtZDCFtiKIBceR2aY5KmnwdNZdVrmndw8otwf6g Pk3/K9hZhTllbpRyY6A7dpLr2g4/uuTMLsM32WRl3xRsHGjoHxfyw3nc3HDcpx7y 3k2JN/cf0a4L1+DE82yJt3fUqSUwepb6+YDbg+xLsmzdewDmf9Bnlu5bABEBAAG0 GVRlc3QgS2V5IDx0ZXN0QHRlc3QudGVzdD6IuAQTAQIAIgUCWD/sgQIbAwYLCQgH AwIGFQgCCQoLBBYCAwECHgECF4AACgkQA0CU+4/Ulfu5pQP+MFCmUrs9Q+XCcRpO 1xLNZtvwDegX7HHYlrAp8Xv/m8n21TE1svrO0NR62OXi/OROxLnpd72/ZD2/BiuV ittsPWup+QK9dddg0TrVDakvaColXmRXhSKzyX4YhaX1F2hbyhzBdlI58OuIsGjM fDsMhAshRf7zdiLEwB+ivzu9gpe0GUFub3RoZXIgVGVzdCA8c2Vjb25kQHVpZD6I uAQTAQIAIgUCWD/uOgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQA0CU +4/UlftBiQP/bu97IEArTem1q2FVks4Yjy7dK1Izfa1CV7JeUS9anoTdeBRUo0T9 VoyI31qUbuWwL/dmSKJ89UZvwwumqDfRR5nr6NMOMec5rnrk9kjnvqa+Tlvj0cQG +01EVYWoBkdlYD7Dut/+ZjCOqHQVHORpKgzdtWDwrDyiWgWhc3PAzPi4jQRYP+yB AQQAxFhAuUVYPVGRNX7m5gjgBYXx/qtNAmdyCv0ivFxAWoqcXuy4LjGFpCKTUDHy XOpv3czfIW7VVh4w3xoXD9OFg2ySU5Lt51/i2PYZsa2RNbogUjwD0VCzqIwXATzp eaA3CwDD+0zpXHhrTJv4FihrYiPnhBjGhg4F6PxtJQyYZYMAEQEAAYifBBgBAgAJ BQJYP+yBAhsMAAoJEANAlPuP1JX7iqID/ijG4Nol51psx7cL9LWLhhNy3rB8gDUr e7NLvrnjf2OXOXrzgqaPq59LHwI0Q+d2Qh2AjAjMgOrpN7CRP6lL9GdKpWm2U5F3 8esFxuMPUDmNyWE5/iiR+IVYI67ZPQrwARGjlMjlTnY345t7FqfS8bTqE2XXNxXK Zezw7yly8itB =9BoK -----END PGP PUBLIC KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-2.asc000066400000000000000000000065671431057335600214410ustar00rootroot00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQOYBFgvBu4BCAC9mzZbSXvu1tQYX2lfMsySyMouIwzP7t3pebW1R2Mqx7GvuivH oE69sve56f+kfK4TKRfPSTq4KsbNApTkXfxU7pvVwgDq85mVzIFSBWWkiRMzPzix 1bVpZAfvNsHea+Cm/4h3C4GHZj4PC4yw7r/XesShqgR34nNUYwMlzFa4zAyRUd2N B7YJR6CkEiwOVeV3SVZuPOxx2a49SLaOFMhKg1duAJq7bZIuRa65rkFlSlYHL5nP Wo/3HG0ow/jY1Tk1UnOhv5s2VVQn9uIFoO8WoYhRrHeUnt0kiPfl7CHngBhPTVZH auXdQ7Pd+3GNjHuNnXeaXvD9zeD4zD5qCP0xABEBAAEAB/oDEEMLrL9hLgmfDsrL wq0PtOMGmM/IFX9ymmIg68zcSZeDRw18oohZkOhnK0xtBdixyMJ9bNAs+DMrGwVF 2IdPTGWqYzT5ltyet39InUhPPsNXjiHZebvLJQmELqacp372cJi6kUe5mAgDqgRo oKSErXnU20OxBJcn2cuyUvL89fchfIDhitwc8dDlhMHRo0pOuZgDKMeNSlSHw2lE YVb56bng0oYDhHFp8WcYndsOlxvC+6zvCT826nfPse2yVMYE5YgexQFZBRQuvKL3 GpN3w0Ymlry+YHud4h/9NcnTvJCoRx7K5jybZFzS3p/bukRedcYOoHIzRUDfdJaX 0Qr5BADWKI7WOl6HTLgRWg2h1dxEM+lV12HeYjxy4qwD4/iIVo4pRUlul+e/C/PC zt0Qht+0CGSOUmKkA43IXqH8YELILN1jNDHphDpKIGtAn8oe71sdMVNOg+L4xpDE EI26WM3+zI5YXwfXE61pjr5Ml65mJMuc4EtvD7k/NJaIrU0mFQQA4qak6cTJOgBk RlFIIIYy53FI9BoDO5d84Rs8l0A96dM/O86J25k43WmJ4S2s7ufOIPhH4sXdJYYF E1TSLuNEoYNhTuw0oB0aMUNswdUQJC4O9JN6ObHu7eBdbycpZtN6eNnC0ZzOOoPS iHuEh4mmQxJIjffFzJsSQI1vsk2Wfa0D/i4UNDw96C5EpM+Rh9wcjNb48IIaTpzN lTKyH1+VRp+KCDp6B/VMZ+de5Yo3TlyWzcB4BvcgrkzoTPW74SIbLMudkNcWdOTP YksTPMBkkYWSpOzPQ+1l7f1Ps5g/29htcCcYnRWF3xG4SuJW8GPs7iM+GQ9u6Xek Sgm6Lw1EOxtcQ7K0E1Rlc3QgS2V5IDx0ZXN0QGtleT6JATgEEwECACIFAlgvBu4C GwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEKXIm4s4PudUlvEIALei+uSZ n8a230B+CUfI6z+t9HlCjjR5FAlyYlUWIDRmox6ny/BGAsa+eJo2fgpAfYsiTAJv iY08oSol5NH52PwCrXOh8mMpttvWLuokz0FsrCocWoerRIErLcx9ytibkyQSNkdH HeDRmDpeNXJyD9c6sfy5vSCx0J+P+roNBKMY/X2vLouL4RoEM+eMKHQxENzKxsj9 BzIgGkdYQjlmSzQo3TcyIUm8Zl4u9Ag3dVQzS7hZKaIoWsfzeLMu3v+oGLhCv9mk e9Xw19usdJ/QSA9P0B+pqHTX+7DO9aUWWX7r0uvtioB7e2Xt7q+9Fmnmwb5AR9g8 OrkeWdftPwjvDf+dA5gEWC8G7gEIAMUKJ5elmdU9jZGu8IM78z2x5cxaFDKBsi9S Xmpg5DV00ru0ZDW0IGvjQO4PO3Rtc/EJJPbroYjcAyBl2RYKXor2Rpj0V4ciGWEc nJEMnoyaeNsrjHlxA2FpJUOySEfLMtXSQyujFM/QqO85TdC51tWeloBJBHYNrxp3 jUlRf2tYcOSyqMEgORiKh6K73u6UDPUTH/VjJR3/fdVeedQhPtUi2uPEKjLEtXY6 +ZmK3vaIRMkDYzVjNEGXnlUlo9eKudJDCqyW5JRLuErK3VwdwSQ2q7nR/mx6pK5R 1cbMl62uPz3Ia7t+6yRFmXVM5E2Fr7PNjYpOLwIE9h8A7ISIWuEAEQEAAQAH/i9X rcSjfu8772ByEorNpDeOH2M2v4SVIf15woK3zg1ECQAdqzg2E9YoT6kDUus6AzIG WvHTEshh6IRnxD2l9ypXWwYUK1WmLUfmin3VdODemqw6bfGd5EyK6W+3DePmIEw8 zXPWJsF55qU39QjyJfrEtG+VW7OLvSdUU0erA70EIk4rwRB1Sl3uDI477sYLMNY1 SdxlDAWcLhnLrIbfNiTyZHOUmGHGIUk2EgEeAJSqmb27aY5KJ/eE7AJxHQowoqFZ IQLMdmP3oxR93gbnFtyo1QhUC2o4aUWLz8N0JM1DWxEcBbSS6dqxngEjsD2y3D3C qhajricmhLfKcgjF2zkEANI6edlwfD4DuU5DF1yqo0+iSzNsops+W02TBhfr1kvD 3AO2mMqKewPGGdy216qQReoDSQ9y6RzidD3VzXOHtChGPHOmeF3uFu9x5+ySU8gx xBVjth6ULxxgRZ3mU/FNao5rpKtSJD8AOZAmJKz+fYbXp+6uuZAajYaVfGP4C4TN BADv8JNcWJfGMRtZzYkyLDzHN74YWoAzVw7iMuNQgtNJCPXa5Eky5O2u71dWJEZd dp6X7ZCGNjgleORanUn4xWLAoRM5cDVhjPMYVBRECfa/6VLuPQ4AsnmAOb2bmsr1 N/vTq2eOjlzV+lrbp1wF1KKRJGnW/X9kRiG0FyKE76DOZQP/XmkLxGioIsmPqi+P +/zWbY4Ik8sNmpBrmrzrGLzsRZ9CFj0DLcek6neCRKv5rG8oGfQvo8wlMToTF60C hYBzgefuDyOhfRsnpXSc3gD4HRQ85yExkZ7unyrRIR+3hDf9i9PcLMP/y12trFIr 3X5KCkGjHi6eD/pIr2CYiTKuGCkzwokBHwQYAQIACQUCWC8G7gIbDAAKCRClyJuL OD7nVJ3nB/9jF3kHmCWqE9JWWKwNhWcWEs6Jd3GfzZDWs4I0gWWfdMYjhC05kl6m keH6PNwMr0qHDcKJ0GCJF6Tu1uRfhxT5/mqcwkG739bQzwhfLtdg1QpaLV5L3nPO /NWUiWlYyqTtPNoluRGfyAwX0JvWdHSJxU78lziMbc4HIv8qJ2Kcsm4CU1hCJFnc bD9DRBK+aHWJDlwW+kjNQZeNLM1uznTufd+CqkHOcSzxn2zEvQIkN6O8nrQ9pq+7 b/ez3zr3GWuLZxpxBvZ6TC35nmdutqwKKhJn939k+XbWKpG+BF2rhdI3pTzcpjKC pRk+jFP4mkML3OgpUm6we3x2f14e/KoP =nbTi -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-colon.asc000066400000000000000000000042641431057335600224020ustar00rootroot00000000000000pub rsa1024 2017-05-19 [SC] BCE33D2033CF08EBFDF16F7B1D4E64C28F62260A BCE33D2033CF08EBFDF16F7B1D4E64C28F62260A uid Bruce Wayne (https://bruce.wayne) sub rsa1024 2017-05-19 [E] -----BEGIN PGP PRIVATE KEY BLOCK----- lQHYBFkeuOMBBADFxRVpXtft0P4ubDNy1JMev8s2wCz+V1Yq1ANcNJID8La3afO5 5fscOs0SePcalbbE7AU21wyPjzzOVgUUcFkj+/4F49jGZB19YbN+Po4ftd8XBBQ2 uCn7WSGE2CV8jIv+bfRK4fd1bfd8UKaAHtCkoQj+4x125UFQUSPYdSRHrwARAQAB AAP/RdaV/BLA/7sot24AMRG+LkKeWWQ9v0dKJ2+dDCeIVJnhfB2PMtty9IITPu22 nQ23cAzEvpvsVJnJaDfaLWCLKVlrfEqaU8gUqOda20UWihv572xo0OZ6TisGeq0R 8AnBmI8o5pZth0gMK6pkmsaBHdT/ZrtgdL1tgiEyIPL0DnECAM66GkiO04c6Gvhj SZruuy8pwedrFLYg9HwNe0hQsNo4l/nVp30+ic4ta+VtZCUHm4VWmnmjmqh7L2W8 kk+Bm0cCAPTocY/0cuh52GUXJIXebk9gniuf3BhSfcAqwA/lduPlqkDSWUmqC7JV sAVz7BmC5qOIDRrTVjcyNLZN+XHOVFkCAJubLNlMjoe21x5sEc5aGHJ3HUvNKKVZ WoTdphaOzE2spU3jnxTtjwymim2BmaOJB7ZEGG11UDj4f9BTjI5Rfpqc0bQ9QnJ1 Y2UgV2F5bmUgKGh0dHBzOi8vYnJ1Y2Uud2F5bmUpIDxicnVjZS53YXluZUB3YXlu ZWNvcnAuY29tPojOBBMBCAA4FiEEvOM9IDPPCOv98W97HU5kwo9iJgoFAlkeuOMC GwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQHU5kwo9iJgrjQwP+P4TVrJuR Blry89JdBhOi/4cuqOGVT7CtS2BeiAakGeoNLSAVapnJy3W6m6EtP11V5hT1JMJx YUaql6rDEwLYNs/niq9VhtAFQefvgyDtPg83caOF0kSNDFhgHG/lFg45l2pyPmgJ X+XfHYKaS7feTcJ02FoEeBotYO2el3y0yWmdAdgEWR644wEEAN/DXNBP2j11WHpc 7geGJTft4WKoGbcmNxYbI3SlVleWjXkjiv5mBqP8IYkM160qbMHZQp1gCBmVQotY lmA2LLTBTP5Wvb2ifJ5fZV5GBr8GK4+Le7AKSWFwq4fh7hLj5aiMLVn4uYBi959O bCUeIAm9nOFE5KoJqtoo9mXmrkgVABEBAAEAA/9Ft3W8hZSmn2AQx9F10KrZ8SjO 9zcD5Ek3fv8eAcGUCplLi/JrbthU0WKVc8Xi8xvtjcZ+iAQeDG4uQkyf72Ef3wmw PQh580Og0VG78AcewbYAb/oIJjBvTULmi7U3fv4Mro9QgLEb0WVx66OHZVpu8ia2 glUBL1v+3lLxWlh1BQIA6m60gO2aQQAcoDCNXZdNAUSg3e5/ILHCathyfZHkiwbL 8Y4HALcrM7EPSKcouThek1z7GHBtQBFR43Nv5SZ1HwIA9FlgZ+oNmBqztXhtPTMX 4+tbLSaVeMLrRCHyJFW4xPK5l5Npr7YMlk3hY4sM6EX7uQEKiAhsH7qgxyzVXh8I SwH+LipkuzmraX/I5Wgc5wGsmUk0AuAaz/n+hoiNr+/XC7ic6By/iCiq8VNTq6iE hc0voph47Lto2DJGqFX5S179cZ+/iLYEGAEIACAWIQS84z0gM88I6/3xb3sdTmTC j2ImCgUCWR644wIbDAAKCRAdTmTCj2ImCsikA/kBQSoGqhVn4X/dCP9lYezznlBg FFjkX4OX4SS4C/EUyAB0ChmAHqtjUiuy462tUvVgcSeI2hgFuYXr6TStx3Mmx436 lqs3THVa/LxYny4PeC0TqyoFfZ0OsgsSZ6uijh+JBQgLmgCGv6gu6TlksEoeUXBz S4TDKhhhkLTS1d29Uw== =6hsa -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-latin1.asc000066400000000000000000000040661431057335600224600ustar00rootroot00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQHYBFkQq/4BBACgTJrZpB0KioOfLrFmRg3DFtrbtN4Ww/mDBgotuWp2xTLTWpiY zuIaEFWj941ZM4Z1PrlTSadEd+xw6RXjW01uPQErNpViZF9jz3NmAsWrqu+2uemu vzq5BXW4qu4MhsxN1qn+CJx7odfQQZKOwEOwOXN2O/RokYKD5FizH71LdQARAQAB AAP9EkK/xijPpR6D4XueemXjFfUR0AMB5MqE70PeH3jWk7qhsFmK9idlMu5m7yOZ fs6jk9ImJwKGM0LNFMy8sVZ6krTnBG9VL2eIN+1CkEgB66ywiTEG5uT/Rkhkb00C scqedBS5CzVxbG8lZkn54Pj5vkPF6+eJ73frTS1NY79JDFkCAMaAk5RID526/ed8 bL3wqaDTk64aht79CdVWWiz2+fdxS6Pj9T/y5/ijkhjuRQcakG/TDLRACBahF6/M H+Zvyj0CAM67Lqbmvtd90JMA0nNDJBXqYuRN00/XHRKo98uswYFHl/h+WoOqoqtC M3btr/SCVGnbZuZTFmkBmbi51gpS8ZkCAJHXIivzI02+sAu3hwOBmQTHUOQZjB8b IknYpkPXnWUY4MF1GRuTOCftBfIeIoFJJYEkaEQE4Wv8JOiGbXi+SZCkHLQTZm/2 ZeliYSA8Zm9vQGJtYS5kPoi4BBMBAgAiBQJZEKv+AhsvBgsJCAcDAgYVCAIJCgsE FgIDAQIeAQIXgAAKCRC2Bzw4kirJYDPhBACbjasupevAxy8eLJ1nsQBfvkv6e4pl K6VUjq3tjl2E0SZ9woZBsYdH2hnW8s7z5fS3Dk1Pw+tSm+mPt9vy24T49Mv8NZtC APiIE27eHugbla5TKzFSigN/hkjivXG7bxSAIfit7DN6KPQWVE9pfgpIwosc9U20 MfPRq8+5VGL5QJ0B2ARZEKv+AQQAnfzUGtWRz6JaBiLof/3eNXspSep28UPq4Yrb ENCRdz54swX1BapJCEZZFdFzu3dBWvFeGJLCGziZd09yFLbXHFM8K4wx2yIQDXKC 0OjowLoQT8YEZQvqKEmX8RyqhV5qyhwDf3ghyqbm71qXj1LaAM9RIts2UAOS8bUW 3uviwNsAEQEAAQAD/0zFurCbjfKvOz32IrNnw16LzgGcTVZqoa4eUtv17mpa0j50 q5+oIztBLDM9CBdWGU0/M3GPh4HA3FqtIYvNWfQnN6QtyzaM0fyHcpbrha7j9jK/ 3JqoEzP9oaPVwOWAjXPs81PsiqyHzFL0ZA8wvKw9xhDH9Lo/YhNWaGV+tG4ZAgDD PGbxIIa10ZGaH9mvd7urFbVB/WwzUUecnU9pw5/F+yP8dE5Yjn7Av3MJIEa8Qtwn gKeoRvxaKhD9JrbRtBY3AgDPKKHYE4WBVzUKDA0ctQ/RGS0SbNzyf4YdtHfrgLG0 KTp4Jh1PRUhsMkBF/rfsFIr9PpApvBzAFWB2Hx4yt1h9Af4pbG8nlGP/H2V8rY1U 8MYMGI7l1FMrWd6Xz0gmhbCuNzFBKqCPLNIWqE7LMU3BbC7cfbozXujQKX/2eawe j3E0nbOJAT0EGAECAAkFAlkQq/4CGy4AqAkQtgc8OJIqyWCdIAQZAQIABgUCWRCr /gAKCRCW6kaJ32540A7AA/9VzXQmMzf26FWTaLHSf1uqBwIY29/PRGrfJvj5yu63 Sw0+agLEkorkD9IKsxVcnWpCI17Xw3hNzSus5euqcdujcy5An0+eEEjxXw13GMn0 zyVJbmBUngTdkHZuY3jTTj92GSv8jo+GZW+uWp7ZDPqpTZoWeH5d1qPq9Hd3LleT p801BACH/NIHLPFAUELnrwTeIZhG8Pa5teqWtYulZtJsWxIyRszLmjvciaTraImE v00K8SAqtMX8+sA7IGBw9TUSmNFCNvhSQZdYGcyfJsN5/X0o5a/R/OTzfrVK/YU9 0fEDu4pTpOe6pmiTUr0dgtKX02MpwfNcKsp2scC5F93LwYQkWQ== =upUO -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-multiple-uid-colon.asc000066400000000000000000000072001431057335600250030ustar00rootroot00000000000000pub rsa1024 2017-05-19 [SC] 9C166D780BBEE4D5862201CA55B91D3471271F1A uid [ultimate] End Col: uid [ultimate] No Col uid [ultimate] Center:Col sub rsa1024 2017-05-19 [E] sub rsa1024 2017-05-19 [E] -----BEGIN PGP PRIVATE KEY BLOCK----- lQHYBFkeuyYBBADZEOrS+p9njje80Bf0OBCfx+eES2C7Kb+4BMnaB/AkDvP5iees Na2VGFRpIuLGrPaKUyqSc4dJ4u7hh3Aq8dAwD+nmhx8s3exsIWN9s1aSm+4f/0tW qOtQAiINAHOd7sKOUTQ+at4E70bKdYgHN9jvoVcnV3FMfDGydreKPUg6/QARAQAB AAP9H+jS6cFKYKdGqKeF9fKt+EcjUM6MlvGsC4m3Vf7CaGftqVqCp6KxH1CsdqjY Ydt4V1z4I6pUZ4yy5Y2K9Dfdt4WzN4HO0Rpsmt8rkkv7w5g84fbhMzHLGdkucgSB VgKfkzel0xwiZaeQY0oGjetF0zxVdlfEzrdbiVZMd1ULbQMCAOX4dYhixNE8Apdv fv11pbTugSt44l0zqEiyvBuqdCrpBm1Odik1Q0rTBfiBDaglXhWn6FOQl+UHc5aL R4quZJMCAPGiixe2x6rSrrG97RHOvltZdtM04TlMrTQ4mmpipKYWMvtmROqHdDL1 DbSmtufIDQxrzS23SMvgma1Jws0rrC8CAOLdsI+ypa29hQPm5t2eciudq/vV0ESc kQCim0+feMjMEccxc5t+JDFbcz30gfe/taC+LQXAPnlFaWQ//jF321iolLQPTm8g Q29sIDxub0Bjb2w+iM4EEwEIADgWIQScFm14C77k1YYiAcpVuR00cScfGgUCWR67 JgIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBVuR00cScfGorHA/oCA5ze vnlY/MSx9u8nSjdY4ThtHPaJ37PS6pE0XYUsNHEpYyF6/brT4py0dc7dPvrKs+SS S1I0IzMshvbMAxw0Y1SToJM498UcTpAGwZIRpzc5OPphb/97waw2UzfpCvdznAvD t4hVh2lbAGL0X/JUDXGuYUf4d7omotDAdpPpqLQXQ2VudGVyOkNvbCA8Y2VudGVy QGNvbD6IzgQTAQgAOBYhBJwWbXgLvuTVhiIBylW5HTRxJx8aBQJZHrtZAhsDBQsJ CAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEFW5HTRxJx8aeasD/jvK/AJouvfUUOqt +RrXVfarGKsIaraQm/rejmiclOu431HvaygzvqU1BG6iy7JrU4Yzwp0PmHCWsglV FpC6gS88MMy7dBESCwa/UjRpS5cKNlidnwWTaXCzz3vErs7e20pPbGwYHyK+H9+E cDIeqfIPUVVgj6CMsu94wy8KoMCCtBJFbmQgQ29sOiA8ZW5kQGNvbD6IzgQTAQgA OBYhBJwWbXgLvuTVhiIBylW5HTRxJx8aBQJZHrtwAhsDBQsJCAcCBhUICQoLAgQW AgMBAh4BAheAAAoJEFW5HTRxJx8ar3MD/1ybk1Lm8KT8mz8Ku/h7WxE8aDoKNtMP mCz5r/KWz2pOfQMQpWvvuOz/b9uUXjK43qMPeEY39ICag/1KAx7+YfQlZdEDsm+N EwX1K0rS8G9COIVma6fqUtzJdu+qbKL+UkRz1CS6xPe8Ucs046uMf3KcRufumaqn 2R+2RlMzcWQwnQHYBFkeuyYBBAC6tXwbhR3Dr8oP2eFQr/2x3HXy68I5rMJn+5gs 2mNkOyzKAZ0pGYdPj7jIb0Z99OFIYTYve039jUS1bzJ0/oeJmZKkYshopWAvt+70 1hNxv9sSivPI0Rm2TvW7q6bUe26qqRfna7wMYv7dTHNsMwrKXOW3xJ7GmWe4pN0l Iq3kfwARAQABAAP6AmfKKd9E1eY9jTIPvrwLDFqRw8fDyyhtohdSC5SOCUGLPy2s JQETht6MJpDrGz5SFLOj62gERjWmt/ZZyRC/wEFtKS3Nt45zYLaur1aBn2Rrj9Hy hlOh1jxDnxR2bCzKiw/gQw40mYV0+Q/zi/PCGKSoMOXOol2q7uxe191aslkCAMnO bsneItnnVpX0pqXYXxFVMYbCqTb7fNdTYHk1CrKZIo/H88tmgngagGocxHmkWwlg GgfoLfyDILfLylcYnfUCAOzZJgtAkykUPN3W7RtsUqS7xnvZuCn8gjREQrawQXua p5r7lRbJcXFCzZh6DrgSU89gwtQzj+5C6TEn7BFznCMB/3DrXQAL501q7wu4MO0Z rmDvPe4BvslM+OWwaLtigKt0nSNOczYjFtTT/WnYUEAotandAci3VvSU32c+pK7t 0xGjQoi2BBgBCAAgFiEEnBZteAu+5NWGIgHKVbkdNHEnHxoFAlkeuyYCGwwACgkQ VbkdNHEnHxpmiAP/XiSeHdhSQh3FOtm6u/Gvv7V37UQIJFT4q3j8rJKK6YkenFOc 2G91Y3lhb1GusBzl1ZtVKR1q/e59ytfJo0GVu3ZRZha7WaHelX9H/evfiaw5dy6D k+BoBoXaDd+Glai6NQymIGnJrpKi0ftC62rZO/qeHlMmHi7hHs4QVyvDeDOdAdgE WR67JgEEALq1fBuFHcOvyg/Z4VCv/bHcdfLrwjmswmf7mCzaY2Q7LMoBnSkZh0+P uMhvRn304UhhNi97Tf2NRLVvMnT+h4mZkqRiyGilYC+37vTWE3G/2xKK88jRGbZO 9burptR7bqqpF+drvAxi/t1Mc2wzCspc5bfEnsaZZ7ik3SUireR/ABEBAAEAA/oC Z8op30TV5j2NMg++vAsMWpHDx8PLKG2iF1ILlI4JQYs/LawlAROG3owmkOsbPlIU s6PraARGNaa39lnJEL/AQW0pLc23jnNgtq6vVoGfZGuP0fKGU6HWPEOfFHZsLMqL D+BDDjSZhXT5D/OL88IYpKgw5c6iXaru7F7X3VqyWQIAyc5uyd4i2edWlfSmpdhf EVUxhsKpNvt811NgeTUKspkij8fzy2aCeBqAahzEeaRbCWAaB+gt/IMgt8vKVxid 9QIA7NkmC0CTKRQ83dbtG2xSpLvGe9m4KfyCNERCtrBBe5qnmvuVFslxcULNmHoO uBJTz2DC1DOP7kLpMSfsEXOcIwH/cOtdAAvnTWrvC7gw7RmuYO897gG+yUz45bBo u2KAq3SdI05zNiMW1NP9adhQQCi1qd0ByLdW9JTfZz6kru3TEaNCiLYEGAEIACAW IQScFm14C77k1YYiAcpVuR00cScfGgUCWR67JgIbDAAKCRBVuR00cScfGmaIA/9e JJ4d2FJCHcU62bq78a+/tXftRAgkVPirePyskorpiR6cU5zYb3VjeWFvUa6wHOXV m1UpHWr97n3K18mjQZW7dlFmFrtZod6Vf0f969+JrDl3LoOT4GgGhdoN34aVqLo1 DKYgacmukqLR+0Lratk7+p4eUyYeLuEezhBXK8N4Mw== =ZNsB -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-no-pw-1.asc000066400000000000000000000042101431057335600224550ustar00rootroot00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQHYBFg/7IEBBADPdSr8W7SJa2mbWQwhbYiiAXHkdmmOSpp8HTWXVa5p3cPKLcH+ oD5N/yvYWYU5ZW6UcmOgO3aS69oOP7rkzC7DN9lkZd8UbBxo6B8X8sN53Nxw3Kce 8t5NiTf3H9GuC9fgxPNsibd31KklMHqW+vmA24PsS7Js3XsA5n/QZ5buWwARAQAB AAP8DnLLlp3Qb2MCt5C2bpGRWtnHk9tyCI3w6m9NBIgxcyrAcGagGdq73B9xxJ9K JFrdyQrvyKtmMQn/ZXn8yziJPRad12X3//rj6XChGf8aY7X036UTXkKSekjboymh KTNQiH/mqLg1A64lT0lXURt6X4udbuQdI9Kg2ayZR8jfZhkCAOIyzjqpBQCH0pKo ggoEcHwTWxyERPzD0D0+jk1k3Lv2HpNVr0+o9fyeGUAyxhXbPiIxkvM6/2To4HwA cqAk8RcCAOrKRpxRAOslqnnjsiWZBSIo2REzLDA0pxmmXLE0ESskHraNYg4xXL4h qbGUKaeoQI5N2jPzvSCp0Nc3KSktD10CALYofTskvQqX3CcoahiwB1pDktZeBvcZ Ik0k0K5JXQYaTtWnzuGvNNu6Psu/JSU8Q1JkbcJUNX94QCpKuTWOQ7qWrbQZVGVz dCBLZXkgPHRlc3RAdGVzdC50ZXN0Poi4BBMBAgAiBQJYP+yBAhsDBgsJCAcDAgYV CAIJCgsEFgIDAQIeAQIXgAAKCRADQJT7j9SV+7mlA/4wUKZSuz1D5cJxGk7XEs1m 2/AN6BfscdiWsCnxe/+byfbVMTWy+s7Q1HrY5eL85E7Euel3vb9kPb8GK5WK22w9 a6n5Ar1112DROtUNqS9oKiVeZFeFIrPJfhiFpfUXaFvKHMF2Ujnw64iwaMx8OwyE CyFF/vN2IsTAH6K/O72Cl7QZQW5vdGhlciBUZXN0IDxzZWNvbmRAdWlkPoi4BBMB AgAiBQJYP+46AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRADQJT7j9SV +0GJA/9u73sgQCtN6bWrYVWSzhiPLt0rUjN9rUJXsl5RL1qehN14FFSjRP1WjIjf WpRu5bAv92ZIonz1Rm/DC6aoN9FHmevo0w4x5zmueuT2SOe+pr5OW+PRxAb7TURV hagGR2VgPsO63/5mMI6odBUc5GkqDN21YPCsPKJaBaFzc8DM+J0B2ARYP+yBAQQA xFhAuUVYPVGRNX7m5gjgBYXx/qtNAmdyCv0ivFxAWoqcXuy4LjGFpCKTUDHyXOpv 3czfIW7VVh4w3xoXD9OFg2ySU5Lt51/i2PYZsa2RNbogUjwD0VCzqIwXATzpeaA3 CwDD+0zpXHhrTJv4FihrYiPnhBjGhg4F6PxtJQyYZYMAEQEAAQAD/RRHKxQXYdgf Yvhb7Vvnob9gSJBtP6xWY7RX1W0PuAPB2gmBuDnpGmzLt1wqdGX9PmVxYcARss3M m26HQsd7KIgub8bi9iVo2/Vr+XRyAziK4BtkdX6qVLbpYYM28ZVbMmG3WqehS/Ot +dtg3y23ZPvcwoZBT+StiZdpQGtram9BAgDdkBqg1NRqeBTKKO8j52HE3xoTXSbA /lduSDXdVfdEBA2X0SJAD+y0z/PvsYj01MZy7JRuAEeqlcM3P9y/6TfDAgDi3Lp1 gpphjk8ANCSwEMwH1rh8u/Sa46ir3v9mR0Rgtb6nZedeJS0zGwCE/rlH1aXuk/vB 6n8pY75obJclcv9BAgDPa+bOYX329PTfUY86ey+z5FLFDHVMHRFGt+ibXba3FKy7 7NJCfNxIbCJBzW6VX77HnEJIj6D3DiOawkZTKfswqLaInwQYAQIACQUCWD/sgQIb DAAKCRADQJT7j9SV+4qiA/4oxuDaJedabMe3C/S1i4YTct6wfIA1K3uzS765439j lzl684Kmj6ufSx8CNEPndkIdgIwIzIDq6TewkT+pS/RnSqVptlORd/HrBcbjD1A5 jclhOf4okfiFWCOu2T0K8AERo5TI5U52N+Obexan0vG06hNl1zcVymXs8O8pcvIr QQ== =p3BI -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-no-pw-2.asc000066400000000000000000000035731431057335600224710ustar00rootroot00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQHYBFhAJUwBBACgTyIFbzX0mNDO8JQe/Zl9ZH6r+L1/EtBvu3ULqlzQ6aopJlDy ibxfpZ1B2RAv+TjriDSdv9TxLdXmWlaq3qbG1q/DcS1iXKRTk3TBZI40gVZi3JFJ e1D4kIKV/rl3z6PuhVUn4zFkNkX7ZL53JSkdiDdU+7bDHuClLxBsbmRMuwARAQAB AAP8C2a1X7eSGcxIhX88uZuFsBJWo/pz17bJ1jh50ZOTOFR2Aqkz9pvvJspLjeRX L2JFNxMf0txS07hTzyc7pLljGQJY+UdboLtmXMZaQUVqBqXPzup01YPm4pqWPyTR +XjU+iROt0G8nupSYDd3ozyuM4n6LtjiRpDBPiZHjmgpWvkCAMogNy+BfD0fvv8J Z1NDZKupes6GFAGvWEX0Ea1S7NUkE5DIR1oqc17I9kr+/SVDwearQkTULnNRrDhL jD7NOw8CAMsJm/JPyWV8VQxtIUtipTkB8YrKIC3ekFZfoG9v+Ua1hG9CCjKVbqzo CXK7iczY/O66/NndZKpAN4xl0d3EQ5UCAKwiyAE0tqmjjS7brUOP8r8Dh2ND4GMU oQbrFeVanxbH8yH8x+ZwRLs1g8NTkjxR7fJqrPG8CV4nbdiEVrQvdOSiD7QqVGVz dCBLZXkgdy9vIFBhc3NwaHJhc2UgPHRlc3RAZXhhbXBsZS5jb20+iLgEEwECACIF AlhAJUwCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJENiMrIUqxuEPZisD /RXmvebrYuQ7rxx4YI+Lf9u71Ilxj2n2lLEbybKDUKURx+BOL8ETgMz3VAmjOMru xkG3UhVcFohzBZTC3/ixunhX6SYa9YI8VHgN1oWBzu1r8wraQdbGoxe/zX5kCkl5 2nC0PetY7fW/+ZG4xLVQIIfz3jq8F0JeSj+oZ6iP2kI5nQHYBFhAJUwBBADID0GX S12vcyB/xmtlCaSQixTp0SNo6FX45Q/u/f7PECJC42tByBP49lBSw/ahOeIfej1D 3u36lG/ekRcXdljtUPwJY+kHu4cjK0gx2LR5rgq+kC7djBp47IV/o/aW1E5z3swu LOmShyQ2Mk2hXWcx50mjIvTcy9u+ve9oxZ6S4QARAQABAAP+KUfUnfZkL3bPBu6X bHLP7S91skWAS/5c9w20+viYInvOxgSNNjalwGJ68okTE/OQsDQV/jI64tDMQJ2p qSK3eGsotDDS3ej6e8NOBUPuGkqkD3KPv4NryPqo8dsIlIgnjobxE0h3MGL2BuN0 36SOdpo5HIGkRK9P/2hN1BnkfY0CANz+qKbaxmF2xfdyBAHRguMO2O965fyfJeHA GK8Zs2C9DKRXBVNvS6QJIY4EMlwDk2EE3byHKg92qQHg305kZQ8CAOe/rRN5KXut awt6/3qhWJMraVEiLiJvaM3QzsEFthk1xARrAinxctKNcaOg96Ofkd2jqCz/Ozcg 8IyJRqoe6Q8B/3MAJntk09cU53o3wABwZszEsxL8xoOfu5Lvoq5pl94LAOoLzUdJ YcT/3hzSc087YtLQQQwcas1bfgiAuqmZWFeiy4ifBBgBAgAJBQJYQCVMAhsMAAoJ ENiMrIUqxuEPj2MD/1A+0NYN91Ll+VZTTQLI8ldOX3uqqgDbrWPapOVuhebqjSTN bw8h3rUzUDpAbDEs2+R/+EccV1XfIY5dhb5ZXQj0BocPeX6MguHtlRSJnv6FxsY3 vcQpyIYaUUHbVoN5GUyDSO/LHgchAlqxOzMOXVu6ufsUGIr9kx0S54IaYw6I =4Y7y -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-subkeys.asc000066400000000000000000000114271431057335600227540ustar00rootroot00000000000000pub rsa2048 2018-02-13 [SC] D6951AD1A148A16C1B1FFACABA64A52A51061371 uid [ultimate] foobar sub rsa2048 2018-02-13 [E] sub rsa2048 2018-02-13 [S] -----BEGIN PGP PRIVATE KEY BLOCK----- lQEVBFqCw8UBCAC3C8hxnZCfQlIGWIu/V2OaJlbVXY21FsQqpmqzAPBiG5Ewwqv5 o29GpmiupC0ucxu5YduJ2dNfynxWROQZs4GauHcEGl9DcUQoEOig5Ealy6SDSwck MlE4P8eMrwolye1hleIKt6MKtov2ES566GX2Ronh5eUQipZTHZkL9gouDPF0r8QZ ushm/k905Ip7J0bSSUxvR7w0HbRa6fmkWl2tp4jLp1KXBuuHOWvcl+cTc0Um2Z/A go2L7ndeyR0qWdh+tRsguJ5ptAe9GCTx/SnGHlBMechBdJu7DWxLfMMF8ZU5dlXJ mECnoY5war2PanqRx7sEDw3H3txN9fQSEZTzABEBAAH/AGUAR05VAbQQZm9vYmFy IDxmb29AYmFyPokBTgQTAQgAOBYhBNaVGtGhSKFsGx/6yrpkpSpRBhNxBQJagsPF AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJELpkpSpRBhNxzbUH/jJuM8KG AOLF/4MQrAtoSrcFuCVv8Z5xZX3z/vQ0wr6YQivv4T4mC3wbNw6TPR6wBx0+ztir AWGiCXpt+Hb3OLrfK9aBF+opk+k0JIZkD59wxAWqGI/ZiurDQYvqYcp+c2rB/q+V M+joGnWkuy2W9Kfk4b7vMhUjIiqP2EUO8TgMNhgsmbF7yrbStAmHvk+P1eHQCrJI IJmCb7PDBVxFQuRs9XHsf5z4dBjXHVNlr3HECnAOirnAp2oNj/PWdUyirOcT77Ph ffME+txSPJ6ndjGgRxrPWxIh2uCYoA4aJ6pj0igMAY0ci5rGDtKQodvMJ9MXetnX pGj5s+P5ejkTfSidA5gEWoLDxQEIANpgAr2s9TWLpUYwpKyk4EbotPb1vVFw7Ya8 yvyspvyKNn0B9lX97pWL6oDmPTj7Fi/jeGt9LXWVTvALJsTwrFnUKg3gSxong5Ke ndDPWpntLK1PfHP0RN+zhEpQKOIIBHOpBM21sZiwdAKc9hcJXcmh2KowETlFXNEu k1NHDXDjsUQPYc0qQnZskL8q5YHoXGnwHnPIhonOrRa1mKeWdfm2W0dX4Ij0F0u3 f3LSc6CycLwkcmCg1tdVdqd89G5NeUn0EYdDTox5fSv3wmos70UUqkrrGcckNmc7 oRUA/JgX4MK4G+ykbosI9K0UT1puHAnZWWBTpgG2N5Xk3bhr+wUAEQEAAQAH/AiO 01dW7DPRVC8gVY5v1luRCmkp5OXIf4Ep7D6ODuvosrf1bWTzUvfzXW5Nwj/LFJSD MpiWdZidEFSMlf6z0TKirj8691aADpeetbVAMF8bPLFSDcuG2sggLeKyVNfUKUXV wtrDmxZ5G81vv0kp1HjEFKH0Hkit9N7nF15Kc4wP8xMhXYTlpV6v069kfpPr9eZO U6o7RDIXv6BZopToe0n6jP1dAEF2N2sD+vHqdol4pMpJ2cB8IUAvm0JOah7oVXW6 P77YaJXKbcq2HOfJFBtHOQDiZv0qFr6inWpZ3pRXLaFg+u7n19LAHcwTW5mlNvrP Vb3Adu+W8LG3q+LPcaEEAOqRK5vz6xgihgFfsSwjstxGe6Kf5HkNkE+7qYyMbz/q +W+s8JpHyf0K4V6oI8kY/XgHfGUQrXryr/8kOFTvmIGMpuqQx0+EtmbiA4ifsCNy D2Z56tb/0ATQ/Ufu/mKXgxiixAapkp3wO0djq1UlDyLaZ73BImDma9Mdpyp8WYDJ BADuVBZxZbTSg34hJKYmLBXBTLs5FtAstuRAtKmbni/dAF4Qymordk+XsDvml3EO A0lcwOLKQ4DCKXhNfdoG/hSFG0IKgz58mgSVD+tLC4LBFxlwD8oVTaaI5Z2qjbX1 QDtGqD+sJh6ZsNZ10JZ+tc4EHSv6vKSGp4viXFyjmqGiXQQA3smFCdV+0MRLoCmI XLmJu2XZ/ez/uce4oDTok13jbckhBXWm71pqUwtjwhKpTHJcTE4NWrGOhZjV+txj TNWpYx/kRBvbBg2WMYHCjHLy3wLPdRNe+wtlKgDbHIlPTQEZALkLtwtzQFybVbuE X3erXN14o86XOLOLm5AXj9y/4E1Gl4kBNgQYAQgAIBYhBNaVGtGhSKFsGx/6yrpk pSpRBhNxBQJagsPFAhsMAAoJELpkpSpRBhNxSb0H/2FeUlGrwoHLaGDnKBgv3kC9 435UgVXVTL3eFp6l3cYS5/LDIG2qnklsbbout4ZMEkPjvwZhMEkMSs17m2H39t5/ Wjpie8c/oJxg810JP+e5mvsBrWCL4tWuUaR9cKC1ZFd9g6Oj9Mm7tD8kVgwUojSE p7gpSv4fDkB0FeeJS0tCNiCgC0rhQMzmQf+nEGUDmZiYrc5WPLByD4qPatUeE+FT e9HRkEqQmXBYufbSR9/7XxFRIM9+4l4zspBIlN/LWDMzRvUIzcNbW+bF2uiw+qL4 lYFPi0npqPeo4pJeDyC2oZGq+JKoIHZMfQeqUEBGNAndSpAjtR5uwyE/BRmX5E2d A5gEWoLD8AEIAKZ/rtQbY/xq96p3JshNyj7ANRZhkBWHQcwK9muUReaq6rXh1m42 JD0mhnMDVolXxJ88SPfOfQEG6ecpLfZFkNIhC8qkTvJ7Kbwttu9dZFHJmwff8PY5 l+HLxSdnStJAkGM3fXAwqcWbIRlpT/fHKVx/bTVMMNcg8IOswmSctIpO1AqIM+6d yhbcgPlUvLPM+TMqOJdsyZcqZ7FReCPbCbuBFTaQUC6OgnXOG6NyUdig9TKTJnD6 sNs0qxJq+fvce3mUVY3aXOQs00W3E+1FnrvhZdM90NWUYDix2gMyNgcX0kCAxkLA il4GybiLfKwWj/LhFwIdcaCvsWPyYYVW5V8AEQEAAQAH/0dGnrmndiCvTBHaCyyx fHRrhO5tWqiUq/qk8MOyCFCMd4jgQpMQs2fIL8NZuPh3rbD7NkN7TnEbnBM8wjPM qQgDZJBd0XwldILd0RPcV59Znnf7CqTll9ruCBrrsZCbWhRXQ2g9NNhmpf9CYZzx UggKdt5bnQbjT4MW+Gro2LLiBivcTByIT5CKlm1pfdWv+qBDBKgrSy+OdI4pB6WD mNwYJVTJRZ/ZCst2IjQIBSXGLjftat2Xp4JzO+maCflsHimELylxrSJrb8AiqIOv QphdbN+c71v7Bd9dPUJsWYrl04S9xsO+eN+5LXIfYG+1aO5wxq9NpKbLexs1UYQ2 EmEEAMchWM3SNfd1xuz20pWHQevG8SH5QU8Cy8YZvONUElTt3HtaULFpRNuk1Aep PdDRygOM9yPk4mRADMtpiKuolVCZufIrtNrXYNXrR5qFzjS5zNKEcA02GblU+5nY xFU779mWEtEeh73xamNnn30kTnYZJg0Q+O/9l1D92mlyL9W/BADWDJuYmZDxUl45 rdvQuWrqrGVtJXaYYxJhCbGp6GCqsiQPoTut2lGbbIu1NxHg4TcXeitxsQEilLv4 TqUg1F2DZax+Wbik619FYjARxDZynuqvnM3WYAkgnpmSA3FQWva2SEyOaiW7MxCq fAm8Oa34jjr54bNT5SqeLSReGBMYYQP/VRhiZiSLVdFLSO2zhsWaSdf2+psTMQPd Zx477C4S5Gk5D9Jfps/F0yj8ngzh1/uWQFCJIfbZdDufDo4YUOUYyobNTxweDTP/ g5vu3aN5cLoJDa1vLatFUDTNLyP0vXbTp7S2Zhp6rmHPa3OeebNwaxQPlOVdmsHb ZwxU7sGKHftCeYkCbAQYAQgAIBYhBNaVGtGhSKFsGx/6yrpkpSpRBhNxBQJagsPw AhsCAUAJELpkpSpRBhNxwHQgBBkBCAAdFiEE0Ek4r7Lc0BWv15wSubkzjxmE++EF AlqCw/AACgkQubkzjxmE++HNdgf9EdihrcI3x+UFUmFPZ2FtAksvM2rSwglPzVyj zuGBfCUj/rq3EBRFqc3NFb5EIIKtNB55STw6rGaYJGq3EQ88JHs3WVF4U/TppBvC Vktgn/6Fx8CcMI657R6FGZipPrxW5clyp0Oh9QgJgB/WR3O0+CtVhQNR1r5z9+qT BrZxW2Ok2a0k/3pn1LoqyCtJfr4ohcilcV0pLiq29xYk2DSypoWIt4GsebN3BS8X g6GjSP1qSFC6TTlXgaGKErKHGMtibHy5bM1WosmclIiZixJ8d+LAJTHDIIQ4Ye7A 6JyZF5FqIkPtxRl9RyWWKUds8GlrNo1moWYnZ2tfQ4S5NjpK95D1CACIB1zKc6Ei NyBjYpeNbQ3obpTfbb2abaiaGNIlWiKtNVKFFWWi+zfZUMpKmftGWOpKT23wkgYC QcS37mIgKuu2na87vlQ+L1Wy8hHDKdQI8ukJI81pIjwaJh1rwE4xnyUpBdbXdllK A/zn0CRKZeWdqJt/Q7YvY3f2+lsCD1sm70o0TA9GEg1CPpRa7LQ/9bMmL32hEEL2 f3al1x1lCTGiQvbrpVBZzYQu52PrBpTaMv4BTr0rXuHN2qreO2McZJHeKIOe3CIG UEdSZ1X92E7HdV4PtUlqu9Pbd8g15bmicE7U/+C6krHR4F/v5Z7Lf6kCqFBV8oYA GLKBVtWUXI0h =u8x+ -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-utf8-2.asc000066400000000000000000000037411431057335600223140ustar00rootroot00000000000000pub 1024R/A10E045E 2017-09-13 uid Another UTF8 Ümläütß Test sub 1024R/CF7900DF 2017-09-13 -----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQHYBFm5UQwBBACs7Bjg4Gd4mw48Eeshc9wzBhe6RTPF11/5oyBl2I155HFuUAbn bQoNUjqHTe3N/OPVTglTlAx0AtD9/WHxZE8SdpQV0XY01arQvnCyyUdxP45z/7W8 aZomu+4hrzH0PeXikAyC5cambgLBGK/KEkJN6zIZZgxXJymsAeJ5J2GPjQARAQAB AAP7BDfnPHck9wt7S6pZPNHtfX4ozoW5J1qjb/zTgcCIZQCWZs1DedpOXDhVDq9v PW7tpOq4LgaGzj6yV/vaK5AZoKyje3E6q9au1AVvRljRooUyi42rTwiez9gsQf5E 9VYw5QvLbxJgu1F+RxRc3hfbwvdq2LJ6jlE8Pp5Q9FbzCUECAMS5oC+I2e7fOBaQ pW9XQ3cKljhNepQuXTGCj1fOnRNgC9l+g2YOuVlUqWOqeKIn0mEVfCyZxAfuGnaS Ke9nMUECAOEGcN//W7m7wFMfIunGAvoF98PTlqvacHk6/LM6QF1JEsUMmStIsBO+ dCgowLqLepcSY0l/5dHsIT8pnUFI/00B/i9C8kd6bEftalVJiZTYr5mmOzD/r70o FuokW8wGqyZ4ICpzfMCT1a/xttbxmsdTjQvEaWl5xbw7OhhY6mVhOdWd3LQdQW5v dGhlciBVVEY4IMOcbWzDpMO8dMOfIFRlc3SIuAQTAQIAIgUCWblRDAIbAwYLCQgH AwIGFQgCCQoLBBYCAwECHgECF4AACgkQoGLnRaEOBF7HBwP/W6owuGXCyjqmX27t qrNZUogfr8YorN+GmKMkgQRIW0R1XcnVOopaf4/k0o4BVDFEy8gIITOZUBexr76+ R1GQZjAuPGfDw2Ksj+9E68gbHW3YBP2CkAlkH+D42QnrXn7XMNMVWhgY8p6LPuQv Eear4wgZpNCRP0e5YgXQu8b2XSadAdgEWblRDAEEANjd1GnZ78s5Mo9+WdyARYf6 dPG1XR6z0EbO2JsjlJxfmPl3qTs/dwUAMoNaff3HszWa8fLO293vUOLQfbTzKGmG MrFxBGEbgZo39geaTsbXa+UEtsf7XzKtVGfej2lkq1gz8B6FZQIHe2fUHNXeDhBT CcwY2/TZpBPsLcZj2DxrABEBAAEAA/wObqM3/b2I9bmyqPYllKryUK2lqqv5/H3Y 27BSKr0CGkgqgFchaHWgPiu4Abauw+WrCv1QN/BgrBBJXklvWFtENk008AOlKIEu R7XJp+HBSIEFtSwti3GdjfGG3rqPREoPf650yxaGKtrwI4/wnRgxb3g9IOtui1at jfHkh1148QIA3dOzoSrsj2rGd4qu6fCwwnWud2007miyrKxBIkt6oblTpGO2+wVx dqQ/PS2r6jhPbnFmYxZa54oKpGQifrvlaQIA+kaAOR4AwNNutKoMXgnwzlTm6ZbA 9kLmWT+6n9266uwREQk/gDk+hUtj5BGhzCfT0CcZ11BDRpyqkOXGbcG0swIA3YJa TvfQsxBg9ymksQKCqLEKC9a4kAdveeaEuuRoKRDWezOvKbau7ViPHMDeBFtfB/0r Z3uWcrfr12M76v9zT6V7iJ8EGAECAAkFAlm5UQwCGwwACgkQoGLnRaEOBF7XTwP+ Ira2MPQRcsBSjzw8Q2RQOetvoKf0o2qRiC8iYIto/KnJxf/3SX1PHidP8W9YJaZv oiW3EwK0O8VJJxT9KEXnOPbxuoIUeNhaKAGNusdp8nXB/DxV+ibneCOkUOzc2SIJ qJhNsYrtU98aNephx9qGiwxBiBnuPB9Nju6a48Lbgkw= =XPCl -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/seckey-utf8.asc000066400000000000000000000037641431057335600221620ustar00rootroot00000000000000pub 1024R/E21E1C46 2017-09-13 uid Test With Ümläütß sub 1024R/67F0E6F8 2017-09-13 -----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQHYBFm5UKIBBADLvlkXlqVvgkkVsPEXO172kUeYKzV3RtszIunxvNXMXZY6yXkz 6IqWJsOfGjZ5hWqlf5i/7DRYnuUQZt8UBRnrfazqPD82pPcDOVjjDIES+HeyTpCM 2+5Olsqin7ZabIvR6vBt7fVJLheUjkMDVt2ngs71v2mWrDPJQ/vZb7aZ1wARAQAB AAP+LFu+cOzLCvqOJ+tUqi6yb7NUp5QsuVHTcpA05/0pfSuZBCaOPVdxKNy6tX6T AqUiAXNE0fA+u1ao34fOJMExkZjbB0hYi7Z5FbaP3EORb04SlTIInWB6LqgrFki+ EjF+D4c9gR+//6ujzCFpAZaddeN0+0QjBzNXJxhuWxLeizECAN8Cn537Pl1ip5wl EyCZq9AWUeq7nOMbaRRGraekXmFtgneynsFg3Qx7ydliNuj54RTuhMewh720+bGl yweL0JECAOniGK4TPUYVxHZW6whWe1eIcIkLzfGsSu+9Wl6AZf8cY+XxDrW23ylX i8gVCR1XCDIY+vRczjEPt6wApSX6d+cCALxx4jhuCVyLNTbsvw/zgaOY1N6wD/Va InlnTNLHEOAiJmIokeKdW8OnF72tDmGBV4Dam28fXmPZgcm/Zw5wZb2cTrQmVGVz dCBXaXRoIMOcbWzDpMO8dMOfIDxob3BlZnVsbHlAdXRmOD6IuAQTAQIAIgUCWblQ ogIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQpxCaRuIeHEYbbAQAwIrq xYOBELbJvp8RA4ffOpTuQAan5W7+AzBdudjeRucVE+qKLlVdzYTsDOuRr1ziejnx WtFMBHhnJgP2L6jUdcL5E/vbuG4LgUijF13AtJVyuS0AJYYXBycXiz/FAKexfPFs 38i2bToR6lZPi26zQXtH2Xze7f6vKSB5Rkcv4/edAdcEWblQogEEALnhExF6Ax9t rmdeWZNo4QKpAsF4oyRTbWmCiV9JbCreUprFp05oW3YYNQ/whqQmNUWm4IkU51F6 x1Rt150LGIMYE5ZlJgCMGvdE43fevWS/TaWa6oXB3MjCjQkOtL5AINBDw/aCUwZA oZPuwAmnaz7YORA1tMSNkexnkwxkocCXABEBAAEAA/YkqsGYMPlsubYtre79pTK9 05k3kRSdldd/eMCgi1tLGZAx98uJLAzevue4vTnSJ7dahhDE+dqnuBCaFxDxab7r xvF+rSEWkW5JBF4wA1D0WCOcVpz4UjMRv8ZqTtJyEevl/FNgHaNccPEuVVCVEEGx bEx6Ae7nQWogkU3TK7a9AgDIESCBz5/zFx8DFC5TqTtIk+bkrD+/0AcUrMA6iV56 o36MJcibovQiWl7q1WJfzRqr5eGo/0tBINCdaSvaazNTAgDt2IcGMY04miIGvIHo 137UCIwiGTmrAyxlKPTDwisXRbeS/zNEZq7dX+8vBvZ4l8V68NbRmgtaCcg8klfL 6vktAf4wNduozIHE2m6wA/lGRkQolLK7zHpxQgTGkfZiVO3/Gzu3OZyrq9mx6h0t 6TdS1olRCBTkmP1YZsj40BHtYVjYo6eInwQYAQIACQUCWblQogIbDAAKCRCnEJpG 4h4cRo4XA/4wfE6lTboduvaG/rxF0pu3zQEz8VTOpH8Rnjctuva5//gjhvF3OR46 rLpVstt76VcW/VMRynZMjSkBvEzW2F3Ee7NWiNwJxM651Gff0ijOhsuUN7//WBk6 QCVRvKVOlHzov2f4RmCyrVvvKHVC9/kRBDCQFLNMWuhVcovZiAWSeQ== =l0q/ -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/fixtures/third_party.pgp.asc000066400000000000000000000116621431057335600231250ustar00rootroot00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lQVYBF7nGUgBDADFiVllwMWF78oxCmvNYM58+wh7I2XlDfga0T6wX6lsGipzW1z7 J9opvZBk67/R0RgnZAWuW7R/cIK5hilsbMBbJ5Bar3CkfrfEHYUIIyNwHGVR23k+ q1ODlBrKqTgUIVxA2mgMUOcmOK4OGzqtGcWbxwQPOVTq5xiOWEVz0V9P0BeRJgFx Wch+Nby+25C307HQSGku/okZDCHMVKp35x29jwT5slWR4SbpJoK4iCAZ+QB6TqRU TpgOLRf4rHhHAZFp96Ej/qwX6KHUUroC3wli4K8a6KdGn5noZaWT4Z1wzMxEMjH+ 3spVoERxDr9J7j75JuKjVqYejcx+4wZItCH9G01vJKLE3mwkMJK9H/m8kxwJSytd 0QrB4gbggw3HIVmsero36FXeUChrCVD7R+29YSWR+qELHdHpQHsDshkGM7OmbO5F M3DvralJY+MmUqDLEWhSXcvhjCzBS90PLWhiZpGqhQ4MBWGw7NzlhP5FdpIcClbQ M1AgdJjx6AKZ+wsAEQEAAQAL+gIn77eNfsc2XBgXiFN7bei6TeTkklBvy+Ukouqg GKrLFertZ9qyT1srEpmvYwgVhqepzumqXl8RUADALWqQ1oA7ZdCl+PSqqpnNReFW KAuP6JRkpCWiQnnKRe9i7aKpz8AOqJndz8mm6IUGsg5anI5vNSTVy0H6SyME/p93 FqaGqGmXc+bHUPz9Qo9r7EZW9qosNPQXQVE3Ky7ePuZ3hmd5WXFApSNy+ChAsqbB J/+9X052b9+45EfFutNZgPSRchgMHViRphLQIg3hvqiReSOrRRy3RKPGzFYgJ7Xa Fjb4CWy1eVjr4Pn6L+Te6HIV1VdsRcR+s5GpB4xGQU7S8wiA4M62RaTFSCm3K8Yn zvhzV/Vw9JogsAN+ud3f0Ys7f+Rlk2IhUUp8PECUX12PsG5ydwUxVAp7p3elTDbi tGPq97cIrlZiQOZiF/Q0MuqDtdW3YfLtISdNhphdCoNTIjPpQqJFDVDEADB94v1x 7FROQCBMPXoDT3T/0Wgj0LNwzQYA1tn2D9xgT8/+t+6p3ZzZv3z7hl9Pe5wqvPJn B6hznTJykGmVFFUJZPqCcd6b/PW3dKwQ6Xm8hgoMdwDu+gpMM76w+wZPp82jTdqA PPuMF/NW5udUbis0szfAHHZoSU6ovihDjVL72NYDDrw9uKNbr62Dt6b45FDg37CH Pbhb2f1DffDBDaPT714gn+tC4ieGQYzZlB0wtuET0wJxhTj4YprivI5hGVfoXHzI GovwP6GOj/+7scM2uQJeuGfkzAolBgDrXnL3k3tlGd2e8z28fgXbbpaPbPpeBZOz s93g7/NfDg8jFqYmww2Laba9A1wZumzxGEuHO3r8MCTGo241+/Nmr9pWK5UhGcFu CM6igZQGEq+PE57cSiEmM0FcjWjPg5/A4aCb8gCVTe7P/6WpaOmd3J9c3krGB0KH hFXFJURpdoZYzUkAhT2ApysS/p0ThX1OR8zMZZVknlJE2QzsrjWTQqFj9y6R7wUg A+WlrQMPnBkA1WWGBDSi3XxFTZFGsW8GAMMxiMXTCDdq1RMu6YtpJFyGjhOwP3k6 GuRCSwekFAw69nxlQw1AvDKlLqPHo//hHeXyAVRb2pgeg/vCDDPrmmOapelV+B4L RKWPALYmOzE+TQxvAUltklOC6kLckXlrrBgCxvZzBqAwGodCCgWWO9ZsYWeqsaND 5d77zIEW9vo3RL9cVlpAIM4wahE2H6JUXEMRg4spaPhr3f/Mg80X3ag59a9RnuXa I0q1+g2Y+8MPc/exReYFwl8u2m1ls/JvfOL6tAt0aGlyZEBwYXJ0eYkBzgQTAQoA OAIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBN80+DWy2rhUEvwbYO6/BKR0 IlePBQJe5xlqAAoJEO6/BKR0IleP6SoMAIs+WCKKrthZLrQUN1kQ7AmUV9QQvcBz C0ylZd6/ng8fkmsu9Xu8nSzGX3OnZfARzBGRUtDg85QtyvZFx8+Hkq1fYbsnNAPG 6s1ETc7uf07dXnX1xXyaoChkYoOWknW+kW8jFnsEfJ3EfndKuCaAdRsuq/72HpqK 1uM1Apq07svleAVfR45pWqJF9IP2AlHKG3pvmk0OH2/cjyLJNOzRSGSO91jn7bU+ o2UO6O7m/Ybi/XuFMYMVe/2Ikh3g8Kk1YfIayhjbZ03g7GoTqXv2NDW5fvJXrTpO /7JrcZ4cCGI3AFuJgB1LqQDPvxIrWPS1PcRVVvF0xLvJ9K78xu7Qg8M0slQHRRxm CRsF4s1wQlKr84P2jPN/R7Ve43UEZ28U+6zyi42HJ0CxtPpCmGpRYfGGfBL7ro6j kCkgttlFwASnXt6Kdmjg+ntvekA1hCjkFPvpN1ujsIvQNh9mQw2e53jqZmDD8dkU kotdB1wbktWU9BF4sD19Suptstxg7HKcYp0FWARe5xlIAQwAwLk1OBU2dQFvkoiT aTINg5zCXM2B48gZwPLmh+EvUmCD1yyvhQVxxcFQX7z93h65yhQ0nS3rbmQKwmAg CM5BoUV3O58GA+Thq3NOxEvy3TA3iAp7wIphHaTH2DTaiQ1jcekdKjXCY1zzK4vq k9u558oM9vbZmOfiHhtFq7jXxqGlYOLxD17F11u+ufjc+tU2jvLDNI9zOTwosTnQ NQ9OrWBhVpD8/HOYiUdOITxdzM5AZPdttJJjjB/g1R/rDJKMJ/GAJLZMLwCM3LtL q4a8TN7+qCbEs0XJvFdgb0phYGloBoEQJ0Tpiro9BKVgKu9AE2rbLWpUdTxGPqWT 9R4MWjpfoVc4BJMFYEfMFb7I+YvXMxj0VwFOrAfYgOjhjAeqmvYjN19OS0ghk1m6 90ikC3V7kqjaMzvCR1WaRQvG3/NzkxAolhZpyUw/2P3Top2ScPY2DeWHRBbg2JyI KuMEJnApZI/7slUDI/Vu9wCeucwbXHP/47qhXDfdvFV2f3Z3ABEBAAEAC/0Wk1t9 l1aKvEFSm/cQopFcsnc+IcCuaxlBNfL1RdaiQrYO9agV3/5k2PFOVbgzVcwTtOw4 4VEr3EI6ZMI75dVgS9/ctxMgT6ZzzA0VB4SKjoRixj+a3Vrk+xGB7ScQWOYmSNVm xWdg9llx53DyIxIS6eM85su0kq01M6KkrAFyviq+P7dXQpXQVWnxJQrVwzYh5qQh OxCXSsnFgO032fQwcRLV7iQEepIKurSXRhgCzsJSUX2jYmaQ2oce0B9bmKrn2kmi lU2O4Ib/uoVGPjAe+kt8Qfne7e5gMiDdKS7JBtoEI7qVl3s8XJOCNLSyTIXoxpzM tGreZymMgydpmrq1dEx1D6AsANcP/9S1leQk37qyGle6lrPkW8xwRozEKaAeOxM4 KnhlJBPYVBjdg36GenkD0eiZl85ibRyM6rVdrescPL6u6coheFk3zdGBrDWE/Zgl NwdwcUgnuRNJZJTOJKPtFxa/5MkTTpqMZ9CU4HgS5sZqtFfKhi5Exov0zHkGAMH0 Qne2nF/ewNWl/Uy0t5hqHvVRXMcIDsRhWCTSHSGb8TL7w9Yfye976sbN8gLOPHL4 VsO0bNSTFttlbW4XsOKaMH6DnoboTkj/E8K1/4x6zG+QJAKjrt5+4MfkMSWKJzuE 1Llh9pNZxcHFYTmedlSigaLHz0uoQEhcAb++lWZAA+MaHyFmWgCxG921u7h8mERD WQ3oKyJeEUPuuSGrtQqlFPhJpfYFFyb97dpu5aNlG+BvEos/1AJAgSCVHgDDEwYA /mApzj9GB0jQ/Nymi8oJVaOTnfoMn6axy0shW5Mty9Yh/lAFFBXsW7mS38OovwOP +Lso5mKnNVnsI5GmyRzSgfZ8yafXZOPeYNmFBhWRR1KdhtfADw6+er8P7gGNmKna vr10Zh+8xVqZ9nZmKKC9gSt+lD7uk6nIrrojcNF4BfrFamfItWWyo3m85yOir4x6 wGLLTKWrpaZAF1sK8Zx5qu8xCwlIdt4C/npkxFKZSQ3DyDiA2prueAMj0i3Dl4eN BgCPmqnDT493EYmgxqCEgKduhmhdOWvNilejHm+jQdvIimDLH3NVCugfLWgTE0nb eNRshS6JVFvttZjPrA8Zty/wGVKA7ceEJDreQXiSl/gSkoEVbwqRYXibj2AKxENo pOjIHiQX/cFxBe7O6jYWbDTzbqYl60cuvu4y6AWhhjIys6g3Oi0cR3duCtRQ2ItB KzUvp+hagKi4I/lenCIEZcD/PYC1lDDHXG3061AlFJIF+POluqnJBOx2o68tPsq6 S4Xk3okBtgQYAQoAIBYhBN80+DWy2rhUEvwbYO6/BKR0IlePBQJe5xlIAhsMAAoJ EO6/BKR0IlePsB4L/RmF0vSqsrhZFvGExW3X1gTKgsyxHUJX+rayTcIRXzzQ4WrZ ftTU6GQTMzp71OVtzPkrGCR9YmuSudsHG9qxpMmr4Cl36dto6Rs3dXUXTXRkaYHY Kcj9Tk2LzsR3a/YX6/Ba1QZilcRQBNkt1FGUz3k7Id5TWfOl/2PR/LlUB7szpqHh 42+/KHgcv852CTdiYQT5PPLq8uXG8t7hRpZtqX6dykJyXxI6shHuPAhWQQ37Z6uN mTTdX8x1VNqFzJdJCp/H73Nlizh6pk1Qwvg3xqOU2KLLaOAnO+ozCXfnubAzUfsu cA6D2rmKdQ01+NKBl0KRpz4JVq6DpunoT2tX4jjGLFhgZxFqkALuSNaM9w4m6luC izquhNa0ptrTOgNyWPkmq7CK76DqdHLTnuHVhTSsx2bWGDPquKWixLJR/0DcEJng biIVVx61IS7sIbmONUvEGGG/RxcrwGsgijiVhf6gf8eEGi0XsCfC0fwW1L6+xM6p CxFMI+4PaTXZKi+3fA== =WBVz -----END PGP PRIVATE KEY BLOCK----- gnome-keysign-1.3.0/tests/test_bluetooth.py000066400000000000000000000145471431057335600210710ustar00rootroot00000000000000import os import logging import select import socket from subprocess import check_call import tempfile import unittest import gi gi.require_version('Gtk', '3.0') from twisted.internet import threads from pytest_twisted import inlineCallbacks try: from keysign.bluetoothoffer import BluetoothOffer from keysign.bluetoothreceive import BluetoothReceive, BluetoothError HAVE_BT = True except ImportError: HAVE_BT = False from keysign.gpgmeh import get_public_key_data, openpgpkey_from_data from keysign.util import mac_generate log = logging.getLogger(__name__) thisdir = os.path.dirname(os.path.realpath(__file__)) parentdir = os.path.join(thisdir, "..") @unittest.skipUnless(HAVE_BT, "requires bluetooth module") def get_fixture_dir(fixture=""): dname = os.path.join(thisdir, "fixtures", fixture) return dname @unittest.skipUnless(HAVE_BT, "requires bluetooth module") def get_fixture_file(fixture): fname = os.path.join(get_fixture_dir(), fixture) return fname @unittest.skipUnless(HAVE_BT, "requires bluetooth module") def import_key_from_file(fixture, homedir): fname = get_fixture_file(fixture) original = open(fname, 'rb').read() gpgcmd = ["gpg", "--homedir={}".format(homedir)] # Now we import a single key check_call(gpgcmd + ["--import", fname]) return openpgpkey_from_data(original) @inlineCallbacks @unittest.skipUnless(HAVE_BT, "requires bluetooth module") def test_bt(): """This test requires two working Bluetooth devices""" # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) file_key_data = get_public_key_data(key.fingerprint) log.info("Running with key %r", key) hmac = mac_generate(key.fingerprint.encode('ascii'), file_key_data) # Start offering the key offer = BluetoothOffer(key) data = yield offer.allocate_code() if data is None: log.warning("No code allocated (%r), probably no Bluetooth adapter!", data) # getting the code from "BT=code;...." code = data.split("=", 1)[1] code = code.split(";", 1)[0] port = int(data.rsplit("=", 1)[1]) offer.start() receive = BluetoothReceive(port) msg_tuple = yield receive.find_key(code, hmac) log.debug("Receiving yielded: %r", msg_tuple) downloaded_key_data, success, _ = msg_tuple assert success, "No success :( %r" % msg_tuple log.info("Checking with key: %r", downloaded_key_data) assert downloaded_key_data.encode("utf-8") == file_key_data @inlineCallbacks @unittest.skipUnless(HAVE_BT, "requires bluetooth module") def test_bt_wrong_hmac(): """This test requires two working Bluetooth devices""" # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) log.info("Running with key %r", key) hmac = "wrong_hmac_eg_tampered_key" # Start offering the key offer = BluetoothOffer(key) data = yield offer.allocate_code() # getting the code from "BT=code;...." code = data.split("=", 1)[1] code = code.split(";", 1)[0] port = int(data.rsplit("=", 1)[1]) offer.start() receive = BluetoothReceive(port) msg_tuple = yield receive.find_key(code, hmac) downloaded_key_data, success, err = msg_tuple assert not success assert not isinstance(err, BluetoothError), "We expect a ValidationError or something else, anyway, than a Bluetooth error, because the transfer ought to have worked. How else do we distinguish a broken Bluetooth (won't work at all) from a tampered connection (may work next time)" @inlineCallbacks @unittest.skipUnless(HAVE_BT, "requires bluetooth module") def test_bt_wrong_mac(): """This test requires one working Bluetooth device""" receive = BluetoothReceive() msg_tuple = yield receive.find_key("01:23:45:67:89:AB", "hmac") downloaded_key_data, success, error = msg_tuple assert downloaded_key_data is None assert not success assert error.args[0] == "(112, 'Host is down')" @inlineCallbacks @unittest.skipUnless(HAVE_BT, "requires bluetooth module") def test_bt_corrupted_key(): """This test requires two working Bluetooth devices""" @inlineCallbacks def start(bo): success = False try: while not success: # server_socket.accept() is not stoppable. So with select we can call accept() # only when we are sure that there is already a waiting connection ready_to_read, ready_to_write, in_error = yield threads.deferToThread( select.select, [bo.server_socket], [], [], 0.5) if ready_to_read: # We are sure that a connection is available, so we can call # accept() without deferring it to a thread client_socket, address = bo.server_socket.accept() key_data = get_public_key_data(bo.key.fingerprint) kd_decoded = key_data.decode('utf-8') # We send only a part of the key. In this way we can simulate the case # where the connection has been lost half = len(kd_decoded)/2 kd_corrupted = kd_decoded[:half] yield threads.deferToThread(client_socket.sendall, kd_corrupted) client_socket.shutdown(socket.SHUT_RDWR) client_socket.close() success = True except Exception as e: log.error("An error occurred: %s" % e) # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) log.info("Running with key %r", key) file_key_data = get_public_key_data(key.fingerprint) hmac = mac_generate(key.fingerprint.encode('ascii'), file_key_data) # Start offering the key offer = BluetoothOffer(key) data = yield offer.allocate_code() # getting the code from "BT=code;...." code = data.split("=", 1)[1] code = code.split(";", 1)[0] port = int(data.rsplit("=", 1)[1]) start(offer) receive = BluetoothReceive(port) msg_tuple = yield receive.find_key(code, hmac) downloaded_key_data, result, error = msg_tuple assert not result assert isinstance(error, ValueError) gnome-keysign-1.3.0/tests/test_gpgmeh.py000066400000000000000000000542661431057335600203350ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 Tobias Mueller # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import logging import os, sys from subprocess import CalledProcessError, check_call import tempfile import unittest import gpg import pytest from keysign.gpgmeh import TempContext from keysign.gpgmeh import DirectoryContext from keysign.gpgmeh import UIDExport from keysign.gpgmeh import export_uids from keysign.gpgmeh import fingerprint_from_keydata from keysign.gpgmeh import import_signature from keysign.gpgmeh import openpgpkey_from_data from keysign.gpgmeh import get_usable_keys from keysign.gpgmeh import get_usable_secret_keys from keysign.gpgmeh import get_public_key_data from keysign.gpgmeh import sign_keydata_and_encrypt from keysign.gpgmeh import ImportNewCertificationError from keysign.gpgkey import to_valid_utf8_string log = logging.getLogger(__name__) thisdir = os.path.dirname(os.path.realpath(__file__)) parentdir = os.path.join(thisdir, "..") def get_fixture_dir(fixture=""): dname = os.path.join(thisdir, "fixtures", fixture) return dname def get_fixture_file(fixture): fname = os.path.join(get_fixture_dir(), fixture) return fname def read_fixture_file(fixture): fname = get_fixture_file(fixture) data = open(fname, 'rb').read() return data def test_uid_export_0(): "You should not be able to export uid < 1" data = read_fixture_file("pubkey-1.asc") pytest.raises(ValueError, UIDExport, data, 0) def test_uid_export_single(): # This key contains only one UID data = read_fixture_file("pubkey-1.asc") try: uid1_data = UIDExport(data, 1) except KeyboardInterrupt as e: log.exception("Meh.") raise RuntimeError() # The original key c = TempContext() c.op_import(data) result = c.op_import_result() logging.info("Result: %r", result) fpr = result.imports[0].fpr uids = c.get_key(fpr).uids assert 1 == len(uids) # The first exported UID c = TempContext() logging.info("uid1: %r", uid1_data) c.op_import(uid1_data) result = c.op_import_result() imports = result.imports assert 1 == len(imports) uids1_key = c.get_key(fpr).uids assert 1 == len(uids1_key) uid1 = uids1_key[0] # assert uid1 == uids[0] assert uid1.uid == uids[0].uid def test_uid_export_double(): # This key contains two UIDs data = read_fixture_file("pubkey-2-uids.asc") try: uid1_data = UIDExport(data, 1) logging.info("uid1: %r", uid1_data) uid2_data = UIDExport(data, 2) except KeyboardInterrupt as e: log.exception("Meh.") raise RuntimeError() assert uid1_data != uid2_data # The original key c = TempContext() c.op_import(data) result = c.op_import_result() logging.info("Result: %r", result) fpr = result.imports[0].fpr uids = c.get_key(fpr).uids assert 2 == len(uids) # The first exported UID c = TempContext() logging.info("uid1: %r", uid1_data) c.op_import(uid1_data) result = c.op_import_result() imports = result.imports assert 1 == len(imports) uids1_key = c.get_key(fpr).uids assert 1 == len(uids1_key) uid1 = uids1_key[0] # assert uid1 == uids[0] assert uid1.uid == uids[0].uid # The second exported UID c = TempContext() c.op_import(uid2_data) result = c.op_import_result() imports = result.imports assert 1 == len(imports) uids2_key = c.get_key(fpr).uids assert 1 == len(uids2_key) uid2 = uids2_key[0] # FIXME: The objects don't implement __eq__ it seems :-/ # assert uid2 == uids[1] assert uid2.uid == uids[1].uid def test_export_uids(): # This key contains two UIDs # We ought to have tests with revoked and invalid UIDs data = read_fixture_file("pubkey-2-uids.asc") # The original key c = TempContext() c.op_import(data) result = c.op_import_result() logging.info("Result: %r", result) fpr = result.imports[0].fpr uids = c.get_key(fpr).uids assert 2 == len(uids) exported_uids = list(export_uids(data)) assert 2 == len(exported_uids) exported_uid1 = exported_uids[0] uid1, uid1_data = exported_uid1 exported_uid2 = exported_uids[1] uid2, uid2_data = exported_uid2 assert uids[0].uid == uid1 assert uids[1].uid == uid2 # The first exported UID c = TempContext() c.op_import(uid1_data) result = c.op_import_result() imports = result.imports assert 1 == len(imports) uids1_key = c.get_key(fpr).uids assert 1 == len(uids1_key) uid1_key = uids1_key[0] # assert uid1 == uids[0] assert uid1_key.uid == uids[0].uid # The second exported UID c = TempContext() c.op_import(uid2_data) result = c.op_import_result() imports = result.imports assert 1 == len(imports) uids2_key = c.get_key(fpr).uids assert 1 == len(uids2_key) uid2_key = uids2_key[0] # FIXME: The objects don't implement __eq__ it seems :-/ # assert uid2 == uids[1] assert uid2_key.uid == uids[1].uid def test_export_alpha_uids(): """When UIDs get deleted, their index shrinks, of course We didn't, however, take that into account so a key with three UIDs would break. """ data = read_fixture_file("alpha.asc") # The original key c = TempContext() c.op_import(data) result = c.op_import_result() logging.info("Result: %r", result) fpr = result.imports[0].fpr uids = c.get_key(fpr).uids logging.info("UIDs: %r", uids) assert 3 == len(uids) for i, uid in enumerate(uids, start=1): exported_uid = UIDExport(data, i) tmp = TempContext() tmp.op_import(exported_uid) result = tmp.op_import_result() logging.debug("UID %d %r import result: %r", i, uid, result) uid_key = tmp.get_key(result.imports[0].fpr) assert 1 == len(uid_key.uids) key_uid = uid_key.uids[0] # FIXME: Enable __eq__ # assert uids[i-1] == key_uid assert uids[i-1].name == key_uid.name assert uids[i-1].email == key_uid.email def test_fingerprint_from_data(): pytest.raises(ValueError, fingerprint_from_keydata, "This is not a key...") class TestKey1: def setup(self): data = read_fixture_file("pubkey-1.asc") self.key = openpgpkey_from_data(data) def test_fingerprint(self): assert "ADAB7FCC1F4DE2616ECFA402AF82244F9CD9FD55" == self.key.fingerprint def test_uids(self): uids = self.key.uidslist assert 1 == len(uids) uid = uids[0] assert 'Joe Random Hacker' == uid.name assert 'joe@example.com' == uid.email def test_get_public_key_no_data(): tmp = tempfile.mkdtemp() pytest.raises(ValueError, get_public_key_data, None, homedir=tmp) class TestGetPublicKeyData: def setup(self): self.fname = get_fixture_file("pubkey-1.asc") original = open(self.fname, 'rb').read() # This should be a new, empty directory self.homedir = tempfile.mkdtemp() gpgcmd = ["gpg", "--homedir={}".format(self.homedir)] # The directory should not have any keys # I don't know how to easily check for that, though # Now we import a single key check_call(gpgcmd + ["--import", self.fname]) self.originalkey = openpgpkey_from_data(original) def teardown(self): # shutil.rmtree(self.homedir) pass def test_get_all_public_key_data(self): # Hm. The behaviour of something that matches # more than one key may change. data = get_public_key_data("", homedir=self.homedir) newkey = openpgpkey_from_data(data) # Hrm. We may be better off checking for a few things # we actually care about rather than delegating to the Key() itself. assert self.originalkey == newkey def test_get_public_key_data(self): fpr = self.originalkey.fingerprint data = get_public_key_data(fpr, homedir=self.homedir) newkey = openpgpkey_from_data(data) assert fpr == newkey.fingerprint def test_no_match(self): pytest.raises(ValueError, get_public_key_data, "nothing should match this", homedir=self.homedir) def test_get_empty_usable_keys(): homedir = tempfile.mkdtemp() keys = get_usable_keys(homedir=homedir) assert 0 == len(keys) class TestGetUsableKeys: def setup(self): self.fname = get_fixture_file("pubkey-1.asc") original = open(self.fname, 'rb').read() # This should be a new, empty directory self.homedir = tempfile.mkdtemp() gpgcmd = ["gpg", "--homedir={}".format(self.homedir)] # The directory should not have any keys # I don't know how to easily check for that, though # Now we import a single key check_call(gpgcmd + ["--import", self.fname]) self.originalkey = openpgpkey_from_data(original) def teardown(self): # shutil.rmtree(self.homedir) pass def test_get_usable_key_no_pattern(self): keys = get_usable_keys(homedir=self.homedir) assert 1 == len(keys) key = keys[0] assert self.originalkey == key def test_get_usable_key_fpr(self): fpr = self.originalkey.fingerprint keys = get_usable_keys(fpr, homedir=self.homedir) assert 1 == len(keys) key = keys[0] assert self.originalkey == key class TestGetUsableSecretKeys: def setup(self): self.fname = get_fixture_file("seckey-no-pw-1.asc") original = open(self.fname, 'rb').read() # This should be a new, empty directory self.homedir = tempfile.mkdtemp() gpgcmd = ["gpg", "--homedir={}".format(self.homedir)] # The directory should not have any keys # I don't know how to easily check for that, though # Now we import a single key check_call(gpgcmd + ["--import", self.fname]) self.originalkey = openpgpkey_from_data(original) def teardown(self): # shutil.rmtree(self.homedir) pass def test_get_usable_key_no_pattern(self): keys = get_usable_secret_keys(homedir=self.homedir) assert 1 == len(keys) key = keys[0] assert self.originalkey == key def test_get_usable_key_fpr(self): fpr = self.originalkey.fingerprint keys = get_usable_secret_keys(fpr, homedir=self.homedir) assert 1 == len(keys) key = keys[0] assert self.originalkey == key def get_signatures_for_uids_on_key(ctx, key): """It seems to be a bit hard to get a key with its signatures, so this is a small helper function""" # esp. get_key does not take a SIGS argument. # What happens if keylist returns multiple keys, e.g. because there # is another key with a UID named as the fpr? How can I make sure I # get the signatures of any given key? # *sigh* gpgme is killing me. With gpgme 1.8 we have to # set_keylist_mode before we can call keylist. With gpgme 1.9 # keylist takes a mode argument and overrides whatever has been # set before. In order to come with something compatible with both # 1.8 and 1.9 we have to set_keylist_mode and NOT call ctx.keylist # but rather the bare op_keylist_all. In 1.8 that requires two # arguments. mode = gpg.constants.keylist.mode.LOCAL | gpg.constants.keylist.mode.SIGS secret = False ctx.set_keylist_mode(mode) keys = list(ctx.op_keylist_all(key.fpr, secret)) # With gpgme 1.9 we can simply do: # keys = list(ctx.keylist(key.fpr), mode=mode) assert len(keys) == 1 uid_sigs = {uid.uid: [s for s in uid.signatures] for uid in keys[0].uids} log.info("Signatures: %r", uid_sigs) return uid_sigs def export_public_key(keydata): "Returns the public portion of the key even if you provide a private key" # This might be a secret key, too, so we import and export to # get hold of the public portion. ctx = TempContext() ctx.op_import(keydata) result = ctx.op_import_result() fpr = result.imports[0].fpr sink = gpg.Data() ctx.op_export(fpr, 0, sink) sink.seek(0, 0) public_key = sink.read() assert len(public_key) > 0 return public_key class TestSignAndEncrypt: SENDER_KEY = "seckey-no-pw-1.asc" RECEIVER_KEY = "seckey-no-pw-2.asc" def setup(self): # The "sender" sends its certificate to have it certified by the receiver self.key_sender_key = get_fixture_file(self.SENDER_KEY) # The "receiver" will receive the certificate, certify it, and send it back to the "sender" self.key_receiver_key = get_fixture_file(self.RECEIVER_KEY) # This should be a new, empty directory self.key_sender_homedir = tempfile.mkdtemp() self.key_receiver_homedir = tempfile.mkdtemp() sender_gpgcmd = ["gpg", "--homedir={}".format(self.key_sender_homedir)] receiver_gpgcmd = ["gpg", "--homedir={}".format(self.key_receiver_homedir)] check_call(sender_gpgcmd + ["--import", self.key_sender_key]) check_call(receiver_gpgcmd + ["--import", self.key_receiver_key]) def teardown(self): # shutil.rmtree(self.sender_homedir) # shutil.rmtree(self.receiver_homedir) pass def test_sign_and_encrypt(self): # This might be a secret key, too, so we import and export to # get hold of the public portion. keydata = open(self.key_sender_key, "rb").read() # We get the public portion of the key sender = TempContext() sender.op_import(keydata) result = sender.op_import_result() fpr = result.imports[0].fpr sink = gpg.Data() sender.op_export(fpr, 0, sink) sink.seek(0, 0) # This is the key that we will sign public_sender_key = sink.read() keys = get_usable_keys(homedir=self.key_sender_homedir) assert 1 == len(keys) key = keys[0] uids = key.uidslist # Now finally call the function under test uid_encrypted = list(sign_keydata_and_encrypt(public_sender_key, error_cb=None, homedir=self.key_receiver_homedir)) assert len(uids) == len(uid_encrypted) # We need to explicitly request signatures uids_before = uids assert len(uids_before) == len(sender.get_key(fpr).uids) sigs_before = [s for l in get_signatures_for_uids_on_key(sender, key).values() for s in l] # FIXME: Refactor this a little bit. # We have duplication of code with the other test below. for uid, uid_enc in zip(uids_before, uid_encrypted): uid_enc_str = uid_enc[0].uid # The test doesn't work so well, because comments # are not rendered :-/ # assert uid == uid_enc[0] assert uid.name in uid_enc_str assert uid.email in uid_enc_str ciphertext = uid_enc[1] log.debug("Decrypting %r", ciphertext) plaintext, result, vrfy = sender.decrypt(ciphertext) log.debug("Decrypt Result: %r", result) sender.op_import(plaintext) import_result = sender.op_import_result() log.debug("Import Result: %r", import_result) assert 1 == import_result.new_signatures updated_key = sender.get_key(fpr) log.debug("updated key: %r", updated_key) log.debug("updated key sigs: %r", [(uid, uid.signatures) for uid in updated_key.uids]) sigs_after = [s for l in get_signatures_for_uids_on_key(sender, key).values() for s in l] assert len(sigs_after) > len(sigs_before) def test_sign_and_encrypt_double_secret(self): "We want to produce as many signatures as possible" recv = DirectoryContext(homedir=self.key_receiver_homedir) params = """ %transient-key Key-Type: RSA Key-Length: 1024 Name-Real: Joe Genkey Tester Name-Comment: with stupid passphrase Name-Email: joe+gpg@example.org %no-protection #Passphrase: Crypt0R0cks #Expire-Date: 2020-12-31 """ recv.op_genkey(params, None, None) gen_result = recv.op_genkey_result() assert 2 == len(list(recv.keylist(secret=True))) sender = DirectoryContext(homedir=self.key_sender_homedir) sender.set_keylist_mode(gpg.constants.KEYLIST_MODE_SIGS) sender_keys = list(sender.keylist()) assert 1 == len(sender_keys) sender_key = sender_keys[0] fpr = sender_key.fpr sink = gpg.Data() sender.op_export_keys(sender_keys, 0, sink) sink.seek(0, 0) public_sender_key = sink.read() # Now finally call the function under test uid_encrypted = list(sign_keydata_and_encrypt(public_sender_key, error_cb=None, homedir=self.key_receiver_homedir)) assert len(sender_key.uids) == len(uid_encrypted) uids_before = sender.get_key(fpr).uids sigs_before = [s for l in get_signatures_for_uids_on_key(sender, sender_key).values() for s in l] for uid, uid_enc in zip(uids_before, uid_encrypted): uid_enc_str = uid_enc[0].uid log.info("Uid enc str: %r", uid_enc_str) log.info("Uid name: %r", uid.name) # FIXME: assert uid == uid_enc[0] # It's a bit weird to re-use the string treatment here. # But gpgme may return unencodable bytes (and uid, here, is # coming straight from gpgme). We opted for our UID wrapper # to return consumable strings, i.e. safe to encode assert to_valid_utf8_string(uid.name) in uid_enc_str assert to_valid_utf8_string(uid.email) in uid_enc_str ciphertext = uid_enc[1] log.debug("Decrypting %r", ciphertext) plaintext, result, vrfy = sender.decrypt(ciphertext) log.debug("Decrypt Result: %r", result) sender.op_import(plaintext) import_result = sender.op_import_result() log.debug("Import Result: %r", import_result) # Here is the important check for two new signatures assert 2 == import_result.new_signatures updated_key = sender.get_key(fpr) log.debug("updated key: %r", updated_key) log.debug("updated key sigs: %r", [(uid, uid.signatures) for uid in updated_key.uids]) sigs_after = [s for l in get_signatures_for_uids_on_key(sender, sender_key).values() for s in l] assert len(sigs_after) > len(sigs_before) def test_third_party_key(self): """This test tries to trick the receiver by sending an unrelated key of a third party. The receiver must not import that key. """ THIRD_PARTY_KEY = "third_party.pgp.asc" self.third_party_key = get_fixture_file(THIRD_PARTY_KEY) self.key_third_party_homedir = tempfile.mkdtemp() third_party_gpgcmd = ["gpg", "--homedir={}".format(self.key_third_party_homedir)] check_call(third_party_gpgcmd + ["--import", self.third_party_key]) keydata = open(self.third_party_key, "rb").read() public_third_party_key = export_public_key(keydata) # The "sender" sends its certificate via the app and then receives the email with the certification public_sender_key = export_public_key(open(self.key_sender_key, 'rb')) sender = DirectoryContext(homedir=self.key_sender_homedir) before = list(sender.keylist()) third_party = DirectoryContext(homedir=self.key_third_party_homedir) third_party.op_import(public_sender_key) result = third_party.op_import_result() if result.considered != 1 and result.imported != 1: raise ValueError("Expected to load exactly one key. %r", result) else: imports = result.imports assert len(imports) == 1, "Imported %d instead of 1" % len(imports) fpr = result.imports[0].fpr target_key = third_party.get_key(fpr) ciphertext, _, _ = third_party.encrypt( plaintext=public_third_party_key, recipients=[target_key], always_trust=True, sign=False, ) # Now we have transferred the ciphertext to the victim plaintext, result, vrfy = sender.decrypt(ciphertext) log.debug("Decrypt Result: %r", result) result = pytest.raises(ImportNewCertificationError, import_signature, plaintext, homedir=self.key_sender_homedir) log.debug("Import result: %s", result) after = list(sender.keylist()) assert len(before) == len(after) class TestLatin1(TestSignAndEncrypt): SENDER_KEY = "seckey-latin1.asc" RECEIVER_KEY = "seckey-2.asc" class TestColon(TestSignAndEncrypt): SENDER_KEY = "seckey-colon.asc" RECEIVER_KEY = "seckey-2.asc" class TestMultipleUID(TestSignAndEncrypt): SENDER_KEY = "seckey-multiple-uid-colon.asc" RECEIVER_KEY = "seckey-2.asc" class TestUtf8(TestSignAndEncrypt): SENDER_KEY = "seckey-utf8.asc" RECEIVER_KEY = "seckey-utf8-2.asc" # There is little we can do here. # That OpenPGP key is incomplete, i.e. it lacks the "d" needed to # do anything meaningful with the key. #class TestSubKeys(TestSignAndEncrypt): # SENDER_KEY = "seckey-2.asc" # RECEIVER_KEY = "seckey-subkeys.asc" gnome-keysign-1.3.0/tests/test_latin1.py000066400000000000000000000032261431057335600202440ustar00rootroot00000000000000#!/usr/bin/env python import logging import sys, os import gi gi.require_version('Gtk', "3.0") from gi.repository import Gtk, GLib from keysign import gpgmeh from keysign.KeyPresent import KeyPresentWidget from keysign.keyconfirm import PreSignWidget from keysign.keylistwidget import KeyListWidget ## We should unify this fixture related code somehow log = logging.getLogger(__name__) thisdir = os.path.dirname(os.path.realpath(__file__)) parentdir = os.path.join(thisdir, "..") def get_fixture_dir(fixture=""): dname = os.path.join(thisdir, "fixtures", fixture) return dname def get_fixture_file(fixture): fname = os.path.join(get_fixture_dir(), fixture) return fname def read_fixture_file(fixture): fname = get_fixture_file(fixture) data = open(fname, 'rb').read() return data def load_key(key): f = read_fixture_file(key) k = gpgmeh.openpgpkey_from_data(f) return k def load_latin1_key(): key = "seckey-latin1.asc" return load_key(key) def _gui_test(widget): widget.show_all() GLib.timeout_add_seconds(2, Gtk.main_quit) Gtk.main() def test_kpw(): """We had problems with non-UTF-8 UIDs and KPW. We try to load one""" key = load_latin1_key() log.info("Loaded %r", key) kpw = KeyPresentWidget(key=key, discovery_code="") _gui_test(kpw) def test_psw(): """We had problems with non UTF-8 UIDs and PSW. We try to load one""" key = load_latin1_key() psw = PreSignWidget(key=key) _gui_test(psw) def test_klw(): """We had problems with non UTF-8 UIDs and KLW. We try to load one""" key = load_latin1_key() klw = KeyListWidget(keys=[key]) _gui_test(klw) gnome-keysign-1.3.0/tests/test_uids.py000066400000000000000000000021141431057335600200130ustar00rootroot00000000000000#!/usr/bin/env python """We want our custom UID wrapper to return encodable and displayable strings, rather than raw bytes, for the raw UID, email, name, and comment component. """ from __future__ import unicode_literals from keysign import gpgkey def is_string(s): return type(s) == type("string") def is_bytes(s): return type(s) == type(b"bytes") def assert_string(s): assert is_string(s), "Expected String, but got %s (%r)" % (type(s), s) def assert_bytes(s): assert is_bytes(s), "Expected Bytes, but got %s (%r)" % (type(s), s) class FakeMKSUID: uid = b'' expire = 0 def test_mks_utf8_uid(): "The normal case" uid = FakeMKSUID() uid.uid = 'foo bar ' u = gpgkey.UID.from_monkeysign(uid) assert_string(u.name) assert_string(u.comment) assert_string(u.email) assert_string(u.uid) def test_mks_latin_uid(): uid = FakeMKSUID() uid.uid = 'fo\udcf6e\udce9ba ' u = gpgkey.UID.from_monkeysign(uid) assert_string(u.name) assert_string(u.comment) assert_string(u.email) assert_string(u.uid) gnome-keysign-1.3.0/tests/test_wormhole.py000066400000000000000000000137301431057335600207110ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2017 Ludovico de Nittis # # This file is part of GNOME Keysign. # # GNOME Keysign 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. # # GNOME Keysign 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 GNOME Keysign. If not, see . import os import logging from subprocess import check_call import tempfile import gi gi.require_version('Gtk', '3.0') from wormhole.errors import WrongPasswordError, LonelyError from pytest_twisted import inlineCallbacks from keysign.gpgmeh import openpgpkey_from_data from keysign.gpgmeh import get_public_key_data from keysign.offer import Offer from keysign.util import mac_generate from keysign.wormholeoffer import WormholeOffer from keysign.wormholereceive import WormholeReceive log = logging.getLogger(__name__) thisdir = os.path.dirname(os.path.realpath(__file__)) parentdir = os.path.join(thisdir, "..") def get_fixture_dir(fixture=""): dname = os.path.join(thisdir, "fixtures", fixture) return dname def get_fixture_file(fixture): fname = os.path.join(get_fixture_dir(), fixture) return fname def import_key_from_file(fixture, homedir): fname = get_fixture_file(fixture) original = open(fname, 'rb').read() gpgcmd = ["gpg", "--homedir={}".format(homedir)] # Now we import a single key check_call(gpgcmd + ["--import", fname]) return openpgpkey_from_data(original) @inlineCallbacks def test_wrmhl(): # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) file_key_data = get_public_key_data(key.fingerprint) log.info("Running with key %r", key) # Start offering the key offer = WormholeOffer(key) info = yield offer.allocate_code() code, _ = info offer.start() receive = WormholeReceive(code) msg_tuple = yield receive.start() downloaded_key_data, success, _ = msg_tuple assert success log.info("Checking with key: %r", downloaded_key_data) assert downloaded_key_data == file_key_data @inlineCallbacks def test_wrmhl_offline_code(): # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) file_key_data = get_public_key_data(key.fingerprint) # We assume that this channel, at execution time, is free code = u"5556-penguin-paw-print" # Start offering the key offer = WormholeOffer(key) offer.allocate_code(code) offer.start() # Start receiving the key receive = WormholeReceive(code) msg_tuple = yield receive.start() downloaded_key_data, success, _ = msg_tuple assert success log.info("Checking with key: %r", downloaded_key_data) assert downloaded_key_data == file_key_data @inlineCallbacks def test_wrmhl_wrong_code(): # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) log.info("Running with key %r", key) # Start offering the key offer = WormholeOffer(key) info = yield offer.allocate_code() code, _ = info offer.start() receive = WormholeReceive(code+"-wrong") msg_tuple = yield receive.start() downloaded_key_data, success, message = msg_tuple assert not success assert message is not None assert message == WrongPasswordError @inlineCallbacks def test_wrmhl_wrong_hmac(): # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) log.info("Running with key %r", key) hmac = "wrong_hmac_eg_tampered_key" # Start offering the key offer = WormholeOffer(key) info = yield offer.allocate_code() code, _ = info offer.start() receive = WormholeReceive(code, mac=hmac) msg_tuple = yield receive.start() downloaded_key_data, success, message = msg_tuple assert not success assert message is not None assert message == WrongPasswordError @inlineCallbacks def test_wrmhl_with_hmac(): # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) file_key_data = get_public_key_data(key.fingerprint) log.info("Running with key %r", key) hmac = mac_generate(key.fingerprint.encode('ascii'), file_key_data) # Start offering the key offer = WormholeOffer(key) info = yield offer.allocate_code() code, _ = info offer.start() receive = WormholeReceive(code, mac=hmac) msg_tuple = yield receive.start() downloaded_key_data, success, _ = msg_tuple assert success log.info("Checking with key: %r", downloaded_key_data) assert downloaded_key_data == file_key_data @inlineCallbacks def test_offer_cancel(): def _received(start_data): success, message = start_data assert message is not None assert isinstance(message, LonelyError) # This should be a new, empty directory homedir = tempfile.mkdtemp() os.environ["GNUPGHOME"] = homedir key = import_key_from_file("seckey-no-pw-1.asc", homedir) log.info("Running with key %r", key) # Start offering the key offer = Offer(key) _ = yield offer.allocate_code(worm=True) defers = offer.start() for de in defers: de.addCallback(_received) offer.stop() gnome-keysign-1.3.0/tox.ini000066400000000000000000000011471431057335600156140ustar00rootroot00000000000000[tox] # I don't seem to be able to say "python 2" and "python 3", only. skip_missing_interpreters = true envlist = py35,py36,py37,py38,py39,flake8 #deps = # -rrequirements.txt [testenv] deps = pytest pytest_twisted commands=pytest #install_command = pip install -U {opts} {packages} [flake8] ignore = E302,E303,W293,E226,E305,E266 max-line-length = 160 exclude = tests/* max-complexity = 10 # Settings specific to the flake8 environment [testenv:flake8] # The command to run: commands = flake8 keysign # We only need flake8 when linting, we do not care about the project dependencies deps = flake8