pax_global_header00006660000000000000000000000064135540507360014522gustar00rootroot0000000000000052 comment=cd725a05e92bd9390422be501ddd7c9a228c001d gnome-keysign-1.2.0/000077500000000000000000000000001355405073600142765ustar00rootroot00000000000000gnome-keysign-1.2.0/.gitignore000066400000000000000000000003031355405073600162620ustar00rootroot00000000000000*.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.2.0/COPYING000066400000000000000000001045131355405073600153350ustar00rootroot00000000000000 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.2.0/MANIFEST.in000066400000000000000000000006571355405073600160440ustar00rootroot00000000000000# 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.2.0/Makefile000066400000000000000000000000261355405073600157340ustar00rootroot00000000000000 clean: rm -f *.pyc gnome-keysign-1.2.0/README.rst000066400000000000000000000174611355405073600157760ustar00rootroot00000000000000GNOME 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-lxml 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-lxml 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=python2 /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.2.0/data/000077500000000000000000000000001355405073600152075ustar00rootroot00000000000000gnome-keysign-1.2.0/data/gnome-keysign-sign-key.man.rst000066400000000000000000000015221355405073600230130ustar00rootroot00000000000000 ============== 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.2.0/data/gnome-keysign.man.rst000066400000000000000000000034751355405073600213000ustar00rootroot00000000000000 ============== 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.2.0/data/org.gnome.Keysign-symbolic.svg000066400000000000000000000040241355405073600230520ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme gnome-keysign-1.2.0/data/org.gnome.Keysign.raw.appdata.xml000066400000000000000000000126341355405073600234430ustar00rootroot00000000000000 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.2.0/data/org.gnome.Keysign.raw.desktop000066400000000000000000000004221355405073600226730ustar00rootroot00000000000000[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.2.0/data/org.gnome.Keysign.svg000066400000000000000000000164351355405073600212440ustar00rootroot00000000000000 Adwaita Icon Template image/svg+xml GNOME Design Team Adwaita Icon Template gnome-keysign-1.2.0/gnome-keysign.doap000066400000000000000000000026171355405073600177250ustar00rootroot00000000000000 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.2.0/gnome-keysign.py000077500000000000000000000005351355405073600174320ustar00rootroot00000000000000#!/usr/bin/env python2 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.2.0/keysign/000077500000000000000000000000001355405073600157475ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/GPGQRCode.py000077500000000000000000000053261355405073600200050ustar00rootroot00000000000000#!/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.2.0/keysign/GtkKeyserver.py000077500000000000000000000066141355405073600207600ustar00rootroot00000000000000#!/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.2.0/keysign/KeyPresent.py000077500000000000000000000214171355405073600204220ustar00rootroot00000000000000#!/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.2.0/keysign/Keyserver.py000077500000000000000000000206301355405073600203040ustar00rootroot00000000000000#!/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.2.0/keysign/QRCode.py000077500000000000000000000255301355405073600174460ustar00rootroot00000000000000#!/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.2.0/keysign/SignKey.py000077500000000000000000000043351355405073600177020ustar00rootroot00000000000000#!/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="Sign an OpenPGP key from a file. The program will open each file, exrtact exactly one OpenPGP key, 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.2.0/keysign/__init__.py000077500000000000000000000016231355405073600200650ustar00rootroot00000000000000#!/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.2.0/keysign/__main__.py000077500000000000000000000020671355405073600200510ustar00rootroot00000000000000#!/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.2.0/keysign/_version.py000077500000000000000000000000541355405073600201470ustar00rootroot00000000000000#!/usr/bin/env python __version__ = '1.2.0' gnome-keysign-1.2.0/keysign/app.py000077500000000000000000000320561355405073600171120ustar00rootroot00000000000000#!/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 .util import sign_keydata_and_send 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.2.0/keysign/app.ui000066400000000000000000000101451355405073600170670ustar00rootroot00000000000000 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.2.0/keysign/avahidiscovery.py000077500000000000000000000173201355405073600213470ustar00rootroot00000000000000#!/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.2.0/keysign/avahioffer.py000077500000000000000000000062611355405073600204430ustar00rootroot00000000000000#!/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.2.0/keysign/bluetoothoffer.py000066400000000000000000000135701355405073600213560ustar00rootroot00000000000000import 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.2.0/keysign/bluetoothreceive.py000066400000000000000000000126031355405073600216730ustar00rootroot00000000000000import 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: 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.2.0/keysign/compat/000077500000000000000000000000001355405073600172325ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/compat/__init__.py000066400000000000000000000000001355405073600213310ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/compat/gtkbutton.py000066400000000000000000000020651355405073600216300ustar00rootroot00000000000000#!/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.2.0/keysign/dialog_avahi.ui000066400000000000000000000037341355405073600207240ustar00rootroot00000000000000 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.2.0/keysign/discover.py000066400000000000000000000103441355405073600201410ustar00rootroot00000000000000import 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.2.0/keysign/errors.py000066400000000000000000000010411355405073600176310ustar00rootroot00000000000000class 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.2.0/keysign/gpgkey.py000077500000000000000000000147461355405073600176260ustar00rootroot00000000000000#!/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.2.0/keysign/gpgmeh.py000077500000000000000000000510131355405073600175730ustar00rootroot00000000000000#!/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 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 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 RuntimeError("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""" 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))) ## ## 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) def import_signature(encrypted_sig, homedir=None): ctx = DirectoryContext(homedir) # Check if we are really importing a signature temp_ctx = TempContextWithAgent(ctx) signature = temp_ctx.decrypt(encrypted_sig) temp_ctx.op_import(signature[0]) 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 or result.revocations != 0 or result.new_sub_keys != 0: log.warning("The signature that we were importing is not as we expected!") raise GPGMEError signature = ctx.decrypt(encrypted_sig) # Try Seahorse DBus name = "org.gnome.seahorse" path = "/org/gnome/seahorse/keys" bus = dbus.SessionBus() result = [] try: proxy = bus.get_object(name, path) except dbus.exceptions.DBusException: log.debug("Seahorse DBus is not available") else: iface = "org.gnome.seahorse.KeyService" gpg_iface = dbus.Interface(proxy, iface) payload = base64.b64encode(signature[0]).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) # If Seahorse failed we try op_import if len(result) < 1: ctx.op_import(signature[0]) result = ctx.op_import_result() if len(result.imports) < 1: raise GPGMEError gnome-keysign-1.2.0/keysign/gtkexcepthook.py000077500000000000000000000271351355405073600212130ustar00rootroot00000000000000#!/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.2.0/keysign/i18n.py000066400000000000000000000023301355405073600170760ustar00rootroot00000000000000#!/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.2.0/keysign/keyconfirm.py000077500000000000000000000146231355405073600205000ustar00rootroot00000000000000#!/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_save_as_button = builder.get_object('btn_local_import_save_as') self.infobar_import_button = builder.get_object('btn_local_import') 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.2.0/keysign/keyfprscan.py000077500000000000000000000130731355405073600204750ustar00rootroot00000000000000#!/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.2.0/keysign/keylistwidget.py000077500000000000000000000163211355405073600212170ustar00rootroot00000000000000#!/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 = builder.get_object('infobar_import') fix_infobar(self.ib_import) self.label_ib_import = builder.get_object('label_import') self.image_ib_import = builder.get_object('image_import') 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.2.0/keysign/locale/000077500000000000000000000000001355405073600172065ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/README.rst000066400000000000000000000026371355405073600207050ustar00rootroot00000000000000Translations ============== 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.2.0/keysign/locale/cs/000077500000000000000000000000001355405073600176135ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/cs/LC_MESSAGES/000077500000000000000000000000001355405073600214005ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/cs/LC_MESSAGES/keysign.po000066400000000000000000000301001355405073600234030ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2018-10-04 17:23+0000\n" "PO-Revision-Date: 2018-10-05 10:37+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:10 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: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" "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:165 msgid "Send" msgstr "Odeslání" #: keysign/app.py:167 keysign/receive.py:238 msgid "Receive" msgstr "Příjem" #: keysign/app.ui:62 keysign/send.ui:616 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:144 msgid "Offering key: {}" msgstr "Nabízený klíč: {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:145 msgid "Discovery info: {}" msgstr "Informace o vyhledávání: {}" #: keysign/avahioffer.py:83 msgid "Press Enter to stop" msgstr "Zastavíte zmáčknutím Enter" #: keysign/bluetoothoffer.py:127 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Klíč byl úspěšně odeslán" #: keysign/bluetoothoffer.py:129 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Vyskytla se chyba: {}" #: keysign/bluetoothoffer.py:131 msgid "Press Enter to exit" msgstr "Ukončíte zmáčknutím Enter" #: 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 není k dispozici" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Zkouší se stáhnout klíč, čekejte prosím" #: keysign/gpgmks.py:178 #, python-format msgid "installing symlinks for sockets from %s to %s" msgstr "instalují se symbolické odkazy pro sokety od %s do %s" #: 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." #: 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/i18n.py:39 msgid "Translated for gettext (C)" msgstr "Přeloženo pro gettext ©" #: keysign/i18n.py:47 msgid "Translated for Python (C)" msgstr "Přeloženo pro Python ©" #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Vyprší: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Podepisovací klíč" #: 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 "" "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í si zobrazíte kliknutím zde." #: keysign/receive.ui:105 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:124 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Integrovaná webová kamera" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Bezpečnostní kód" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Načtení čárového kódu" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait ..." msgstr "Stahují se data klíče. Čekejte prosím…" #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Stahování klíče bylo přerušeno!" #: keysign/receive.ui:313 keysign/send.ui:527 msgid "page1" msgstr "" #: 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 "" "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:365 msgid "Key" msgstr "Klíč" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "P_otvrdit" #: keysign/receive.ui:521 keysign/send.ui:564 msgid "page2" msgstr "" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Podepisují se následující UID:" #: keysign/receive.ui:615 msgid "page3" msgstr "" #: keysign/send.py:156 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:162 msgid "There isn't an Internet connection!" msgstr "Není k dispozici internetové připojení!" #: keysign/send.py:190 keysign/send.ui:545 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: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 "" "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:199 #, 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:58 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:135 msgid "Very slow or no Internet connection!" msgstr "Připojení do Internetu je pomalé nebo nefunkční!" #: keysign/send.ui:190 msgid "Select a key for signing" msgstr "Vyberte klíč k podepsání" #: keysign/send.ui:206 msgid "Times signed" msgstr "Počet podepsání" #: keysign/send.ui:272 msgid "Keylist" msgstr "Seznam klíčů" #: keysign/send.ui:292 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:319 msgid "Key Details" msgstr "Údaje klíče" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Otisk" #: keysign/send.ui:498 msgid "QR Code" msgstr "QR kód" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Výběr a odeslání klíče" #: keysign/util.py:206 msgid "Your signed key $fingerprint" msgstr "Váš podepsaný klíč $fingerprint" #: keysign/util.py:207 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.2.0/keysign/locale/da/000077500000000000000000000000001355405073600175725ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/da/LC_MESSAGES/000077500000000000000000000000001355405073600213575ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/da/LC_MESSAGES/keysign.po000066400000000000000000000317401355405073600233750ustar00rootroot00000000000000# 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. msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-04-12 10:12+0000\n" "PO-Revision-Date: 2019-04-24 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:10 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: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" " 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:181 msgid "Send" msgstr "Send" #: keysign/app.py:183 keysign/receive.py:238 msgid "Receive" msgstr "Modtag" #: keysign/app.ui:62 keysign/send.ui:617 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Tilbyder nøgle: {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Opdagelsesinfo: {}" #: keysign/avahioffer.py:83 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.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 "" "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" "Klik her " "for mere information." #: keysign/receive.ui:105 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:124 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Integreret webcam" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Sikkerhedskode" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Skan stregkode" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait..." msgstr "Downloader nøgledata. Vent venligst …" #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Download af nøgle blev afbrudt!" #: 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 "" "For at fortsætte, skal du bekræfte, at du vil underskrive følgende " "nøgle.\nDet genererer en e-mail som skal sendes for at fuldføre " "underskriftsprocessen." #: keysign/receive.ui:365 msgid "Key" msgstr "Nøgle" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "UID'er" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "_Bekræft" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Underskriver følgende UID'er:" #: keysign/send.py:156 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:162 msgid "There isn't an Internet connection!" msgstr "Der er ikke forbindelse til internettet!" #: keysign/send.py:190 keysign/send.ui:545 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: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 "" "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:199 #, 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:58 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:135 msgid "Very slow or no Internet connection!" msgstr "Meget langsom eller ingen internetforbindelse!" #. 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 "Vælg en nøgle som skal underskrives" #: keysign/send.ui:206 msgid "Times signed" msgstr "Antal underskrifter" #: keysign/send.ui:272 msgid "Keylist" msgstr "Nøgleliste" #: keysign/send.ui:292 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:319 msgid "Key Details" msgstr "Nøgledetaljer" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Fingeraftryk" #: keysign/send.ui:498 msgid "QR Code" msgstr "QR-kode" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Vælg og send nøgle" #: keysign/send.ui:594 msgid "" "Uses the Internet to transport the key rather than the local network and " "Bluetooth (if available)" msgstr "Bruger internettet til at transportere nøglen i stedet for det " "lokale netværk og Bluetooth (hvis det er tilgængeligt)" #: 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 "" "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.2.0/keysign/locale/de/000077500000000000000000000000001355405073600175765ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/de/LC_MESSAGES/000077500000000000000000000000001355405073600213635ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/de/LC_MESSAGES/keysign.po000066400000000000000000000267701355405073600234100ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign 0.9\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2018-09-07 10:11+0000\n" "PO-Revision-Date: 2018-09-18 23:07+0200\n" "Last-Translator: Christian Kirbach \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 2.1.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" " GNOME-Keysign beglaubigt OpenPGP-Schlüssel einfach und sicher über das\n" " 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: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" " Das Programm scannt den Barcode eines anderen Schlüssels und " "überträgt\n" " den Schlüssel sicher, was spontane Signierpartys 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:165 msgid "Send" msgstr "Senden" #: keysign/app.py:167 keysign/receive.py:238 msgid "Receive" msgstr "Empfangen" #: keysign/app.ui:62 keysign/send.ui:616 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:144 msgid "Offering key: {}" msgstr "Schlüssel wird angeboten: {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:145 msgid "Discovery info: {}" msgstr "Suchinformation: {}" #: keysign/avahioffer.py:83 msgid "Press Enter to stop" msgstr "Eingabetaste zum Stoppen drücken" #: keysign/bluetoothoffer.py:127 msgid "" "\n" "Key successfully sent" msgstr "" "\n" "Schlüssel erfolgreich gesendet" #: keysign/bluetoothoffer.py:129 msgid "" "\n" "An error occurred: {}" msgstr "" "\n" "Es ist ein Fehler aufgetreten: {}" #: keysign/bluetoothoffer.py:131 msgid "Press Enter to exit" msgstr "Eingabetaste zum Beenden drücken" #: 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 ist nicht verfügbar" #: keysign/bluetoothreceive.py:134 msgid "Trying to download the key, please wait" msgstr "Es wird versucht, den Schlüssel herunterzuladen. Bitte warten" #: keysign/gpgmks.py:178 #, python-format msgid "installing symlinks for sockets from %s to %s" msgstr "" "Symbolische Verknüpfungen für Sockets aus %s werden nach %s installiert" #: 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. #: 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/i18n.py:39 msgid "Translated for gettext (C)" msgstr "Übersetzt für gettext (DE)" #: keysign/i18n.py:47 msgid "Translated for Python (C)" msgstr "Übersetzt für Python (DE)" #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Läuft ab: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Schlüssel beglaubigen" #: 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 "" "Es konnten keine GNOME Keysign-Server erkannt werden :-(\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:105 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:124 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Integrierte Webcam" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Sicherheitscode" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "QR-Code scannen" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait ..." msgstr "Schlüsseldaten werden heruntergeladen. Bitte warten …" #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Herunterladen des Schlüssels wurde unterbrochen!" #: keysign/receive.ui:313 keysign/send.ui:527 msgid "page1" msgstr "Seite1" #: 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 "" "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:365 msgid "Key" msgstr "Schlüssel" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "Benutzerkennungen" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "_Bestätigen" #: keysign/receive.ui:521 keysign/send.ui:564 msgid "page2" msgstr "Seite2" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Folgende Benutzerkennungen werden beglaubigt:" #: keysign/receive.ui:615 msgid "page3" msgstr "Seite3" #: keysign/send.py:156 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:162 msgid "There isn't an Internet connection!" msgstr "Es gibt keine Internetverbindung!" #: keysign/send.py:190 keysign/send.ui:545 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: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 "" "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:199 #, 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:58 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:135 msgid "Very slow or no Internet connection!" msgstr "Sehr langsame oder keine Internetverbindung!" #: keysign/send.ui:190 msgid "Select a key for signing" msgstr "Einen Schlüssel zum Beglaubigen auswählen" # CHECK #: keysign/send.ui:206 msgid "Times signed" msgstr "Anzahl erhaltener Signaturen" #: keysign/send.ui:272 msgid "Keylist" msgstr "Schlüsselliste" #: keysign/send.ui:292 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:319 msgid "Key Details" msgstr "Schlüsseldetails" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Fingerabdruck" #: keysign/send.ui:498 msgid "QR Code" msgstr "QR-Code" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Schlüssel auswählen und senden" gnome-keysign-1.2.0/keysign/locale/es/000077500000000000000000000000001355405073600176155ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/es/LC_MESSAGES/000077500000000000000000000000001355405073600214025ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/es/LC_MESSAGES/keysign.po000066400000000000000000000354461355405073600234270ustar00rootroot00000000000000# 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-2019. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign 0.9.7.2\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-08-07 09:49+0000\n" "PO-Revision-Date: 2019-08-21 10:34+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 3.32.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" " 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: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" " 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:187 msgid "Send" msgstr "Enviar" #: keysign/app.py:189 keysign/receive.py:272 msgid "Receive" msgstr "Recibir" #: keysign/app.ui:62 keysign/send.ui:54 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:218 #| msgid "Select a key for signing" 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:568 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:345 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:360 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:403 #| 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." 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: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 "" "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:474 msgid "Key" msgstr "Llave" #: keysign/receive.ui:507 keysign/send.ui:493 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "C_onfirmar" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "Firmando los siguientes UID:" #: keysign/send.py:207 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:213 msgid "There isn't an Internet connection!" msgstr "No hay conexión a Internet." #: keysign/send.py:219 keysign/send.ui:267 msgid "The signature has been successfully imported!" msgstr "La firma se ha importado correctamente." #: 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 "" "A ocurrido un error al intentar importar la firma.\n" "Compruebe que la firma elegida es correcta." #: keysign/send.py:254 keysign/send.ui:678 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: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 "" "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:263 #, 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:121 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:198 msgid "Very slow or no Internet connection!" msgstr "Conexión a Internet muy lenta o no hay conexión." #. 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 "Seleccione una clave para firmar" #: keysign/send.ui:338 msgid "Times signed" msgstr "Veces firmada" #: keysign/send.ui:405 msgid "Keylist" msgstr "Lista de claves" #: keysign/send.ui:425 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:452 msgid "Key Details" msgstr "Detalles de la clave" #: keysign/send.ui:477 msgid "Fingerprint" msgstr "Huella dactilar" #: keysign/send.ui:631 msgid "QR Code" msgstr "Código QR" #: keysign/util.py:223 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.2.0/keysign/locale/fi/000077500000000000000000000000001355405073600176045ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/fi/LC_MESSAGES/000077500000000000000000000000001355405073600213715ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/fi/LC_MESSAGES/keysign.po000066400000000000000000000220751355405073600234100ustar00rootroot00000000000000# 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.2.0/keysign/locale/fr/000077500000000000000000000000001355405073600176155ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/fr/LC_MESSAGES/000077500000000000000000000000001355405073600214025ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/fr/LC_MESSAGES/keysign.po000066400000000000000000000273171355405073600234250ustar00rootroot00000000000000# 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.2.0/keysign/locale/fur/000077500000000000000000000000001355405073600200025ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/fur/LC_MESSAGES/000077500000000000000000000000001355405073600215675ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/fur/LC_MESSAGES/keysign.po000066400000000000000000000310331355405073600236000ustar00rootroot00000000000000# 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: 2019-01-22 20:53+0000\n" "PO-Revision-Date: 2019-02-09 17:08+0100\n" "Language-Team: Friulian \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: fur\n" "Last-Translator: Fabio Tomat \n" "X-Generator: Poedit 2.2\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" " 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: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" " 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:181 msgid "Send" msgstr "Invie" #: keysign/app.py:183 keysign/receive.py:238 msgid "Receive" msgstr "Ricêf" #: keysign/app.ui:62 keysign/send.ui:616 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Ufrint la clâf: {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informazion pe ricercje : {}" #: keysign/avahioffer.py:83 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 ce mût riprodusi l'erôr,\n" " al è ancjemò miôr.\n" "\n" " #### Traceback\n" " " #. TRANSLATORS: Please include your locale, e.g. "de". We're trying to debug native #. gettext #: keysign/i18n.py:39 msgid "Translated for gettext (C)" msgstr "Tradot par gettext (C)" #. TRANSLATORS: Please include your locale, e.g. "de". We're trying to debug pure #. python gettext #: keysign/i18n.py:47 msgid "Translated for Python (C)" msgstr "Tradot par Python (C)" #: keysign/keylistwidget.py:83 msgid "Expires: " msgstr "Scjadence: " #: keysign/receive.py:158 msgid "Sign Key" msgstr "Firme clâf" #: 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 "" "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 fâs clic achì." #: keysign/receive.ui:105 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:124 msgid "Camera" msgstr "Fotocjamare" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Web Cam integrade" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Codiç di sigurece" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Scansione codiç a sbaris" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait ..." msgstr "Daûr a discjariâ i dâts de clâf. Spiete ..." #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Il discjariament de clâf al è stât interot!" #: 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 "" "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:365 msgid "Key" msgstr "Clâf" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "C_onferme" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Daûr a firmâ i UID chi sot:" #: keysign/send.py:156 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 semee jessi " "lente o no disponibile." #: keysign/send.py:162 msgid "There isn't an Internet connection!" msgstr "No si à une conession a internet!" #: keysign/send.py:190 keysign/send.ui:545 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: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 "" "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:199 #, 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:58 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:135 msgid "Very slow or no Internet connection!" msgstr "Une vore lente o nissune conession a internet!" #: keysign/send.ui:190 msgid "Select a key for signing" msgstr "Selezione une clâf par firmâ" #: keysign/send.ui:206 msgid "Times signed" msgstr "Voltis firmade" #: keysign/send.ui:272 msgid "Keylist" msgstr "Liste des clâfs" #: keysign/send.ui:292 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:319 msgid "Key Details" msgstr "Detais clâf" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Impronte" #: keysign/send.ui:498 msgid "QR Code" msgstr "Codiç QR" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Selezione e invie clâf" #: 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 "" "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" gnome-keysign-1.2.0/keysign/locale/hr/000077500000000000000000000000001355405073600176175ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/hr/LC_MESSAGES/000077500000000000000000000000001355405073600214045ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/hr/LC_MESSAGES/keysign.po000066400000000000000000013467461355405073600234420ustar00rootroot00000000000000# 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: \n" "POT-Creation-Date: 2019-06-11 09:34+0000\n" "PO-Revision-Date: 2019-06-22 18:13+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.2.1\n" #. TRANSLATORS: This is the designation for the last (most west) timezone on Earth #. https://en.wikipedia.org/wiki/Anywhere_on_Earth 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" #. FIXME: rename this to Atlantic Ocean 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" #. AF - Afghanistan msgid "Afghanistan" msgstr "Afganistan" #. AL - Albania msgid "Albania" msgstr "Albanija" #. DZ - Algeria msgid "Algeria" msgstr "Alžir" #. AS - American Samoa, a territory of the United States in the #. South Pacific, not to be confused with the separate nation #. of "Samoa". #. msgid "American Samoa" msgstr "Američka Samoa" #. AD - Andorra msgid "Andorra" msgstr "Andora" #. AO - Angola msgid "Angola" msgstr "Angola" #. AI - Anguilla, a British territory in the Caribbean msgid "Anguilla" msgstr "Anguilla" #. AQ - Antarctica msgctxt "Country" msgid "Antarctica" msgstr "Antarktika" #. AG - Antigua and Barbuda msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. AR - Argentina msgid "Argentina" msgstr "Argentina" #. AM - Armenia #. A city in Colombia msgid "Armenia" msgstr "Armenija" #. AW - Aruba, a Caribbean island that is one of the three #. constituent countries of the Kingdom of the Netherlands. #. msgid "Aruba" msgstr "Aruba" #. AU - Australia msgid "Australia" msgstr "Australia" #. AT - Austria msgid "Austria" msgstr "Austrija" #. AZ - Azerbaijan msgid "Azerbaijan" msgstr "Azerbaijan" #. BS - Bahamas msgid "Bahamas" msgstr "Bahamas" #. BH - Bahrain msgid "Bahrain" msgstr "Bahrain" #. BD - Bangladesh msgid "Bangladesh" msgstr "Bangladeš" #. BB - Barbados msgid "Barbados" msgstr "Barbados" #. BY - Belarus msgid "Belarus" msgstr "Belarus" #. BE - Belgium. The local names for the country are "België" #. (Dutch), Belgique (French), and Belgien (German). #. msgid "Belgium" msgstr "Belgija" #. BZ - Belize msgid "Belize" msgstr "Belize" #. BJ - Benin msgid "Benin" msgstr "Benin" #. BM - Bermuda, a British territory off the coast of the #. United States #. msgid "Bermuda" msgstr "Bermuda" #. BT - Bhutan msgid "Bhutan" msgstr "Butan" #. BO - Bolivia msgid "Bolivia" msgstr "Bolivia" #. BA - Bosnia and Herzegovina msgid "Bosnia and Herzegovina" msgstr "Bosna i Hercegovina" #. BW - Botswana msgid "Botswana" msgstr "Botswana" #. BR - Brazil msgid "Brazil" msgstr "Brazil" #. IO - British Indian Ocean Territory, which is exactly what #. it sounds like. #. msgid "British Indian Ocean Territory" msgstr "British Indian oceanski teritorij" #. VG - British Virgin Islands, a British territory in the #. Caribbean #. msgid "British Virgin Islands" msgstr "British Virgin otočje" #. BN - Brunei Darussalam msgid "Brunei" msgstr "Brunei" #. BG - Bulgaria msgid "Bulgaria" msgstr "Bugarska" #. BF - Burkina Faso msgid "Burkina Faso" msgstr "Burkina Faso" #. BI - Burundi msgid "Burundi" msgstr "Burundi" #. KH - Cambodia msgid "Cambodia" msgstr "Cambodia" #. CM - Cameroon msgid "Cameroon" msgstr "Cameroon" #. CA - Canada msgid "Canada" msgstr "Canada" #. CV - Cape Verde msgid "Cape Verde" msgstr "Cape Verde" #. KY - Cayman Islands, a British territory in the Caribbean msgid "Cayman Islands" msgstr "Cayman otočje" #. CF - Central African Republic msgid "Central African Republic" msgstr "Centralna afrička republika" #. TD - Chad msgid "Chad" msgstr "Čad" #. CL - Chile msgid "Chile" msgstr "Čile" #. CN - China. (The official ISO 3166 short English name does #. not include "The People's Republic of".) #. msgid "China" msgstr "Kina" #. CX - Christmas Island, a territory of Australia in the #. Indian Ocean, not to be confused with various other islands #. of the same name. #. msgid "Christmas Island" msgstr "Božični otoci" #. CC - Cocos (Keeling) Islands, a territory of Australia in #. the Indian Ocean. The "(Keeling)" is to distinguish them #. from other "Cocos Island"s, and is part of the official name. #. msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Otočje" #. CO - Colombia msgid "Colombia" msgstr "Kolumbija" #. KM - Comoros msgid "Comoros" msgstr "Comoros" #. CD - Democratic Republic of the Congo msgid "Congo, Democratic Republic of the" msgstr "Demokratska republika Kongo" #. CG - Republic of the Congo. The official ISO 3166 short #. English name is simply "Congo"; we use the long name to #. better distinguish it from CD (The Democratic Republic of #. the Congo). #. msgid "Congo, Republic of the" msgstr "Republika Kongo" #. CK - Cook Islands msgid "Cook Islands" msgstr "Cook otok" #. CR - Costa Rica msgid "Costa Rica" msgstr "Costa Rica" #. HR - Croatia msgid "Croatia" msgstr "Hrvatska" #. CU - Cuba msgid "Cuba" msgstr "Kuba" #. CY - Cyprus msgid "Cyprus" msgstr "Cipar" #. CZ - Czech Republic msgid "Czech Republic" msgstr "Republika Češka" #. CI - Côte d'Ivoire msgid "Côte d'Ivoire" msgstr "Côte d'Ivoire" #. DK - Denmark. The Danish name is "Danmark" msgid "Denmark" msgstr "Danska" #. DJ - Djibouti msgctxt "Country" msgid "Djibouti" msgstr "Džibuti" #. DM - Dominica, a Caribbean island nation, not to be confused #. with the Domincan Republic. #. msgid "Dominica" msgstr "Dominica" #. DO - Dominican Republic msgid "Dominican Republic" msgstr "Dominikanska republika" #. EC - Ecuador msgid "Ecuador" msgstr "Ekvador" #. EG - Egypt msgid "Egypt" msgstr "Egipat" #. SV - El Salvador msgid "El Salvador" msgstr "El Salvador" #. GQ - Equatorial Guinea msgid "Equatorial Guinea" msgstr "Ekvatorska gvineja" #. ER - Eritrea msgid "Eritrea" msgstr "Eritreja" #. EE - Estonia msgid "Estonia" msgstr "Estonia" #. ET - Ethiopia msgid "Ethiopia" msgstr "Etiopija" #. FK - Falkland Islands (Malvinas), a British territory in the #. South Atlantic also claimed by Argentina. (The British name #. is "Falkland Islands". The Argentine name is "Islas #. Malvinas". The parenthesized form is the compromise used by #. ISO and the UN.) #. msgid "Falkland Islands (Malvinas)" msgstr "Falklandski Otoci (Malvinski Otoci)" #. FO - Faroe Islands, an autonomous province of Denmark in the #. north Atlantic. #. msgid "Faroe Islands" msgstr "Faroe otočje" #. FJ - Fiji msgid "Fiji" msgstr "Fiji" #. FI - Finland msgid "Finland" msgstr "Finska" #. FR - France msgid "France" msgstr "Francuska" #. GF - French Guiana, an overseas department of France on the #. northern coast of South America. #. msgid "French Guiana" msgstr "Francuska Guiana" #. PF - French Polynesia, a French territory in the South #. Pacific #. msgid "French Polynesia" msgstr "Francuska Polinezija" #. TF - French Southern Territories, a territory of France #. consisting of several mostly-uninhabited islands in the #. Indian Ocean. The French name is "Terres australes #. françaises". #. msgid "French Southern Territories" msgstr "Francuski južni i antarktički teritoriji" #. GA - Gabon msgid "Gabon" msgstr "Gabon" #. GM - Gambia msgid "Gambia" msgstr "Gambija" #. GE - Georgia (the country, not the US state) msgctxt "Country" msgid "Georgia" msgstr "Gruzija" #. DE - Germany msgid "Germany" msgstr "Njemačka" #. GH - Ghana msgid "Ghana" msgstr "Ghana" #. GI - Gibraltar, a British overseas territory on the southern #. tip of Spain. #. msgctxt "Country" msgid "Gibraltar" msgstr "Gibraltar" #. GR - Greece msgid "Greece" msgstr "Grčka" #. GL - Greenland, an autonomous province of Denmark in the #. North Atlantic. #. msgid "Greenland" msgstr "Greenland" #. GD - Grenada msgid "Grenada" msgstr "Grenada" #. GP - Guadeloupe, an overseas department of France in the #. Caribbean. #. msgid "Guadeloupe" msgstr "Guadeloupe" #. GU - Guam, a territory of the United States in the South #. Pacific. #. msgid "Guam" msgstr "Guam" #. GT - Guatemala msgctxt "Country" msgid "Guatemala" msgstr "Gvatemala" #. GG - The Bailiwick of Guernsey, a British Crown dependency msgid "Guernsey" msgstr "Guernsey" #. GN - Guinea msgid "Guinea" msgstr "Gvineja" #. GW - Guinea-Bissau msgid "Guinea-Bissau" msgstr "Gvineja-Bissau" #. GY - Guyana msgid "Guyana" msgstr "Guyana" #. HT - Haiti msgid "Haiti" msgstr "Haiti" #. HN - Honduras msgid "Honduras" msgstr "Honduras" #. HK - Hong Kong, aka "Hong Kong Special Administrative Region #. of China" #. msgid "Hong Kong" msgstr "Hong Kong" #. HU - Hungary msgid "Hungary" msgstr "Mađarska" #. IS - Iceland msgid "Iceland" msgstr "Island" #. IN - India msgid "India" msgstr "Indija" #. ID - Indonesia msgid "Indonesia" msgstr "Indonezija" #. IR - Islamic Republic of Iran msgid "Iran" msgstr "Iran" #. IQ - Iraq msgid "Iraq" msgstr "Irak" #. IE - Ireland msgid "Ireland" msgstr "Irska" #. IM - Isle of Man, a British Crown dependency msgid "Isle of Man" msgstr "Isle of Man" #. IL - Israel msgid "Israel" msgstr "Israel" #. IT - Italy msgid "Italy" msgstr "Italija" #. JM - Jamaica msgid "Jamaica" msgstr "Jamaika" #. JP - Japan msgid "Japan" msgstr "Japan" #. JE - The Bailiwick of Jersey, a British Crown dependency msgid "Jersey" msgstr "Jersey" #. JO - Jordan msgctxt "Country" msgid "Jordan" msgstr "Jordan" #. KZ - Kazakhstan msgid "Kazakhstan" msgstr "Kazakhstan" #. KE - Kenya msgid "Kenya" msgstr "Kenya" #. KI - Kiribati msgid "Kiribati" msgstr "Kiribati" #. XK, Kosovo msgid "Kosovo" msgstr "Kosovo" #. KW - Kuwait msgctxt "Country" msgid "Kuwait" msgstr "Kuvajt" #. KG - Kyrgyzstan msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. LA - Lao People's Democratic Republic msgid "Laos" msgstr "Laos" #. LV - Latvia msgid "Latvia" msgstr "Latvia" #. LB - Lebanon msgctxt "Country" msgid "Lebanon" msgstr "Libanon" #. LS - Lesotho msgid "Lesotho" msgstr "Lesotho" #. LR - Liberia msgctxt "Country" msgid "Liberia" msgstr "Liberija" #. LY - Libyan Arab Jamahiriya msgid "Libya" msgstr "Libya" #. LI - Liechtenstien msgid "Liechtenstein" msgstr "Lihtenštajn" #. LT - Lithuania msgid "Lithuania" msgstr "Lithuania" #. LU - Luxembourg msgctxt "Country" msgid "Luxembourg" msgstr "Luksemburg" #. MO - Macao, aka "Macao Special Administrative Region of #. China". (The spellings "Macao" and "Macau" are both widely #. used. The "u" spelling is currently slightly more popular in #. English.) #. msgctxt "Country" msgid "Macau" msgstr "Makau" #. MK - The Former Yugoslav Republic of Macedonia msgid "Macedonia" msgstr "Makedonija" #. MG - Madagascar msgid "Madagascar" msgstr "Madagascar" #. MW - Malawi msgid "Malawi" msgstr "Malawi" #. MY - Malaysia msgid "Malaysia" msgstr "Malaysia" #. MV - Maldives msgid "Maldives" msgstr "Maldives" #. ML - Mali msgid "Mali" msgstr "Mali" #. MT - Malta msgctxt "Country" msgid "Malta" msgstr "Malta" #. MH - Marshall Islands msgid "Marshall Islands" msgstr "Marshall otočje" #. MQ - Martinique, an overseas department of France in the #. Caribbean. #. msgid "Martinique" msgstr "Martinique" #. MR - Mauritania msgid "Mauritania" msgstr "Mauritania" #. MU - Mauritius msgid "Mauritius" msgstr "Mauritius" #. YT - Mayotte msgid "Mayotte" msgstr "Majote" #. MX - Mexico msgid "Mexico" msgstr "Meksiko" #. FM - Federated States of Micronesia msgid "Micronesia, Federated States of" msgstr "Micronesia, Federativna država" #. MD - Moldova msgid "Moldova" msgstr "Moldova" #. MC - Monaco msgctxt "Country" msgid "Monaco" msgstr "Monako" #. MN - Mongolia msgid "Mongolia" msgstr "Mongolia" #. ME - Montenegro msgid "Montenegro" msgstr "Crna Gora" #. MS - Montserrat, a British territory in the Caribbean. msgid "Montserrat" msgstr "Montserrat" #. MA - Morocco msgid "Morocco" msgstr "Morocco" #. MZ - Mozambique msgid "Mozambique" msgstr "Mozambik" #. MM - Myanmar (also known as Burma, but "Myanmar" is #. currently the official ISO 3166 short English name, and gets #. more Google hits in English) #. msgid "Myanmar" msgstr "Myanmar" #. NA - Namibia msgid "Namibia" msgstr "Namibija" #. NR - Nauru msgid "Nauru" msgstr "Nauru" #. NP - Nepal msgid "Nepal" msgstr "Nepal" #. NL - Netherlands msgid "Netherlands" msgstr "Nizozemska" #. AN - Netherlands Antilles, a group of Caribbean islands; one #. of the three constituent countries of the Kingdom of the #. Netherlands. #. msgid "Netherlands Antilles" msgstr "Nizozemski antili" #. NC - New Caledonia, a French territory in the South Pacific. #. The French name is "Nouvelle-Calédonie". #. msgid "New Caledonia" msgstr "New Caledonia" #. NZ - New Zealand msgid "New Zealand" msgstr "New Zealand" #. NI - Nicaragua msgid "Nicaragua" msgstr "Nicaragua" #. NE - Niger msgid "Niger" msgstr "Niger" #. NG - Nigeria msgid "Nigeria" msgstr "Nigeria" #. NU - Niue msgid "Niue" msgstr "Niue" #. NF - Norfolk Island, a territory of Australia msgid "Norfolk Island" msgstr "Norfolk otok" #. KP - The Democratic People's Republic of Korea, aka North #. Korea #. msgid "North Korea" msgstr "Sjeverna Korea" #. MP - Northern Mariana Islands, a semi-independent territory #. of the United States in the western Pacific Ocean. #. msgid "Northern Mariana Islands" msgstr "Sjeverno Marijansko otočje" #. NO - Norway msgid "Norway" msgstr "Norway" #. OM - Oman msgid "Oman" msgstr "Oman" #. PK - Pakistan msgid "Pakistan" msgstr "Pakistan" #. PW - Palau msgid "Palau" msgstr "Palau" #. PS - Occupied Palestinian Territory msgid "Palestinian Territory" msgstr "Palestinski teritorij" #. PA - Panama. The local (Spanish) name is "Panamá". In common #. English usage (and in ISO 3166) it does not have the accent. #. msgid "Panama" msgstr "Panama" #. PG - Papua New Guinea msgid "Papua New Guinea" msgstr "Papua New Guinea" #. PY - Paraguay msgid "Paraguay" msgstr "Paraguay" #. PE - Peru msgctxt "Country" msgid "Peru" msgstr "Peru" #. PH - Philippines msgid "Philippines" msgstr "Philipini" #. PN - Pitcairn, a British territory in the South Pacific msgid "Pitcairn" msgstr "Pitcairn" #. PL - Poland msgid "Poland" msgstr "Poljska" #. PT - Portugal msgid "Portugal" msgstr "Portugal" #. PR - Puerto Rico, a territory of the United States in the #. Caribbean. #. msgid "Puerto Rico" msgstr "Puerto Rico" #. QA - Qatar msgid "Qatar" msgstr "Qatar" #. RO - Romania msgid "Romania" msgstr "Rumunjska" #. RU - Russian Federation msgid "Russia" msgstr "Rusija" #. RW - Rwanda msgid "Rwanda" msgstr "Ruanda" #. RE - Réunion, an overseas department of France in the Indian #. Ocean. #. msgid "Réunion" msgstr "Réunion" #. BL - Saint Barthélemy, an overseas territory of France in #. the Caribbean, formerly part of Guadeloupe. #. msgid "Saint Barthélemy" msgstr "Sveti Bartolomej" #. SH - Saint Helena, a British territory in the South Atlantic msgid "Saint Helena" msgstr "Sveta Helena" #. KN - Saint Kitts and Nevis msgid "Saint Kitts and Nevis" msgstr "Sveti Kitts i Nevis" #. LC - Saint Lucia msgid "Saint Lucia" msgstr "Sveta Lucija" #. MF - Saint Martin, the French half of the island of Saint #. Martin / Sint Maarten. (The Dutch half is considered part of #. the Netherlands Antilles.) #. msgid "Saint Martin" msgstr "Sveti Martin" #. PM - Saint Pierre and Miquelon, a French territory in North #. America (off the coast of Newfoundland). The French name is #. "Saint-Pierre-et-Miquelon". #. msgid "Saint Pierre and Miquelon" msgstr "Sveti Pierre i Miquelon" #. VC - Saint Vincent and the Grenadines msgid "Saint Vincent and the Grenadines" msgstr "Sveti Vincent i Grenadines" #. WS - Samoa, an independent nation not to be confused with #. "American Samoa" #. msgid "Samoa" msgstr "Samoa" #. SM - San Marino msgctxt "Country" msgid "San Marino" msgstr "San Marino" #. ST - Sao Tome and Principe. The local (Portuguese) name is #. "São Tomé and Príncipe". The official ISO 3166 short English #. name does not have the accents. #. msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. SA - Saudi Arabia msgid "Saudi Arabia" msgstr "Saudijska Arabija" #. SN - Senegal msgid "Senegal" msgstr "Senegal" #. RS - Serbia msgid "Serbia" msgstr "Srbija" #. SC - Seychelles msgid "Seychelles" msgstr "Seychelles" #. SL - Sierra Leone msgid "Sierra Leone" msgstr "Sierra Leone" #. SG - Singapore msgctxt "Country" msgid "Singapore" msgstr "Singapur" #. SK - Slovakia msgid "Slovakia" msgstr "Slovačka" #. SI - Slovenia msgid "Slovenia" msgstr "Slovenija" #. SB - Solomon Islands msgid "Solomon Islands" msgstr "Otočje Solomon" #. SO - Somalia msgid "Somalia" msgstr "Somalija" #. ZA - South Africa msgid "South Africa" msgstr "Južn Africa" #. GS - South Georgia and the South Sandwich Islands, a British #. territory in the South Atlantic. #. msgid "South Georgia and the South Sandwich Islands" msgstr "Južna Georgija i otočje Južni Sandwich" #. KR - The Republic of Korea, aka South Korea msgid "South Korea" msgstr "Južna Korea" #. ES - Spain msgid "Spain" msgstr "Španjolska" #. LK - Sri Lanka msgid "Sri Lanka" msgstr "Sri Lanka" #. SD - Sudan msgid "Sudan" msgstr "Sudan" #. SR - Suriname msgid "Suriname" msgstr "Suriname" #. SJ - Svalbard and Jan Mayen. Svalbard is an island in the #. Arctic Ocean which is a part of Norway with unusual status #. internationally. #. msgid "Svalbard and Jan Mayen" msgstr "Svalbard i Jan Mayen" #. SZ - Swaziland msgid "Swaziland" msgstr "Swaziland" #. SE - Sweden msgid "Sweden" msgstr "Švedska" #. CH - Switzerland msgid "Switzerland" msgstr "Švicarska" #. SY - Syrian Arab Republic msgid "Syria" msgstr "Sirija" #. TW - Taiwan, Province of China. (That's the official ISO #. 3166 short English name.) #. msgid "Taiwan" msgstr "Tajvan" #. TJ - Tajikistan msgid "Tajikistan" msgstr "Tadžikistan" #. TZ - United Republic of Tanzania msgid "Tanzania" msgstr "Tanzania" #. TH - Thailand msgid "Thailand" msgstr "Tajland" #. TL - Timor-Leste (formerly known as "East Timor") msgid "Timor-Leste" msgstr "Istočni Timor" #. TG - Togo msgid "Togo" msgstr "Togo" #. TK - Tokelau, a territory of New Zealand msgid "Tokelau" msgstr "Tokelau" #. TO - Tonga msgid "Tonga" msgstr "Tonga" #. TT - Trinidad and Tobago msgid "Trinidad and Tobago" msgstr "Trinidad i Tobago" #. TN - Tunisia msgid "Tunisia" msgstr "Tunis" #. TR - Turkey msgid "Turkey" msgstr "Turska" #. TM - Turkmenistan msgid "Turkmenistan" msgstr "Turkmenistan" #. TC - Turks and Caicos Islands, a British territory in the #. Caribbean #. msgid "Turks and Caicos Islands" msgstr "Turski i Caicos otoci" #. TV - Tuvalu msgid "Tuvalu" msgstr "Tuvalu" #. UG - Uganda msgid "Uganda" msgstr "Uganda" #. UA - Ukraine msgid "Ukraine" msgstr "Ukraina" #. AE - United Arab Emirates msgid "United Arab Emirates" msgstr "Ujedinjeni Arapski Emirati" #. GB - United Kingdom msgid "United Kingdom" msgstr "Ujedinjeno Kraljevstvo" #. US - United States, aka United States of America msgid "United States" msgstr "Sjedinjene države" #. UM - United States Minor Outlying Islands, a group of #. mostly-uninhabited United States territories in the South #. Pacific. #. msgid "United States Minor Outlying Islands" msgstr "Sjedinjene države jezera Minor Outlying" #. VI - United States Virgin Islands, a territory of the United #. States in the Caribbean #. msgid "United States Virgin Islands" msgstr "Djevičanski Otoci Sjedinjenih Država" #. UY - Uruguay msgid "Uruguay" msgstr "Uruguay" #. UZ - Uzbekistan msgid "Uzbekistan" msgstr "Uzbekistan" #. VU - Vanuatu msgid "Vanuatu" msgstr "Vanuatu" #. VA - Holy See (Vatican City State) msgid "Vatican City" msgstr "Vatikan" #. VE - Venezuela msgid "Venezuela" msgstr "Venecuela" #. VN - Viet Nam (The official ISO 3166 short English name #. includes a space, though it is also frequently written #. without one.) #. msgid "Viet Nam" msgstr "Viet Nam" #. WF - Wallis and Futuna, a French territory in the South #. Pacific #. msgid "Wallis and Futuna" msgstr "Wallis i Futuna" #. EH - Western Sahara, a disputed territory in western Africa msgid "Western Sahara" msgstr "Western Sahara" #. YE - Yemen msgid "Yemen" msgstr "Yemen" #. ZM - Zambia msgid "Zambia" msgstr "Zambija" #. ZW - Zimbabwe msgid "Zimbabwe" msgstr "Zimbabwe" #. AX - Åland Islands, an autonomous province of Finland msgid "Åland Islands" msgstr "Otoci Åland" #. The time zone used in the western half of the Democratic #. Republic of the Congo. The string is only used in places #. where "Democratic Republic of the Congo" is already #. clear from context. FIXME: is there an official name for #. this zone? #. msgid "Western Congo" msgstr "Zapadni Kongo" #. The time zone used in the eastern half of the Democratic #. Republic of the Congo. The string is only used in places #. where "Democratic Republic of the Congo" is already #. clear from context. FIXME: is there an official name for #. this zone? #. msgid "Eastern Congo" msgstr "Istočni Kongo" #. An American research station in Antarctica, which keeps #. the same time as mainland Chile. The string is only used #. in places where "Antarctica" is already clear from #. context. #. msgid "Palmer Station (Chile Time)" msgstr "Postaja Palmer (čileansko vrijeme)" #. A British research station in Antarctica. The string is #. only used in places where "Antarctica" is already clear #. from context. #. msgid "Rothera Research Station" msgstr "Istraživačka postaja Rothera" #. A Japanese research station in Antarctica. The string is #. only used in places where "Antarctica" is already clear #. from context. #. msgid "Showa Station" msgstr "Postaja Showa" #. An Australian research station in Antarctica. The string #. is only used in places where "Antarctica" is already #. clear from context. #. msgid "Mawson Station" msgstr "Postaja Mawson" #. A Russian research station in Antarctica. The string is #. only used in places where "Antarctica" is already clear #. from context. #. msgid "Vostok Station" msgstr "Postaja Vostok" #. An Australian research station in Antarctica. The string #. is only used in places where "Antarctica" is already #. clear from context. #. msgid "Davis Station" msgstr "Postaja Davis" #. An Australian research station in Antarctica, which #. keeps the same time as Western Australia. The string is #. only used in places where "Antarctica" is already clear #. from context. #. msgid "Casey Station (Western Australia Time)" msgstr "Postaja Casey (zapadnoaustralsko vrijeme)" #. A French research station in Antarctica. The string is #. only used in places where "Antarctica" is already clear #. from context. #. msgid "Dumont d'Urville Station" msgstr "Postaja Dumont d'Urville" #. An American research station in Antarctica, which keeps #. the same time as New Zealand. The string is only used in #. places where "Antarctica" is already clear from context. #. msgid "McMurdo Station (New Zealand Time)" msgstr "Postaja McMurdo (novozelandsko vrijeme)" #. An American research station in Antarctica, which keeps #. the same time as New Zealand. The string is only used in #. places where "Antarctica" is already clear from context. #. msgid "Amundsen-Scott South Pole Station (New Zealand Time)" msgstr "Postaja na južnom polu Amundsen-Scott (novozelansko vrijeme)" #. The time zone used in the eastern half of Kazakhstan. #. FIXME: is there an official name for this zone? #. msgid "Eastern Kazakhstan" msgstr "Istočni Kazahstan" #. The time zone used in the western half of Kazakhstan. #. FIXME: is there an official name for this zone? #. msgid "Western Kazakhstan" msgstr "Zapadni Kazahstan" #. The time zone used in the eastern part of Mongolia. #. FIXME: Is there an official name for this zone? #. msgid "Eastern Mongolia" msgstr "Istočna Mongolija" #. The time zone used in the western part of Mongolia. #. FIXME: Is there an official name for this zone? #. msgid "Western Mongolia" msgstr "Zapadna Mongolija" #. The time zone used in the central part of Mongolia. #. FIXME: Is there an official name for this zone? #. msgid "Central Mongolia" msgstr "Središnja Mongolija" #. The timezone around Danmarkshavn station in Greenland. #. The string is only used in places where "Greenland" is #. already clear from context. #. msgid "Danmarkshavn" msgstr "Danmarkshavn" #. The primary timezone for Greenland, although sources #. seem to point towards calling the area "Western #. Greenland" rathern than just "Greenland". #. msgid "Western Greenland" msgstr "Zapadni Grenland" #. The timezone around Scoresbysund / Ittoqqortoormiit on #. the east coast of Greenland. #. msgid "Eastern Greenland" msgstr "Istočni Grenland" #. The timezone at the Thule US Air Force Base on the west #. coast of Greenland. #. msgid "Thule AFB" msgstr "Zračna baza Thule" #. The time zone used on the east coast of Canada, in #. Bermuda, and on many Caribbean islands. In #. French-speaking parts of Canada it is called "Heure de #. l'Atlantique". The string is only used in places where a #. country is already clear from the context. #. msgid "Atlantic Time" msgstr "Atlantsko vrijeme" #. The time zone used in Western Australia. The string is #. only used in places where "Australia" is already clear #. from context. #. msgid "Western Time" msgstr "Zapadno vrijeme" #. The commonly-used name for an unofficial time zone used #. in part of southwestern Australia. The string is only #. used in places where "Australia" is already clear from #. context. #. msgid "Central Western Time" msgstr "Središnje zapadno vrijrme" #. The time zone used in Central Australia. This string is #. specifically for the time zone as implemented in the #. state of South Australia, and is only used in places #. where "Australia" is already clear from context. #. msgid "Central Time (South Australia)" msgstr "Središnje vrijeme (južna Australija)" #. The time zone used in Central Australia. This string is #. specifically for the time zone as implemented in #. Yancowinna county in the state of New South Wales (NSW), #. which uses Central Time even though the rest of the #. state uses Eastern Time. This string is only used in #. places where "Australia" is already clear from context. #. msgid "Central Time (Yancowinna, NSW)" msgstr "Središnje vrijeme (Yancowinna, NSW)" #. The time zone used in Central Australia. This string is #. specifically for the time zone as implemented in the #. Northern Territory, which does not use Summer Time. This #. string is only used in places where "Australia" is #. already clear from context. #. msgid "Central Time (Northern Territory)" msgstr "Središnje vrijeme (Sjeverni teritorij)" #. The time zone used in Eastern Australia. This string is #. specifically for the time zone as implemented in the #. state of Tasmania, and is only used in places where #. "Australia" is already clear from context. #. msgid "Eastern Time (Tasmania)" msgstr "Istočno vrijeme (Tasmanija)" #. The time zone used in Eastern Australia. This string is #. specifically for the time zone as implemented in the #. state of Victoria, and is only used in places where #. "Australia" is already clear from context. #. msgid "Eastern Time (Victoria)" msgstr "Istočno vrijeme (Victoria)" #. The time zone used in Eastern Australia. This string is #. specifically for the time zone as implemented in the #. state of New South Wales, and is only used in places #. where "Australia" is already clear from context. #. msgid "Eastern Time (New South Wales)" msgstr "Istočno vrijeme (New South Wales)" #. The time zone used in Eastern Australia. This string is #. specifically for the time zone as implemented in the #. state of Queensland, which does not use Summer Time. #. This string is only used in places where "Australia" is #. already clear from context. #. msgid "Eastern Time (Queensland)" msgstr "Istočno vrijeme (Queensland)" #. The time zone used on Lord Howe Island, off the east #. coast of Australia. This string is only used in places #. where "Australia" is already clear from context. #. msgid "Lord Howe Island" msgstr "Otok Lord Howe" #. This refers to the time zone in the Society Islands of #. French Polynesia (including in particular the island of #. Tahiti). This string is only used in places where #. "French Polynesia" is already clear from context. #. msgid "Tahiti / Society Islands" msgstr "Tahiti / Društveni otoci" #. This refers to the time zone in the Marquesas Islands of #. French Polynesia. This string is only used in places #. where "French Polynesia" is already clear from context. #. msgid "Marquesas Islands" msgstr "Otoci Marquesas" #. This refers to the time zone in the Gambier Islands of #. French Polynesia. This string is only used in places #. where "French Polynesia" is already clear from context. #. msgid "Gambier Islands" msgstr "Otoci Gambier" #. The timezone on the western islands of Indonesia. The #. name in Indonesian is "Waktu Indonesia Bagian Barat". #. msgid "Western Indonesia Time" msgstr "Zapadno indonezijsko vrijeme" #. The timezone on the central islands of Indonesia. The #. name in Indonesian is "Waktu Indonesia Bagian Tengah". #. msgid "Central Indonesia Time" msgstr "Srednje indonezijsko vrijeme" #. The timezone on the eastern islands of Indonesia. The #. name in Indonesian is "Waktu Indonesia Bagian Timur". #. msgid "Eastern Indonesia Time" msgstr "Istočno indonezijsko vrijeme" #. The time zone in the Gilbert Islands, one of the three #. main island groups of Kiribati. This string is only used #. in places where "Kiribati" is already clear from context. #. msgid "Gilbert Islands" msgstr "Gilbertovi otoci" #. The time zone in the Phoenix Islands, one of the three #. main island groups of Kiribati. This string is only used #. in places where "Kiribati" is already clear from context. #. msgid "Phoenix Islands" msgstr "Otoci Phoenix" #. The time zone in the Line Islands, one of the three main #. island groups of Kiribati. This string is only used in #. places where "Kiribati" is already clear from context. #. msgid "Line Islands" msgstr "Otoci Line" #. One of two time zones in the Federated States of #. Micronesia, including the islands of Pohnpei and Kosrae. #. The string is only used in places where "Micronesia" is #. already clear from context. #. msgid "Pohnpei / Kosrae" msgstr "Pohnpei / Kosrae" #. One of two time zones in the Federated States of #. Micronesia, including the islands of Yap and Chuuk. The #. string is only used in places where "Micronesia" is #. already clear from context. #. msgid "Yap / Chuuk" msgstr "Yap / Chuuk" #. This refers to the "mainland" of New Zealand (ie, North #. Island and South Island), to distinguish it from the #. Chatham Islands. The string is only used in places where #. "New Zealand" is already clear from context. FIXME: is #. there a better name for this? "Mainland" seems odd in #. reference to an island nation... #. msgid "Mainland New Zealand" msgstr "Središnji Novi zeland" #. This refers to the time zone in the Chatham Islands of #. New Zealand. #. msgid "Chatham Islands" msgstr "Otoci Chatham" #. The time zone for the Johnston Atoll in the United #. States Minor Outlying Islands, which keeps the same time #. as the US state of Hawaii. The string is only used in #. places where "US Minor Outlying Islands" is already #. clear from context. #. msgid "Johnston Atoll (Hawaii Time)" msgstr "Atol Johnston (havajsko vrijeme)" #. The time zone for the Midway Atoll in the United States #. Minor Outlying Islands, which uses the same time as #. American Samoa (which is in fact also the same time zone #. as (non-American) Samoa). The string is only used in #. places where "US Minor Outlying Islands" is already #. clear from context. #. msgid "Midway Atoll (Samoa Time)" msgstr "Atol Midway (samoansko vrijeme)" #. The time zone for Wake Island in the United States Minor #. Outlying Islands. The string is only used in places #. where "US Minor Outlying Islands" is already clear from #. context. #. msgid "Wake Island" msgstr "Otok Wake" #. This represents the time zone in the Brazilian state of #. Tocantins. See the comment on "Brasília Time" for more #. details. This string is only used in places where #. "Brazil" is already clear from context. #. msgid "Tocantins" msgstr "Tocantins" #. This represents the time zone in the Brazilian state of #. Bahia. See the comment on "Brasília Time" for more #. details. This string is only used in places where #. "Brazil" is already clear from context. #. msgctxt "Timezone" msgid "Bahia" msgstr "Bahia" #. This represents the time zone in the Brazilian state of #. Amapá and the eastern part of Pará. See the comment on #. "Brasília Time" for more details. This string is only #. used in places where "Brazil" is already clear from #. context. #. msgid "Amapá / East Pará" msgstr "Amapá / Istočna Pará" #. This represents the time zone in the Brazilian state of #. Roraima. See the comment on "Brasília Time" for more #. details. This string is only used in places where #. "Brazil" is already clear from context. #. msgctxt "Timezone" msgid "Roraima" msgstr "Roraima" #. This represents the time zone in the Brazilian state of #. Mato Grosso do Sul. See the comment on "Brasília Time" #. for more details. This string is only used in places #. where "Brazil" is already clear from context. #. msgctxt "Timezone" msgid "Mato Grosso do Sul" msgstr "Mato Grosso do Sul" #. This represents the time zone in the Brazilian state of #. Mato Grosso. See the comment on "Brasília Time" for more #. details. This string is only used in places where #. "Brazil" is already clear from context. #. msgctxt "Timezone" msgid "Mato Grosso" msgstr "Mato Grosso" #. This represents the time zone in the western part of the #. Brazilian state of Amazonas. See the comment on #. "Brasília Time" for more details. This string is only #. used in places where "Brazil" is already clear from #. context. #. msgid "West Amazonas" msgstr "Zapadna Amazona" #. This represents the time zone in the Brazilian states of #. Ceará, Maranhão, Paraíba, Piauí, and Rio Grande do #. Norte. See the comment on "Brasília Time" for more #. details. This string is only used in places where #. "Brazil" is already clear from context. #. msgid "Ceará, Maranhão, Paraíba, Piauí, Rio Grande do Norte" msgstr "Ceará, Maranhão, Paraíba, Piauí, Rio Grande do Norte" #. This represents the time zone in the Brazilian states of #. Alagoas and Sergipe. See the comment on "Brasília Time" #. for more details. This string is only used in places #. where "Brazil" is already clear from context. #. msgid "Alagoas, Sergipe" msgstr "Alagoas, Sergipe" #. This represents the time zone in the eastern part of the #. Brazilian state of Amazonas. See the comment on #. "Brasília Time" for more details. This string is only #. used in places where "Brazil" is already clear from #. context. #. msgid "East Amazonas" msgstr "Istočna Amazona" #. This represents the time zone on the Brazilian island of #. Fernando de Noronha. See the comment on "Brasília Time" #. for more details. This string is only used in places #. where "Brazil" is already clear from context. #. msgid "Fernando de Noronha" msgstr "Fernando de Noronha" #. This represents the time zone in the Brazilian state of #. Rondônia and the western part of Pará. See the comment #. on "Brasília Time" for more details. This string is only #. used in places where "Brazil" is already clear from #. context. #. msgid "West Pará, Rondônia" msgstr "Zapadna Pará, Rondônia" #. This represents the time zone in the Brazilian state of #. Pernambuco. See the comment on "Brasília Time" for more #. details. This string is only used in places where #. "Brazil" is already clear from context. #. msgctxt "Timezone" msgid "Pernambuco" msgstr "Pernambuco" #. This represents the time zone in the Brazilian state of #. Acre. See the comment on "Brasília Time" for more #. details. This string is only used in places where #. "Brazil" is already clear from context. #. msgctxt "Timezone" msgid "Acre" msgstr "Acre" #. This represents the official "base" time zone in Brazil, #. covering the capital city of Brasília, and those states #. that choose to follow it. Each Brazilian state decides #. on its own each year whether or not to observe Daylight #. Saving Time. The tzdata database breaks the states up #. into groups of states that generally make the same #. decision in a given year. Thus, in any given year, #. several of the time zones will appear to be redundant, #. but exactly which ones seem redundant may differ from #. year to year, and there's no good way to identify the #. zones other than by listing states. Anyway, "Brasília #. Time" is the most common timezone, being used by about a #. third of the states in Brazil (Distrito Federal, #. Espírito Santo, Goiás, Minas Gerais, Paraná, Rio de #. Janeiro, Rio Grande do Sul, Santa Catarina, and São #. Paulo). This string is only used in places where #. "Brazil" is already clear from context. #. msgid "Brasília Time" msgstr "Vrijeme Brazilije" #. This refers to the time zone for mainland Chile (as #. opposed to the time zone for Easter Island). #. msgid "Mainland Chile" msgstr "Središnji Čile" #. This refers to the time zone for Easter Island. The #. string is only used in places where "Chile" is already #. understood from context. #. msgid "Easter Island" msgstr "Uskršnji otok" #. This refers to the time zone for mainland Ecuador (as #. opposed to the time zone for the Galapagos Islands). #. msgid "Mainland Ecuador" msgstr "Središnji Ekvador" #. The time zone for the Galapagos Islands. msgid "Galapagos Islands" msgstr "Otoci Galapagos" #. The time zone in the UK (GMT in the winter, and British #. Summer Time in the summer.) #. msgid "GMT/BST" msgstr "GMT/BST" #. The time zone in Ireland (GMT in the winter, and Irish #. Summer Time in the summer.) #. msgid "GMT/IST" msgstr "GMT/IST" #. This refers to the time zone for the Azores. The string #. is only used in places where "Portugal" is already #. understood from context. #. msgid "Azores" msgstr "Azori" #. This refers to the time zone for the Portuguese island #. of Madeira. The string is only used in places where #. "Portugal" is already understood from context. #. msgid "Madeira" msgstr "Madeira" #. This refers to the time zone for mainland Portugal (as #. opposed to the time zone for the Azores). #. msgid "Mainland Portugal" msgstr "Središnji Portugal" #. A Russian time zone, used in the city and oblast of #. Kaliningrad on the Baltic sea. The Russian name is #. "Калининградское время". This string is only used in #. places where "Russia" is already clear from context. #. msgid "Kaliningrad Time" msgstr "Kalinjingradsko vrijeme" #. A Russian time zone, used in most of the European part #. of Russia, including Moscow. The Russian name is #. "Московское время". This string is only used in places #. where "Russia" is already clear from context. #. msgid "Moscow Time" msgstr "Moskovsko vrijeme" #. A Russian time zone, used in the Samara oblast and #. Udmurtia, on the eastern edge of European Russia. The #. Russian name is "Самарское время". This string is only #. used in places where "Russia" is already clear from #. context. #. msgid "Samara Time" msgstr "Samarsko vrijeme" #. A Russian time zone, used along the Ural mountains, #. including the city of Yekaterinburg. The Russian name is #. "Екатеринбургское время". This string is only used in #. places where "Russia" is already clear from context. #. msgid "Yekaterinburg Time" msgstr "Jekaterinburško vrijeme" #. A Russian time zone, used in the Omsk oblast #. and surrounding areas of south-central Russia. #. The Russian name is "Омское время". This string is only #. used in places where "Russia" is already clear from #. context. #. msgid "Omsk Time" msgstr "Omsko vrijeme" #. A Russian time zone, used in the Novosibirsk oblast. #. The Russian name is "Новосибирское время". #. This string is only used in places #. where "Russia" is already clear from context. #. msgid "Novosibirsk Time" msgstr "Novosibirsk vrijeme" #. A Russian time zone, used in the Krasnoyarsk krai and #. surrounding areas of central Russia. The Russian name is #. "Красноярское время". This string is only used in places #. where "Russia" is already clear from context. #. msgid "Krasnoyarsk Time" msgstr "Krasnojarsko vrijeme" #. A Russian time zone, used in the Irkutsk oblast and #. surrounding areas of south-central Russia. The Russian #. name is "Иркутское время". This string is only used in #. places where "Russia" is already clear from context. #. msgid "Irkutsk Time" msgstr "Irkutsko vrijeme" #. A Russian time zone, used in the city of Yakutsk and #. surrounding areas of east-central Russia. The Russian #. name is "Якутское время". This string is only used in #. places where "Russia" is already clear from context. #. msgid "Yakutsk Time" msgstr "Jakutsko vrijeme" #. A Russian time zone, used in the city of Vladivostok and #. surrounding areas of eastern Russia. The Russian name is #. "Владивостокское время". This string is only used in #. places where "Russia" is already clear from context. #. msgid "Vladivostok Time" msgstr "Vladivostovsko vrijeme" #. A Russian time zone, used in the Magadan oblast and #. surrounding areas of eastern Russia. The Russian name is #. "Магаданское время". This string is only used in places #. where "Russia" is already clear from context. #. msgid "Magadan Time" msgstr "Magadansko vrijeme" #. A Russian time zone, used in the Kamchatka krai and #. Chukotka okrug of far-eastern Russia. The Russian name #. is "Камчатское время". This string is only used in #. places where "Russia" is already clear from context. #. msgid "Kamchatka Time" msgstr "Kamčatsko vrijeme" #. This refers to the time zone for the Canary Islands. The #. string is only used in places where "Spain" is already #. clear from context. #. msgid "Canary Islands" msgstr "Kanarsko otočje" #. This refers to the time zone for mainland Spain (as #. opposed to the time zone for the Canary Islands). #. msgid "Mainland Spain" msgstr "Središnja Španjolska" #. The time zone for the Spanish cities of Ceuta and #. Melilla, on the coast of Africa. The string is only used #. in places where "Spain" is already clear from context. #. msgid "Ceuta and Melilla" msgstr "Ceuta i Melilla" #. The time zone used on most of the west coast of North #. America. In Mexico it is called "Tiempo del Pacífico" #. and in French-speaking parts of Canada it is called #. "Heure du Pacifique". The string is only used in places #. where "US", "Canada" or "Mexico" is already clear from #. the context. #. msgid "Pacific Time" msgstr "Pacifičko vrijeme" #. The time zone used in the central-west part of North #. America (ie, the Rocky Mountains). In Mexico it is #. called "Tiempo de la Montaña", and in French-speaking #. parts of Canada it is called "Heure des Rocheuses". The #. string is only used in places where "US", "Canada" or #. "Mexico" is already clear from the context. #. msgid "Mountain Time" msgstr "Planinsko vrijeme" #. This represents the time zone in the northeastern part #. of the Canadian province of British Columbia (BC), which #. is part of the "Mountain Time" zone, but does not #. observe Daylight Saving Time with the rest of the zone. #. msgid "Mountain Time, no DST (Northeast BC)" msgstr "Planinsko vrijeme, bez ljetnog računanja vremena (sjeveroistočna BC)" #. The time zone used in the central-east part of North #. America. In Mexico it is called "Tiempo del Centro", and #. in French-speaking parts of Canada it is called "Heure #. du Centre". The string is only used in places where #. "US", "Canada" or "Mexico" is already clear from the #. context. #. msgid "Central Time" msgstr "Središnje vrijeme" #. This represents the time zone in the Canadian province #. of Saskatchewan, which is part of the "Central Time" #. zone, but does not observe Daylight Saving Time with the #. rest of the zone. #. msgid "Central Time, no DST (Saskatchewan)" msgstr "Središnje vrijeme, bez ljetnog računanja vremena (Saskatchewan)" #. The time zone used on the east coast of the United #. States, and the corresponding (non-coastal) part of #. Canada. In French-speaking parts of Canada it is called #. "Heure de l'Est". The string is only used in places #. where "US" or "Canada" is already clear from the context. #. msgid "Eastern Time" msgstr "Istočno vrijeme" #. This represents the time zone in certain parts of Canada #. (such as Southampton Island, Nunavut, and Atikokan, #. Ontario) which are part of the "Eastern Time" zone, but #. which do not observe Daylight Saving Time with the rest #. of the zone. #. msgid "Eastern Time, no DST (Southampton Island, etc)" msgstr "Istočno vrijeme, bez ljetnog računanja vremena (Otoci Southampton itd.)" #. This represents the time zone in the far eastern portion #. of the Canadian province of Quebec, which is part of the #. "Atlantic Time" zone, but does not observe Daylight #. Saving Time with the rest of the zone. #. msgid "Atlantic Time, no DST (Eastern Quebec)" msgstr "Atlanstko vrijeme, bez ljetnog računanja vremena (istočni Quebec)" #. The time zone used in the Canadian province of #. Newfoundland. In French-speaking parts of Canada it is #. called "Heure de Terre-Neuve". #. msgid "Newfoundland Time" msgstr "Newfoundlandsko vrijeme" #. "Hawaiian-Aleutian Time" is the official name of the #. time zone used in Hawaii and the Aleutian Islands of #. Alaska in the United States. This string is for the time #. zone as it is observed in the Aleutian Islands (with #. Daylight Saving Time). It is only used in places where #. "United States" is already clear from context. #. msgid "Hawaiian-Aleutian Time (Aleutian Islands)" msgstr "Havajsko-aleutsko vrijeme (Aleutski otoci)" #. "Hawaiian-Aleutian Time" is the official name of the #. time zone used in Hawaii and the Aleutian Islands of #. Alaska in the United States. This string is for the time #. zone as it is observed in Hawaii, where they do not use #. Daylight Saving Time. It is only used in places where #. "United States" is already clear from context. #. msgid "Hawaiian-Aleutian Time, no DST (Hawaii)" msgstr "Havajsko-aleutsko vrijeme, bez ljetnog računanja vremena (Havaji)" #. The time zone used in the majority of Alaska in the #. United States. The string is only used in places where #. "United States" is already clear from context. #. msgid "Alaska Time" msgstr "Aljaško vrijeme" #. This represents the time zone in the US state of #. Arizona, which is part of the "Mountain Time" zone, but #. does not observe Daylight Saving Time with the rest of #. the zone. The string is only used in places where #. "United States" is already clear from context. #. msgid "Mountain Time, no DST (Arizona)" msgstr "Planinsko vrijeme, bez ljetnog računanja vremena (Arizona)" #. A state/province/territory in Australia msgid "Australian Capital Territory" msgstr "Australsko glavno područje" #. A state/province/territory in Australia msgid "New South Wales" msgstr "New South Wales" #. A state/province/territory in Australia msgid "Northern Territory" msgstr "Northern Territory" #. A state/province/territory in Australia msgid "Queensland" msgstr "Queensland" #. A state/province/territory in Australia msgid "South Australia" msgstr "Južna Australija" #. A state/province/territory in Australia msgid "Tasmania" msgstr "Tasmania" #. A state/province/territory in Australia msgctxt "State in Australia" msgid "Victoria" msgstr "Victoria" #. A state/province/territory in Australia msgid "Western Australia" msgstr "Zapadna Australija" #. A state in Belgium. local name (nl): Antwerpen. local name #. (fr): Anvers. local name (de): Antwerpen. #. msgctxt "State in Belgium" msgid "Antwerp" msgstr "Antwerpen" #. A state in Belgium. local name (nl): Brussel, Vlaams- en #. Waals-Brabant. local name (fr): Bruxelles, Brabant flamand #. et wallon. local name (de): Brüssel, Flämish- und #. Wallonisch-Brabant. #. msgid "Brussels, Flemish and Walloon Brabant" msgstr "Brussels, Flemish i Walloon Brabant" #. A state/province/territory in Belgium msgid "East-Flanders" msgstr "Istočna Flandrija" #. A state in Belgium. local name (fr): Hainaut. local name #. (fr_BE): Hinnot. local name (nl): Henegouwen. local name #. (de): Hennegau. #. msgid "Hainaut" msgstr "Hainaut" #. A state in Belgium. local name (nl): Limburg. local name #. (fr): Limbourg. local name (de): Limburg. #. msgid "Limburg" msgstr "Limburg" #. A state in Belgium. local name (fr): Liège. local name #. (fr_BE): Lîdje. local name (nl): Luik. local name (de): #. Lüttich. #. msgid "Liège" msgstr "Liège" #. A state/province/territory in Belgium msgctxt "State in Belgium" msgid "Luxembourg" msgstr "Luksemburg" #. A state/province/territory in Belgium msgid "Namur" msgstr "Namur" #. A state in Belgium. local name (nl): West-Vlaanderen. #. local name (fr): Flandre occidentale. local name (de): #. Westflandern. #. msgid "West-Flanders" msgstr "Zapadna Flandrija" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Acre" msgstr "Acre" #. A state/province/territory in Brazil msgid "Alagoas" msgstr "Alagoas" #. A state/province/territory in Brazil msgid "Amapá" msgstr "Amapá" #. A state/province/territory in Brazil msgid "Amazonas" msgstr "Amazona" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Bahia" msgstr "Bahia" #. A state/province/territory in Brazil msgid "Ceará" msgstr "Ceará" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Distrito Federal" msgstr "Distrito Federal" #. A state/province/territory in Brazil msgid "Espírito Santo" msgstr "Espírito Santo" #. A state/province/territory in Brazil msgid "Goiás" msgstr "Goiás" #. A state/province/territory in Brazil msgid "Maranhão" msgstr "Maranhão" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Mato Grosso" msgstr "Mato Grosso" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Mato Grosso do Sul" msgstr "Mato Grosso do Sul" #. A state/province/territory in Brazil msgid "Minas Gerais" msgstr "Minas Gerais" #. A state/province/territory in Brazil #. A city in Argentina msgid "Paraná" msgstr "Paraná" #. A state/province/territory in Brazil msgid "Paraíba" msgstr "Paraíba" #. A state/province/territory in Brazil msgid "Pará" msgstr "Pará" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Pernambuco" msgstr "Pernambuco" #. A state/province/territory in Brazil msgid "Piauí" msgstr "Piauí" #. A state/province/territory in Brazil msgid "Rio Grande do Norte" msgstr "Rio Grande do Norte" #. A state/province/territory in Brazil msgid "Rio Grande do Sul" msgstr "Rio Grande do Sul" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Rio de Janeiro" msgstr "Rio de Janeiro" #. A state/province/territory in Brazil msgid "Rondônia" msgstr "Rondônia" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "Roraima" msgstr "Roraima" #. A state/province/territory in Brazil msgid "Santa Catarina" msgstr "Santa Catarina" #. A state/province/territory in Brazil msgid "Sergipe" msgstr "Sergipe" #. A state/province/territory in Brazil msgctxt "State in Brazil" msgid "São Paulo" msgstr "São Paulo" #. A state/province/territory in Brazil msgid "Tocantis" msgstr "Tocantis" #. A state/province/territory in Canada msgid "Alberta" msgstr "Alberta" #. A state/province/territory in Canada msgid "British Columbia" msgstr "British Columbia" #. A state/province/territory in Canada msgid "Manitoba" msgstr "Manitoba" #. A state/province/territory in Canada msgid "New Brunswick" msgstr "New Brunswick" #. A state/province/territory in Canada msgid "Newfoundland and Labrador" msgstr "Newfoundland i Labrador" #. A state/province/territory in Canada msgid "Northwest Territories" msgstr "Northwest Territories" #. A state/province/territory in Canada msgid "Nova Scotia" msgstr "Nova Scotia" #. A state/province/territory in Canada msgid "Nunavut" msgstr "Nunavut" #. A state/province/territory in Canada msgctxt "State in Canada" msgid "Ontario" msgstr "Ontario" #. A state/province/territory in Canada msgid "Prince Edward Island" msgstr "Prince Edward otok" #. A state/province/territory in Canada msgctxt "State in Canada" msgid "Quebec" msgstr "Quebec" #. A state/province/territory in Canada msgid "Saskatchewan" msgstr "Saskatchewan" #. FIXME: rename this to Yukon msgid "Yukon Territory" msgstr "Yukon Territory" #. A state/province/territory in China msgid "Anhui" msgstr "Anhui" #. A state/province/territory in China msgctxt "State in China" msgid "Beijing" msgstr "Peking" #. A state/province/territory in China msgctxt "State in China" msgid "Chongqing" msgstr "Chongqing" #. A state/province/territory in China msgid "Fujian" msgstr "Fujian" #. A state/province/territory in China msgid "Gansu" msgstr "Gansu" #. A state/province/territory in China msgid "Guangdong" msgstr "Guangdong" #. A state/province/territory in China msgid "Guangxi" msgstr "Guangxi" #. A state/province/territory in China msgid "Guizhou" msgstr "Guizhou" #. A state/province/territory in China msgid "Hainan" msgstr "Hainan" #. A state/province/territory in China msgid "Heilongjiang" msgstr "Heilongjiang" #. A state/province/territory in China msgid "Henan" msgstr "Henan" #. A state/province/territory in China msgid "Hubei" msgstr "Hubei" #. A state/province/territory in China msgid "Hunan" msgstr "Hunan" #. A state/province/territory in China msgid "Inner Mongolia" msgstr "Unitrašnja Mongolia" #. A state/province/territory in China msgid "Jiangsu" msgstr "Jiangsu" #. A state/province/territory in China msgid "Jilin" msgstr "Jilin" #. A state/province/territory in China msgid "Liaoning" msgstr "Liaoning" #. A state/province/territory in China msgid "Shaanxi" msgstr "Shaanxi" #. A state/province/territory in China msgid "Shandong" msgstr "Shandong" #. A state/province/territory in China msgctxt "State in China" msgid "Shanghai" msgstr "Šangaj" #. A state/province/territory in China msgid "Shanxi" msgstr "Shanxi" #. A state/province/territory in China msgid "Sichuan" msgstr "Sichuan" #. A state/province/territory in China msgctxt "State in China" msgid "Tianjin" msgstr "Tianjin" #. A state/province/territory in China msgid "Xinjiang" msgstr "Xinjiang" #. A state/province/territory in China msgid "Yunnan" msgstr "Yunnan" #. A state/province/territory in China msgid "Zhejiang" msgstr "Zhejiang" msgid "Tbilisi" msgstr "Tbilisi" #. A state/province/territory in Germany msgid "Baden-Württemberg" msgstr "Baden-Württemberg" #. A state in Germany. The local name is "Bayern". Please #. use that unless you know that it has a different name in #. your language. #. msgid "Bavaria" msgstr "Bavarska" #. A state/province/territory in Germany msgctxt "State in Germany" msgid "Berlin" msgstr "Berlin" #. A state/province/territory in Germany msgid "Brandenburg" msgstr "Brandenburg" #. A state/province/territory in Germany msgctxt "State in Germany" msgid "Bremen" msgstr "Bremen" #. A state/province/territory in Germany msgctxt "State in Germany" msgid "Hamburg" msgstr "Hamburg" #. A state in Germany. The local name is "Hessen". Please #. use that unless you know that it has a different name in #. your language. #. msgid "Hesse" msgstr "Hesse" #. A state in Germany. The local name is "Niedersachsen". #. Please use that unless you know that it has a different #. name in your language. #. msgid "Lower Saxony" msgstr "Lower Saxony" #. A state in Germany. The local name is #. "Mecklenburg-Vorpommern". Please use that unless you know #. that it has a different name in your language. #. msgid "Mecklenburg-Western Pomerania" msgstr "Mecklenburg - Western Pomerania" #. A state in Germany. The local name is #. "Nordrhein-Westfalen". Please use that unless you know #. that it has a different name in your language. #. msgid "North Rhine-Westphalia" msgstr "North Rhine- Westphalia" #. A state in Germany. The local name is "Rheinland-Pfalz". #. Please use that unless you know that it has a different #. name in your language. #. msgid "Rhineland-Palatinate" msgstr "Rhineland - Palatinate" #. A state/province/territory in Germany msgid "Saarland" msgstr "Saarland" #. A state in Germany. The local name is "Sachsen". Please #. use that unless you know that it has a different name in #. your language. #. msgid "Saxony" msgstr "Saxony" #. A state in Germany. The local name is "Sachsen-Anhalt". #. Please use that unless you know that it has a different #. name in your language. #. msgid "Saxony-Anhalt" msgstr "Saxony - Anhalt" #. A state in Germany. The Danish name is "Slesvig-Holsten". msgid "Schleswig-Holstein" msgstr "Schleswig - Holstein" #. A state in Germany. The local name is "Thüringen". Please #. use that unless you know that it has a different name in #. your language. #. msgid "Thuringia" msgstr "Thuringia" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Aguascalientes" msgstr "Aguascalientes" #. A state/province/territory in Mexico msgid "Baja California" msgstr "Baja California" #. A state/province/territory in Mexico msgid "Baja California Sur" msgstr "Baja California Sur" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Campeche" msgstr "Campeche" #. A state/province/territory in Mexico msgid "Chiapas" msgstr "Chiapas" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Chihuahua" msgstr "Chihuahua" #. A state/province/territory in Mexico msgid "Coahuila" msgstr "Coahuila" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Colima" msgstr "Colima" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Distrito Federal" msgstr "Distrito Federal" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Durango" msgstr "Durango" #. A state/province/territory in Mexico msgid "Guanajuato" msgstr "Guanajuato" #. A state/province/territory in Mexico msgid "Guerrero" msgstr "Guerrero" #. A state/province/territory in Mexico msgid "Hidalgo" msgstr "Hidalgo" #. A state/province/territory in Mexico msgid "Jalisco" msgstr "Jalisco" #. A state/province/territory in Mexico msgid "Michoacán" msgstr "Michoacán" #. A state/province/territory in Mexico msgid "Morelos" msgstr "Morelos" #. A state/province/territory in Mexico msgid "México" msgstr "México" #. A state/province/territory in Mexico msgid "Nayarit" msgstr "Nayarit" #. A state/province/territory in Mexico msgid "Nuevo León" msgstr "Nuevo León" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Oaxaca" msgstr "Oaxaca" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Puebla" msgstr "Puebla" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Querétaro" msgstr "Querétaro" #. A state/province/territory in Mexico msgid "Quintana Roo" msgstr "Quintana Roo" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "San Luis Potosí" msgstr "San Luis Potosí" #. A state/province/territory in Mexico msgid "Sinaloa" msgstr "Sinaloa" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Sonora" msgstr "Sonora" #. A state/province/territory in Mexico msgid "Tabasco" msgstr "Tabasco" #. A state/province/territory in Mexico msgid "Tamaulipas" msgstr "Tamaulipas" #. A state/province/territory in Mexico msgid "Tlaxcala" msgstr "Tlaxcala" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Veracruz" msgstr "Veracruz" #. A state/province/territory in Mexico msgid "Yucatán" msgstr "Yucatán" #. A state/province/territory in Mexico msgctxt "State in Mexico" msgid "Zacatecas" msgstr "Zacatecas" #. A state/province/territory in United Kingdom msgid "East and South East England" msgstr "Istočna i jugoistočna Engleska" #. A state/province/territory in United Kingdom msgid "Midlands" msgstr "Midlands" #. A state/province/territory in United Kingdom msgid "North East England" msgstr "North East England" #. A state/province/territory in United Kingdom msgid "North West England" msgstr "North West England" #. A state/province/territory in United Kingdom msgid "Northern Ireland" msgstr "Northern Ireland" #. A state/province/territory in United Kingdom msgid "Scotland" msgstr "Škotska" #. A state/province/territory in United Kingdom msgid "South and South West England" msgstr "Južna i jugozapadna Engleska" #. A state/province/territory in United Kingdom msgid "Wales" msgstr "Wales" #. A state/province/territory in United States msgid "Alabama" msgstr "Alabama" #. A state/province/territory in United States msgid "Alaska" msgstr "Aljaska" #. A state/province/territory in United States msgid "Arizona" msgstr "Arizona" #. A state/province/territory in United States msgid "Arkansas" msgstr "Arkansas" #. A state/province/territory in United States msgid "California" msgstr "Kalifornija" #. A state/province/territory in United States msgid "Colorado" msgstr "Colorado" #. A state/province/territory in United States msgid "Connecticut" msgstr "Connecticut" #. A state/province/territory in United States msgid "Delaware" msgstr "Delaware" #. A state/province/territory in United States msgid "District of Columbia" msgstr "District of Columbia" #. A state/province/territory in United States msgid "Florida" msgstr "Florida" #. A state/province/territory in United States msgctxt "State in United States" msgid "Georgia" msgstr "Georgia" #. A state/province/territory in United States msgid "Hawaii" msgstr "Hawaii" #. A state/province/territory in United States msgid "Idaho" msgstr "Idaho" #. A state/province/territory in United States msgid "Illinois" msgstr "Illinois" #. A state/province/territory in United States msgctxt "State in United States" msgid "Indiana" msgstr "Indiana" #. A state/province/territory in United States msgid "Iowa" msgstr "Iowa" #. A state/province/territory in United States msgid "Kansas" msgstr "Kansas" #. A state/province/territory in United States msgid "Kentucky" msgstr "Kentucky" #. A state/province/territory in United States msgid "Louisiana" msgstr "Louisiana" #. A state/province/territory in United States msgid "Maine" msgstr "Maine" #. A state/province/territory in United States msgid "Maryland" msgstr "Maryland" #. A state/province/territory in United States msgid "Massachusetts" msgstr "Massachusetts" #. A state/province/territory in United States msgid "Michigan" msgstr "Michigan" #. A state/province/territory in United States msgid "Minnesota" msgstr "Minnesota" #. A state/province/territory in United States msgid "Mississippi" msgstr "Mississippi" #. A state/province/territory in United States msgid "Missouri" msgstr "Missouri" #. A state/province/territory in United States msgid "Montana" msgstr "Montana" #. A state/province/territory in United States msgid "Nebraska" msgstr "Nebraska" #. A state/province/territory in United States msgid "Nevada" msgstr "Nevada" #. A state/province/territory in United States msgid "New Hampshire" msgstr "New Hampshire" #. A state/province/territory in United States msgid "New Jersey" msgstr "New Jersey" #. A state/province/territory in United States msgid "New Mexico" msgstr "New Mexico" #. A state/province/territory in United States msgctxt "State in United States" msgid "New York" msgstr "New York" #. A state/province/territory in United States msgid "North Carolina" msgstr "Sjeverna Carolina" #. A state/province/territory in United States msgid "North Dakota" msgstr "Sjeverna Dakota" #. A state/province/territory in United States msgid "Ohio" msgstr "Ohio" #. A state/province/territory in United States msgid "Oklahoma" msgstr "Oklahoma" #. A state/province/territory in United States msgid "Oregon" msgstr "Oregon" #. A state/province/territory in United States msgid "Pennsylvania" msgstr "Pennsylvania" #. A state/province/territory in United States msgid "Rhode Island" msgstr "Rhode otok" #. A state/province/territory in United States msgid "South Carolina" msgstr "Južna Karolina" #. A state/province/territory in United States msgid "South Dakota" msgstr "Južna Dakota" #. A state/province/territory in United States msgid "Tennessee" msgstr "Tennessee" #. A state/province/territory in United States msgid "Texas" msgstr "Texas" #. A state/province/territory in United States msgid "Utah" msgstr "Utah" #. A state/province/territory in United States msgid "Vermont" msgstr "Vermont" #. A state/province/territory in United States msgid "Virginia" msgstr "Virginia" #. A state/province/territory in United States msgctxt "State in United States" msgid "Washington" msgstr "Washington" #. A state/province/territory in United States msgid "West Virginia" msgstr "Zapadna Virginia" #. A state/province/territory in United States msgid "Wisconsin" msgstr "Wisconsin" #. A state/province/territory in United States msgctxt "State in United States" msgid "Wyoming" msgstr "Wyoming" #. A city in Afghanistan msgid "Herat" msgstr "Herat" #. The capital of Afghanistan. #. "Kabul" is the traditional English name. #. The local name in Persian is "Kabol". #. msgid "Kabul" msgstr "Kabul" #. The capital of Albania. #. "Tirana" is the traditional English name. #. The local name is "Tiranë". #. msgid "Tirana" msgstr "Tirana" #. A city in Algeria msgid "Adrar" msgstr "Adrar" #. The capital of Algeria. #. "Algiers" is the traditional English name. #. The local name in French is "Alger". #. msgid "Algiers" msgstr "Alžir" #. A city in Algeria msgid "Annaba" msgstr "Annaba" #. A city in Algeria msgid "Batna" msgstr "Batna" #. A city in Algeria msgid "Bechar" msgstr "Bechar" #. A city in Algeria msgid "Bejaia" msgstr "Bejaia" #. A city in Algeria msgid "Berriane" msgstr "Berriane" #. A city in Algeria msgid "Biskra" msgstr "Biskra" #. A city in Algeria msgid "Bou Saada" msgstr "Bou Saada" #. A city in Algeria msgid "Chlef" msgstr "Chlef" #. A city in Algeria msgid "Constantine" msgstr "Konstantin" #. A city in Algeria msgid "Dar el Beida" msgstr "Dar el Beida" #. A city in Algeria msgid "Djanet" msgstr "Djanet" #. A city in Algeria msgid "El Golea" msgstr "El Golea" #. A city in Algeria msgid "Ghardaia" msgstr "Ghardaia" #. A city in Algeria msgid "Hassi Messaoud" msgstr "Hassi Messaoud" #. A city in Algeria msgid "I-n-Amenas" msgstr "I-n-Amenas" #. A city in Algeria msgid "I-n-Salah" msgstr "I-n-Salah" #. A city in Algeria msgid "Illizi" msgstr "Illizi" #. A city in Algeria msgid "Jijel" msgstr "Jijel" #. A city in Algeria msgid "Laghouat" msgstr "Laghouat" #. A city in Algeria msgid "Mascara" msgstr "Mascara" #. A city in Algeria msgid "Oran" msgstr "Oran" #. A city in Algeria msgid "Ouargla" msgstr "Ouargla" #. A city in Algeria msgid "Setif" msgstr "Setif" #. A city in Algeria msgid "Sidi Amrane" msgstr "Sidi Amrane" #. A city in Algeria msgid "Sidi Bel Abbes" msgstr "Sidi Bel Abbes" #. A city in Algeria msgid "Tamanrasset" msgstr "Tamanrasset" #. A city in Algeria msgid "Tebessa" msgstr "Tebessa" #. A city in Algeria msgid "Tiaret" msgstr "Tiaret" #. A city in Algeria msgid "Timimoun" msgstr "Timimoun" #. A city in Algeria msgid "Tindouf" msgstr "Tindouf" #. A city in Algeria msgid "Tlemcen" msgstr "Tlemcen" #. A city in Algeria msgid "Touggourt" msgstr "Touggourt" #. A city in American Samoa msgid "Pago Pago" msgstr "Pago Pago" #. The capital of Anguilla msgid "The Valley" msgstr "The Valley" msgid "Amundsen-Scott South Pole Station" msgstr "Postaja na južnom polu Amundsen-Scott" #. A city in Antigua and Barbuda msgid "Fitches Creek" msgstr "Fitches Creek" #. The capital of Antigua and Barbuda msgctxt "City in Antigua and Barbuda" msgid "Saint John's" msgstr "Saint John's" #. The capital of Argentina msgid "Buenos Aires" msgstr "Buenos Aires" #. A city in Argentina msgid "Comodoro Rivadavia" msgstr "Comodoro Rivadavia" #. A city in Argentina msgid "Corrientes" msgstr "Corrientes" #. A city in Argentina msgctxt "City in Argentina" msgid "Córdoba" msgstr "Córdoba" #. A city in Argentina msgid "El Palomar" msgstr "El Palomar" #. A city in Argentina msgid "Ezeiza" msgstr "Ezeiza" #. A city in Argentina msgid "Formosa" msgstr "Formosa" #. A city in Argentina msgid "Mar del Plata" msgstr "Mar del Plata" #. A city in Argentina msgid "Mendoza" msgstr "Mendoza" #. A city in Argentina msgid "Neuquén" msgstr "Neuquén" #. A city in Argentina msgid "Posadas" msgstr "Posadas" #. A city in Argentina msgid "Puerto Iguazú" msgstr "Puerto Iguazú" #. A city in Argentina msgid "Reconquista" msgstr "Reconquista" #. A city in Argentina msgid "Resistencia" msgstr "Resistencia" #. A city in Argentina msgid "Rosario" msgstr "Rosario" #. A city in Argentina msgid "Río Gallegos" msgstr "Río Gallegos" #. A city in Argentina msgid "Río Grande" msgstr "Río Grande" #. A city in Argentina msgid "Salta" msgstr "Salta" #. A city in Argentina msgid "San Carlos de Bariloche" msgstr "San Carlos de Bariloche" #. A city in Argentina msgctxt "City in Argentina" msgid "San Fernando" msgstr "San Fernando" #. A city in Argentina msgid "San Salvador de Jujuy" msgstr "San Salvador de Jujuy" #. A city in Argentina msgid "Ushuaia" msgstr "Ushuaia" #. The capital of Armenia msgid "Yerevan" msgstr "Yerevan" #. A city in Aruba msgid "Camacuri" msgstr "Camacuri" #. The capital of Aruba msgid "Oranjestad" msgstr "Oranjestad" #. A city in South Australia in Australia msgid "Adelaide" msgstr "Adelaide" #. A city in Northern Territory in Australia msgid "Alice Springs" msgstr "Alice Springs" #. A city in Queensland in Australia msgid "Brisbane" msgstr "Brisbane" #. A city in Western Australia in Australia msgid "Broome" msgstr "Broome" #. A city in Western Australia in Australia msgid "Bullsbrook" msgstr "Bullsbrook" #. A city in Queensland in Australia msgid "Cairns" msgstr "Cairns" #. The capital of Australia msgid "Canberra" msgstr "Canberra" #. A city in Queensland in Australia msgid "Coolangatta" msgstr "Coolangatta" #. A city in Northern Territory in Australia msgid "Darwin" msgstr "Darwin" #. A city in New South Wales in Australia msgid "Dubbo" msgstr "Dubbo" #. A city in New South Wales in Australia msgid "Forest Hill" msgstr "Forest Hill" #. A city in Tasmania in Australia msgctxt "City in Tasmania, Australia" msgid "Hobart" msgstr "Hobart" #. A city in Western Australia in Australia msgid "Kalgoorlie" msgstr "Kalgoorlie" #. A city in Northern Territory in Australia msgid "Katherine" msgstr "Katherine" #. A city in Western Australia in Australia msgid "Kununurra" msgstr "Kununurra" #. A city in Victoria in Australia msgid "Lara" msgstr "Lara" #. A city in Tasmania in Australia msgid "Launceston" msgstr "Launceston" #. A city in Western Australia in Australia msgid "Learmonth" msgstr "Learmonth" #. A city in Victoria in Australia msgctxt "City in Victoria, Australia" msgid "Melbourne" msgstr "Melbourne" #. A city in Queensland in Australia msgid "Mount Isa" msgstr "Mount Isa" #. A city in Western Australia in Australia msgid "Perth" msgstr "Perth" #. A city in New South Wales in Australia msgctxt "City in New South Wales, Australia" msgid "Richmond" msgstr "Richmond" #. A city in Queensland in Australia msgid "Rockhampton" msgstr "Rockhampton" #. A city in Western Australia in Australia msgid "Shellborough" msgstr "Shellborough" #. A city in New South Wales in Australia msgctxt "City in New South Wales, Australia" msgid "Sydney" msgstr "Sydney" #. A city in New South Wales in Australia msgid "Tamworth" msgstr "Tamworth" #. A city in Queensland in Australia msgid "Townsville" msgstr "Townsville" #. A city in Victoria in Australia msgid "Wangaratta" msgstr "Wangaratta" #. A city in South Australia in Australia msgid "Woomera" msgstr "Woomera" #. A city in Austria. #. One of several cities in Austria called "Aigen". #. msgid "Aigen im Ennstal" msgstr "Aigen im Ennstal" #. A city in Austria msgid "Graz" msgstr "Graz" #. A city in Austria msgid "Hohenems" msgstr "Hohenems" #. A city in Austria msgid "Innsbruck" msgstr "Innsbruck" #. A city in Austria msgid "Klagenfurt" msgstr "Klagenfurt" #. A city in Austria msgid "Linz" msgstr "Linz" #. A city in Austria msgid "Salzburg" msgstr "Salzburg" #. A city in Austria msgid "Teesdorf" msgstr "Teesdorf" #. A city in Austria msgid "Tulln" msgstr "Tulln" #. The capital of Austria. #. "Vienna" is the traditional English name. #. The local name in German is "Wien". #. msgid "Vienna" msgstr "Beč" #. A city in Austria msgid "Wiener Neustadt" msgstr "Bečko novo mjesto" #. A city in Austria msgid "Zell am See" msgstr "Zell am See" #. A city in Austria msgid "Zeltweg" msgstr "Zeltweg" #. The capital of Azerbaijan. #. "Baku" is the traditional English name. #. The local name is "Baki". #. msgid "Baku" msgstr "Baku" #. A city in Azerbaijan msgid "Ganca" msgstr "Ganca" #. A city in the Bahamas msgctxt "City in Bahamas" msgid "Freeport" msgstr "Freeport" #. A city in the Bahamas msgctxt "City in Bahamas" msgid "Georgetown" msgstr "Georgetown" #. The capital of the Bahamas msgid "Nassau" msgstr "Nassau" #. A city in Bahrain. #. The name is also written "الحد". #. msgid "Al Hadd" msgstr "Al Hadd" #. The capital of Bahrain. #. "Manama" is the traditional English name. #. The local name in Arabic is "Al Manamah / المنامة". #. msgid "Manama" msgstr "Manama" #. A city in Bangladesh. #. The local name in Bengali is "চট্টগ্রাম". #. msgid "Chittagong" msgstr "Chittagong" #. The capital of Bangladesh. #. The local name in Bengali is "ঢাকা". #. msgid "Dhaka" msgstr "Dhaka" #. A city in Bangladesh msgid "Solpur" msgstr "Solpur" #. The capital of Barbados msgid "Bridgetown" msgstr "Bridgetown" #. A city in Barbados msgid "Paragon" msgstr "Paragon" #. A city in Belarus msgctxt "City in Belarus" msgid "Brest" msgstr "Brest" #. A city in Belarus msgid "Homyel'" msgstr "Homyel'" #. A city in Belarus msgid "Hrodna" msgstr "Hrodna" #. The capital of Belarus msgid "Minsk" msgstr "Minsk" #. A city in Belarus msgid "Vitsyebsk" msgstr "Vitsyebsk" #. A city in Antwerp in Belgium. #. "Antwerp" is the traditional English name. #. The local name is "Antwerpen". #. msgctxt "City in Antwerp, Belgium" msgid "Antwerp" msgstr "Antwerpen" #. A city in Brussels, Flemish and Walloon Brabant in #. Belgium #. msgid "Beauvechain" msgstr "Beauvechain" #. A city in Liège in Belgium msgid "Bierset" msgstr "Bierset" #. The capital of Belgium. #. "Brussels" is the traditional English name. #. The local name in French is "Bruxelles". #. The local name in Dutch is "Brussel". #. msgid "Brussels" msgstr "Bruxelles" #. A city in Hainaut in Belgium msgid "Chièvres" msgstr "Chièvres" #. A city in Liège in Belgium msgid "Elsenborn" msgstr "Elsenborn" #. A city in Namur in Belgium msgid "Florennes" msgstr "Florennes" #. A city in Hainaut in Belgium msgid "Gosselies" msgstr "Gosselies" #. A city in Limburg in Belgium msgid "Kleine-Brogel" msgstr "Kleine-Brogel" #. A city in West-Flanders in Belgium msgid "Koksijde" msgstr "Koksijde" #. A city in West-Flanders in Belgium msgid "Oostende" msgstr "Oostende" #. A city in Brussels, Flemish and Walloon Brabant in #. Belgium #. msgid "Schaffen" msgstr "Schaffen" #. A city in Belize msgid "Belize City" msgstr "Belize City" #. A city in Benin msgid "Cotonou" msgstr "Cotonou" #. The capital of Benin msgid "Porto-Novo" msgstr "Porto-Novo" #. The capital of Bermuda msgctxt "City in Bermuda" msgid "Hamilton" msgstr "Hamilton" #. A city in Bermuda msgctxt "City in Bermuda" msgid "Saint George" msgstr "Saint George" #. A city in Bolivia msgid "Camiri" msgstr "Camiri" #. A city in Bolivia msgid "Cobija" msgstr "Cobija" #. A city in Bolivia msgid "Cochabamba" msgstr "Cochabamba" #. A city in Bolivia msgctxt "City in Bolivia" msgid "Concepción" msgstr "Concepción" #. The capital of Bolivia msgctxt "City in Bolivia" msgid "La Paz" msgstr "La Paz" #. A city in Bolivia msgid "Magdalena" msgstr "Magdalena" #. A city in Bolivia msgid "Oruro" msgstr "Oruro" #. A city in Bolivia msgid "Potosí" msgstr "Potosí" #. A city in Bolivia msgid "Puerto Suárez" msgstr "Puerto Suárez" #. A city in Bolivia msgid "Reyes" msgstr "Reyes" #. A city in Bolivia msgid "Riberalta" msgstr "Riberalta" #. A city in Bolivia msgid "Roboré" msgstr "Roboré" #. A city in Bolivia msgid "Rurrenabaque" msgstr "Rurrenabaque" #. A city in Bolivia msgid "San Borja" msgstr "San Borja" #. A city in Bolivia msgid "San Ignacio de Velasco" msgstr "San Ignacio de Velasco" #. A city in Bolivia msgid "San Joaquín" msgstr "San Joaquín" #. A city in Bolivia. #. One of several cities in Bolivia called "San José". #. msgid "San José de Chiquitos" msgstr "San José de Chiquitos" #. A city in Bolivia msgid "Santa Ana de Yacuma" msgstr "Santa Ana de Yacuma" #. A city in Bolivia msgid "Santa Cruz" msgstr "Santa Cruz" #. The capital of Bolivia msgid "Sucre" msgstr "Sucre" #. A city in Bolivia msgid "Tarija" msgstr "Tarija" #. A city in Bolivia msgctxt "City in Bolivia" msgid "Trinidad" msgstr "Trinidad" #. A city in Bolivia msgid "Villamontes" msgstr "Villamontes" #. A city in Bolivia msgid "Viro Viro" msgstr "Viro Viro" #. A city in Bolivia msgid "Yacuiba" msgstr "Yacuiba" #. A city in Bosnia and Herzegovina msgid "Banja Luka" msgstr "Banja Luka" #. A city in Bosnia and Herzegovina msgid "Mostar" msgstr "Mostar" #. The capital of Bosnia and Herzegovina msgid "Sarajevo" msgstr "Sarajevo" #. A city in Botswana msgid "Francistown" msgstr "Francistown" #. The capital of Botswana msgid "Gaborone" msgstr "Gaborone" #. A city in Botswana msgid "Ghanzi" msgstr "Ghanzi" #. A city in Botswana msgid "Kasane" msgstr "Kasane" #. A city in Botswana msgid "Letlhakane" msgstr "Letlhakane" #. A city in Botswana msgid "Lokerane" msgstr "Lokerane" #. A city in Botswana msgid "Maun" msgstr "Maun" #. A city in Botswana msgid "Mochudi" msgstr "Mochudi" #. A city in Botswana msgid "Selebi-Phikwe" msgstr "Selebi-Phikwe" #. A city in Botswana msgid "Tshabong" msgstr "Tshabong" #. A city in Mato Grosso in Brazil msgid "Alta Floresta" msgstr "Alta Floresta" #. A city in Pará in Brazil msgid "Altamira" msgstr "Altamira" #. A city in Goiás in Brazil msgid "Anápolis" msgstr "Anápolis" #. A city in Sergipe in Brazil msgid "Aracaju" msgstr "Aracaju" #. A city in Minas Gerais in Brazil msgid "Barbacena" msgstr "Barbacena" #. A city in Mato Grosso in Brazil msgid "Barra do Garças" msgstr "Barra do Garças" #. A city in São Paulo in Brazil msgid "Bauru" msgstr "Bauru" #. A city in Minas Gerais in Brazil msgid "Belo Horizonte" msgstr "Belo Horizonte" #. A city in Pará in Brazil msgid "Belém" msgstr "Belém" #. A city in Roraima in Brazil msgid "Boa Vista" msgstr "Boa Vista" #. A city in Bahia in Brazil msgid "Bom Jesus da Lapa" msgstr "Bom Jesus da Lapa" #. The capital of Brazil msgid "Brasília" msgstr "Brasília" #. A city in Pará in Brazil msgid "Cachimbo" msgstr "Cachimbo" #. A city in Paraíba in Brazil msgid "Campina Grande" msgstr "Campina Grande" #. A city in São Paulo in Brazil msgid "Campinas" msgstr "Campinas" #. A city in Mato Grosso do Sul in Brazil msgid "Campo Grande" msgstr "Campo Grande" #. A city in Rio de Janeiro in Brazil msgid "Campos" msgstr "Campos" #. A city in Pará in Brazil msgid "Conceição do Araguaia" msgstr "Conceição do Araguaia" #. A city in Mato Grosso do Sul in Brazil msgid "Corumbá" msgstr "Corumbá" #. A city in Acre in Brazil msgid "Cruzeiro do Sul" msgstr "Cruzeiro do Sul" #. A city in Mato Grosso in Brazil msgid "Cuiabá" msgstr "Cuiabá" #. A city in Paraná in Brazil msgid "Curitiba" msgstr "Curitiba" #. A city in Mato Grosso do Sul in Brazil msgid "Dourados" msgstr "Dourados" #. A city in Santa Catarina in Brazil msgid "Florianópolis" msgstr "Florianópolis" #. A city in Ceará in Brazil msgid "Fortaleza" msgstr "Fortaleza" #. A city in Paraná in Brazil msgid "Foz do Iguaçu" msgstr "Foz do Iguaçu" #. A city in Goiás in Brazil msgid "Goiânia" msgstr "Goiânia" #. A city in São Paulo in Brazil msgid "Guaratinguetá" msgstr "Guaratinguetá" #. A city in São Paulo in Brazil msgid "Guarulhos" msgstr "Guarulhos" #. A city in Bahia in Brazil msgid "Ilhéus" msgstr "Ilhéus" #. A city in Maranhão in Brazil msgid "Imperatriz" msgstr "Imperatriz" #. A city in Pará in Brazil msgid "Itaituba" msgstr "Itaituba" #. A city in Pará in Brazil msgid "Jacareacanga" msgstr "Jacareacanga" #. A city in Paraíba in Brazil msgid "João Pessoa" msgstr "João Pessoa" #. A city in Minas Gerais in Brazil msgid "Juiz de Fora" msgstr "Juiz de Fora" #. A city in Paraná in Brazil msgid "Londrina" msgstr "Londrina" #. A city in Alagoas in Brazil msgid "Maceió" msgstr "Maceió" #. A city in Amazonas in Brazil msgid "Manaus" msgstr "Manaus" #. A city in Amazonas in Brazil msgid "Manicoré" msgstr "Manicoré" #. A city in Pará in Brazil msgid "Marabá" msgstr "Marabá" #. A city in Paraná in Brazil msgid "Maringá" msgstr "Maringá" #. A city in Minas Gerais in Brazil msgid "Montes Claros" msgstr "Montes Claros" #. A city in Rio Grande do Norte in Brazil msgid "Mossoró" msgstr "Mossoró" #. A city in Rio Grande do Norte in Brazil msgctxt "City in Rio Grande do Norte, Brazil" msgid "Natal" msgstr "Natal" #. A city in Amapá in Brazil msgid "Oiapoque" msgstr "Oiapoque" #. A city in São Paulo in Brazil msgid "Palmeiras" msgstr "Palmeiras" #. A city in Piauí in Brazil msgid "Parnaíba" msgstr "Parnaíba" #. A city in Bahia in Brazil msgid "Paulo Afonso" msgstr "Paulo Afonso" #. A city in Rio Grande do Sul in Brazil msgid "Pelotas" msgstr "Pelotas" #. A city in Pernambuco in Brazil msgid "Petrolina" msgstr "Petrolina" #. A city in São Paulo in Brazil msgid "Piracicaba" msgstr "Piracicaba" #. A city in São Paulo in Brazil msgid "Piraçununga" msgstr "Piraçununga" #. A city in Pará in Brazil msgid "Piri Grande" msgstr "Piri Grande" #. A city in Mato Grosso do Sul in Brazil msgid "Ponta Porã" msgstr "Ponta Porã" #. A city in Rio Grande do Sul in Brazil msgid "Porto Alegre" msgstr "Porto Alegre" #. A city in Minas Gerais in Brazil msgid "Poços de Caldas" msgstr "Poços de Caldas" #. A city in São Paulo in Brazil msgid "Presidente Prudente" msgstr "Presidente Prudente" #. A city in Bahia in Brazil msgid "Pôrto Seguro" msgstr "Pôrto Seguro" #. A city in Rondônia in Brazil msgid "Pôrto Velho" msgstr "Pôrto Velho" #. A city in Pernambuco in Brazil msgid "Recife" msgstr "Recife" #. A city in Acre in Brazil msgid "Rio Branco" msgstr "Rio Branco" #. A city in Rio de Janeiro in Brazil msgctxt "City in Rio de Janeiro, Brazil" msgid "Rio de Janeiro" msgstr "Rio de Janeiro" #. A city in Bahia in Brazil msgid "Salvador" msgstr "Salvador" #. A city in Rio Grande do Sul in Brazil msgctxt "City in Rio Grande do Sul, Brazil" msgid "Santa Maria" msgstr "Santa Maria" #. A city in Pará in Brazil msgid "Santarém" msgstr "Santarém" #. A city in São Paulo in Brazil msgid "Santos" msgstr "Santos" #. A city in Amazonas in Brazil msgid "São Félix" msgstr "São Félix" #. A city in Amazonas in Brazil msgid "São Gabriel" msgstr "São Gabriel" #. A city in São Paulo in Brazil msgid "São José dos Campos" msgstr "São José dos Campos" #. A city in Maranhão in Brazil msgid "São Luís" msgstr "São Luís" #. A city in São Paulo in Brazil msgctxt "City in São Paulo, Brazil" msgid "São Paulo" msgstr "São Paulo" #. A city in Rio de Janeiro in Brazil msgid "São Pedro da Aldeia" msgstr "São Pedro da Aldeia" #. A city in Acre in Brazil msgid "Tarauacá" msgstr "Tarauacá" #. A city in Amazonas in Brazil msgid "Tefé" msgstr "Tefé" #. A city in Piauí in Brazil msgid "Teresina" msgstr "Teresina" #. A city in Pará in Brazil msgid "Tucuruí" msgstr "Tucuruí" #. A city in Minas Gerais in Brazil msgid "Uberaba" msgstr "Uberaba" #. A city in Minas Gerais in Brazil msgid "Uberlândia" msgstr "Uberlândia" #. A city in Rio Grande do Sul in Brazil msgid "Uruguaiana" msgstr "Uruguaiana" #. A city in Pernambuco in Brazil msgid "Vila dos Remédios" msgstr "Vila dos Remédios" #. A city in Rondônia in Brazil msgid "Vilhena" msgstr "Vilhena" #. A city in Espírito Santo in Brazil msgid "Vitória" msgstr "Vitória" #. A city in Bahia in Brazil msgid "Vitória da Conquista" msgstr "Vitória da Conquista" #. The capital of the British Virgin Islands msgid "Road Town" msgstr "Road Town" #. A city in the British Virgin Islands msgid "The Mill" msgstr "The Mill" #. The capital of Brunei msgid "Bandar Seri Begawan" msgstr "Bandar Seri Begawan" #. A city in Bulgaria msgid "Burgas" msgstr "Burgas" #. A city in Bulgaria msgid "Gorna Oryakhovitsa" msgstr "Gorna Oryakhovitsa" #. A city in Bulgaria msgid "Plovdiv" msgstr "Plovdiv" #. The capital of Bulgaria. #. "Sofia" is the traditional English name. #. The local name is "Sofiya". #. msgid "Sofia" msgstr "Sofia" #. A city in Bulgaria msgid "Varna" msgstr "Varna" #. The capital of Burkina Faso msgid "Ouagadougou" msgstr "Ouagadougou" #. The capital of Burundi msgid "Bujumbura" msgstr "Bujumbura" #. The capital of Cambodia. #. "Phnom Penh" is the traditional English name. #. The local name in Khmer is "Phnum Penh". #. msgid "Phnom Penh" msgstr "Phnom Penh" #. A city in Cambodia msgid "Siemreab" msgstr "Siemreab" #. A city in Cameroon msgid "Douala" msgstr "Douala" #. A city in Cameroon msgid "Garoua" msgstr "Garoua" #. A city in Cameroon msgid "Ngaoundere" msgstr "Ngaoundere" #. The capital of Cameroon msgid "Yaounde" msgstr "Yaounde" #. A city in British Columbia in Canada msgid "Abbotsford" msgstr "Abbotsford" #. A city in British Columbia in Canada msgid "Agassiz" msgstr "Agassiz" #. A city in Northwest Territories in Canada msgid "Aklavik" msgstr "Aklavik" #. A city in British Columbia in Canada msgid "Allison Harbour" msgstr "Allison Harbour" #. A city in British Columbia in Canada msgid "Alta Lake" msgstr "Alta Lake" #. A city in Quebec in Canada msgid "Amqui" msgstr "Amqui" #. A city in Newfoundland and Labrador in Canada msgid "Argentia" msgstr "Argentia" #. A city in Nunavut in Canada msgid "Arviat" msgstr "Arviat" #. A city in Saskatchewan in Canada msgid "Assiniboia" msgstr "Assiniboia" #. A city in Quebec in Canada msgid "Bagotville" msgstr "Bagotville" #. A city in Quebec in Canada msgid "Baie-Comeau" msgstr "Baie-Comeau" #. A city in Quebec in Canada msgid "Baie-Sainte-Catherine" msgstr "Baie-Sainte-Catherine" #. A city in Quebec in Canada msgid "Baie-de-la-Trinité" msgstr "Baie-de-la-Trinité" #. A city in Nunavut in Canada msgid "Baker Lake" msgstr "Baker Lake" #. A city in British Columbia in Canada msgid "Baldonnel" msgstr "Baldonnel" #. A city in Ontario in Canada msgid "Bancroft" msgstr "Bancroft" #. A city in Alberta in Canada msgid "Banff" msgstr "Banff" #. A city in New Brunswick in Canada msgid "Bathurst" msgstr "Bathurst" #. A city in Nova Scotia in Canada msgid "Bay Saint Lawrence" msgstr "Bay Saint Lawrence" #. A city in Ontario in Canada msgid "Beardmore" msgstr "Beardmore" #. A city in Quebec in Canada msgid "Beauceville" msgstr "Beauceville" #. A city in Quebec in Canada msgid "Beauport" msgstr "Beauport" #. A city in Nova Scotia in Canada msgid "Beaver Harbour" msgstr "Beaver Harbour" #. A city in Quebec in Canada msgctxt "City in Quebec, Canada" msgid "Bedford" msgstr "Bedford" #. A city in British Columbia in Canada msgid "Bella Coola" msgstr "Bella Coola" #. A city in Quebec in Canada msgid "Bellin" msgstr "Bellin" #. A city in Manitoba in Canada msgid "Berens River" msgstr "Berens River" #. A city in Alberta in Canada #. A city in Norway msgid "Bergen" msgstr "Bergen" #. A city in Quebec in Canada msgid "Blanc-Sablon" msgstr "Blanc-Sablon" #. A city in British Columbia in Canada msgid "Blue River" msgstr "Blue River" #. A city in British Columbia in Canada msgid "Boat Basin" msgstr "Boat Basin" #. A city in Ontario in Canada msgid "Borden" msgstr "Borden" #. A city in Alberta in Canada msgid "Bow Island" msgstr "Bow Island" #. A city in Manitoba in Canada msgid "Brandon" msgstr "Brandon" #. A city in Saskatchewan in Canada msgid "Broadview" msgstr "Broadview" #. A city in Alberta in Canada msgid "Brooks" msgstr "Brooks" #. A city in Saskatchewan in Canada msgid "Buffalo Narrows" msgstr "Buffalo Narrows" #. A city in Ontario in Canada msgctxt "City in Ontario, Canada" msgid "Burlington" msgstr "Burlington" #. A city in British Columbia in Canada msgid "Burns Lake" msgstr "Burns Lake" #. A city in Yukon Territory in Canada msgid "Burwash Landing" msgstr "Burwash Landing" #. A city in Nova Scotia in Canada msgid "Caledonia" msgstr "Caledonia" #. A city in Alberta in Canada msgid "Calgary" msgstr "Calgary" #. A city in Nunavut in Canada msgid "Cambridge Bay" msgstr "Cambridge Bay" #. A city in British Columbia in Canada msgid "Campbell River" msgstr "Campbell River" #. A city in Nova Scotia in Canada msgid "Canso" msgstr "Canso" #. A city in Quebec in Canada msgid "Canton-Bégin" msgstr "Canton-Bégin" #. A city in Quebec in Canada msgid "Cap-Chat" msgstr "Cap-Chat" #. A city in Quebec in Canada msgid "Cap-aux-Meules" msgstr "Cap-aux-Meules" #. A city in Quebec in Canada msgid "Cape Cove" msgstr "Cape Cove" #. A city in Nunavut in Canada msgid "Cape Dorset" msgstr "Cape Dorset" #. A city in Nunavut in Canada msgid "Cape Dyer" msgstr "Cape Dyer" #. A city in Northwest Territories in Canada msgid "Cape Parry" msgstr "Cape Parry" #. A city in Newfoundland and Labrador in Canada msgid "Cape Race" msgstr "Cape Race" #. A city in Alberta in Canada msgid "Cardston" msgstr "Cardston" #. A city in Nova Scotia in Canada msgid "Caribou Island" msgstr "Caribou otok" #. A city in Yukon Territory in Canada msgid "Carmacks" msgstr "Carmacks" #. A city in Manitoba in Canada msgid "Carman" msgstr "Carman" #. A city in Newfoundland and Labrador in Canada msgid "Cartwright" msgstr "Cartwright" #. A city in British Columbia in Canada msgid "Castlegar" msgstr "Castlegar" #. A city in Ontario in Canada msgid "Central Patricia" msgstr "Central Patricia" #. A city in Ontario in Canada msgid "Chapleau" msgstr "Chapleau" #. A city in Prince Edward Island in Canada msgid "Charlottetown" msgstr "Charlottetown" #. A city in Nunavut in Canada msgid "Chesterfield Inlet" msgstr "Chesterfield Inlet" #. A city in Quebec in Canada msgid "Chibougamau" msgstr "Chibougamau" #. A city in Manitoba in Canada msgid "Churchill" msgstr "Churchill" #. A city in Nova Scotia in Canada msgid "Chéticamp" msgstr "Chéticamp" #. A city in Alberta in Canada msgid "Claresholm" msgstr "Claresholm" #. A city in British Columbia in Canada msgctxt "City in British Columbia, Canada" msgid "Clinton" msgstr "Clinton" #. A city in Nunavut in Canada msgid "Clyde River" msgstr "Rijeka Clyde" #. A city in Ontario in Canada msgid "Cobourg" msgstr "Cobourg" #. A city in Alberta in Canada msgid "Cold Lake" msgstr "Jezero Cold" #. A city in Alberta in Canada msgid "Coleman" msgstr "Coleman" #. A city in Ontario in Canada msgid "Collingwood" msgstr "Collingwood" #. A city in British Columbia in Canada msgid "Comox" msgstr "Comox" #. A city in Ontario in Canada msgid "Coppell" msgstr "Coppell" #. A city in Nunavut in Canada msgid "Coral Harbour" msgstr "Luka Coral" #. A city in Alberta in Canada msgid "Coronation" msgstr "Coronation" #. A city in British Columbia in Canada msgid "Cranbrook" msgstr "Cranbrook" #. A city in British Columbia in Canada msgctxt "City in British Columbia, Canada" msgid "Creston" msgstr "Creston" #. A city in Manitoba in Canada msgid "Dauphin" msgstr "Dauphin" #. A city in Yukon Territory in Canada msgid "Dawson" msgstr "Dawson" #. A city in British Columbia in Canada msgid "Dease Lake" msgstr "Jezero Dease" #. A city in Newfoundland and Labrador in Canada msgid "Deer Lake" msgstr "Jezero Deer" #. A city in Ontario in Canada msgid "Delhi" msgstr "Delhi" #. A city in Nova Scotia in Canada msgid "Dingwall" msgstr "Dingwall" #. A city in New Brunswick in Canada msgid "Dipper Harbour" msgstr "Dipper Harbour" #. A city in Alberta in Canada msgid "Drumheller" msgstr "Drumheller" #. A city in Ontario in Canada msgctxt "City in Ontario, Canada" msgid "Dryden" msgstr "Dryden" #. A city in Northwest Territories in Canada msgid "Délįne" msgstr "Délįne" #. A city in Ontario in Canada msgid "Earlton" msgstr "Earlton" #. A city in Saskatchewan in Canada msgid "East Poplar" msgstr "East Poplar" #. A city in Saskatchewan in Canada msgid "Eastend" msgstr "Eastend" #. A city in Alberta in Canada msgid "Edmonton" msgstr "Edmonton" #. A city in Alberta in Canada msgid "Edson" msgstr "Edson" #. A city in Ontario in Canada msgid "Elliot Lake" msgstr "Rijeka Elliot" #. A city in Prince Edward Island in Canada msgctxt "City in Prince Edward Island, Canada" msgid "Elmira" msgstr "Elmira" #. A city in Alberta in Canada msgid "Embarras Portage" msgstr "Embarras Portage" #. A city in Newfoundland and Labrador in Canada msgid "Englee" msgstr "Englee" #. A city in Nunavut in Canada msgid "Ennadai" msgstr "Ennadai" #. A city in Ontario in Canada msgid "Erieau" msgstr "Erieau" #. A city in British Columbia in Canada msgid "Esquimalt" msgstr "Esquimalt" #. A city in Saskatchewan in Canada msgid "Estevan" msgstr "Estevan" #. A city in Alberta in Canada msgid "Esther" msgstr "Esther" #. A city in Nunavut in Canada msgctxt "City in Nunavut, Canada" msgid "Eureka" msgstr "Eureka" #. A city in Newfoundland and Labrador in Canada msgid "Ferolle Point" msgstr "Ferolle Point" #. A city in Manitoba in Canada msgid "Flin Flon" msgstr "Flin Flon" #. A city in Alberta in Canada msgid "Fort Chipewyan" msgstr "Fort Chipewyan" #. A city in Northwest Territories in Canada msgid "Fort Good Hope" msgstr "Rt Dobre Nade" #. A city in British Columbia in Canada msgid "Fort Grahame" msgstr "Fort Grahame" #. A city in Alberta in Canada msgid "Fort McMurray" msgstr "Fort McMurray" #. A city in British Columbia in Canada msgid "Fort Nelson" msgstr "Fort Nelson" #. A city in Northwest Territories in Canada msgid "Fort Providence" msgstr "Fort Providence" #. A city in Northwest Territories in Canada msgid "Fort Simpson" msgstr "Fort Simpson" #. A city in Northwest Territories in Canada msgctxt "City in Northwest Territories, Canada" msgid "Fort Smith" msgstr "Fort Smith" #. A city in Quebec in Canada msgid "Fort-Rupert" msgstr "Fort-Rupert" #. A city in New Brunswick in Canada msgid "Fredericton" msgstr "Fredericton" #. A city in Ontario in Canada msgid "Front of Escott" msgstr "Front of Escott" #. A city in British Columbia in Canada msgid "Gabriola" msgstr "Gabriola" #. A city in New Brunswick in Canada msgid "Gagetown" msgstr "Gagetown" #. A city in Newfoundland and Labrador in Canada msgid "Gander" msgstr "Gander" #. A city in Quebec in Canada msgid "Gaspé" msgstr "Gaspé" #. A city in Quebec in Canada msgid "Gatineau" msgstr "Gatineau" #. A city in Ontario in Canada msgid "Geraldton" msgstr "Geraldton" #. A city in Manitoba in Canada msgid "Gillam" msgstr "Gillam" #. A city in Manitoba in Canada msgid "Gimli" msgstr "Gimli" #. A city in Nunavut in Canada msgid "Gjoa Haven" msgstr "Gjoa Haven" #. A city in Ontario in Canada msgid "Goderich" msgstr "Goderich" #. A city in British Columbia in Canada msgid "Golden" msgstr "Golden" #. A city in Newfoundland and Labrador in Canada msgid "Goose Bay" msgstr "Goose Bay" #. A city in Ontario in Canada msgid "Gore Bay" msgstr "Gore Zaljev" #. A city in Manitoba in Canada msgctxt "City in Manitoba, Canada" msgid "Grand Rapids" msgstr "Grand Rapids" #. A city in Nova Scotia in Canada msgid "Grand-Etang" msgstr "Grand-Etang" #. A city in Alberta in Canada msgid "Grande Prairie" msgstr "Grande Prairie" #. A city in Nova Scotia in Canada msgctxt "City in Nova Scotia, Canada" msgid "Greenwood" msgstr "Greenwood" #. A city in Yukon Territory in Canada msgid "Haines Junction" msgstr "Haines Junction" #. A city in Nova Scotia in Canada msgid "Halifax" msgstr "Halifax" #. A city in Nunavut in Canada msgid "Hall Beach" msgstr "Hall Beach" #. A city in Ontario in Canada msgid "Hallowell" msgstr "Hallowell" #. A city in Ontario in Canada msgctxt "City in Ontario, Canada" msgid "Hamilton" msgstr "Hamilton" #. A city in Newfoundland and Labrador in Canada msgid "Harbour Breton" msgstr "Harbour Breton" #. A city in Quebec in Canada msgid "Harrington Harbour" msgstr "Harrington Harbour" #. A city in Quebec in Canada msgid "Havre-Saint-Pierre" msgstr "Havre-Saint-Pierre" #. A city in Northwest Territories in Canada msgid "Hay River" msgstr "Rijeka Hay" #. A city in Newfoundland and Labrador in Canada msgctxt "City in Newfoundland and Labrador, Canada" msgid "Hebron" msgstr "Hebron" #. A city in Ontario in Canada msgid "Heron Bay" msgstr "Heron Bay" #. A city in Alberta in Canada msgid "High Level" msgstr "High Level" #. A city in British Columbia in Canada msgid "Hollyburn" msgstr "Hollyburn" #. A city in Northwest Territories in Canada msgid "Holman" msgstr "Holman" #. A city in British Columbia in Canada msgid "Hope" msgstr "Hope" #. A city in Newfoundland and Labrador in Canada msgid "Hopedale" msgstr "Hopedale" #. A city in Nunavut in Canada msgid "Igloolik" msgstr "Igloolik" #. A city in Quebec in Canada msgid "Inoucdjouac" msgstr "Inoucdjouac" #. A city in Northwest Territories in Canada msgid "Inuvik" msgstr "Inuvik" #. A city in Nunavut in Canada msgid "Iqaluit" msgstr "Iqaluit" #. A city in Manitoba in Canada msgid "Island Lake" msgstr "Jezero Island" #. A city in Quebec in Canada msgid "Ivugivik" msgstr "Ivugivik" #. A city in Quebec in Canada msgid "Jacques-Cartier" msgstr "Jacques-Cartier" #. A city in Alberta in Canada msgctxt "City in Alberta, Canada" msgid "Jasper" msgstr "Jasper" #. A city in Quebec in Canada msgid "Jonquière" msgstr "Jonquière" #. A city in British Columbia in Canada msgid "Kamloops" msgstr "Kamloops" #. A city in Ontario in Canada msgid "Kapuskasing" msgstr "Kapuskasing" #. A city in British Columbia in Canada msgid "Kelowna" msgstr "Kelowna" #. A city in Ontario in Canada msgid "Kenora" msgstr "Kenora" #. A city in Nova Scotia in Canada msgid "Kentville" msgstr "Kentville" #. A city in Saskatchewan in Canada msgid "Kindersley" msgstr "Kindersley" #. A city in Ontario in Canada msgctxt "City in Ontario, Canada" msgid "Kingston" msgstr "Kingston" #. A city in Quebec in Canada msgid "Koartac" msgstr "Koartac" #. A city in Nunavut in Canada msgid "Kugaaruk" msgstr "Kugaaruk" #. A city in Nunavut in Canada msgid "Kugluktuk" msgstr "Kugluktuk" #. A city in Quebec in Canada msgid "Kuujjuaq" msgstr "Kuujjuaq" #. A city in Quebec in Canada msgid "L'Anse-Saint-Jean" msgstr "L'Anse-Saint-Jean" #. A city in Quebec in Canada msgid "L'Ascension" msgstr "L'Ascension" #. A city in Quebec in Canada msgid "L'Assomption" msgstr "L'Assomption" #. A city in Quebec in Canada msgid "La Baie" msgstr "La Baie" #. A city in Saskatchewan in Canada msgid "La Ronge" msgstr "La Ronge" #. A city in Quebec in Canada msgid "La Tuque" msgstr "La Tuque" #. A city in Alberta in Canada msgid "Lac La Biche" msgstr "Lac La Biche" #. A city in British Columbia in Canada msgid "Lasqueti" msgstr "Lasqueti" #. A city in Saskatchewan in Canada msgid "Leader" msgstr "Leader" #. A city in Quebec in Canada msgid "Leaf River" msgstr "Leaf River" #. A city in Quebec in Canada msgid "Lennoxville" msgstr "Lennoxville" #. A city in Alberta in Canada msgid "Lethbridge" msgstr "Lethbridge" #. A city in British Columbia in Canada msgid "Little Prairie" msgstr "Little Prairie" #. A city in Nova Scotia in Canada msgctxt "City in Nova Scotia, Canada" msgid "Liverpool" msgstr "Liverpool" #. A city in Saskatchewan in Canada msgid "Lloydminster" msgstr "Lloydminster" #. A city in Ontario in Canada msgctxt "City in Ontario, Canada" msgid "London" msgstr "London" #. A city in Quebec in Canada msgid "Longue-Pointe-de-Mingan" msgstr "Longue-Pointe-de-Mingan" #. A city in Saskatchewan in Canada msgid "Lucky Lake" msgstr "Lucky jezero" #. A city in Manitoba in Canada msgid "Lynn Lake" msgstr "Lynn Lake" #. A city in British Columbia in Canada msgid "Lytton" msgstr "Lytton" #. A city in Newfoundland and Labrador in Canada msgid "Makkovik" msgstr "Makkovik" #. A city in Quebec in Canada msgid "Maniwaki" msgstr "Maniwaki" #. A city in Saskatchewan in Canada msgid "Maple Creek" msgstr "Maple Creek" #. A city in Quebec in Canada msgid "Maricourt" msgstr "Maricourt" #. A city in Newfoundland and Labrador in Canada msgid "Mary's Harbour" msgstr "Mary's luka" #. A city in Quebec in Canada msgid "Matagami" msgstr "Matagami" #. A city in Yukon Territory in Canada msgid "Mayo" msgstr "Mayo" #. A city in British Columbia in Canada msgid "McLeod Lake" msgstr "McLeod Lake" #. A city in Saskatchewan in Canada msgid "Meadow Lake" msgstr "Meadow jezero" #. A city in Alberta in Canada msgid "Medicine Hat" msgstr "Medicine Hat" #. A city in Saskatchewan in Canada msgid "Melfort" msgstr "Melfort" #. A city in Manitoba in Canada msgctxt "City in Manitoba, Canada" msgid "Miami" msgstr "Miami" #. A city in Alberta in Canada msgid "Milk River" msgstr "Milk River" #. A city in New Brunswick in Canada msgid "Moncton" msgstr "Moncton" #. A city in Quebec in Canada msgid "Mont-Apica" msgstr "Mont-Apica" #. A city in Quebec in Canada msgid "Mont-Joli" msgstr "Mont-Joli" #. A city in Quebec in Canada msgid "Montmagny" msgstr "Montmagny" #. A city in Quebec in Canada. #. The local name in French is "Montréal". #. msgid "Montreal" msgstr "Montreal" #. A city in Ontario in Canada msgid "Moosonee" msgstr "Moosonee" #. A city in Manitoba in Canada msgid "Morden" msgstr "Morden" #. A city in Ontario in Canada msgid "Mount Forest" msgstr "Mount Forest" #. A city in Newfoundland and Labrador in Canada msgid "Mount Pearl Park" msgstr "Mount Pearl Park" #. A city in Ontario in Canada msgid "Muskoka Falls" msgstr "Muskoka Falls" #. A city in Northwest Territories in Canada msgid "Nahanni Butte" msgstr "Nahanni Butte" #. A city in Newfoundland and Labrador in Canada msgid "Nain" msgstr "Nain" #. A city in British Columbia in Canada msgid "Nakusp" msgstr "Nakusp" #. A city in British Columbia in Canada msgid "Nanaimo" msgstr "Nanaimo" #. A city in British Columbia in Canada msgid "Nanoose Bay" msgstr "Nanoose Bay" #. A city in Ontario in Canada msgid "Nanticoke" msgstr "Nanticoke" #. A city in British Columbia in Canada msgctxt "City in British Columbia, Canada" msgid "Natal" msgstr "Natal" #. A city in Quebec in Canada msgid "Natashquan" msgstr "Natashquan" #. A city in Newfoundland and Labrador in Canada msgid "Neddy Harbour" msgstr "Neddy Harbour" #. A city in British Columbia in Canada msgid "Nelson" msgstr "Nelson" #. A city in Quebec in Canada msgid "New Carlisle" msgstr "New Carlisle" #. A city in Quebec in Canada msgid "Nicolet" msgstr "Nicolet" #. A city in Saskatchewan in Canada msgid "Nipawin" msgstr "Nipawin" #. A city in Northwest Territories in Canada msgid "Norman Wells" msgstr "Norman Wells" #. A city in Quebec in Canada msgid "Normandin" msgstr "Normandin" #. A city in Saskatchewan in Canada msgid "North Battleford" msgstr "North Battleford" #. A city in Ontario in Canada msgid "North Bay" msgstr "North Bay" #. A city in British Columbia in Canada msgid "North Kamloops" msgstr "North Kamloops" #. A city in Manitoba in Canada msgid "Norway House" msgstr "Norway House" #. A city in Quebec in Canada msgid "Notre-Dame-de-la-Salette" msgstr "Notre-Dame-de-la-Salette" #. A city in Quebec in Canada msgid "Nouveau-Comptoir" msgstr "Nouveau-Comptoir" #. A city in Newfoundland and Labrador in Canada msgid "Nutak" msgstr "Nutak" #. A city in British Columbia in Canada msgid "Ocean Falls" msgstr "Ocean Falls" #. A city in Yukon Territory in Canada msgid "Old Crow" msgstr "Old Crow" #. A city in Alberta in Canada msgid "Onefour" msgstr "Onefour" #. A city in British Columbia in Canada msgid "Osoyoos" msgstr "Osoyoos" #. The capital of Canada msgid "Ottawa" msgstr "Ottawa" #. A city in Nunavut in Canada msgid "Pangnirtung" msgstr "Pangnirtung" #. A city in Quebec in Canada msgid "Parent" msgstr "Parent" #. A city in Northwest Territories in Canada msgid "Paulatuk" msgstr "Paulatuk" #. A city in Alberta in Canada msgid "Peace River" msgstr "Peace rijeka" #. A city in British Columbia in Canada msgid "Penticton" msgstr "Penticton" #. A city in Ontario in Canada msgid "Petawawa" msgstr "Petawawa" #. A city in Ontario in Canada msgid "Peterborough" msgstr "Peterborough" #. A city in Quebec in Canada msgid "Petite-Rivière" msgstr "Petite-Rivière" #. A city in Manitoba in Canada msgid "Pilot Mound" msgstr "Pilot Mound" #. A city in Alberta in Canada msgid "Pincher Creek" msgstr "Pincher Creek" #. A city in British Columbia in Canada msgid "Pitt Meadows" msgstr "Pitt Meadows" #. A city in Nunavut in Canada msgid "Pond Inlet" msgstr "Pond Inlet" #. A city in British Columbia in Canada msgid "Port Hardy" msgstr "Port Hardy" #. A city in British Columbia in Canada msgid "Port Simpson" msgstr "Port Simpson" #. A city in Ontario in Canada msgid "Port Weller" msgstr "Port Weller" #. A city in Quebec in Canada msgid "Port-Menier" msgstr "Port-Menier" #. A city in Quebec in Canada msgid "Portneuf" msgstr "Portneuf" #. A city in Quebec in Canada msgid "Poste-de-la-Baleine" msgstr "Poste-de-la-Baleine" #. A city in British Columbia in Canada msgid "Powell River" msgstr "Powell rijeka" #. A city in Saskatchewan in Canada msgid "Prince Albert" msgstr "Prince Albert" #. A city in British Columbia in Canada msgid "Prince George" msgstr "Prince George" #. A city in British Columbia in Canada msgid "Prince Rupert" msgstr "Prince Rupert" #. A city in British Columbia in Canada msgctxt "City in British Columbia, Canada" msgid "Princeton" msgstr "Princeton" #. A city in Quebec in Canada msgid "Puvirnituq" msgstr "Puvirnituq" #. A city in Nunavut in Canada msgid "Qikiqtarjuaq" msgstr "Qikiqtarjuaq" #. A city in Quebec in Canada. #. The local name in French is "Québec". #. msgctxt "City in Quebec, Canada" msgid "Quebec" msgstr "Quebec" #. A city in British Columbia in Canada msgid "Queen Charlotte" msgstr "Queen Charlotte" #. A city in British Columbia in Canada msgid "Quesnel" msgstr "Quesnel" #. A city in Quebec in Canada msgid "Radisson" msgstr "Radisson" #. A city in Nunavut in Canada msgid "Rankin Inlet" msgstr "Rankin Inlet" #. A city in Alberta in Canada msgid "Red Deer" msgstr "Red Deer" #. A city in Ontario in Canada msgid "Red Lake" msgstr "Red jezero" #. A city in Saskatchewan in Canada msgid "Regina" msgstr "Regina" #. A city in Nunavut in Canada msgid "Repulse Bay" msgstr "Repulse Bay" #. A city in Nunavut in Canada msgid "Resolute" msgstr "Resolute" #. A city in British Columbia in Canada msgid "Revelstoke" msgstr "Revelstoke" #. A city in Quebec in Canada msgid "Rivière-du-Loup" msgstr "Rivière-du-Loup" #. A city in Quebec in Canada msgid "Rivière-la-Madeleine" msgstr "Rivière-la-Madeleine" #. A city in Quebec in Canada msgid "Roberval" msgstr "Roberval" #. A city in Saskatchewan in Canada msgid "Rockglen" msgstr "Rockglen" #. A city in Alberta in Canada msgid "Rocky Mountain House" msgstr "Rocky Mountain House" #. A city in British Columbia in Canada msgid "Rocky Point" msgstr "Rocky Point" #. A city in Saskatchewan in Canada msgid "Rosetown" msgstr "Rosetown" #. A city in Quebec in Canada msgid "Rouyn" msgstr "Rouyn" #. A city in Northwest Territories in Canada msgid "Sachs Harbour" msgstr "Sachs luka" #. A city in Newfoundland and Labrador in Canada msgid "Saint Anthony" msgstr "Saint Anthony" #. A city in Ontario in Canada msgid "Saint Catharines" msgstr "Saint Catharines" #. A city in New Brunswick in Canada msgid "Saint John" msgstr "Sveti Ivan" #. A city in Newfoundland and Labrador in Canada msgctxt "City in Newfoundland and Labrador, Canada" msgid "Saint John's" msgstr "Saint John's" #. A city in New Brunswick in Canada msgid "Saint Leonard" msgstr "Sveti Leonard" #. A city in New Brunswick in Canada msgid "Saint Stephen" msgstr "Saint Stephen" #. A city in Quebec in Canada msgid "Saint-Anicet" msgstr "Saint-Anicet" #. A city in Quebec in Canada msgid "Saint-Chrysostome" msgstr "Saint-Chrysostome" #. A city in Quebec in Canada msgid "Saint-Fabien" msgstr "Saint-Fabien" #. A city in Quebec in Canada msgid "Saint-François" msgstr "Saint-François" #. A city in Quebec in Canada msgid "Saint-Henri-de-Taillon" msgstr "Saint-Henri-de-Taillon" #. A city in Quebec in Canada msgid "Saint-Jean" msgstr "Saint-Jean" #. A city in Quebec in Canada msgid "Saint-Joachim" msgstr "Saint-Joachim" #. A city in Quebec in Canada msgid "Saint-Jovite" msgstr "Saint-Jovite" #. A city in Quebec in Canada msgid "Sainte-Anne-de-la-Pocatière" msgstr "Sainte-Anne-de-la-Pocatière" #. A city in British Columbia in Canada msgid "Salmon Arm" msgstr "Salmon Arm" #. A city in British Columbia in Canada msgid "Sandspit" msgstr "Sandspit" #. A city in Ontario in Canada msgid "Sarnia" msgstr "Sarnia" #. A city in Saskatchewan in Canada msgid "Saskatoon" msgstr "Saskatoon" #. A city in Ontario in Canada msgid "Sault Sainte Marie" msgstr "Sault Sainte Marie" #. A city in Quebec in Canada msgid "Schefferville" msgstr "Schefferville" #. A city in Alberta in Canada msgid "Seebe" msgstr "Seebe" #. A city in Quebec in Canada msgid "Senneville" msgstr "Senneville" #. A city in Quebec in Canada msgid "Sept-Îles" msgstr "Sept-Îles" #. A city in Quebec in Canada msgid "Shawinigan" msgstr "Shawinigan" #. A city in Nova Scotia in Canada msgid "Sheet Harbour" msgstr "Sheet Harbour" #. A city in Quebec in Canada msgid "Sherbrooke" msgstr "Sherbrooke" #. A city in Yukon Territory in Canada msgid "Shingle Point" msgstr "Shingle Point" #. A city in Ontario in Canada msgid "Sioux Lookout" msgstr "Sioux vidikovac" #. A city in Alberta in Canada msgid "Slave Lake" msgstr "Jezero Slave" #. A city in British Columbia in Canada msgid "Smithers" msgstr "Smithers" #. A city in Yukon Territory in Canada msgid "Snag" msgstr "Snag" #. A city in Saskatchewan in Canada msgctxt "City in Saskatchewan, Canada" msgid "Southend" msgstr "Southend" #. A city in Alberta in Canada msgid "Spirit River" msgstr "Spirit River" #. A city in Saskatchewan in Canada msgid "Spiritwood" msgstr "Spiritwood" #. A city in British Columbia in Canada msgid "Squamish" msgstr "Squamish" #. A city in British Columbia in Canada msgid "Stephen" msgstr "Stephen" #. A city in Newfoundland and Labrador in Canada msgctxt "City in Newfoundland and Labrador, Canada" msgid "Stephenville" msgstr "Stephenville" #. A city in British Columbia in Canada msgid "Steveston" msgstr "Steveston" #. A city in British Columbia in Canada msgid "Stewart" msgstr "Stewart" #. A city in Quebec in Canada msgid "Stoneham" msgstr "Stoneham" #. A city in Saskatchewan in Canada msgid "Stony Rapids" msgstr "Stony Rapids" #. A city in Ontario in Canada msgid "Sudbury" msgstr "Sudbury" #. A city in British Columbia in Canada msgid "Summerland" msgstr "Summerland" #. A city in Prince Edward Island in Canada msgid "Summerside" msgstr "Summerside" #. A city in Manitoba in Canada msgid "Swan River" msgstr "Rijeka Swan" #. A city in Saskatchewan in Canada msgid "Swift Current" msgstr "Swift Current" #. A city in Nova Scotia in Canada msgctxt "City in Nova Scotia, Canada" msgid "Sydney" msgstr "Sydney" #. A city in Nunavut in Canada msgid "Taloyoak" msgstr "Taloyoak" #. A city in Newfoundland and Labrador in Canada msgid "Terra Nova" msgstr "Terra Nova" #. A city in British Columbia in Canada msgid "Terrace" msgstr "Terrace" #. A city in Yukon Territory in Canada msgid "Teslin" msgstr "Teslin" #. A city in Manitoba in Canada msgid "The Pas" msgstr "The Pas" #. A city in Manitoba in Canada msgid "Thompson" msgstr "Thompson" #. A city in Alberta in Canada msgid "Three Hills" msgstr "Three Hills" #. A city in Ontario in Canada msgid "Thunder Bay" msgstr "Thunder Bay" #. A city in Prince Edward Island in Canada msgid "Tignish" msgstr "Tignish" #. A city in Ontario in Canada msgid "Timmins" msgstr "Timmins" #. A city in Ontario in Canada msgid "Tobermory" msgstr "Tobermory" #. A city in British Columbia in Canada msgid "Tofino" msgstr "Tofino" #. A city in Ontario in Canada msgid "Toronto" msgstr "Toronto" #. A city in British Columbia in Canada msgid "Tow Hill" msgstr "Tow Hill" #. A city in Ontario in Canada msgctxt "City in Ontario, Canada" msgid "Trenton" msgstr "Trenton" #. A city in Quebec in Canada msgid "Trois-Rivières" msgstr "Trois-Rivières" #. A city in British Columbia in Canada msgid "Trout Lake" msgstr "Jezero Trout" #. A city in Northwest Territories in Canada msgid "Tuktoyaktuk" msgstr "Tuktoyaktuk" #. A city in Northwest Territories in Canada msgid "Tununuk" msgstr "Tununuk" #. A city in Newfoundland and Labrador in Canada msgid "Twillingate" msgstr "Twillingate" #. A city in Ontario in Canada msgid "Upsala" msgstr "Upsala" #. A city in Saskatchewan in Canada msgid "Uranium City" msgstr "Uranium City" #. A city in Saskatchewan in Canada msgid "Val Marie" msgstr "Val Marie" #. A city in Quebec in Canada msgid "Val-d'Or" msgstr "Val-d'Or" #. A city in Quebec in Canada msgid "Valcartier Station" msgstr "Valcartier Station" #. A city in British Columbia in Canada msgctxt "City in British Columbia, Canada" msgid "Vancouver" msgstr "Vancouver" #. A city in Quebec in Canada msgid "Varennes" msgstr "Varennes" #. A city in Alberta in Canada msgid "Vegreville" msgstr "Vegreville" #. A city in British Columbia in Canada msgctxt "City in British Columbia, Canada" msgid "Vernon" msgstr "Vernon" #. A city in British Columbia in Canada msgctxt "City in British Columbia, Canada" msgid "Victoria" msgstr "Victoria" #. A city in Manitoba in Canada msgid "Victoria Beach" msgstr "Victoria Beach" #. A city in Newfoundland and Labrador in Canada msgid "Wabush" msgstr "Wabush" #. A city in Ontario in Canada msgctxt "City in Ontario, Canada" msgid "Waterloo" msgstr "Waterloo" #. A city in Saskatchewan in Canada msgid "Watrous" msgstr "Watrous" #. A city in Yukon Territory in Canada msgid "Watson Lake" msgstr "Jezero Watson" #. A city in Ontario in Canada msgid "Wawa" msgstr "Wawa" #. A city in Nova Scotia in Canada msgid "Westport" msgstr "Westport" #. A city in Saskatchewan in Canada msgid "Weyburn" msgstr "Weyburn" #. A city in Northwest Territories in Canada msgid "Wha Ti" msgstr "Wha Ti" #. A city in British Columbia in Canada msgid "White Rock" msgstr "White Rock" #. A city in Alberta in Canada msgid "Whitecourt" msgstr "Whitecourt" #. A city in Ontario in Canada msgid "Whitefish Falls" msgstr "Whitefish Falls" #. A city in Yukon Territory in Canada msgid "Whitehorse" msgstr "Whitehorse" #. A city in Ontario in Canada msgid "Wiarton" msgstr "Wiarton" #. A city in British Columbia in Canada msgid "Williams Lake" msgstr "Jezero Williams" #. A city in Ontario in Canada msgid "Windsor" msgstr "Windsor" #. A city in Manitoba in Canada msgid "Winnipeg" msgstr "Winnipeg" #. A city in British Columbia in Canada msgid "Winter Harbour" msgstr "Winter Harbour" #. A city in Saskatchewan in Canada msgid "Wynyard" msgstr "Wynyard" #. A city in Nova Scotia in Canada msgid "Yarmouth" msgstr "Yarmouth" #. A city in Northwest Territories in Canada msgid "Yellowknife" msgstr "Yellowknife" #. A city in Saskatchewan in Canada msgid "Yorkton" msgstr "Yorkton" #. A city in Cape Verde msgid "Preguiça" msgstr "Preguiça" #. The capital of the Cayman Islands msgctxt "City in Cayman Islands" msgid "George Town" msgstr "George Town" #. A city in the Cayman Islands msgid "Knob Hill" msgstr "Knob Hill" #. A city in the Cayman Islands msgid "Red Bay Estate" msgstr "Red Bay Estate" #. A city in the Central African Republic msgid "Bangassou" msgstr "Bangassou" #. The capital of the Central African Republic msgid "Bangui" msgstr "Bangui" #. A city in the Central African Republic msgid "Berberati" msgstr "Berberati" #. A city in Chad msgid "Moundou" msgstr "Moundou" #. The capital of Chad msgid "N'Djamena" msgstr "N'Djamena" #. A city in Chad msgid "Sarh" msgstr "Sarh" #. A city in Chile msgid "Antofagasta" msgstr "Antofagasta" #. A city in Chile msgid "Arica" msgstr "Arika" #. A city in Chile msgid "Balmaceda" msgstr "Balmaceda" #. A city in Chile msgctxt "City in Chile" msgid "Concepción" msgstr "Concepción" #. A city in Chile msgid "Curico" msgstr "Curico" #. A city in Chile msgid "Hanga Roa" msgstr "Hanga Roa" #. A city in Chile msgid "Iquique" msgstr "Iquique" #. A city in Chile msgid "La Serena" msgstr "La Serena" #. A city in Chile msgid "Puerto Montt" msgstr "Puerto Montt" #. A city in Chile msgid "Punta Arenas" msgstr "Punta Arenas" #. A city in Chile msgid "Santa Teresa de Lo Ovalle" msgstr "Santa Teresa de Lo Ovalle" #. The capital of Chile msgctxt "City in Chile" msgid "Santiago" msgstr "Santiago" #. A city in Chile msgid "Temuco" msgstr "Temuco" #. The capital of China msgctxt "City in Beijing, China" msgid "Beijing" msgstr "Peking" #. A city in Jilin in China. #. The name is also written "长春". #. msgid "Changchun" msgstr "Changchun" #. A city in Hunan in China. #. The name is also written "长沙". #. msgid "Changsha" msgstr "Changsha" #. A city in Sichuan in China. #. The name is also written "成都". #. msgid "Chengdu" msgstr "Chengdu" #. A city in Chongqing in China. #. The name is also written "重庆". #. msgctxt "City in Chongqing, China" msgid "Chongqing" msgstr "Chongqing" #. A city in Liaoning in China msgid "Dalian" msgstr "Dalian" #. A city in Fujian in China. #. The name is also written "福州". #. msgid "Fuzhou" msgstr "Fuzhou" #. A city in Guangdong in China. #. The name is also written "广州". #. msgid "Guangzhou" msgstr "Guangzhou" #. A city in Guangxi in China msgid "Guilin" msgstr "Guilin" #. A city in Zhejiang in China. #. The name is also written "杭州". #. msgid "Hangzhou" msgstr "Hangzhou" #. A city in Heilongjiang in China. #. The name is also written "哈尔滨". #. msgid "Harbin" msgstr "Harbin" #. A city in Anhui in China. #. The name is also written "合肥". #. msgid "Hefei" msgstr "Hefei" #. A city in Inner Mongolia in China. #. The name is also written "呼和浩特". #. msgid "Hohhot" msgstr "Hohhot" #. A city in Shandong in China. #. The name is also written "济南" msgid "Jinan" msgstr "Jinan" #. A city in Xinjiang in China msgid "Kashi" msgstr "Kashi" #. A city in Yunnan in China. #. The name is also written "昆明". #. msgid "Kunming" msgstr "Kunming" #. A city in Gansu in China. #. The name is also written "兰州". #. msgid "Lanzhou" msgstr "Lanzhou" #. A city in Jiangsu in China. #. The name is also written "南京". #. msgid "Nanjing" msgstr "Nanjing" #. A city in Guangxi in China. #. The name is also written "南宁". #. msgid "Nanning" msgstr "Nanning" #. A city in Shandong in China msgid "Qingdao" msgstr "Qingdao" #. A city in Hainan in China msgid "Sanya" msgstr "Sanya" #. A city in Shanghai in China. #. The name is also written "上海". #. msgctxt "City in Shanghai, China" msgid "Shanghai" msgstr "Šangaj" #. A city in Guangdong in China msgid "Shantou" msgstr "Shantou" #. A city in Liaoning in China. #. The name is also written "沈阳". #. msgid "Shenyang" msgstr "Shenyang" #. A city in Guangdong in China msgid "Shenzhen" msgstr "Shenzhen" #. A city in Shanxi in China. #. The name is also written "太原". #. msgid "Taiyuan" msgstr "Taiyuan" #. A city in Tianjin in China. #. The name is also written "天津". #. msgctxt "City in Tianjin, China" msgid "Tianjin" msgstr "Tianjin" #. A city in Xinjiang in China. #. The name is also written "乌鲁木齐". #. msgid "Urumqi" msgstr "Urumqi" #. A city in Hubei in China. #. The name is also written "武汉". #. msgid "Wuhan" msgstr "Wuhan" #. A city in Shaanxi in China. #. The name is also written "西安". #. msgid "Xi'an" msgstr "Xi'an" #. A city in Fujian in China. #. The name is also written "厦门". #. msgid "Xiamen" msgstr "Xiamen" #. A city in Henan in China. #. The name is also written "郑州". #. msgid "Zhengzhou" msgstr "Zhengzhou" #. A city in Christmas Island msgid "Drumsite" msgstr "Drumsite" #. The capital of Christmas Island msgid "Flying Fish Cove" msgstr "Flying Fish Cove" #. A city in the Cocos (Keeling) Islands msgid "Bantam Village" msgstr "Bantam Village" #. A city in Colombia msgid "Barranquilla" msgstr "Barranquilla" #. The capital of Colombia msgid "Bogotá" msgstr "Bogotá" #. A city in Colombia msgid "Bucaramanga" msgstr "Bucaramanga" #. A city in Colombia msgid "Cali" msgstr "Cali" #. A city in Colombia msgid "Cartagena" msgstr "Cartagena" #. A city in Colombia msgid "Cúcuta" msgstr "Cúcuta" #. A city in Colombia msgid "Ibagué" msgstr "Ibagué" #. A city in Colombia msgid "Ipiales" msgstr "Ipiales" #. A city in Colombia msgid "Leticia" msgstr "Leticia" #. A city in Colombia msgid "Medellín" msgstr "Medellín" #. A city in Colombia msgid "Monteria" msgstr "Monteria" #. A city in Colombia msgid "Pasto" msgstr "Pasto" #. A city in Colombia msgid "Pereira" msgstr "Pereira" #. A city in Colombia msgid "Popayán" msgstr "Popayán" #. A city in Colombia msgid "Quibdó" msgstr "Quibdó" #. A city in Colombia msgid "Riohacha" msgstr "Riohacha" #. A city in Colombia msgid "Rionegro" msgstr "Rionegro" #. A city in Colombia msgid "San Andrés" msgstr "San Andrés" #. A city in Colombia msgid "Santa Marta" msgstr "Santa Marta" #. A city in Colombia msgid "Villavicencio" msgstr "Villavicencio" #. A city in Comoros msgid "Mbaléni" msgstr "Mbaléni" #. The capital of Comoros msgid "Moroni" msgstr "Moroni" #. The capital of the Democratic Republic of the Congo msgid "Kinshasa" msgstr "Kinshasa" #. The capital of the Republic of the Congo msgid "Brazzaville" msgstr "Brazzaville" #. A city in the Republic of the Congo msgid "Pointe-Noire" msgstr "Pointe - Noire" #. The capital of the Cook Islands msgid "Avarua" msgstr "Avarua" #. A city in Costa Rica msgid "Alajuela" msgstr "Alajuela" #. A city in Costa Rica msgctxt "City in Costa Rica" msgid "Liberia" msgstr "Liberia" #. A city in Costa Rica msgid "Mata de Palo" msgstr "Mata de Palo" #. A city in Costa Rica msgid "Puerto Limón" msgstr "Puerto Limón" #. The capital of Costa Rica msgid "San José" msgstr "San José" #. A city in Croatia msgid "Bol" msgstr "Bol" #. A city in Croatia msgid "Dubrovnik" msgstr "Dubrovnik" #. A city in Croatia msgid "Jelovice" msgstr "Jelovice" #. A city in Croatia msgid "Liška" msgstr "Liška" #. A city in Croatia msgid "Osijek" msgstr "Osijek" #. A city in Croatia msgid "Rijeka" msgstr "Rijeka" #. A city in Croatia msgid "Split" msgstr "Split" #. A city in Croatia msgid "Zadar" msgstr "Zadar" #. The capital of Croatia msgid "Zagreb" msgstr "Zagreb" #. A city in Cuba msgid "Camagüey" msgstr "Camagüey" #. A city in Cuba msgid "Cienfuegos" msgstr "Cienfuegos" #. A city in Cuba msgid "Guantánamo" msgstr "Guantánamo" #. The capital of Cuba. #. "Havana" is the traditional English name. #. The local name in Spanish is "La Habana". #. msgid "Havana" msgstr "Havana" #. A city in Cuba msgid "Holguín" msgstr "Holguín" #. A city in Cuba msgctxt "City in Cuba" msgid "Manzanillo" msgstr "Manzanillo" #. A city in Cuba msgid "Matanzas" msgstr "Matanzas" #. A city in Cuba msgid "Santiago de Cuba" msgstr "Santiago de Cuba" #. A city in Cyprus msgid "Akrotiri" msgstr "Akrotiri" #. A city in Cyprus msgid "Larnaca" msgstr "Larnaka" #. The capital of Cyprus msgid "Nicosia" msgstr "Nikozija" #. A city in Cyprus msgid "Paphos" msgstr "Paphos" #. A city in Cyprus msgid "Tymbou" msgstr "Tymbou" #. A city in the Czech Republic msgid "Brno" msgstr "Brno" #. A city in the Czech Republic msgid "Holešov" msgstr "Holešov" #. A city in the Czech Republic msgid "Karlovy Vary" msgstr "Karlovy Vary" #. A city in the Czech Republic msgid "Liberec" msgstr "Liberec" #. A city in the Czech Republic msgid "Ostrava" msgstr "Ostrava" #. The capital of the Czech Republic. #. "Prague" is the traditional English name. #. The local name in Czech is "Praha". #. msgid "Prague" msgstr "Prag" #. A city in Côte d'Ivoire msgid "Abidjan" msgstr "Abidjan" #. A city in Denmark msgid "Billund" msgstr "Billund" #. The capital of Denmark. #. "Copenhagen" is the traditional English name. #. The local name is "København". #. msgid "Copenhagen" msgstr "Copenhagen" #. A city in Denmark msgid "Esbjerg" msgstr "Esbjerg" #. A city in Denmark msgid "Karup" msgstr "Karup" #. A city in Denmark msgid "Kastrup" msgstr "Kastrup" #. A city in Denmark msgid "Mejlby" msgstr "Mejlby" #. A city in Denmark msgid "Odense" msgstr "Odense" #. A city in Denmark msgid "Roskilde" msgstr "Roskilde" #. A city in Denmark msgid "Rønne" msgstr "Rønne" #. A city in Denmark msgid "Skrydstrup" msgstr "Skrydstrup" #. A city in Denmark msgid "Sottrupskov" msgstr "Sottrupskov" #. A city in Denmark msgid "Tirstrup" msgstr "Tirstrup" #. A city in Denmark msgid "Vamdrup" msgstr "Vamdrup" #. A city in Denmark msgid "Ålborg" msgstr "Ålborg" #. The capital of Djibouti msgctxt "City in Djibouti" msgid "Djibouti" msgstr "Džibuti" #. A city in Dominica msgid "Marigot" msgstr "Marigot" #. The capital of Dominica msgctxt "City in Dominica" msgid "Roseau" msgstr "Roseau" #. A city in Dominica msgid "Saint Joseph" msgstr "Saint Joseph" #. A city in the Dominican Republic msgid "Barahona" msgstr "Barahona" #. A city in the Dominican Republic msgid "La Romana" msgstr "La Romana" #. A city in the Dominican Republic msgid "Mancha Nueva" msgstr "Mancha Nueva" #. A city in the Dominican Republic msgid "Pantanal" msgstr "Pantanal" #. A city in the Dominican Republic msgid "Puerto Plata" msgstr "Puerto Plata" #. A city in the Dominican Republic msgctxt "City in Dominican Republic" msgid "Santiago" msgstr "Santiago" #. The capital of the Dominican Republic msgid "Santo Domingo" msgstr "Santo Domingo" #. A city in Ecuador msgid "Guayaquil" msgstr "Guayaquil" #. A city in Ecuador msgid "Latacunga" msgstr "Latacunga" #. A city in Ecuador msgid "Manta" msgstr "Manta" #. The capital of Ecuador msgid "Quito" msgstr "Quito" #. A city in Egypt msgid "Al 'Arish" msgstr "Al 'Arish" #. A city in Egypt msgid "Al Ghardaqah" msgstr "Al Ghardaqah" #. A city in Egypt msgid "Al Qabuti" msgstr "Al Qabuti" #. A city in Egypt. #. "Alexandria" is the traditional English name. #. The local name in Arabic is "Al Iskandariyah". #. msgctxt "City in Egypt" msgid "Alexandria" msgstr "Aleksandrija" #. A city in Egypt msgid "Aswan" msgstr "Aswan" #. A city in Egypt msgid "Asyut" msgstr "Asyut" #. The capital of Egypt. #. "Cairo" is the traditional English name. #. The local name in Arabic is "Al Qahirah". #. msgctxt "City in Egypt" msgid "Cairo" msgstr "Kairo" #. A city in Egypt. #. "Luxor" is the traditional English name. #. The local name in Arabic is "Al Uqsur". #. msgid "Luxor" msgstr "Luxor" #. A city in Egypt msgid "Marsa Matruh" msgstr "Marsa Matruh" #. A city in Egypt msgid "Sharm ash Shaykh" msgstr "Sharm ash Shaykh" #. A city in Egypt msgid "Taba" msgstr "Taba" #. A city in El Salvador msgid "Comalapa" msgstr "Comalapa" #. A city in El Salvador msgid "Ilopango" msgstr "Ilopango" #. The capital of El Salvador msgid "San Salvador" msgstr "San Salvador" #. The capital of Equatorial Guinea msgid "Malabo" msgstr "Malabo" #. A city in Estonia msgid "Kuressaare" msgstr "Kuressaare" #. A city in Estonia msgid "Kärdla" msgstr "Kärdla" #. A city in Estonia msgid "Pärnu" msgstr "Pärnu" #. The capital of Estonia msgid "Tallinn" msgstr "Tallinn" #. A city in Estonia msgid "Tartu" msgstr "Tartu" #. The capital of the Falkland Islands (Malvinas) msgctxt "City in Falkland Islands (Malvinas)" msgid "Stanley" msgstr "Stanley" #. A city in the Faroe Islands msgid "Sørvágur" msgstr "Sørvágur" #. The capital of the Faroe Islands msgid "Tórshavn" msgstr "Tórshavn" #. The capital of Fiji msgid "Suva" msgstr "Suva" #. A city in Finland msgid "Enontekiö" msgstr "Enontekiö" #. A city in Finland msgid "Halli" msgstr "Halli" #. The capital of Finland. #. The local name in Swedish is "Helsingfors". #. msgid "Helsinki" msgstr "Helsinki" #. A city in Finland msgid "Ivalo" msgstr "Ivalo" #. A city in Finland msgid "Joensuu" msgstr "Joensuu" #. A city in Finland msgid "Jyväskylä" msgstr "Jyväskylä" #. A city in Finland msgid "Kajaani" msgstr "Kajaani" #. A city in Finland msgid "Kauhava" msgstr "Kauhava" #. A city in Finland msgid "Kemi" msgstr "Kemi" #. A city in Finland msgid "Kittilä" msgstr "Kittilä" #. A city in Finland. #. The local name in Swedish is "Kronoby". #. msgid "Kruunupyy" msgstr "Kruunupyy" #. A city in Finland msgid "Kuopio" msgstr "Kuopio" #. A city in Finland msgid "Kuusamo" msgstr "Kuusamo" #. A city in Finland msgid "Lappeenranta" msgstr "Lappeenranta" #. A city in Finland msgid "Mikkeli" msgstr "Mikkeli" #. A city in Finland msgid "Oulu" msgstr "Oulu" #. A city in Finland msgid "Pori" msgstr "Pori" #. A city in Finland msgid "Rovaniemi" msgstr "Rovaniemi" #. A city in Finland msgid "Savonlinna" msgstr "Savonlinna" #. A city in Finland msgid "Seinäjoki" msgstr "Seinäjoki" #. A city in Finland msgid "Tampere" msgstr "Tampere" #. A city in Finland. #. The local name in Swedish is "Åbo". #. msgid "Turku" msgstr "Turku" #. A city in Finland msgid "Utti" msgstr "Utti" #. A city in Finland. #. The local name in Swedish is "Vasa". #. msgid "Vaasa" msgstr "Vaasa" #. A city in Finland. #. The local name in Swedish is "Vanda". #. msgid "Vantaa" msgstr "Vantaa" #. A city in Finland msgid "Varkaus" msgstr "Varkaus" #. A city in France msgid "Agen" msgstr "Agen" #. A city in France msgid "Ajaccio" msgstr "Ajaccio" #. A city in France msgid "Alençon" msgstr "Alençon" #. A city in France msgid "Amiens" msgstr "Amiens" #. A city in France msgid "Auch" msgstr "Auch" #. A city in France msgid "Aurillac" msgstr "Aurillac" #. A city in France msgid "Bastia" msgstr "Bastia" #. A city in France msgid "Beauvais" msgstr "Beauvais" #. A city in France msgid "Bergerac" msgstr "Bergerac" #. A city in France msgid "Biarritz" msgstr "Biarritz" #. A city in France msgctxt "City in France" msgid "Bordeaux" msgstr "Bordeaux" #. A city in France msgid "Bourg-en-Bresse" msgstr "Bourges-en-Bresse" #. A city in France msgid "Bourges" msgstr "Bourges" #. A city in France msgctxt "City in France" msgid "Brest" msgstr "Brest" #. A city in France msgid "Brive" msgstr "Brive" #. A city in France msgid "Béziers" msgstr "Béziers" #. A city in France msgid "Caen" msgstr "Caen" #. A city in France msgid "Calvi" msgstr "Calvi" #. A city in France msgid "Cambrai" msgstr "Cambrai" #. A city in France msgid "Cannes" msgstr "Cannes" #. A city in France msgid "Carcassonne" msgstr "Carcassonne" #. A city in France msgid "Chambéry" msgstr "Chambéry" #. A city in France msgid "Chartres" msgstr "Chartres" #. A city in France msgid "Cherbourg" msgstr "Cherbourg" #. A city in France msgid "Châteauroux" msgstr "Châteauroux" #. A city in France msgid "Clermont-Ferrand" msgstr "Clermont-Ferrand" #. A city in France msgid "Cognac" msgstr "Konjak" #. A city in France msgid "Colmar" msgstr "Colmar" #. A city in France msgid "Dax" msgstr "Dax" #. A city in France msgid "Dijon" msgstr "Dijon" #. A city in France msgid "Dinard" msgstr "Dinard" #. A city in France msgid "Dole" msgstr "Dole" #. A city in France msgid "Dollemard" msgstr "Dollemard" #. A city in France msgid "Grenoble" msgstr "Grenoble" #. A city in France msgid "Hoëricourt" msgstr "Hoëricourt" #. A city in France msgid "Hyères" msgstr "Hyères" #. A city in France msgid "Istres" msgstr "Istres" #. A city in France msgid "La Roche-sur-Yon" msgstr "La Roche-sur-Yon" #. A city in France msgid "La Rochelle" msgstr "La Rochelle" #. A city in France msgid "Lannion" msgstr "Lannion" #. A city in France msgid "Le Mans" msgstr "Le Mans" #. A city in France msgid "Le Puy" msgstr "Le Puy" #. A city in France msgid "Lille" msgstr "Lille" #. A city in France msgid "Limoges" msgstr "Limoges" #. A city in France msgid "Luxeuil-les-Bains" msgstr "Luxeuil-les-Bains" #. A city in France msgid "Lyon" msgstr "Lyon" #. A city in France msgid "Marseille" msgstr "Marseille" #. A city in France msgid "Melun" msgstr "Melun" #. A city in France msgid "Metz" msgstr "Metz" #. A city in France msgid "Mont-de-Marsan" msgstr "Mont-de-Marsan" #. A city in France msgid "Montgauch" msgstr "Montgauch" #. A city in France msgid "Montpellier" msgstr "Montpellier" #. A city in France msgid "Montélimar" msgstr "Montélimar" #. A city in France msgid "Mulhouse" msgstr "Mulhouse" #. A city in France msgid "Mâcon" msgstr "Mâcon" #. A city in France msgid "Méné Guen" msgstr "Méné Guen" #. A city in France msgid "Nancy" msgstr "Nancy" #. A city in France msgid "Nantes" msgstr "Nantes" #. A city in France msgid "Nevers" msgstr "Nevers" #. A city in France msgid "Nice" msgstr "Nice" #. A city in France msgid "Nîmes" msgstr "Nîmes" #. A city in France msgctxt "City in France" msgid "Orange" msgstr "Orange" #. A city in France msgid "Orléans" msgstr "Orléans" #. The capital of France msgctxt "City in France" msgid "Paris" msgstr "Pariz" #. A city in France msgid "Pau" msgstr "Pau" #. A city in France msgid "Perpignan" msgstr "Perpignan" #. A city in France msgid "Poggiale" msgstr "Poggiale" #. A city in France msgid "Poitiers" msgstr "Poitiers" #. A city in France msgid "Quimper" msgstr "Quimper" #. A city in France msgid "Reims" msgstr "Reims" #. A city in France msgid "Rennes" msgstr "Rennes" #. A city in France msgid "Rodez" msgstr "Rodez" #. A city in France msgid "Romorantin" msgstr "Romorantin" #. A city in France msgid "Rouen" msgstr "Rouen" #. A city in France msgid "Saint-Brieuc" msgstr "Saint - Brieuc" #. A city in France msgid "Saint-Quentin" msgstr "Sveti Quentin" #. A city in France msgid "Saint-Yan" msgstr "Sveti Yan" #. A city in France msgid "Salon" msgstr "Salon" #. A city in France msgid "Strasbourg" msgstr "Strasbourg" #. A city in France msgid "Tarbes" msgstr "Tarbes" #. A city in France msgid "Toulouse" msgstr "Toulouse" #. A city in France msgid "Tours" msgstr "Tours" #. A city in France msgid "Trignac" msgstr "Trignac" #. A city in France msgid "Troyes" msgstr "Troyes" #. A city in France msgid "Veauche" msgstr "Veauche" #. A city in France msgctxt "City in France" msgid "Vichy" msgstr "Vichy" #. A city in France msgid "Vélizy" msgstr "Vélizy" #. A city in France msgid "Évreux" msgstr "Évreux" #. The capital of French Guiana msgid "Cayenne" msgstr "Cayenne" #. The capital of French Polynesia msgid "Papeete" msgstr "Papeete" #. A city in Gabon msgid "Franceville" msgstr "Franceville" #. The capital of Gabon msgid "Libreville" msgstr "Libreville" #. A city in Gabon msgid "Port-Gentil" msgstr "Port - Gentil" #. The capital of Gambia msgid "Banjul" msgstr "Banjul" #. A city in Lower Saxony in Germany msgid "Achum" msgstr "Achum" #. A city in Thuringia in Germany msgid "Altenburg" msgstr "Altenburg" #. A city in Bavaria in Germany msgid "Augsburg" msgstr "Augsburg" #. A city in North Rhine-Westphalia in Germany msgid "Baal" msgstr "Baal" #. The capital of Germany msgctxt "City in Berlin, Germany" msgid "Berlin" msgstr "Berlin" #. A city in Thuringia in Germany msgid "Bindersleben" msgstr "Bindersleben" #. A city in North Rhine-Westphalia in Germany msgid "Bonn" msgstr "Bonn" #. A city in Lower Saxony in Germany msgid "Braunschweig" msgstr "Braunschweig" #. A city in North Rhine-Westphalia in Germany msgid "Bredeck" msgstr "Bredeck" #. A city in Bremen in Germany msgctxt "City in Bremen, Germany" msgid "Bremen" msgstr "Bremen" #. A city in Rhineland-Palatinate in Germany msgid "Büchel" msgstr "Büchel" #. A city in Lower Saxony in Germany msgid "Celle" msgstr "Celle" #. A city in Baden-Württemberg in Germany msgid "Donaueschingen" msgstr "Donaueschingen" #. A city in Bavaria in Germany msgid "Dorfgmünd" msgstr "Dorfgmünd" #. A city in North Rhine-Westphalia in Germany msgid "Dortmund" msgstr "Dortmund" #. A city in Saxony in Germany msgid "Dresden" msgstr "Dresden" #. A city in Lower Saxony in Germany msgid "Faßberg" msgstr "Faßberg" #. A city in Hesse in Germany msgid "Frankfurt" msgstr "Frankfurt" #. A city in Baden-Württemberg in Germany msgid "Friedrichshafen" msgstr "Friedrichshafen" #. A city in Hesse in Germany msgid "Fritzlar" msgstr "Fritzlar" #. A city in North Rhine-Westphalia in Germany msgid "Geilenkirchen" msgstr "Geilenkirchen" #. A city in Rhineland-Palatinate in Germany msgid "Hahn" msgstr "Hahn" #. A city in Hamburg in Germany msgctxt "City in Hamburg, Germany" msgid "Hamburg" msgstr "Hamburg" #. A city in Lower Saxony in Germany msgid "Hannover" msgstr "Hannover" #. A city in Bavaria in Germany msgid "Hof" msgstr "Hof" #. A city in Schleswig-Holstein in Germany msgid "Hohn" msgstr "Hohn" #. A city in Saxony-Anhalt in Germany msgid "Holzdorf" msgstr "Holzdorf" #. A city in Bavaria in Germany msgid "Illesheim" msgstr "Illesheim" #. A city in North Rhine-Westphalia in Germany msgid "Kalkar" msgstr "Kalkar" #. A city in North Rhine-Westphalia in Germany msgid "Kalkum" msgstr "Kalkum" #. A city in Baden-Württemberg in Germany msgid "Karlsruhe" msgstr "Karlsruhe" #. A city in Hesse in Germany msgid "Kassel" msgstr "Kassel" #. A city in Bavaria in Germany msgid "Katterbach" msgstr "Katterbach" #. A city in Schleswig-Holstein in Germany msgid "Kiel" msgstr "Kiel" #. A city in North Rhine-Westphalia in Germany msgid "Klemenshof" msgstr "Klemenshof" #. A city in Mecklenburg-Western Pomerania in Germany msgid "Laage" msgstr "Laage" #. A city in Bavaria in Germany msgid "Lager Lechfeld" msgstr "Lager Lechfeld" #. A city in Baden-Württemberg in Germany msgid "Lahr" msgstr "Lahr" #. A city in Bavaria in Germany msgid "Landsberg" msgstr "Landsberg" #. A city in Baden-Württemberg in Germany msgid "Laupheim" msgstr "Laupheim" #. A city in Saxony in Germany msgid "Leipzig" msgstr "Leipzig" #. A city in Rhineland-Palatinate in Germany msgid "Liebenscheid" msgstr "Liebenscheid" #. A city in Bavaria in Germany msgid "Memmingen" msgstr "Memmingen" #. A city in Baden-Württemberg in Germany msgid "Meßstetten" msgstr "Meßstetten" #. A city in Bavaria in Germany. #. "Munich" is the traditional English name. #. The local name is "München". #. msgid "Munich" msgstr "Munich" #. A city in North Rhine-Westphalia in Germany msgid "Mönchengladbach" msgstr "Mönchengladbach" #. A city in North Rhine-Westphalia in Germany msgid "Münster" msgstr "Münster" #. A city in Bavaria in Germany. #. One of several cities in Germany called "Neuburg". #. msgid "Neuburg an der Donau" msgstr "Neuburg na Dunavu" #. A city in Baden-Württemberg in Germany msgid "Neuostheim" msgstr "Neuostheim" #. A city in Baden-Württemberg in Germany msgid "Niederstetten" msgstr "Niederstetten" #. A city in Lower Saxony in Germany msgid "Nordholz" msgstr "Nordholz" #. A city in Bavaria in Germany. #. "Nuremberg" is the traditional English name. #. The local name is "Nürnberg". #. msgid "Nuremberg" msgstr "Nuremberg" #. A city in Bavaria in Germany msgid "Oberpfaffenhofen" msgstr "Oberpfaffenhofen" #. A city in North Rhine-Westphalia in Germany msgid "Paderborn" msgstr "Paderborn" #. A city in Mecklenburg-Western Pomerania in Germany msgid "Parchim" msgstr "Parchim" #. A city in Rhineland-Palatinate in Germany msgid "Ramstein" msgstr "Ramstein" #. A city in North Rhine-Westphalia in Germany msgid "Rheine" msgstr "Rheine" #. A city in Bavaria in Germany msgid "Roth" msgstr "Roth" #. A city in Saarland in Germany msgid "Saarbrücken" msgstr "Saarbrücken" #. A city in Schleswig-Holstein in Germany msgid "Schleswig" msgstr "Schleswig" #. A city in Mecklenburg-Western Pomerania in Germany msgid "Seebad Heringsdorf" msgstr "Seebad Heringsdorf" #. A city in Rhineland-Palatinate in Germany msgid "Spangdahlem" msgstr "Spangdahlem" #. A city in Baden-Württemberg in Germany msgctxt "City in Baden-Württemberg, Germany" msgid "Stuttgart" msgstr "Stuttgart" #. A city in Mecklenburg-Western Pomerania in Germany msgid "Trollenhagen" msgstr "Trollenhagen" #. A city in Schleswig-Holstein in Germany msgid "Ulstrupfeld" msgstr "Ulstrupfeld" #. A city in Schleswig-Holstein in Germany msgid "Vorrade" msgstr "Vorrade" #. A city in Lower Saxony in Germany msgid "Webershausen" msgstr "Webershausen" #. A city in Schleswig-Holstein in Germany msgid "Westerland" msgstr "Westerland" #. A city in Hesse in Germany msgid "Wiesbaden" msgstr "Wiesbaden" #. A city in Lower Saxony in Germany msgid "Wunstorf" msgstr "Wunstorf" #. A city in Bavaria in Germany msgid "Würzburg" msgstr "Würzburg" #. A city in Rhineland-Palatinate in Germany msgid "Zweibrücken" msgstr "Zweibrücken" #. The capital of Ghana msgid "Accra" msgstr "Accra" #. The capital of Gibraltar msgctxt "City in Gibraltar" msgid "Gibraltar" msgstr "Gibraltar" #. A city in Greece msgid "Alexandroúpolis" msgstr "Alexandroúpolis" #. A city in Greece msgid "Andravída" msgstr "Andravída" #. A city in Greece msgid "Argostólion" msgstr "Argostólion" #. The capital of Greece. #. "Athens" is the traditional English name. #. The local name in Greek is "Athína / Αθήνα". #. msgctxt "City in Greece" msgid "Athens" msgstr "Atena" #. A city in Greece msgid "Chrysoúpolis" msgstr "Chrysoúpolis" #. A city in Greece. #. The name is also written "Χίος". #. msgid "Chíos" msgstr "Chíos" #. A city in Greece msgid "Elefsís" msgstr "Elefsís" #. A city in Greece msgid "Irákleion" msgstr "Irákleion" #. A city in Greece. #. The name is also written "Καλαμάτα". #. msgid "Kalamáta" msgstr "Kalamáta" #. A city in Greece msgid "Karpásion" msgstr "Karpásion" #. A city in Greece msgid "Katomérion" msgstr "Katomérion" #. A city in Greece msgid "Kos" msgstr "Kos" #. A city in Greece msgid "Kozáni" msgstr "Kozáni" #. A city in Greece msgid "Kárpathos" msgstr "Kárpathos" #. A city in Greece. #. The name is also written "Κέρκυρα". #. msgid "Kérkyra" msgstr "Kérkyra" #. A city in Greece. #. The name is also written "Κύθηρα". #. msgid "Kýthira" msgstr "Kýthira" #. A city in Greece msgid "Lárisa" msgstr "Lárisa" #. A city in Greece msgid "Monólithos" msgstr "Monólithos" #. A city in Greece msgid "Mytilíni" msgstr "Mytilíni" #. A city in Greece. #. The name is also written "Μύκονος". #. msgid "Mýkonos" msgstr "Mýkonos" #. A city in Greece msgid "Náxos" msgstr "Náksos" #. A city in Greece msgid "Paradeísion" msgstr "Paradeísion" #. A city in Greece msgid "Páros" msgstr "Páros" #. A city in Greece msgid "Skíathos" msgstr "Skíathos" #. A city in Greece msgid "Soúda" msgstr "Soúda" #. A city in Greece msgid "Sámos" msgstr "Sámos" #. A city in Greece msgid "Tanágra" msgstr "Tanágra" #. A city in Greece msgid "Thessaloníki" msgstr "Thessaloníki" #. A city in Greece msgid "Zákynthos" msgstr "Zákynthos" #. A city in Greece msgid "Áno Síros" msgstr "Áno Síros" #. A city in Greece msgid "Áraxos" msgstr "Áraksos" #. A city in Greece msgid "Áyios Athanásios" msgstr "Áyios Athanásios" #. A city in Greenland. #. The local name in Kalaallisut is "Uummannaq". #. msgid "Dundas" msgstr "Dundas" #. The capital of Greenland. #. The local name in Kalaallisut is "Nuuk". #. msgid "Godthåb" msgstr "Nuuk" #. A city in Greenland msgid "Ittorisseq" msgstr "Ittorisseq" #. A city in Greenland. #. The local name in Kalaallisut is "Ilulissat". #. msgid "Jakobshavn" msgstr "Jakobshavn" #. A city in Greenland msgid "Kulusuk" msgstr "Kulusuk" #. A city in Greenland msgid "Narsarsuaq" msgstr "Narsarsuaq" #. A city in Greenland msgid "Søndre Strømfjord" msgstr "Søndre Strømfjord" #. A city in Grenada msgid "Bamboo" msgstr "Bamboo" #. The capital of Grenada msgid "Saint George's" msgstr "Saint George's" #. The capital of Guadeloupe msgid "Basse-Terre" msgstr "Basse-Terre" #. A city in Guadeloupe msgid "Les Abymes" msgstr "Les Abymes" #. A city in Guam msgid "Asatdas" msgstr "Asatdas" #. A city in Guam msgid "Hagåtña" msgstr "Hagåtña" #. The capital of Guatemala msgctxt "City in Guatemala" msgid "Guatemala" msgstr "Gvatemala" #. A city in Guatemala msgid "Huehuetenango" msgstr "Huehuetenango" #. A city in Guatemala msgid "Puerto Barrios" msgstr "Puerto Barrios" #. A city in Guatemala msgid "Puerto San José" msgstr "Puerto San José" #. A city in Guatemala msgid "Retalhuleu" msgstr "Retalhuleu" #. A city in Guatemala msgid "Tikal" msgstr "Tikal" #. A city in Guernsey msgid "Hautnez" msgstr "Hautnez" #. The capital of Guernsey msgid "Saint Peter Port" msgstr "Saint Peter Port" #. The capital of Guinea msgid "Conakry" msgstr "Conakry" #. The capital of Guyana msgctxt "City in Guyana" msgid "Georgetown" msgstr "Georgetown" #. Capital of Haiti msgid "Port-au-Prince" msgstr "Port-au-Prince" #. A city in Honduras msgid "Amapala" msgstr "Amapala" #. A city in Honduras msgid "Catacamas" msgstr "Catacamas" #. A city in Honduras msgid "Ciudad Choluteca" msgstr "Ciudad Choluteca" #. A city in Honduras msgid "Comayagua" msgstr "Comayagua" #. A city in Honduras msgid "Guanaja" msgstr "Guanaja" #. A city in Honduras msgid "La Ceiba" msgstr "La Ceiba" #. A city in Honduras msgid "La Esperanza" msgstr "La Esperanza" #. A city in Honduras msgid "La Mesa" msgstr "La Mesa" #. A city in Honduras msgid "Puerto Lempira" msgstr "Puerto Lempira" #. A city in Honduras msgid "Roatán" msgstr "Roatán" #. A city in Honduras msgid "Santa Rosa de Copán" msgstr "Santa Rosa de Copán" #. The capital of Honduras msgid "Tegucigalpa" msgstr "Tegucigalpa" #. A city in Honduras msgid "Tela" msgstr "Tela" #. A city in Honduras msgid "Yoro" msgstr "Yoro" #. The capital of Hungary msgid "Budapest" msgstr "Budimpešta" #. A city in Hungary msgid "Debrecen" msgstr "Debrecen" #. A city in Hungary msgid "Győr" msgstr "Győr" #. A city in Hungary msgid "Kecskemét" msgstr "Kecskemét" #. A city in Hungary msgid "Pápa" msgstr "Pápa" #. A city in Hungary msgid "Pécs" msgstr "Pečuh" #. A city in Hungary msgid "Szeged" msgstr "Szeged" #. A city in Hungary msgid "Szolnok" msgstr "Szolnok" #. A city in Iceland msgid "Akureyri" msgstr "Akureyri" #. A city in Iceland msgid "Eiðar" msgstr "Eiðar" #. The capital of Iceland msgid "Reykjavík" msgstr "Reykjavík" #. A city in Iceland msgid "Ytri-Njarðvík" msgstr "Ytri-Njarðvík" #. A city in India #. the local name in Bengali is "আগরতলা/Agortôla" msgid "Agartala" msgstr "Agartala" #. A city in India #. the local name in Hindi is "आगरा" #. msgid "Agra" msgstr "Agra" #. A city in India msgid "Ahmadabad" msgstr "Ahmadabad" #. A city in India #. the local name in Hindi is "इलाहाबाद" msgid "Allahabad" msgstr "Allahabad" #. A city in India #. the local name in Punjabi is "ਅੰਮ੍ਰਿਤਸਰ" #. msgid "Amritsar" msgstr "Amritsar" #. A city in India #. the local name in Marathi is "औरंगाबाद" msgid "Aurangabad" msgstr "Aurangabad" #. A city in India msgid "Bagdogra" msgstr "Bagdogra" #. A city in India - local airport #. "Bengaluru" is the new name #. msgid "Bangalore" msgstr "Bangalore" #. A city in India. #. "Benares" is the traditional English name. #. The local name is "Varanasi". #. The local name in Hindi is "वाराणसी". #. msgid "Benares" msgstr "Benares" #. A city in India #. the local name in Gujrati is "ભાવનગર" #. the local name in Hindi is "भावनगर" msgid "Bhavnagar" msgstr "Bhavnagar" #. A city in India. #. The local name in Hindi is "भोपाल". #. msgid "Bhopal" msgstr "Bopal" #. A city in India. #. The local name in Oriya is "ଭୁବେନଶ୍ବର". #. msgid "Bhubaneshwar" msgstr "Bhubaneshwar" #. A city in India. msgid "Bhuj" msgstr "Bhuj" #. A city in the Indian union territory of Andaman and Nicobar Islands. msgid "Car Nicobar" msgstr "Car Nicobar" #. A union territory in India. #. The local name in Hindi is "चण्डीगढ़ / चंडीगढ़" #. The local name in Punjabi is "ਚੰਡੀਗੜ੍ਹ" msgid "Chandigarh" msgstr "Chandigarh" #. A city in India. #. "Madras" is the traditional English name. #. The local name in Tamil is "Chennai / சென்னை". #. msgid "Chennai" msgstr "Chennai" #. A city in India. #. The local name in Tamil is "கோயம்புத்தூர்". #. msgid "Coimbatore" msgstr "Coimbatore" #. A city in India #. also known as Dehra Doon #. the local name in Hindi is "देहरादून" msgid "Dehradun" msgstr "Dehradun" #. A city in India msgid "Dibrugarh" msgstr "Dibrugarh" #. A city in India #. the local name in Hindi is "दीमापुर" msgid "Dimapur" msgstr "Dimapur" #. A city in India #. the local name in Telugu is "హైదరాబాద్" #. the local name in Urdu is "حیدرآباد" msgid "Hyderabad" msgstr "Hyderabad" #. A city in India msgid "Jaipur" msgstr "Jaipur" #. A city in India. #. The local name in Dogri is "जम्मू" msgid "Jammu" msgstr "Jammu" #. A city in India. #. The old name is "Cochin" #. A city in Japan msgid "Kochi" msgstr "Kochi" #. A city in India. #. "Calcutta" is the traditional English name. #. The local name in Bengali is "Kolkata / কলকাতা". #. msgid "Kolkata" msgstr "Kalkuta" #. A city in India. #. The local name in Hindi is "लेह" msgid "Leh" msgstr "Leh" #. A city in India. #. The local name in Hindi is "लखनऊ". #. msgid "Lucknow" msgstr "Lucknow" #. A city in India. #. "Bombay" is the traditional English name. #. The local name in Marathi is "Mumbai / मुंबई". #. msgid "Mumbai" msgstr "Mumbai" #. A city in India msgid "Nagpur" msgstr "Nagpur" #. The capital of India. #. The local name in Urdu is "نئی دلی‎". #. The local name in Panjabi is "ਨਵੀਂ ਦਿੱਲੀ". #. The local name in Hindi is "नई दिल्ली". #. msgid "New Delhi" msgstr "New Delhi" #. A city in India msgid "Patna" msgstr "Patna" #. A city in India. #. The local name in Hindi is "पोर्ट ब्लेयर" msgid "Port Blair" msgstr "Port Hardy" #. A city in India msgid "Pune" msgstr "Pune" #. A city in India. #. The local name in Hindi is "शिमला" msgid "Shimla" msgstr "Shimla" #. A city in India. #. The local name in Dogri is "श्रीनगर" #. The local name in Urdu is "شرینگر" msgid "Srinagar" msgstr "Srinagar" #. A city in India. #. The local name in Malayalam is "തിരുവനന്തപുരം". #. msgid "Thiruvananthapuram" msgstr "Thiruvananthapuram" #. A city in India. #. The local name in Tamil is "திருச்சிராப்பள்ளி". #. msgid "Tiruchchirappalli" msgstr "Tiruchchirappalli" #. A city in India. #. The local name in Telugu is "తిరుపతి". #. msgid "Tirupati" msgstr "Tirupati" #. A city in India. #. The local name in Telugu is "విజయవాడ". #. msgid "Vijayawada" msgstr "Vijayawada" #. A city in India. #. "Vizag" is other traditional name #. The local name in Telugu is "విశాఖపట్నం". #. msgid "Visakhapatnam" msgstr "Visakhapatnam" #. The capital of Indonesia msgid "Jakarta" msgstr "Jakarta" #. A city in Indonesia msgid "Makassar" msgstr "Makassar" #. A city in Indonesia msgid "Medan" msgstr "Medan" #. A city in Indonesia msgid "Palembang" msgstr "Palembang" #. A city in Indonesia msgid "Pekanbaru" msgstr "Pekanbaru" #. A city in Iran. #. The name is also written "آبادان". #. msgid "Abadan" msgstr "Abadan" #. A city in Iran msgid "Abadeh" msgstr "Abadeh" #. A city in Iran msgid "Abū Mūsā" msgstr "Abū Mūsā" #. A city in Iran. #. The name is also written "آغاجاری". #. msgid "Aghajari" msgstr "Aghajari" #. A city in Iran. #. The name is also written "اهواز". #. msgid "Ahvaz" msgstr "Ahvaz" #. A city in Iran. #. The name is also written "اردبيل". #. msgid "Ardabil" msgstr "Ardabil" #. A city in Iran. #. The name is also written "بندر عباس". #. msgid "Bandar 'Abbas" msgstr "Bandar 'Abbas" #. A city in Iran. #. The name is also written "بندر بوشهر". #. msgid "Bandar-e Bushehr" msgstr "Bandar-e Bushehr" #. A city in Iran. #. The name is also written "بندر لنگه". #. msgid "Bandar-e Lengeh" msgstr "Bandar-e Lengeh" #. A city in Iran. #. The name is also written "بندر ماهشهر". #. msgid "Bandar-e Mahshahr" msgstr "Bandar-e Mahshahr" #. A city in Iran msgid "Birjand" msgstr "Birjand" #. A city in Iran. #. The name is also written "چاه بهار". #. msgid "Chah Bahar" msgstr "Chah Bahar" #. A city in Iran. #. The name is also written "ديرستان". #. msgid "Dayrestan" msgstr "Dayrestan" #. A city in Iran. #. The name is also written "دو گنبدان". #. msgid "Do Gonbadan" msgstr "Do Gonbadan" #. A city in Iran msgid "Esfahan" msgstr "Esfahan" #. A city in Iran. #. The name is also written "فسا". #. msgid "Fasa" msgstr "Fasa" #. A city in Iran. #. The name is also written "گرگان". #. msgid "Gorgan" msgstr "Gorgan" #. A city in Iran. #. The name is also written "گوشه شاهزاده قاسم". #. msgid "Gusheh Shahzadeh Qasem" msgstr "Gusheh Shahzadeh Qasem" #. A city in Iran. #. The name is also written "همدان". #. msgid "Hamadan" msgstr "Hamadan" #. A city in Iran. #. The name is also written "يلام". #. msgid "Ilam" msgstr "Ilam" #. A city in Iran msgid "Iranshahr" msgstr "Iranshahr" #. A city in Iran. #. The name is also written "كرج". #. msgid "Karaj" msgstr "Karaj" #. A city in Iran msgid "Kashan" msgstr "Kashan" #. A city in Iran msgid "Kerman" msgstr "Kerman" #. A city in Iran msgid "Kermanshah" msgstr "Kermanshah" #. A city in Iran. #. The name is also written "خرم آباد". #. msgid "Khorramabad" msgstr "Khorramabad" #. A city in Iran. #. The name is also written "كيش". #. msgid "Kish" msgstr "Kish" #. A city in Iran msgid "Lar" msgstr "Lar" #. A city in Iran. #. The name is also written "مشهد". #. msgid "Mashhad" msgstr "Mashhad" #. A city in Iran. #. The name is also written "مسجد سلیمان". #. msgid "Masjed Soleyman" msgstr "Masjed Soleyman" #. A city in Iran. #. The name is also written "نو شهر". #. msgid "Now Shahr" msgstr "Now Shahr" #. A city in Iran. #. The name is also written "ارومیه". #. msgid "Orumiyeh" msgstr "Orumiyeh" #. A city in Iran. #. The name is also written "قزوین". #. msgid "Qazvin" msgstr "Qazvin" #. A city in Iran msgid "Rasht" msgstr "Rasht" #. A city in Iran msgid "Sabzevar" msgstr "Sabzevar" #. A city in Iran. #. The name is also written "سخت سر". #. msgid "Sakht Sar" msgstr "Sakht Sar" #. A city in Iran msgid "Sanandaj" msgstr "Sanandaj" #. A city in Iran msgid "Sarakhs" msgstr "Sarakhs" #. A city in Iran. #. The name is also written "سمنان". #. msgid "Semnan" msgstr "Semnan" #. A city in Iran. #. The name is also written "شهر بالا". #. msgid "Shahr-e Bala" msgstr "Shahr-e Bala" #. A city in Iran. #. The name is also written "شهر كرد". #. msgid "Shahr-e Kord" msgstr "Shahr-e Kord" #. A city in Iran. #. The name is also written "شیراز". #. msgid "Shiraz" msgstr "Shiraz" #. A city in Iran msgid "Tabas" msgstr "Tabas" #. A city in Iran. #. The name is also written "تبريز". #. msgid "Tabriz" msgstr "Tabriz" #. The capital of Iran. #. The name is also written "تهران". #. msgid "Tehran" msgstr "Teheran" #. A city in Iran. #. The name is also written "يزد". #. msgid "Yazd" msgstr "Yazd" #. A city in Iran. #. The name is also written "زابل". #. msgid "Zabol" msgstr "Zabol" #. A city in Iran. #. The name is also written "زاهدان (کي)". #. 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" #. The capital of the Isle of Man msgctxt "City in Isle of Man" msgid "Douglas" msgstr "Douglas" #. A city in the Isle of Man msgid "Ronaldsway" msgstr "Ronaldsway" #. A city in Israel msgid "Eilat" msgstr "Eilat" #. A city in Israel msgid "Haifa" msgstr "Haifa" #. A city in Israel msgid "Lod" msgstr "Lod" #. A city in Israel msgid "Rosh Pina" msgstr "Rosh Pina" #. A city in Israel msgid "Shizzafon" msgstr "Shizzafon" #. A city in Israel msgid "Tel Aviv" msgstr "Tel Aviv" #. A city in Italy msgid "Albenga" msgstr "Albenga" #. A city in Italy msgid "Alghero" msgstr "Alghero" #. A city in Italy msgid "Ancona" msgstr "Ancona" #. A city in Italy msgid "Aviano" msgstr "Aviano" #. A city in Italy msgid "Bari" msgstr "Bari" #. A city in Italy msgid "Bergamo" msgstr "Bergamo" #. A city in Italy msgid "Bologna" msgstr "Bolonja" #. A city in Italy msgid "Bolzano" msgstr "Bolzano" #. A city in Italy msgid "Brescia" msgstr "Brescia" #. A city in Italy msgid "Breuil-Cervinia" msgstr "Breuil-Cervinia" #. A city in Italy msgid "Brindisi" msgstr "Brindisi" #. A city in Italy msgid "Cagliari" msgstr "Cagliari" #. A city in Italy msgid "Capri" msgstr "Capri" #. A city in Italy msgid "Case Arfel" msgstr "Case Arfel" #. A city in Italy msgid "Catania" msgstr "Catania" #. A city in Italy msgid "Cervia" msgstr "Cervia" #. A city in Italy msgid "Crotone" msgstr "Crotone" #. A city in Italy msgid "Cuneo" msgstr "Cuneo" #. A city in Italy msgid "Decimomannu" msgstr "Decimomannu" #. A city in Italy msgid "Dobbiaco" msgstr "Dobbiaco" #. A city in Italy msgid "Ferrara" msgstr "Ferrara" #. A city in Italy. #. "Florence" is the traditional English name. #. The local name in Italian is "Firenze". #. msgctxt "City in Italy" msgid "Florence" msgstr "Firenca" #. A city in Italy msgid "Forlì" msgstr "Forlì" #. A city in Italy msgid "Frosinone" msgstr "Frosinone" #. A city in Italy. #. "Genoa" is the traditional English name. #. The local name in Italian is "Genova". #. msgid "Genoa" msgstr "Genova" #. A city in Italy msgid "Ginosa Marina" msgstr "Ginosa Marina" #. A city in Italy msgid "Gioia del Colle" msgstr "Gioia del Colle" #. A city in Italy msgid "Grazzanise" msgstr "Grazzanise" #. A city in Italy msgid "Grosseto" msgstr "Grosseto" #. A city in Italy msgid "Grottaglie" msgstr "Grottaglie" #. A city in Italy msgid "Isola del Cantone" msgstr "Isola del Cantone" #. A city in Italy msgid "L'Aquila" msgstr "L'Aquila" #. A city in Italy msgid "Laigueglia" msgstr "Laigueglia" #. A city in Italy msgid "Lampedusa" msgstr "Lampedusa" #. A city in Italy msgid "Latina" msgstr "Latina" #. A city in Italy msgid "Lecce" msgstr "Lecce" #. A city in Italy msgid "Lucca" msgstr "Lucca" #. A city in Italy msgid "Messina" msgstr "Messina" #. A city in Italy. #. "Milan" is the traditional English name. #. The local name in Italian is "Milano". #. msgid "Milan" msgstr "Milano" #. A city in Italy. #. "Naples" is the traditional English name. #. The local name in Italian is "Napoli". #. msgctxt "City in Italy" msgid "Naples" msgstr "Napulj" #. A city in Italy msgid "Olbia" msgstr "Olbia" #. A city in Italy msgid "Palazzo" msgstr "Palazzo" #. A city in Italy msgid "Palermo" msgstr "Palermo" #. A city in Italy msgid "Paneveggio" msgstr "Paneveggio" #. A city in Italy msgid "Pantelleria" msgstr "Pantelleria" #. A city in Italy msgid "Parma" msgstr "Parma" #. A city in Italy msgid "Perugia" msgstr "Perugia" #. A city in Italy msgid "Pescara" msgstr "Pescara" #. A city in Italy msgid "Piacenza" msgstr "Piacenza" #. A city in Italy msgid "Pisa" msgstr "Pisa" #. A city in Italy msgid "Pontecagnano" msgstr "Pontecagnano" #. A city in Italy msgid "Pratica di Mare" msgstr "Pratica di Mare" #. A city in Italy msgid "Reggio di Calabria" msgstr "Reggio di Calabria" #. A city in Italy msgid "Resia" msgstr "Resia" #. A city in Italy msgid "Rieti" msgstr "Rieti" #. A city in Italy msgid "Rimini" msgstr "Rimini" #. The capital of Italy. #. "Rome" is the traditional English name. #. The local name in Italian is "Roma". #. msgctxt "City in Italy" msgid "Rome" msgstr "Rim" #. A city in Italy msgid "Ronchi dei Legionari" msgstr "Ronchi dei Legionari" #. A city in Italy msgid "Salignano" msgstr "Salignano" #. A city in Italy msgid "San Stèfano" msgstr "San Stèfano" #. A city in Italy msgid "Sant'Eufemia Lamezia" msgstr "Sant'Eufemia Lamezia" #. A city in Italy msgid "Sporminore" msgstr "Sporminore" #. A city in Italy msgid "Tamaricciola" msgstr "Tamaricciola" #. A city in Italy msgid "Tarvisio" msgstr "Tarvisio" #. A city in Italy msgid "Trapani" msgstr "Trapani" #. A city in Italy msgid "Trevico" msgstr "Trevico" #. A city in Italy msgid "Treviso" msgstr "Treviso" #. A city in Italy msgid "Trieste" msgstr "Trst" #. A city in Italy. #. "Turin" is the traditional English name. #. The local name is "Torino". #. msgid "Turin" msgstr "Torino" #. A city in Italy. #. "Venice" is the traditional English name. #. The local name in Italian is "Venezia". #. msgid "Venice" msgstr "Venecija" #. A city in Italy msgid "Verona" msgstr "Verona" #. A city in Italy msgid "Vicenza" msgstr "Vicenza" #. A city in Italy msgid "Viterbo" msgstr "Viterbo" #. A city in Italy msgid "Àrbatax" msgstr "Àrbatax" #. The capital of Jamaica msgctxt "City in Jamaica" msgid "Kingston" msgstr "Kingston" #. A city in Jamaica msgid "Montego Bay" msgstr "Montego Bay" #. A city in Japan msgid "Akita" msgstr "Akita" #. A city in Japan msgid "Ami" msgstr "Ami" #. A city in Japan msgid "Aomori" msgstr "Aomori" #. A city in Japan msgid "Asahikawa" msgstr "Asahikawa" #. A city in Japan msgid "Ashiya" msgstr "Ashiya" #. A city in Japan msgid "Chitose" msgstr "Chitose" #. A city in Japan msgid "Chofu" msgstr "Chofu" #. A city in Japan msgid "Fuji" msgstr "Fuji" #. A city in Japan msgid "Fukue" msgstr "Fukue" #. A city in Japan msgid "Fukuoka" msgstr "Fukuoka" #. A city in Japan msgid "Futemma" msgstr "Futemma" #. A city in Japan msgid "Gifu" msgstr "Gifu" #. A city in Japan msgid "Hakodate" msgstr "Hakodate" #. A city in Japan msgid "Hamamatsu" msgstr "Hamamatsu" #. A city in Japan msgid "Hamanaka" msgstr "Hamanaka" #. A city in Japan msgid "Hanamaki" msgstr "Hanamaki" #. A city in Japan msgid "Hiroshima" msgstr "Hiroshima" #. A city in Japan msgid "Hofu" msgstr "Hofu" #. A city in Japan msgid "Ishigaki" msgstr "Ishigaki" #. A city in Japan msgid "Iwakuni" msgstr "Iwakuni" #. A city in Japan msgid "Izumo" msgstr "Izumo" #. A city in Japan msgid "Janado" msgstr "Janado" #. A city in Japan msgid "Kadena" msgstr "Kadena" #. A city in Japan msgid "Kagoshima" msgstr "Kagoshima" #. A city in Japan msgid "Kanayama" msgstr "Kanayama" #. A city in Japan msgid "Kanoya" msgstr "Kanoya" #. A city in Japan msgid "Kashoji" msgstr "Kashoji" #. A city in Japan msgid "Kitakyushu" msgstr "Kitakyushu" #. A city in Japan msgid "Komatsu" msgstr "Komatsu" #. A city in Japan msgid "Komatsushima" msgstr "Komatsushima" #. A city in Japan msgid "Kumamoto" msgstr "Kumamoto" #. A city in Japan msgid "Kushiro" msgstr "Kushiro" #. A city in Japan msgid "Matsubara" msgstr "Matsubara" #. A city in Japan msgid "Matsumoto" msgstr "Matsumoto" #. A city in Japan msgid "Matsushima" msgstr "Matsushima" #. A city in Japan msgid "Matsuyama" msgstr "Matsuyama" #. A city in Japan msgid "Memambetsu" msgstr "Memambetsu" #. A city in Japan msgid "Mihonoseki" msgstr "Mihonoseki" #. A city in Japan msgid "Minami" msgstr "Minami" #. A city in Japan msgid "Misawa" msgstr "Misawa" #. A city in Japan msgid "Mito" msgstr "Mito" #. A city in Japan msgid "Miyazaki" msgstr "Miyazaki" #. A city in Japan msgid "Mombetsu" msgstr "Mombetsu" #. A city in Japan msgid "Nagasaki" msgstr "Nagasaki" #. A city in Japan msgid "Nagoya" msgstr "Nagoya" #. A city in Japan msgid "Naha" msgstr "Naha" #. A city in Japan msgid "Naka-shibetsu" msgstr "Naka-shibetsu" #. A city in Japan msgid "Niigata" msgstr "Niigata" #. A city in Japan msgid "Obihiro" msgstr "Obihiro" #. A city in Japan msgid "Odaira" msgstr "Odaira" #. A city in Japan msgid "Odaka" msgstr "Odaka" #. A city in Japan msgid "Odate" msgstr "Odate" #. A city in Japan msgid "Ofunakoshi" msgstr "Ofunakoshi" #. A city in Japan msgid "Ogimachiya" msgstr "Ogimachiya" #. A city in Japan msgid "Oita" msgstr "Oita" #. A city in Japan msgid "Okata" msgstr "Okata" #. A city in Japan msgid "Okayama" msgstr "Okayama" #. A city in Japan msgid "Okazato" msgstr "Okazato" #. A city in Japan msgid "Osaka" msgstr "Osaka" #. A city in Japan msgid "Ozuki" msgstr "Ozuki" #. A city in Japan msgid "Saga" msgstr "Saga" #. A city in Japan msgid "Sanrizuka" msgstr "Sanrizuka" #. A city in Japan msgid "Sawada" msgstr "Sawada" #. A city in Japan msgid "Sendai" msgstr "Sendai" #. A city in Japan msgid "Shiroi" msgstr "Shiroi" #. A city in Japan msgid "Takamatsu" msgstr "Takamatsu" #. A city in Japan msgid "Takatsu" msgstr "Takatsu" #. A city in Japan msgid "Tateyama" msgstr "Tateyama" #. The capital of Japan msgid "Tokyo" msgstr "Tokyo" #. A city in Japan msgid "Tottori" msgstr "Tottori" #. A city in Japan msgid "Toyama" msgstr "Toyama" #. A city in Japan msgid "Toyooka" msgstr "Toyooka" #. A city in Japan msgid "Tsuiki" msgstr "Tsuiki" #. A city in Japan msgid "Ushuku" msgstr "Ushuku" #. A city in Japan msgid "Wakkanai" msgstr "Wakkanai" #. A city in Japan msgid "Yamagata" msgstr "Yamagata" #. A city in Japan msgid "Yamaguchi" msgstr "Yamaguchi" #. A city in Japan msgid "Yao" msgstr "Yao" #. A city in Japan msgid "Yokota" msgstr "Yokota" #. A city in Japan msgid "Yoshinaga" msgstr "Yoshinaga" #. A city in Jersey msgid "La Hougue" msgstr "La Hougue" #. The capital of Jersey msgid "Saint Helier" msgstr "Saint Helier" #. A city in Jordan msgid "Al 'Aqabah" msgstr "Al 'Aqabah" #. A city in Jordan msgid "Al Jizah" msgstr "Al Jizah" #. The capital of Jordan. #. "Amman" is the traditional English name. #. The local name in Arabic is "'Amman". #. msgid "Amman" msgstr "Amman" #. A city in Kazakhstan msgid "Almaty" msgstr "Almaty" #. A city in Kazakhstan. #. The local name in Russian is "Aktau". #. msgid "Aqtau" msgstr "Aqtau" #. A city in Kazakhstan. #. The local name in Russian is "Aktobe". #. msgid "Aqtöbe" msgstr "Aqtöbe" #. The capital of Kazakhstan msgid "Astana" msgstr "Astana" #. A city in Kazakhstan msgid "Atyrau" msgstr "Atyrau" #. A city in Kazakhstan. #. The local name in Russian is "Ural'sk". #. msgid "Oral" msgstr "Oral" #. A city in Kazakhstan. #. The local name in Russian is "Karaganda". #. msgid "Qaraghandy" msgstr "Qaraghandy" #. A city in Kazakhstan. #. The local name in Russian is "Kostanay". #. msgid "Qostanay" msgstr "Qostanay" #. A city in Kazakhstan. #. The local name in Russian is "Kyzylorda". #. msgid "Qyzylorda" msgstr "Qyzylorda" #. A city in Kazakhstan msgid "Shymkent" msgstr "Shymkent" #. A city in Kenya msgid "Eldoret" msgstr "Eldoret" #. A city in Kenya msgid "Kisumu" msgstr "Kisumu" #. A city in Kenya msgid "Mombasa" msgstr "Mombasa" #. The capital of Kenya msgid "Nairobi" msgstr "Nairobi" #. A city in Kiribati msgctxt "City in Kiribati" msgid "London" msgstr "London" #. A city in Kosovo: #. https://en.wikipedia.org/wiki/Pristina msgid "Pristina" msgstr "Priština" #. The capital of Kuwait. #. "Kuwait" is the traditional English name. #. The local name in Arabic is "Al Kuwayt / الكويت". #. msgctxt "City in Kuwait" msgid "Kuwait" msgstr "Kuvajt" #. The capital of Kyrgyzstan msgid "Bishkek" msgstr "Bishkek" #. The capital of Laos. #. "Vientiane" is the traditional English name. #. The local name in Lao is "Viangchan". #. msgid "Vientiane" msgstr "Vientiane" #. A city in Latvia msgid "Liepāja" msgstr "Liepāja" #. The capital of Latvia msgid "Rīga" msgstr "Rīga" #. The capital of Lebanon. #. "Beirut" is the traditional English name. #. The local name is "Beyrouth". #. msgid "Beirut" msgstr "Beirut" #. A city in Libya msgid "Baninah" msgstr "Baninah" #. A city in Libya msgid "Sabha" msgstr "Sabha" #. The capital of Libya. #. "Tripoli" is the traditional English name. #. The local name in Arabic is "Tarabulus / طرابلس". #. msgid "Tripoli" msgstr "Tripoli" #. The capital of Liechtenstein msgid "Vaduz" msgstr "Vaduz" #. A city in Lithuania msgid "Kaunas" msgstr "Kaunas" #. A city in Lithuania msgid "Palanga" msgstr "Palanga" #. The capital of Lithuania msgid "Vilnius" msgstr "Vilnius" #. A city in Lithuania msgid "Šiauliai" msgstr "Šiauliai" #. The capital of Luxembourg msgctxt "City in Luxembourg" msgid "Luxembourg" msgstr "Luksemburg" #. The capital of Macau. #. The local name in Chinese is "Aomen / 澳门". #. msgctxt "City in Macau" msgid "Macau" msgstr "Makau" #. A city in Macau. #. The local name in Chinese is "Dangzai / 氹仔". #. msgid "Taipa" msgstr "Taipa" #. A city in Macedonia msgid "Ohrid" msgstr "Ohrid" #. The capital of Macedonia msgid "Skopje" msgstr "Skopje" #. A city in Madagascar msgid "Ankarena" msgstr "Ankarena" #. The capital of Madagascar msgid "Antananarivo" msgstr "Antananarivo" #. A city in Madagascar msgid "Antsiranana" msgstr "Antsiranana" #. A city in Madagascar msgid "Fasenina-Ampasy" msgstr "Fasenina-Ampasy" #. A city in Madagascar msgid "Mahajanga" msgstr "Mahajanga" #. A city in Madagascar msgid "Toamasina" msgstr "Toamasina" #. A city in Madagascar msgid "Tolanaro" msgstr "Tolanaro" #. A city in Malaysia msgid "Bintulu" msgstr "Bintulu" #. A city in Malaysia msgctxt "City in Malaysia" msgid "George Town" msgstr "George Town" #. A city in Malaysia msgid "Johor Bahru" msgstr "Johor Bahru" #. A city in Malaysia msgid "Klang" msgstr "Klang" #. A city in Malaysia msgid "Kota Baharu" msgstr "Kota Baharu" #. A city in Malaysia msgid "Kota Kinabalu" msgstr "Kota Kinabalu" #. A city in Malaysia msgid "Kuah" msgstr "Kuah" #. The capital of Malaysia msgid "Kuala Lumpur" msgstr "Kuala Lumpur" #. A city in Malaysia msgid "Kuantan" msgstr "Kuantan" #. A city in Malaysia msgid "Kuching" msgstr "Kuching" #. A city in Malaysia msgid "Kudat" msgstr "Kudat" #. A city in Malaysia msgid "Melaka" msgstr "Melaka" #. A city in Malaysia msgid "Miri" msgstr "Miri" #. A city in Malaysia msgid "Sandakan" msgstr "Sandakan" #. A city in Malaysia msgid "Sepang" msgstr "Sepang" #. A city in Malaysia msgid "Sibu" msgstr "Sibu" #. A city in Malaysia msgid "Sitiawan" msgstr "Sitiawan" #. A city in Malaysia msgid "Tawau" msgstr "Tawau" #. A city in Malaysia msgctxt "City in Malaysia" msgid "Victoria" msgstr "Victoria" #. The capital of the Maldives. #. "Male" is the traditional English name. #. The local name in Dhivehi is "Maale". #. msgid "Male" msgstr "Male" #. A city in Malta msgid "Luqa" msgstr "Luqa" #. The capital of Malta msgid "Valletta" msgstr "Valletta" #. The capital of the Marshall Islands msgid "Majuro" msgstr "Majuro" #. The capital of Martinique msgid "Fort-de-France" msgstr "Fort-de-France" #. A city in Martinique msgid "Le Lamentin" msgstr "Le Lamentin" #. A city in Mauritania msgid "Nouadhibou" msgstr "Nouadhibou" #. The capital of Mauritania msgid "Nouakchott" msgstr "Nouakchott" #. A city in Mauritius msgid "Plaisance" msgstr "Plaisance" #. The capital of Mauritius msgid "Port Louis" msgstr "Port Louis" #. A city in Mauritius msgid "Port Mathurin" msgstr "Port Mathurin" #. A city in Mayotte msgid "Dzaoudzi" msgstr "Dzaoudzi" #. The capital of Mayotte msgid "Mamoudzou" msgstr "Mamoudzou" #. A city in Guerrero in Mexico msgid "Acapulco" msgstr "Acapulco" #. A city in Aguascalientes in Mexico msgctxt "City in Aguascalientes, Mexico" msgid "Aguascalientes" msgstr "Aguascalientes" #. A city in Campeche in Mexico msgctxt "City in Campeche, Mexico" msgid "Campeche" msgstr "Campeche" #. A city in Quintana Roo in Mexico msgid "Cancún" msgstr "Cancún" #. A city in Campeche in Mexico msgid "Carmen" msgstr "Carmen" #. A city in Quintana Roo in Mexico msgid "Chetumal" msgstr "Chetumal" #. A city in Yucatán in Mexico msgid "Chichén-Itzá" msgstr "Chichén-Itzá" #. A city in Chihuahua in Mexico msgctxt "City in Chihuahua, Mexico" msgid "Chihuahua" msgstr "Chihuahua" #. A city in Chihuahua in Mexico. #. One of several cities in Mexico called "Juárez". #. msgid "Ciudad Juárez" msgstr "Ciudad Juárez" #. A city in Sonora in Mexico msgid "Ciudad Obregón" msgstr "Ciudad Obregón" #. A city in Tamaulipas in Mexico msgid "Ciudad Victoria" msgstr "Ciudad Victoria" #. A city in Colima in Mexico msgctxt "City in Colima, Mexico" msgid "Colima" msgstr "Colima" #. A city in Quintana Roo in Mexico msgid "Cozumel" msgstr "Cozumel" #. A city in Morelos in Mexico msgid "Cuernavaca" msgstr "Cuernavaca" #. A city in Sinaloa in Mexico msgid "Culiacán" msgstr "Culiacán" #. A city in Durango in Mexico msgctxt "City in Durango, Mexico" msgid "Durango" msgstr "Durango" #. A city in Oaxaca in Mexico msgid "El Zapote" msgstr "El Zapote" #. A city in Jalisco in Mexico msgid "Guadalajara" msgstr "Guadalajara" #. A city in Sonora in Mexico msgid "Guaymas" msgstr "Guaymas" #. A city in Sonora in Mexico msgid "Hermosillo" msgstr "Hermosillo" #. A city in Guerrero in Mexico msgid "Ixtapa" msgstr "Ixtapa" #. A city in Oaxaca in Mexico msgid "Ixtepec" msgstr "Ixtepec" #. A city in Baja California Sur in Mexico msgctxt "City in Baja California Sur, Mexico" msgid "La Paz" msgstr "La Paz" #. A city in Oaxaca in Mexico msgid "Laguna Tepic" msgstr "Laguna Tepic" #. A city in Guanajuato in Mexico msgctxt "City in Guanajuato, Mexico" msgid "León" msgstr "León" #. A city in Baja California Sur in Mexico msgid "Loreto" msgstr "Loreto" #. A city in Sinaloa in Mexico msgid "Los Mochis" msgstr "Los Mochis" #. A city in Colima in Mexico msgctxt "City in Colima, Mexico" msgid "Manzanillo" msgstr "Manzanillo" #. A city in Tamaulipas in Mexico msgid "Matamoros" msgstr "Matamoros" #. A city in Sinaloa in Mexico msgid "Mazatlán" msgstr "Mazatlán" #. A city in Baja California in Mexico msgid "Mexicali" msgstr "Mexicali" #. The capital of Mexico. #. "Mexico City" is the traditional English name. #. The local name in Spanish is "México". #. msgid "Mexico City" msgstr "Mexico City" #. A city in Veracruz in Mexico msgid "Minatitlán" msgstr "Minatitlán" #. A city in Coahuila in Mexico msgid "Monclova" msgstr "Monclova" #. A city in Nuevo León in Mexico msgid "Monterrey" msgstr "Monterrey" #. A city in Michoacán in Mexico msgid "Morelia" msgstr "Morelia" #. A city in Yucatán in Mexico msgctxt "City in Yucatán, Mexico" msgid "Mérida" msgstr "Mérida" #. A city in Tamaulipas in Mexico msgid "Nuevo Laredo" msgstr "Nuevo Laredo" #. A city in Oaxaca in Mexico msgctxt "City in Oaxaca, Mexico" msgid "Oaxaca" msgstr "Oaxaca" #. A city in Coahuila in Mexico msgid "Piedras Negras" msgstr "Piedras Negras" #. A city in Veracruz in Mexico. #. One of several cities in Mexico called "Poza Rica". #. msgid "Poza Rica de Hidalgo" msgstr "Poza Rica de Hidalgo" #. A city in Puebla in Mexico msgctxt "City in Puebla, Mexico" msgid "Puebla" msgstr "Puebla" #. A city in Oaxaca in Mexico msgid "Puerto Escondido" msgstr "Puerto Escondido" #. A city in Jalisco in Mexico msgid "Puerto Vallarta" msgstr "Puerto Vallarta" #. A city in Querétaro in Mexico msgctxt "City in Querétaro, Mexico" msgid "Querétaro" msgstr "Querétaro" #. A city in Tamaulipas in Mexico msgid "Reynosa" msgstr "Reynosa" #. A city in Coahuila in Mexico msgid "Saltillo" msgstr "Saltillo" #. A city in Baja California Sur in Mexico msgid "San José del Cabo" msgstr "San José del Cabo" #. A city in San Luis Potosí in Mexico msgctxt "City in San Luis Potosí, Mexico" msgid "San Luis Potosí" msgstr "San Luis Potosí" #. A city in Tamaulipas in Mexico msgid "Tampico" msgstr "Tampico" #. A city in Chiapas in Mexico msgid "Tapachula" msgstr "Tapachula" #. A city in Baja California in Mexico msgid "Tijuana" msgstr "Tijuana" #. A city in México in Mexico msgid "Toluca" msgstr "Toluca" #. A city in Coahuila in Mexico msgid "Torreón" msgstr "Torreón" #. A city in Chiapas in Mexico msgid "Tuxtla" msgstr "Tuxtla" #. A city in Michoacán in Mexico msgid "Uruapan" msgstr "Uruapan" #. A city in Veracruz in Mexico msgctxt "City in Veracruz, Mexico" msgid "Veracruz" msgstr "Veracruz" #. A city in Tabasco in Mexico msgid "Villahermosa" msgstr "Villahermosa" #. A city in Zacatecas in Mexico msgctxt "City in Zacatecas, Mexico" msgid "Zacatecas" msgstr "Zacatecas" #. The capital of the Federated States of Micronesia msgid "Palikir" msgstr "Palikir" #. The capital of Moldova msgid "Chişinău" msgstr "Chişinău" #. The capital of Monaco msgctxt "City in Monaco" msgid "Monaco" msgstr "Monako" #. The capital of Mongolia. #. The name is also written "Улаанбаатар". #. msgid "Ulaanbaatar" msgstr "Ulan Bator" #. A city in Montenegro msgid "Podgorica" msgstr "Podgorica" #. A city in Montenegro msgid "Tivat" msgstr "Tivat" #. A city in Morocco msgid "Agadir" msgstr "Agadir" #. A city in Morocco msgid "Al Hoceima" msgstr "Al Hoceima" #. A city in Morocco msgid "Fes" msgstr "Fes" #. A city in Morocco msgid "Marrakech" msgstr "Marrakech" #. A city in Morocco msgid "Meknes" msgstr "Meknes" #. A city in Morocco msgid "Nador" msgstr "Nador" #. A city in Morocco msgid "Nouaseur" msgstr "Nouaseur" #. A city in Morocco msgid "Ouarzazat" msgstr "Ouarzazat" #. A city in Morocco msgid "Oujda" msgstr "Oujda" #. The capital of Morocco msgid "Rabat" msgstr "Rabat" #. A city in Morocco. #. "Tangier" is the traditional English name. #. The local name is "Tanger". #. msgid "Tangier" msgstr "Tanger" #. A city in Morocco msgid "Tetouan" msgstr "Tetouan" #. A city in Mozambique msgid "Beira" msgstr "Beira" #. A city in Mozambique msgid "Chimoio" msgstr "Chimoio" #. A city in Mozambique msgid "Lichinga" msgstr "Lichinga" #. The capital of Mozambique msgid "Maputo" msgstr "Maputo" #. A city in Mozambique msgid "Nampula" msgstr "Nampula" #. A city in Mozambique msgid "Pemba" msgstr "Pemba" #. A city in Mozambique msgid "Quelimane" msgstr "Quelimane" #. The capital of Myanmar. #. "Rangoon" is the traditional English name. #. The local name in Burmese is "Yangon". #. msgid "Rangoon" msgstr "Rangun" msgid "Windhoek" msgstr "Windhoek" #. The capital of Nepal. #. The local name in Nepali is "काठमाडौं". #. msgid "Kathmandu" msgstr "Kathmandu" #. The capital of the Netherlands msgid "Amsterdam" msgstr "Amsterdam" #. A city in the Netherlands msgid "De Kooy" msgstr "De Kooy" #. A city in the Netherlands msgid "Deelen" msgstr "Deelen" #. A city in the Netherlands msgid "Eindhoven" msgstr "Eindhoven" #. A city in the Netherlands msgid "Gilze" msgstr "Gilze" #. A city in the Netherlands msgid "Groningen" msgstr "Groningen" #. A city in the Netherlands msgid "Leeuwarden" msgstr "Leeuwarden" #. A city in the Netherlands msgid "Maastricht" msgstr "Maastricht" #. A city in the Netherlands msgid "Oost-Vlieland" msgstr "Oost-Vlieland" #. A city in the Netherlands msgid "Rotterdam" msgstr "Rotterdam" #. The capital of the Netherlands. #. "The Hague" is the traditional English name. #. The local name in Dutch is "'s-Gravenhage". #. msgid "The Hague" msgstr "Haag" #. A city in the Netherlands msgid "Utrecht" msgstr "Utrecht" #. A city in the Netherlands msgid "Volkel" msgstr "Volkel" #. A city in the Netherlands msgid "Woensdrecht" msgstr "Woensdrecht" #. A city in the Netherlands Antilles msgid "Benners" msgstr "Benners" #. A city in the Netherlands Antilles msgid "Cupe Coy" msgstr "Cupe Coy" #. A city in the Netherlands Antilles msgid "Dorp Nikiboko" msgstr "Dorp Nikiboko" #. A city in the Netherlands Antilles msgid "Gato" msgstr "Gato" #. A city in New Caledonia msgid "Karenga" msgstr "Karenga" #. The capital of New Caledonia msgid "Nouméa" msgstr "Nouméa" #. A city in New Zealand msgid "Auckland" msgstr "Auckland" #. A city in New Zealand msgid "Christchurch" msgstr "Christchurch" #. The capital of New Zealand msgid "Wellington" msgstr "Wellington" #. A city in Nicaragua msgid "Bluefields" msgstr "Bluefields" #. A city in Nicaragua msgid "Chinandega" msgstr "Chinandega" #. A city in Nicaragua msgid "Jinotega" msgstr "Jinotega" #. A city in Nicaragua msgid "Juigalpa" msgstr "Juigalpa" #. The capital of Nicaragua msgid "Managua" msgstr "Managua" #. A city in Nicaragua msgid "Puerto Cabezas" msgstr "Puerto Cabezas" #. A city in Nicaragua msgid "Rivas" msgstr "Rivas" #. A city in Niger msgid "Agadez" msgstr "Agadez" #. The capital of Niger msgid "Niamey" msgstr "Niamey" #. A city in Niger msgid "Zinder" msgstr "Zinder" msgid "Abuja" msgstr "Abuja" #. A city in the Lagos Metropolitan Area, in Nigeria msgid "Ikeja" msgstr "Ikeja" #. A city in Nigeria msgid "Ilorin" msgstr "Ilorin" #. A city in Nigeria msgid "Kaduna" msgstr "Kaduna" #. A city in Nigeria msgid "Kano" msgstr "Kano" #. A city and metropolitan area in Nigeria msgid "Lagos" msgstr "Lagos" #. A city in Nigeria msgid "Port Harcourt" msgstr "Port Harcourt" #. The capital of Niue msgid "Alofi" msgstr "Alofi" #. A city in Norfolk Island msgctxt "City in Norfolk Island" msgid "Kingston" msgstr "Kingston" #. The capital of North Korea. #. The local name in Korean is "평양". #. msgid "Pyongyang" msgstr "Pjonjang" #. A city in the Northern Mariana Islands msgid "Chalan Kanoa" msgstr "Chalan Kanoa" #. A city in Norway msgid "Alta" msgstr "Alta" #. A city in Norway msgid "Berlevåg" msgstr "Berlevåg" #. A city in Norway msgid "Bodø" msgstr "Bodø" #. A city in Norway msgid "Bolle" msgstr "Bolle" #. A city in Norway msgid "Boltåsen" msgstr "Boltåsen" #. A city in Norway msgid "Brønnøysund" msgstr "Brønnøysund" #. A city in Norway msgid "Båtsfjord" msgstr "Båtsfjord" #. A city in Norway msgid "Dalem" msgstr "Dalem" #. A city in Norway msgid "Djupdalen" msgstr "Djupdalen" #. A city in Norway msgid "Eldskog" msgstr "Eldskog" #. A city in Norway msgid "Fagernes" msgstr "Fagernes" #. A city in Norway msgid "Fiskenes" msgstr "Fiskenes" #. A city in Norway msgid "Florø" msgstr "Florø" #. A city in Norway msgid "Førde" msgstr "Førde" #. A city in Norway msgid "Gardermoen" msgstr "Gardermoen" #. A city in Norway msgid "Hammerfest" msgstr "Hammerfest" #. A city in Norway msgid "Hasvik" msgstr "Hasvik" #. A city in Norway msgid "Haugesund" msgstr "Haugesund" #. A city in Norway msgid "Holm" msgstr "Holm" #. A city in Norway msgid "Honningsvåg" msgstr "Honningsvåg" #. A city in Norway msgid "Kirkenes" msgstr "Kirkenes" #. A city in Norway msgid "Kjevik" msgstr "Kjevik" #. A city in Norway msgid "Kristiansund" msgstr "Kristiansund" #. A city in Norway msgid "Mehamn" msgstr "Mehamn" #. A city in Norway msgid "Molde" msgstr "Molde" #. A city in Norway msgid "Mosjøen" msgstr "Mosjøen" #. A city in Norway msgid "Namsos" msgstr "Namsos" #. A city in Norway msgid "Narvik" msgstr "Narvik" #. A city in Norway msgid "Notodden" msgstr "Notodden" #. A city in Norway msgid "Oseberg" msgstr "Oseberg" #. The capital of Norway msgid "Oslo" msgstr "Oslo" #. A city in Norway msgid "Rygge" msgstr "Rygge" #. A city in Norway msgid "Røros" msgstr "Røros" #. A city in Norway msgid "Rørvik" msgstr "Rørvik" #. A city in Norway msgid "Røssvoll" msgstr "Røssvoll" #. A city in Norway msgid "Røst" msgstr "Røst" #. A city in Norway msgid "Sandane" msgstr "Sandane" #. A city in Norway msgid "Skagen" msgstr "Skagen" #. A city in Norway msgid "Skien" msgstr "Skien" #. A city in Norway msgid "Sola" msgstr "Sola" #. A city in Norway msgid "Stokka" msgstr "Stokka" #. A city in Norway msgid "Svartnes" msgstr "Svartnes" #. A city in Norway msgid "Svolvær" msgstr "Svolvær" #. A city in Norway msgid "Sørkjosen" msgstr "Sørkjosen" #. A city in Norway msgid "Torp" msgstr "Torp" #. A city in Norway msgid "Tromsø" msgstr "Tromsø" #. A city in Norway msgid "Trondheim" msgstr "Trondheim" #. A city in Norway msgid "Vadsø" msgstr "Vadsø" #. A city in Norway msgid "Ålesund" msgstr "Ålesund" #. A city in Norway msgid "Ørsta" msgstr "Ørsta" #. A city in Oman msgid "Mu'askar al Murtafi'ah" msgstr "Mu'askar al Murtafi'ah" #. The capital of Oman. #. "Muscat" is the traditional English name. #. The local name in Arabic is "Masqat". #. msgid "Muscat" msgstr "Muscat" #. A city in Oman msgid "Salalah" msgstr "Salalah" #. The capital of Pakistan msgid "Islamabad" msgstr "Islamabad" #. A city in Pakistan msgid "Karachi" msgstr "Karachi" #. A city in Pakistan msgid "Lahore" msgstr "Lahore" #. A city in Pakistan msgid "Nawabshah" msgstr "Nawabshah" #. The capital of Palau msgid "Koror" msgstr "Koror" #. The capital of Palau msgid "Melekeok" msgstr "Melekeok" #. A city in Panama msgid "David" msgstr "David" #. A city in Panama msgid "Fuerte Kobbe" msgstr "Fuerte Kobbe" #. The capital of Panama msgid "Panamá" msgstr "Panamá" #. A city in Panama msgid "Tocumen" msgstr "Tocumen" #. The capital of Papua New Guinea msgid "Port Moresby" msgstr "Port Moresby" #. The capital of Paraguay msgid "Asunción" msgstr "Asunción" #. A city in Paraguay msgid "Colonia Félix de Azara" msgstr "Colonia Félix de Azara" #. A city in Peru msgid "Andahuaylas" msgstr "Andahuaylas" #. A city in Peru msgid "Arequipa" msgstr "Arequipa" #. A city in Peru msgid "Ayacucho" msgstr "Ayacucho" #. A city in Peru msgid "Chiclayo" msgstr "Chiclayo" #. A city in Peru msgid "Cusco" msgstr "Cusco" #. A city in Peru msgid "Iquitos" msgstr "Iquitos" #. A city in Peru msgid "Juliaca" msgstr "Juliaca" #. The capital of Peru msgctxt "City in Peru" msgid "Lima" msgstr "Lima" #. A city in Peru msgid "Pisco" msgstr "Pisco" #. A city in Peru msgid "Pucallpa" msgstr "Pucallpa" #. A city in Peru msgid "Puerto Maldonado" msgstr "Puerto Maldonado" #. A city in Peru msgid "Tacna" msgstr "Tacna" #. A city in Peru msgid "Talara" msgstr "Talara" #. A city in Peru msgid "Tarapoto" msgstr "Tarapoto" #. A city in Peru msgid "Trujillo" msgstr "Trujillo" #. A city in Peru msgid "Tumbes" msgstr "Tumbes" #. A city in the Philippines msgid "Angeles" msgstr "Angeles" #. A city in the Philippines msgid "Davao" msgstr "Davao" #. A city in the Philippines msgid "Laoag" msgstr "Laoag" #. The capital of the Philippines msgid "Manila" msgstr "Manila" #. A city in the Philippines msgid "Masbate" msgstr "Masbate" #. A city in the Philippines msgid "Pildira" msgstr "Pildira" #. A city in the Philippines msgid "Subic" msgstr "Subic" #. A city in the Philippines msgid "Zamboanga City" msgstr "Zamboanga City" #. A city in Poland msgid "Bydgoszcz" msgstr "Bydgoszcz" #. A city in Poland msgid "Gdańsk" msgstr "Gdanjsk" #. A city in Poland msgid "Katowice" msgstr "Katowice" #. A city in Poland msgid "Kraków" msgstr "Kraków" #. A city in Poland msgid "Lublin" msgstr "Lublin" #. A city in Poland msgid "Olsztyn" msgstr "Olsztyn" #. A city in Poland msgid "Poznań" msgstr "Poznań" #. A city in Poland msgid "Radom" msgstr "Radom" #. A city in Poland msgid "Rzeszów" msgstr "Rzeszów" #. A city in Poland msgid "Szczecin" msgstr "Szczecin" #. The capital of Poland. #. "Warsaw" is the traditional English name. #. The local name in Polish is "Warszawa". #. msgctxt "City in Poland" msgid "Warsaw" msgstr "Varšava" #. A city in Poland msgid "Wrocław" msgstr "Wrocław" #. A city in Poland msgid "Zielona Góra" msgstr "Zielona Góra" #. A city in Poland msgid "Łódź" msgstr "Lodž" #. A city in Portugal msgid "Beja" msgstr "Beja" #. A city in Portugal msgid "Castelo Branco" msgstr "Castelo Branco" #. A city in Portugal msgid "Faro" msgstr "Faro" #. A city in Portugal msgid "Flor da Rosa" msgstr "Flor da Rosa" #. A city in Portugal msgid "Lajes" msgstr "Lajes" #. The capital of Portugal. #. "Lisbon" is the traditional English name. #. The local name in Portuguese is "Lisboa". #. msgid "Lisbon" msgstr "Lisbon" #. A city in Portugal msgid "Monte Real" msgstr "Monte Real" #. A city in Portugal msgid "Montijo" msgstr "Montijo" #. A city in Portugal msgid "Ovar" msgstr "Ovar" #. A city in Portugal msgid "Ponta Delgada" msgstr "Ponta Delgada" #. A city in Portugal msgid "Porto" msgstr "Porto" #. A city in Portugal msgid "Porto Santo" msgstr "Porto Santo" #. A city in Portugal. #. One of several cities in Portugal called "Santa Cruz". #. msgid "Santa Cruz das Flores" msgstr "Santa Cruz das Flores" #. A city in Portugal msgid "Sintra" msgstr "Sintra" #. A city in Portugal msgid "Água de Pena" msgstr "Água de Pena" #. A city in Puerto Rico msgid "Carolina" msgstr "Carolina" #. A city in Puerto Rico msgid "Ponce" msgstr "Ponce" #. A city in Puerto Rico msgid "Rafael Hernandez" msgstr "Rafael Hernandez" #. A city in Puerto Rico msgid "San Juan" msgstr "San Juan" #. The capital of Qatar. #. "Doha" is the traditional English name. #. The local name in Arabic is "Ad Dawhah / الدوحة". #. msgid "Doha" msgstr "Doha" #. A city in Romania msgid "Arad" msgstr "Arad" #. A city in Romania msgid "Bacău" msgstr "Bacău" #. A city in Romania msgid "Baia Mare" msgstr "Baia Mare" #. The capital of Romania. #. "Bucharest" is the traditional English name. #. The local name in Romanian is "Bucureşti". #. msgid "Bucharest" msgstr "Bukurešt" #. A city in Romania msgid "Cluj-Napoca" msgstr "Cluj-Napoca" #. A city in Romania msgid "Craiova" msgstr "Craiova" #. A city in Romania msgid "Iaşi" msgstr "Iaşi" #. A city in Romania msgid "Mihail Kogălniceanu" msgstr "Mihail Kogălniceanu" #. A city in Romania msgid "Oradea" msgstr "Oradea" #. A city in Romania msgid "Satu Mare" msgstr "Satu Mare" #. A city in Romania msgid "Sibiu" msgstr "Sibiu" #. A city in Romania msgid "Suceava" msgstr "Suceava" #. A city in Romania msgid "Timişoara" msgstr "Timişoara" #. A city in Romania msgid "Tulcea" msgstr "Tulcea" #. A city in Romania msgid "Târgu-Mureş" msgstr "Târgu - Mureş" #. A city in Russia. #. The local name in Russian is "Абакан". #. msgid "Abakan" msgstr "Abakan" #. A city in Russia. #. The local name in Russian is "Адлер". #. msgid "Adler" msgstr "Adler" #. A city in Russia. #. The local name in Russian is "Анадырь". #. msgid "Anadyr'" msgstr "Anadyr'" #. A city in Russia. #. The local name in Russian is "Анапа". #. msgid "Anapa" msgstr "Anapa" #. A city in Russia. #. The local name in Russian is "Архангельск". #. msgid "Arkhangel'sk" msgstr "Arhangelsk" #. A city in Russia. #. The local name in Russian is "Астрахань". #. msgid "Astrakhan'" msgstr "Astrahan" #. A city in Russia. #. The local name in Russian is "Барнаул". #. msgid "Barnaul" msgstr "Barnaul" #. A city in Russia. #. The local name in Russian is "Брацк". #. msgid "Bratsk" msgstr "Bratsk" #. A city in Russia. #. The local name in Russian is "Брянск". #. msgid "Bryansk" msgstr "Brjansk" #. A city in Russia. #. The local name in Russian is "Чебоксары". #. msgid "Cheboksary" msgstr "Cheboksary" #. A city in Russia. #. The local name in Russian is "Челябинск". #. msgid "Chelyabinsk" msgstr "Čeljabinsk" #. A city in Russia. #. The local name in Russian is "Чита". #. msgid "Chita" msgstr "Chita" #. A city in Russia. #. The local name in Russian is "Чульман". #. msgid "Chul'man" msgstr "Chul'man" #. A city in Russia. #. The local name in Russian is "Энгельс". #. msgid "Engel's" msgstr "Engel's" #. A city in Russia. #. The local name in Russian is "Иркуцк". #. msgid "Irkutsk" msgstr "Irkutsk" #. A city in Russia. #. The local name in Russian is "Иже́вск". #. msgid "Izhevsk" msgstr "Iževsk" #. A city in Russia. #. The local name in Russian is "Калининград". #. msgid "Kaliningrad" msgstr "Kaliningrad" #. A city in Russia. #. The local name in Russian is "Казань". #. msgid "Kazan'" msgstr "Kazan'" #. A city in Russia. #. The local name in Russian is "Кемерово". #. msgid "Kemerovo" msgstr "Kemerovo" #. A city in Russia. #. The local name in Russian is "Хабаровск". #. msgid "Khabarovsk" msgstr "Khabarovsk" #. A city in Russia. #. The local name in Russian is "Ханты-Мансийск". #. msgid "Khanty-Mansiysk" msgstr "Hanty-Mansiysk" #. A city in Russia. #. The local name in Russian is "Краснодар". #. msgid "Krasnodar" msgstr "Krasnodar" #. A city in Russia. #. The local name in Russian is "Красноярск". #. msgid "Krasnoyarsk" msgstr "Krasnoyarsk" #. A city in Russia. #. The local name in Russian is "Магадан". #. msgid "Magadan" msgstr "Magadan" #. A city in Russia. #. The local name in Russian is "Минеральные Воды". #. msgid "Mineral'nyye Vody" msgstr "Mineral'nyye Vody" #. A city in Russia. #. The local name in Russian is "Мирный". #. msgid "Mirnyy" msgstr "Mirnyy" #. The capital of Russia. #. "Moscow" is the traditional English name. #. The local name in Russian is "Moskva / Москва". #. msgctxt "City in Russia" msgid "Moscow" msgstr "Moskva" #. A city in Russia. #. The local name in Russian is "Мурманск". #. msgid "Murmansk" msgstr "Murmansk" #. A city in Russia. #. The local name in Russian is "Нальчик". #. msgid "Nal'chik" msgstr "Nalčik" #. A city in Russia. #. The local name in Russian is "Нижневартовск". #. msgid "Nizhnevartovsk" msgstr "Nizhnevartovsk" #. A city in Russia. #. The local name in Russian is "Ни́жний Но́вгород". #. msgid "Nizhny Novgorod" msgstr "Nižnji Novgorod" #. A city in Russia. #. The local name in Russian is "Новокузнецк". #. msgid "Novokuznetsk" msgstr "Novokuznetsk" #. A city in Russia. #. The local name in Russian is "Новосибирск". #. msgid "Novosibirsk" msgstr "Novosibirsk" #. A city in Russia. #. The local name in Russian is "Омск". #. msgid "Omsk" msgstr "Omsk" #. A city in Russia. #. The local name in Russian is "Оренбург". #. msgid "Orenburg" msgstr "Orenburg" #. A city in Russia. #. The local name in Russian is "Пенза". #. msgid "Penza" msgstr "Penza" #. A city in Russia. #. The local name in Russian is "Пермь". #. msgid "Perm" msgstr "Perm" #. A city in Russia. #. The local name in Russian is "Петропавловск-Камчатский". #. msgid "Petropavlovsk" msgstr "Petropavlovsk" #. A city in Russia. #. The local name in Russian is "Ростов-на-Дону". #. msgid "Rostov" msgstr "Rostov" #. A city in Russia msgid "Rybinsk" msgstr "Rybinsk" #. A city in Russia. #. "Saint Petersburg" is the traditional English name. #. The local name in Russian is "Sankt-Peterburg / #. Санкт-Петербург". #. msgid "Saint Petersburg" msgstr "Sankt Petersburg" #. A city in Russia. #. The local name in Russian is "Самара". #. msgid "Samara" msgstr "Samara" #. A city in Russia msgid "Saratov" msgstr "Saratov" #. A city in Russia. #. The local name in Russian is "Ставрополь". #. msgid "Stavropol'" msgstr "Stavropolj" #. A city in Russia. #. The local name in Russian is "Сургут". #. msgid "Surgut" msgstr "Surgut" #. A city in Russia msgid "Syktyvkar" msgstr "Syktyvkar" #. A city in Russia msgid "Tiksi" msgstr "Tiksi" #. A city in Russia msgid "Tomsk" msgstr "Tomsk" #. A city in Russia msgid "Tyumen" msgstr "Tyumen" #. A city in Russia msgid "Udachnyy" msgstr "Udachnyy" #. A city in Russia msgid "Ufa" msgstr "Ufa" #. A city in Russia msgid "Ul'yanovsk" msgstr "Ul'yanovsk" #. A city in Russia msgid "Ulan-Ude" msgstr "Ulan - Ude" #. A city in Russia msgid "Velikiye Luki" msgstr "Velikiye Luki" #. A city in Russia msgid "Vladivostok" msgstr "Vladivostok" #. A city in Russia msgid "Volgograd" msgstr "Volgograd" #. A city in Russia msgid "Voronezh" msgstr "Voronež" #. A city in Russia msgid "Yakutsk" msgstr "Yakutsk" #. A city in Russia msgid "Yaroslavl" msgstr "Jaroslavlj" #. A city in Russia msgid "Yekaterinburg" msgstr "Jekaterinburg" #. A city in Russia. #. The local name in Russian is "Йошкар-Ола". #. msgid "Yoshkar-Ola" msgstr "Joškar-Ola" #. A city in Russia msgid "Yuzhno-Sakhalinsk" msgstr "Yuzhno - Sakhalinsk" #. The capital of Réunion msgid "Saint-Denis" msgstr "Saint-Denis" #. A city in Réunion msgctxt "City in Réunion" msgid "Saint-Pierre" msgstr "Saint-Pierre" #. A city in Saint Helena msgctxt "City in Saint Helena" msgid "Georgetown" msgstr "Georgetown" #. The capital of Saint Kitts and Nevis msgid "Basseterre" msgstr "Basseterre" #. A city in Saint Kitts and Nevis msgid "Golden Rock" msgstr "Golden Rock" #. A city in Saint Kitts and Nevis msgctxt "City in Saint Kitts and Nevis" msgid "Newcastle" msgstr "Newcastle" #. The capital of Saint Lucia msgid "Castries" msgstr "Castries" #. A city in Saint Lucia msgid "Pointe Sable" msgstr "Pointe Sable" #. A city in Saint Lucia msgid "Vigie" msgstr "Vigie" #. The capital of Saint Pierre and Miquelon msgctxt "City in Saint Pierre and Miquelon" msgid "Saint-Pierre" msgstr "Saint-Pierre" #. A city in Saint Vincent and the Grenadines msgid "Arnos Vale" msgstr "Arnos Vale" #. The capital of Saint Vincent and the Grenadines msgid "Kingstown" msgstr "Kingstown" #. The capital of Samoa msgid "Apia" msgstr "Apia" #. The capital of San Marino msgctxt "City in San Marino" msgid "San Marino" msgstr "San Marino" #. A city in Saudi Arabia msgid "'Ar'ar" msgstr "'Ar'ar" #. A city in Saudi Arabia msgid "Abha" msgstr "Abha" #. A city in Saudi Arabia msgid "Ad Dalfa'ah" msgstr "Ad Dalfa'ah" #. A city in Saudi Arabia msgid "Ad Dammam" msgstr "Ad Dammam" #. A city in Saudi Arabia msgid "Al 'Aqiq" msgstr "Al 'Aqiq" #. A city in Saudi Arabia msgid "Al Qaysumah" msgstr "Al Qaysumah" #. A city in Saudi Arabia msgid "Al Qurayyat" msgstr "Al Qurayyat" #. A city in Saudi Arabia msgid "Al Wajh" msgstr "Al Wajh" #. A city in Saudi Arabia msgid "Al Wuday'ah" msgstr "Al Wuday'ah" #. A city in Saudi Arabia msgid "Ar Ruqayyiqah" msgstr "Ar Ruqayyiqah" #. A city in Saudi Arabia msgid "At Ta'if" msgstr "At Ta'if" #. A city in Saudi Arabia. #. "Dhahran" is the traditional English name. #. The local name in Arabic is "Az Zahran". #. msgid "Dhahran" msgstr "Dhahran" #. A city in Saudi Arabia msgid "Ha'il" msgstr "Ha'il" #. A city in Saudi Arabia msgid "Jiddah" msgstr "Jiddah" #. A city in Saudi Arabia msgid "Jizan" msgstr "Jizan" #. A city in Saudi Arabia msgid "Khamis Mushayt" msgstr "Khamis Mushayt" #. A city in Saudi Arabia msgid "Masjid Ibn Rashid" msgstr "Masjid Ibn Rashid" #. A city in Saudi Arabia. #. "Mecca" is the traditional English name. #. The local name in Arabic is "Makkah". #. msgid "Mecca" msgstr "Meka" #. A city in Saudi Arabia. #. "Medina" is the traditional English name. #. The local name in Arabic is "Al Madinah al Munawwarah". #. msgid "Medina" msgstr "Medina" #. A city in Saudi Arabia msgid "Najran" msgstr "Najran" #. A city in Saudi Arabia msgid "Qal'at Bishah" msgstr "Qal'at Bishah" #. A city in Saudi Arabia msgid "Qara" msgstr "Qara" #. A city in Saudi Arabia msgid "Rafha" msgstr "Rafha" #. The capital of Saudi Arabia. #. "Riyadh" is the traditional English name. #. The local name in Arabic is "Ar Riyad". #. msgid "Riyadh" msgstr "Riyadh" #. A city in Saudi Arabia msgid "Tabuk" msgstr "Tabuk" #. A city in Saudi Arabia msgid "Tamrah" msgstr "Tamrah" #. A city in Saudi Arabia msgid "Turayf" msgstr "Turayf" #. A city in Saudi Arabia msgid "Yanbu' al Bahr" msgstr "Yanbu' al Bahr" #. A city in Senegal msgid "Boukot Ouolof" msgstr "Boukot Ouolof" #. The capital of Senegal msgid "Dakar" msgstr "Dakar" #. A city in Senegal msgid "Saint-Louis" msgstr "Sveti Louis" #. A city in Senegal msgid "Tambacounda" msgstr "Tambacounda" #. A city in Senegal msgid "Ziguinchor" msgstr "Ziguinchor" #. The capital of Serbia. #. "Belgrade" is the traditional English name. #. The local name in Serbian is "Beograd". #. msgid "Belgrade" msgstr "Beograd" #. A city in Serbia msgid "Niš" msgstr "Niš" #. A city in Serbia msgid "Vršac" msgstr "Vršac" #. A city in Serbia msgid "Zemun" msgstr "Zemun" #. A city in the Seychelles msgid "Cascade" msgstr "Cascade" #. The capital of the Seychelles msgctxt "City in Seychelles" msgid "Victoria" msgstr "Victoria" #. The capital of Sierra Leone msgid "Freetown" msgstr "Freetown" #. A city in Sierra Leone msgid "Lungi" msgstr "Lungi" #. The capital of Singapore msgctxt "City in Singapore" msgid "Singapore" msgstr "Singapur" #. The capital of Slovakia msgid "Bratislava" msgstr "Bratislava" #. A city in Slovakia msgid "Dolný Hričov" msgstr "Dolný Hričov" #. A city in Slovakia msgid "Kamenica nad Cirochou" msgstr "Kamenica nad Cirochou" #. A city in Slovakia msgid "Košice" msgstr "Košice" #. A city in Slovakia msgid "Lučenec" msgstr "Lučenec" #. A city in Slovakia msgid "Piešťany" msgstr "Piešťany" #. A city in Slovakia msgid "Poprad" msgstr "Poprad" #. A city in Slovakia msgid "Prešov" msgstr "Prešov" #. A city in Slovakia msgid "Prievidza" msgstr "Prievidza" #. A city in Slovakia msgid "Sliač" msgstr "Sliač" #. A city in Slovakia msgid "Žilina" msgstr "Žilina" #. The capital of Slovenia msgid "Ljubljana" msgstr "Ljubljana" #. A city in Slovenia msgid "Maribor" msgstr "Maribor" #. A city in Slovenia msgid "Portorož" msgstr "Portorož" #. The capital of the Solomon Islands msgid "Honiara" msgstr "Honiara" #. A city in South Africa msgid "Bloemfontein" msgstr "Bloemfontein" #. A city in South Africa msgid "Cape Town" msgstr "Cape Town" #. A city in South Africa msgid "Durban" msgstr "Durban" #. A city in South Africa msgid "Johannesburg" msgstr "Johannesburg" #. A city in South Africa msgid "Klerksdorp" msgstr "Klerksdorp" #. A city in South Africa msgid "Port Elizabeth" msgstr "Port Elizabeth" #. A city in South Africa msgid "Potchefstroom" msgstr "Potchefstroom" #. The capital of South Africa msgid "Pretoria" msgstr "Pretoria" #. A city in South Africa msgid "Springs" msgstr "Springs" #. A city in South Africa msgid "Upington" msgstr "Upington" #. A city in South Africa msgid "Vereeniging" msgstr "Vereeniging" #. A city in South Korea msgid "Ch'ongju" msgstr "Ch'ongju" #. A city in South Korea msgid "Cheju" msgstr "Cheju" #. A city in South Korea msgid "Inch'on" msgstr "Inch'on" #. A city in South Korea msgid "Kunsan" msgstr "Kunsan" #. A city in South Korea. #. The name is also written "오산". #. msgid "Osan" msgstr "Osan" #. A city in South Korea msgid "P'yongt'aek" msgstr "P'yongt'aek" #. A city in South Korea msgid "Pusan" msgstr "Pusan" #. The capital of South Korea. #. "Seoul" is the traditional English name. #. The local name in Korean is "서울" (transliterated as "Soul"). #. msgid "Seoul" msgstr "Seoul" #. A city in South Korea msgid "Taegu" msgstr "Taegu" #. A city in Spain msgid "A Coruña" msgstr "La Coruña" #. A city in Spain msgid "Agoncillo" msgstr "Agoncillo" #. A city in Spain msgid "Alcantarilla" msgstr "Alcantarilla" #. A city in Spain msgid "Alcorcón" msgstr "Alcorcón" #. A city in Spain msgid "Alicante" msgstr "Alicante" #. A city in Spain msgid "Almería" msgstr "Almería" #. A city in Spain msgid "Armilla" msgstr "Armilla" #. A city in Spain msgid "Atogo" msgstr "Atogo" #. A city in Spain msgid "Avilés" msgstr "Avilés" #. A city in Spain msgid "Barajas" msgstr "Barajas" #. A city in Spain msgctxt "City in Spain" msgid "Barcelona" msgstr "Barcelona" #. A city in Spain msgid "Bilbao" msgstr "Bilbao" #. A city in Spain msgid "Colmenar Viejo" msgstr "Colmenar Viejo" #. A city in Spain msgid "Corcovados" msgstr "Corcovados" #. A city in Spain msgid "Cuatro Vientos" msgstr "Cuatro Vientos" #. A city in Spain msgctxt "City in Spain" msgid "Córdoba" msgstr "Córdoba" #. A city in Spain msgid "El Matorral" msgstr "El Matorral" #. A city in Spain msgid "Fuenlabrada" msgstr "Fuenlabrada" #. A city in Spain msgid "Fuenterrabía" msgstr "Fuenterrabía" #. A city in Spain msgid "Gando" msgstr "Gando" #. A city in Spain msgid "Gerona" msgstr "Gerona" #. A city in Spain msgid "Getafe" msgstr "Getafe" #. A city in Spain msgid "Gijón" msgstr "Gijón" #. A city in Spain msgid "Granada" msgstr "Granada" #. A city in Spain msgid "Güime" msgstr "Güime" #. A city in Spain msgid "Ibiza" msgstr "Ibiza" #. A city in Spain msgid "Jerez" msgstr "Jerez" #. A city in Spain msgid "Leganés" msgstr "Leganés" #. A city in Spain msgctxt "City in Spain" msgid "León" msgstr "León" #. A city in Spain msgid "Los Baldíos" msgstr "Los Baldíos" #. A city in Spain msgid "Los Llanos" msgstr "Los Llanos" #. The capital of Spain msgid "Madrid" msgstr "Madrid" #. A city in Spain msgid "Mahón" msgstr "Mahón" #. A city in Spain msgid "Melilla" msgstr "Melilla" #. A city in Spain msgid "Morón" msgstr "Morón" #. A city in Spain msgid "Málaga" msgstr "Málaga" #. A city in Spain msgid "Móstoles" msgstr "Móstoles" #. A city in Spain msgid "Noáin" msgstr "Noáin" #. A city in Spain msgid "Palma" msgstr "Palma" #. A city in Spain msgid "Reus" msgstr "Reus" #. A city in Spain msgid "Rota" msgstr "Rota" #. A city in Spain msgid "Sabadell" msgstr "Sabadell" #. A city in Spain msgid "Salamanca" msgstr "Salamanca" #. A city in Spain msgid "San Javier" msgstr "San Javier" #. A city in Spain msgid "San Pablo" msgstr "San Pablo" #. A city in Spain msgid "Santander" msgstr "Santander" #. A city in Spain msgctxt "City in Spain" msgid "Santiago" msgstr "Santiago" #. A city in Spain msgid "Talavera la Real" msgstr "Talavera la Real" #. A city in Spain msgid "Tamaduste" msgstr "Tamaduste" #. A city in Spain msgid "Torrejón del Rey" msgstr "Torrejón del Rey" #. A city in Spain msgctxt "City in Spain" msgid "Valencia" msgstr "Valencia" #. A city in Spain msgid "Vigo" msgstr "Vigo" #. A city in Spain msgid "Villanubla" msgstr "Villanubla" #. A city in Spain msgid "Vitoria-Gasteiz" msgstr "Vitoria-Gasteiz" #. A city in Spain msgid "Zaragoza" msgstr "Zaragoza" #. The capital of Sri Lanka msgid "Colombo" msgstr "Colombo" #. A city in Sri Lanka msgid "Katunayaka" msgstr "Katunayaka" #. The capital of Sri Lanka msgid "Sri Jayewardenepura Kotte" msgstr "Sri Jayewardenepura Kotte" #. The capital of Sudan. #. "Khartoum" is the traditional English name. #. The local name in Arabic is "Al Khartum". #. msgid "Khartoum" msgstr "Khartoum" #. The capital of Suriname msgid "Paramaribo" msgstr "Paramaribo" #. A city in Suriname msgid "Zanderij" msgstr "Zanderij" #. The capital of Svalbard and Jan Mayen msgid "Longyearbyen" msgstr "Longyearbyen" #. The capital of Swaziland msgid "Lobamba" msgstr "Lobamba" #. A city in Swaziland msgid "Manzini" msgstr "Manzini" #. The capital of Swaziland msgid "Mbabane" msgstr "Mbabane" #. A city in Sweden msgid "Borlänge" msgstr "Borlänge" #. A city in Sweden msgid "Gällivare" msgstr "Gällivare" #. A city in Sweden msgid "Göteborg" msgstr "Göteborg" #. A city in Sweden msgid "Halmstad" msgstr "Halmstad" #. A city in Sweden msgid "Jönköping" msgstr "Jönköping" #. A city in Sweden msgid "Kalmar" msgstr "Kalmar" #. A city in Sweden msgid "Karlstad" msgstr "Karlstad" #. A city in Sweden msgid "Kiruna" msgstr "Kiruna" #. A city in Sweden msgid "Kramfors" msgstr "Kramfors" #. A city in Sweden msgid "Kristianstad" msgstr "Kristianstad" #. A city in Sweden msgid "Linköping" msgstr "Linköping" #. A city in Sweden msgid "Ljungbyhed" msgstr "Ljungbyhed" #. A city in Sweden msgid "Luleå" msgstr "Luleå" #. A city in Sweden msgid "Lycksele" msgstr "Lycksele" #. A city in Sweden msgid "Malmö" msgstr "Malmö" #. A city in Sweden msgid "Norrköping" msgstr "Norrköping" #. A city in Sweden msgid "Nyköping" msgstr "Nyköping" #. A city in Sweden msgid "Ronneby" msgstr "Ronneby" #. A city in Sweden msgid "Skellefteå" msgstr "Skellefteå" #. A city in Sweden msgid "Skövde" msgstr "Skövde" #. The capital of Sweden msgid "Stockholm" msgstr "Stockholm" #. A city in Sweden msgid "Sundsvall" msgstr "Sundsvall" #. A city in Sweden msgid "Söderhamn" msgstr "Söderhamn" #. A city in Sweden msgid "Umeå" msgstr "Umeå" #. A city in Sweden msgid "Visby" msgstr "Visby" #. A city in Sweden msgid "Västerås" msgstr "Västerås" #. A city in Sweden msgid "Växjö" msgstr "Växjö" #. A city in Sweden msgid "Ängelholm" msgstr "Ängelholm" #. A city in Sweden msgid "Örebro" msgstr "Örebro" #. A city in Sweden msgid "Örnsköldsvik" msgstr "Örnsköldsvik" #. A city in Switzerland msgid "Basel" msgstr "Basel" #. The capital of Switzerland msgid "Bern" msgstr "Bern" #. A city in Switzerland. #. "Geneva" is the traditional English name. #. The local name is "Genève". #. msgid "Geneva" msgstr "Geneva" #. A city in Switzerland msgid "Grenchen" msgstr "Grenchen" #. A city in Switzerland msgid "Lugano" msgstr "Lugano" #. A city in Switzerland msgid "Neuchâtel" msgstr "Neuchâtel" #. A city in Switzerland msgid "Sankt Gallen" msgstr "Sankt Gallen" #. A city in Switzerland msgid "Sion" msgstr "Sion" #. A city in Switzerland msgid "St. Moritz" msgstr "St. Moritz" #. A city in Switzerland msgid "Zürich" msgstr "Zürich" #. A city in Syria msgid "Al Qamishli" msgstr "Al Qamishli" #. A city in Syria. #. "Aleppo" is the traditional English name. #. The local name in Arabic is "Halab". #. msgid "Aleppo" msgstr "Aleppo" #. The capital of Syria. #. "Damascus" is the traditional English name. #. The local name in Arabic is "Dimashq". #. msgid "Damascus" msgstr "Damascus" #. A city in Syria msgid "Dayr az Zawr" msgstr "Dayr az Zawr" #. A city in Syria. #. "Latakia" is the traditional English name. #. The local name in Arabic is "Al Ladhiqiyah". #. msgid "Latakia" msgstr "Latakia" #. A city in Taiwan. #. The name is also written "高雄". #. msgid "Kaohsiung" msgstr "Kaohsiung" #. The capital of Taiwan. #. The name is also written "臺北". #. msgid "Taipei" msgstr "Taipei" #. A city in Taiwan. #. The name is also written "埔頂". #. msgid "Taoyuan" msgstr "Taoyuan" #. The capital of Tajikistan msgid "Dushanbe" msgstr "Dushanbe" #. A city in Tanzania msgid "Arusha" msgstr "Arusha" #. A city in Tanzania msgid "Bukoba" msgstr "Bukoba" #. The capital of Tanzania msgid "Dar es Salaam" msgstr "Dar es Salaam" #. A city in Tanzania msgid "Dodoma" msgstr "Dodoma" #. A city in Tanzania msgid "Iringa" msgstr "Iringa" #. A city in Tanzania msgid "Kigoma" msgstr "Kigoma" #. A city in Tanzania msgid "Mbeya" msgstr "Mbeya" #. A city in Tanzania msgid "Morogoro" msgstr "Morogoro" #. A city in Tanzania msgid "Moshi" msgstr "Moshi" #. A city in Tanzania msgid "Mtwara" msgstr "Mtwara" #. A city in Tanzania msgid "Musoma" msgstr "Musoma" #. A city in Tanzania msgid "Mwanza" msgstr "Mwanza" #. A city in Tanzania msgid "Songea" msgstr "Songea" #. A city in Tanzania msgid "Tabora" msgstr "Tabora" #. A city in Tanzania msgid "Zanzibar" msgstr "Zanzibar" #. The capital of Thailand. #. "Bangkok" is the traditional English name. #. The local name in Thai is "Krung Thep / กรุงเทพฯ". #. msgid "Bangkok" msgstr "Bangkok" #. A city in Thailand msgid "Chiang Mai" msgstr "Chiang Mai" #. A city in Thailand msgid "Chon Buri" msgstr "Chon Buri" #. A city in Thailand msgid "Hat Yai" msgstr "Hat Yai" #. A city in Thailand msgid "Hua Hin" msgstr "Hua Hin" #. A city in Thailand msgid "Khon Kaen" msgstr "Khon Kaen" #. A city in Thailand msgid "Lampang" msgstr "Lampang" #. A city in Thailand msgid "Mae Hong Son" msgstr "Mae Hong Son" #. A city in Thailand msgid "Nan" msgstr "Nan" #. A city in Thailand msgid "Phrae" msgstr "Phrae" #. A city in Thailand msgid "Phuket" msgstr "Phuket" #. A city in Thailand msgid "Ranong" msgstr "Ranong" #. A city in Thailand msgid "Rayong" msgstr "Rayong" #. A city in Thailand msgid "Surat Thani" msgstr "Surat Thani" #. A city in Thailand msgid "Trang" msgstr "Trang" #. A city in Thailand msgid "Ubon Ratchathani" msgstr "Ubon Ratchathani" #. A city in Thailand msgid "Udon Thani" msgstr "Udon Thani" #. The capital of Togo msgid "Lome" msgstr "Lome" #. A city in Togo msgid "Niamtougou" msgstr "Niamtougou" #. A city in Tonga msgid "Fua'amotu" msgstr "Fua'amotu" #. The capital of Tonga msgid "Nuku'alofa" msgstr "Nuku'alofa" #. A city in Trinidad and Tobago msgid "Bon Accord" msgstr "Bon Accord" #. A city in Trinidad and Tobago msgid "Piarco" msgstr "Piarco" #. The capital of Trinidad and Tobago msgid "Port-of-Spain" msgstr "Port-of-Spain" #. A city in Tunisia msgid "Bizerte" msgstr "Bizerte" #. A city in Tunisia msgid "El Borma" msgstr "El Borma" #. A city in Tunisia msgid "Gabes" msgstr "Gabes" #. A city in Tunisia msgid "Gafsa" msgstr "Gafsa" #. A city in Tunisia msgid "Houmt Souk" msgstr "Houmt Souk" #. A city in Tunisia msgid "Jendouba" msgstr "Jendouba" #. A city in Tunisia msgid "Kairouan" msgstr "Kairouan" #. A city in Tunisia msgid "Monastir" msgstr "Monastir" #. A city in Tunisia msgid "Qulaybiyah" msgstr "Qulaybiyah" #. A city in Tunisia msgid "Remada" msgstr "Remada" #. A city in Tunisia msgid "Sfax" msgstr "Sfax" #. A city in Tunisia msgid "Tabarka" msgstr "Tabarka" #. A city in Tunisia msgid "Tozeur" msgstr "Tozeur" #. The capital of Tunisia msgid "Tunis" msgstr "Tunis" #. A city in Turkey msgid "Adana" msgstr "Adana" #. The capital of Turkey msgid "Ankara" msgstr "Ankara" #. A city in Turkey msgid "Antalya" msgstr "Antalya" #. A city in Turkey msgid "Balikesir" msgstr "Balikesir" #. A city in Turkey msgid "Bandirma" msgstr "Bandirma" #. A city in Turkey msgid "Bodrum" msgstr "Bodrum" #. A city in Turkey msgid "Burdur" msgstr "Burdur" #. A city in Turkey msgid "Bursa" msgstr "Bursa" #. A city in Turkey msgid "Corlu" msgstr "Corlu" #. A city in Turkey msgid "Dalaman" msgstr "Dalaman" #. A city in Turkey msgid "Diyarbakir" msgstr "Diyarbakir" #. A city in Turkey msgid "Erzurum" msgstr "Erzurum" #. A city in Turkey msgid "Eskisehir" msgstr "Eskisehir" #. A city in Turkey msgid "Gaziantep" msgstr "Gaziantep" #. A city in Turkey msgid "Istanbul" msgstr "Istanbul" #. A city in Turkey msgid "Izmir" msgstr "Izmir" #. A city in Turkey msgid "Kars" msgstr "Kars" #. A city in Turkey msgid "Kayseri" msgstr "Kayseri" #. A city in Turkey msgid "Kislakoy" msgstr "Kislakoy" #. A city in Turkey msgid "Konya" msgstr "Konya" #. A city in Turkey msgid "Malatya" msgstr "Malatya" #. A city in Turkey msgid "Merzifon" msgstr "Merzifon" #. A city in Turkey msgid "Nevsehir" msgstr "Nevsehir" #. A city in Turkey msgid "Samsun" msgstr "Samsun" #. A city in Turkey msgid "Tepetarla" msgstr "Tepetarla" #. A city in Turkey msgid "Trabzon" msgstr "Trabzon" #. A city in Turkey msgid "Van" msgstr "Van" #. The capital of Turkmenistan. #. "Ashgabat" is the traditional English name. #. The local name in Turkmen is "Asgabat". #. msgid "Ashgabat" msgstr "Ashgabat" #. The capital of Tuvalu msgid "Funafuti" msgstr "Funafuti" #. A city in Uganda msgid "Arua" msgstr "Arua" #. A city in Uganda msgid "Entebbe" msgstr "Entebbe" #. A city in Uganda msgid "Kabale" msgstr "Kabale" #. The capital of Uganda msgid "Kampala" msgstr "Kampala" #. A city in Ukraine msgid "Boryspil'" msgstr "Boryspil'" #. A city in Ukraine: #. https://en.wikipedia.org/wiki/Chernivtsi msgid "Chernivtsi" msgstr "Černovci" #. A city in Ukraine msgid "Dnipropetrovs'k" msgstr "Dnipropetrovs'k" #. A city in Ukraine msgid "Donets'k" msgstr "Donets'k" #. A city in Ukraine msgid "Hostomel'" msgstr "Hostomel'" #. A city in Ukraine msgid "Ivano-Frankivs'k" msgstr "Ivano-Frankivs'k" #. A city in Ukraine msgid "Kharkiv" msgstr "Kharkiv" #. A city in Ukraine msgid "Kryvyy Rih" msgstr "Kryvyy Rih" #. The capital of Ukraine. #. "Kiev" is the old English name. The local name in #. Ukrainian is "Київ", which transliterates to "Kyiv". #. msgid "Kyiv" msgstr "Kijev" #. A city in Ukraine msgid "L'viv" msgstr "Lavov" #. A city in Ukraine msgid "Mokroye" msgstr "Mokroye" #. A city in Ukraine msgid "Mykolayiv" msgstr "Mykolayiv" #. A city in Ukraine msgid "Odesa" msgstr "Odesa" #. A city in Ukraine msgid "Rivne" msgstr "Rivne" #. A city in Ukraine msgid "Simferopol'" msgstr "Simferopol'" #. A city in Ukraine msgid "Telichka" msgstr "Telichka" #. A city in Ukraine msgid "Uzhhorod" msgstr "Uzhhorod" #. The capital of the United Arab Emirates. #. "Abu Dhabi" is the traditional English name. #. The local name in Arabic is "Abu Zaby". #. msgid "Abu Dhabi" msgstr "Abu Dhabi" #. A city in the United Arab Emirates msgid "Al 'Ayn" msgstr "Al 'Ayn" #. A city in the United Arab Emirates msgid "Al Fujayrah" msgstr "Al Fujayrah" #. A city in the United Arab Emirates. #. "Dubai" is the traditional English name. #. The local name in Arabic is "Dubayy". #. msgid "Dubai" msgstr "Dubai" #. A city in the United Arab Emirates msgid "Ra's al Khaymah" msgstr "Ra's al Khaymah" #. A city in the United Arab Emirates. #. "Sharjah" is the traditional English name. #. The local name in Arabic is "Ash Shariqah". #. msgid "Sharjah" msgstr "Sharjah" #. A city in Scotland in the United Kingdom msgctxt "City in Scotland, United Kingdom" msgid "Aberdeen" msgstr "Aberdeen" #. A city in Northern Ireland in the United Kingdom msgid "Belfast" msgstr "Belfast" #. A city in East and South East England in the United #. Kingdom #. msgctxt "City in East and South East England, United Kingdom" msgid "Benson" msgstr "Benson" #. A city in East and South East England in the United #. Kingdom #. msgid "Biggin Hill" msgstr "Biggin Hill" #. A city in Midlands in the United Kingdom msgctxt "City in Midlands, United Kingdom" msgid "Birmingham" msgstr "Birmingham" #. A city in North West England in the United Kingdom msgid "Blackpool" msgstr "Blackpool" #. A city in South and South West England in the United #. Kingdom #. msgid "Boscombe" msgstr "Boscombe" #. A city in South and South West England in the United #. Kingdom #. msgid "Bournemouth" msgstr "Bournemouth" #. A city on the South East coast of England in the United #. Kingdom #. msgid "Brighton" msgstr "Brighton" #. A city in South and South West England in the United #. Kingdom #. msgid "Bristol" msgstr "Bristol" #. A city in East and South East England in the United #. Kingdom #. msgid "Brize Norton" msgstr "Brize Norton" #. A city in South and South West England in the United #. Kingdom #. msgid "Butes" msgstr "Butes" #. A city in East and South East England in the United #. Kingdom #. msgctxt "City in East and South East England, United Kingdom" msgid "Cambridge" msgstr "Cambridge" #. A city in Scotland in the United Kingdom msgid "Campbeltown" msgstr "Campbeltown" #. A city in Wales in the United Kingdom. #. The local name in Welsh is "Caerdydd". #. msgctxt "City in Wales, United Kingdom" msgid "Cardiff" msgstr "Cardiff" #. A city in North West England in the United Kingdom msgid "Carlisle" msgstr "Carlisle" #. A city in Midlands in the United Kingdom msgid "Castle Donington" msgstr "Castle Donington" #. A city in North West England in the United Kingdom msgid "Church Fenton" msgstr "Church Fenton" #. A city in North East England in the United Kingdom msgid "Coningsby" msgstr "Coningsby" #. A city in Midlands in the United Kingdom msgid "Cottesmore" msgstr "Cottesmore" #. A city in Midlands in the United Kingdom msgid "Coventry" msgstr "Coventry" #. A city in Midlands in the United Kingdom msgid "Cranfield" msgstr "Cranfield" #. A city in North East England in the United Kingdom msgid "Cranwell" msgstr "Cranwell" #. A city in North East England in the United Kingdom msgid "Dishforth" msgstr "Dishforth" #. A city in Scotland in the United Kingdom msgid "Dundee" msgstr "Dundee" #. A city in Scotland in the United Kingdom msgid "Edinburgh" msgstr "Edinburgh" #. A city in Northern Ireland in the United Kingdom msgid "Eglinton" msgstr "Eglinton" #. A city in South and South West England in the United #. Kingdom #. msgid "Exeter" msgstr "Exeter" #. A city in the United Kingdom msgid "Fairford" msgstr "Fairford" #. A city in East and South East England in the United #. Kingdom #. msgid "Farnborough" msgstr "Farnborough" #. A city in South and South West England in the United #. Kingdom #. msgid "Filton" msgstr "Filton" #. A city in Scotland in the United Kingdom msgctxt "City in Scotland, United Kingdom" msgid "Glasgow" msgstr "Glasgow" #. A city in Scotland in the United Kingdom msgid "Gramisdale" msgstr "Gramisdale" #. A city in Wales in the United Kingdom msgid "Hawarden" msgstr "Hawarden" #. A city in South and South West England in the United #. Kingdom #. msgid "Helston" msgstr "Helston" #. A city in South and South West England in the United #. Kingdom #. msgid "Hugh Town" msgstr "Hugh Town" #. A city in Scotland in the United Kingdom msgid "Inverness" msgstr "Inverness" #. A city in East and South East England in the United #. Kingdom #. msgid "Ipswich" msgstr "Ipswich" #. A city in Scotland in the United Kingdom msgid "Kilmoluag" msgstr "Kilmoluag" #. A city in Scotland in the United Kingdom msgid "Kinloss" msgstr "Kinloss" #. A city in Scotland in the United Kingdom msgid "Kintra" msgstr "Kintra" #. A city in Scotland in the United Kingdom msgid "Kirkwall" msgstr "Kirkwall" #. A city in North West England in the United Kingdom msgid "Kirmington" msgstr "Kirmington" #. A city in East and South East England in the United #. Kingdom #. msgid "Lakenheath" msgstr "Lakenheath" #. A city in North West England in the United Kingdom msgid "Leeds" msgstr "Leeds" #. A city in North West England in the United Kingdom msgid "Leeming Bar" msgstr "Leeming Bar" #. A city in Scotland in the United Kingdom msgid "Leuchars" msgstr "Leuchars" #. A city in North West England in the United Kingdom msgid "Linton upon Ouse" msgstr "Linton upon Ouse" #. A city in North West England in the United Kingdom msgctxt "City in North West England, United Kingdom" msgid "Liverpool" msgstr "Liverpool" #. The capital of the United Kingdom msgctxt "City in East and South East England, United Kingdom" msgid "London" msgstr "London" #. A city in Scotland in the United Kingdom msgid "Lossiemouth" msgstr "Lossiemouth" #. A city in East and South East England in the United #. Kingdom #. msgid "Luton" msgstr "Luton" #. A city in East and South East England in the United #. Kingdom #. msgid "Lydd" msgstr "Lydd" #. A city in South and South West England in the United #. Kingdom #. msgid "Lyneham" msgstr "Lyneham" #. A city in North West England in the United Kingdom msgctxt "City in North West England, United Kingdom" msgid "Manchester" msgstr "Manchester" #. A city in East and South East England in the United #. Kingdom #. msgid "Manston" msgstr "Manston" #. A city in East and South East England in the United #. Kingdom #. msgid "Marham" msgstr "Marham" #. A city in South and South West England in the United #. Kingdom #. msgid "Middle Wallop" msgstr "Middle Wallop" #. A city in East and South East England in the United #. Kingdom #. msgid "Mildenhall" msgstr "Mildenhall" #. A city in Scotland in the United Kingdom msgid "Mossbank" msgstr "Mossbank" #. A city in North East England in the United Kingdom msgctxt "City in North East England, United Kingdom" msgid "Newcastle" msgstr "Newcastle" #. A city in East and South East England in the United #. Kingdom #. msgid "Northolt" msgstr "Northolt" #. A city in East and South East England in the United #. Kingdom #. msgid "Norwich" msgstr "Norwich" #. A city in East and South East England in the United #. Kingdom #. msgid "Odiham" msgstr "Odiham" #. A city in Wales in the United Kingdom msgid "Pembrey" msgstr "Pembrey" #. A city in South and South West England in the United #. Kingdom #. msgctxt "City in South and South West England, United Kingdom" msgid "Plymouth" msgstr "Plymouth" #. A city in Scotland in the United Kingdom msgid "Prestwick" msgstr "Prestwick" #. A city in Wales in the United Kingdom msgid "Saint Athan" msgstr "Saint Athan" #. A city in North West England in the United Kingdom msgid "Shawbury" msgstr "Shawbury" #. A city in East and South East England in the United #. Kingdom #. msgid "Shoreham-by-Sea" msgstr "Shoreham-by-Sea" #. A city in East and South East England in the United #. Kingdom #. msgid "Southampton" msgstr "Southampton" #. A city in East and South East England in the United #. Kingdom #. msgctxt "City in East and South East England, United Kingdom" msgid "Southend" msgstr "Southend" #. A city in East and South East England in the United #. Kingdom #. msgid "Stansted Mountfitchet" msgstr "Stansted Mountfitchet" #. A city in South and South West England in the United #. Kingdom #. msgid "Staverton" msgstr "Staverton" #. A city in North East England in the United Kingdom msgctxt "City in North East England, United Kingdom" msgid "Stockton" msgstr "Stockton" #. A city in Scotland in the United Kingdom msgid "Stornoway" msgstr "Stornoway" #. A city in Scotland in the United Kingdom msgid "Sumburgh" msgstr "Sumburgh" #. A city in North East England in the United Kingdom msgid "Topcliffe" msgstr "Topcliffe" #. A city in Wales in the United Kingdom msgid "Valley" msgstr "Valley" #. A city in North East England in the United Kingdom msgid "Waddington" msgstr "Waddington" #. A city in East and South East England in the United #. Kingdom #. msgid "Wainfleet" msgstr "Wainfleet" #. A city in Scotland in the United Kingdom msgid "Wick" msgstr "Wick" #. A city in East and South East England in the United #. Kingdom #. msgid "Wittering" msgstr "Wittering" #. A city in South and South West England in the United #. Kingdom #. msgid "Yeovilton" msgstr "Yeovilton" #. A city in South Dakota in the United States msgctxt "City in South Dakota, United States" msgid "Aberdeen" msgstr "Aberdeen" #. A city in Texas in the United States msgid "Abilene" msgstr "Abilene" #. A city in Virginia in the United States msgid "Abingdon" msgstr "Abingdon" #. A city in Oklahoma in the United States msgid "Ada" msgstr "Ada" #. A city in Alaska in the United States msgid "Adak" msgstr "Adak" #. A city in North Carolina in the United States msgid "Adamsville" msgstr "Adamsville" #. A city in Michigan in the United States msgid "Adrian" msgstr "Adrian" #. A city in North Carolina in the United States msgid "Ahoskie" msgstr "Ahoskie" #. A city in Nebraska in the United States msgid "Ainsworth" msgstr "Ainsworth" #. A city in Minnesota in the United States msgid "Aitkin" msgstr "Aitkin" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Akron" msgstr "Akron" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Akron" msgstr "Akron" #. A city in Alabama in the United States msgid "Alabaster" msgstr "Alabaster" #. A city in New Mexico in the United States msgid "Alamogordo" msgstr "Alamogordo" #. A city in Colorado in the United States msgid "Alamosa" msgstr "Alamosa" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Albany" msgstr "Albany" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Albany" msgstr "Albany" #. A city in North Carolina in the United States msgid "Albemarle" msgstr "Albemarle" #. A city in Minnesota in the United States msgid "Albert Lea" msgstr "Albert Lea" #. A city in Alabama in the United States msgid "Albertville" msgstr "Albertville" #. A city in Nebraska in the United States msgid "Albion" msgstr "Albion" #. A city in New Mexico in the United States msgid "Albuquerque" msgstr "Albuquerque" #. A city in Alabama in the United States msgid "Alexander City" msgstr "Alexander City" #. A city in Louisiana in the United States msgctxt "City in Louisiana, United States" msgid "Alexandria" msgstr "Alexandria" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Alexandria" msgstr "Alexandria" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Alexandria" msgstr "Alexandria" #. A city in Texas in the United States msgid "Alice" msgstr "Alice" #. A city in Pennsylvania in the United States msgid "Allentown" msgstr "Allentown" #. A city in Nebraska in the United States msgid "Alliance" msgstr "Alliance" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Alma" msgstr "Alma" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Alma" msgstr "Alma" #. A city in Michigan in the United States msgid "Alpena" msgstr "Alpena" #. A city in Alaska in the United States msgctxt "City in Alaska, United States" msgid "Alpine" msgstr "Alpine" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Alpine" msgstr "Alpine" #. A city in Illinois in the United States msgid "Alton" msgstr "Alton" #. A city in Pennsylvania in the United States msgid "Altoona" msgstr "Altoona" #. A city in California in the United States msgid "Alturas" msgstr "Alturas" #. A city in Oklahoma in the United States msgid "Altus" msgstr "Altus" #. A city in Oklahoma in the United States msgid "Alva" msgstr "Alva" #. A city in Texas in the United States msgid "Amarillo" msgstr "Amarillo" #. A city in Alaska in the United States msgid "Ambler" msgstr "Ambler" #. A city in Louisiana in the United States msgid "Amelia" msgstr "Amelia" #. A city in Iowa in the United States msgid "Ames" msgstr "Ames" #. A city in California in the United States msgid "Anaheim" msgstr "Anaheim" #. A city in Alaska in the United States msgid "Anaktuvuk Pass" msgstr "Anaktuvuk Pass" #. A city in Alaska in the United States msgid "Anchorage" msgstr "Anchorage" #. A city in Alabama in the United States msgid "Andalusia" msgstr "Andalusia" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Anderson" msgstr "Anderson" #. A city in South Carolina in the United States msgctxt "City in South Carolina, United States" msgid "Anderson" msgstr "Anderson" #. A city in New Jersey in the United States msgid "Andover" msgstr "Andover" #. A city in North Carolina in the United States msgid "Andrews" msgstr "Andrews" #. A city in Minnesota in the United States msgid "Angle Inlet" msgstr "Angle Inlet" #. A city in Texas in the United States msgid "Angleton" msgstr "Angleton" #. A city in Alaska in the United States msgid "Angoon" msgstr "Angoon" #. A city in Alaska in the United States msgid "Aniak" msgstr "Aniak" #. A city in Iowa in the United States msgid "Ankeny" msgstr "Ankeny" #. A city in Michigan in the United States msgid "Ann Arbor" msgstr "Ann Arbor" #. A city in Maryland in the United States msgid "Annapolis" msgstr "Annapolis" #. A city in Alaska in the United States msgid "Annette" msgstr "Annette" #. A city in Alabama in the United States msgid "Anniston" msgstr "Anniston" #. A city in Wisconsin in the United States msgid "Antigo" msgstr "Antigo" #. A city in Alaska in the United States msgid "Anvik" msgstr "Anvik" #. A city in Florida in the United States msgid "Apalachicola" msgstr "Apalachicola" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Appleton" msgstr "Appleton" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Appleton" msgstr "Appleton" #. A city in California in the United States msgid "Arcata" msgstr "Arcata" #. A city in Alaska in the United States msgid "Arctic Village" msgstr "Arctic Village" #. A city in Oklahoma in the United States msgid "Ardmore" msgstr "Ardmore" #. A city in Arkansas in the United States msgid "Arkadelphia" msgstr "Arkadelphia" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Arlington" msgstr "Arlington" #. A city in Washington in the United States msgctxt "City in Washington, United States" msgid "Arlington" msgstr "Arlington" #. A city in New Mexico in the United States msgid "Artesia" msgstr "Artesia" #. A city in Colorado in the United States msgid "Arvada" msgstr "Arvada" #. A city in North Carolina in the United States msgid "Asheboro" msgstr "Asheboro" #. A city in North Carolina in the United States msgid "Asheville" msgstr "Asheville" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Ashland" msgstr "Ashland" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Ashland" msgstr "Ashland" #. A city in Ohio in the United States msgid "Ashtabula" msgstr "Ashtabula" #. A city in Colorado in the United States msgid "Aspen" msgstr "Aspen" #. A city in Oregon in the United States msgid "Astoria" msgstr "Astoria" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Athens" msgstr "Athens" #. A city in Georgia in the United States msgid "Atlanta" msgstr "Atlanta" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Atlantic" msgstr "Atlantic" #. A city in New Jersey in the United States msgid "Atlantic City" msgstr "Atlantic City" #. A city in Oklahoma in the United States msgid "Atoka" msgstr "Atoka" #. A city in Alabama in the United States msgctxt "City in Alabama, United States" msgid "Auburn" msgstr "Auburn" #. A city in California in the United States msgctxt "City in California, United States" msgid "Auburn" msgstr "Auburn" #. A city in Maine in the United States msgctxt "City in Maine, United States" msgid "Auburn" msgstr "Auburn" #. A city in Iowa in the United States msgid "Audubon" msgstr "Audubon" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Augusta" msgstr "Augusta" #. A city in Maine in the United States msgctxt "City in Maine, United States" msgid "Augusta" msgstr "Augusta" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Aurora" msgstr "Aurora" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Aurora" msgstr "Aurora" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Aurora" msgstr "Aurora" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Aurora" msgstr "Aurora" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Austin" msgstr "Austin" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Austin" msgstr "Austin" #. A city in California in the United States msgid "Avalon" msgstr "Avalon" #. A city in Michigan in the United States msgid "Bad Axe" msgstr "Bad Axe" #. A city in Georgia in the United States msgid "Bainbridge" msgstr "Bainbridge" #. A city in Montana in the United States msgid "Baker" msgstr "Baker" #. A city in Oregon in the United States msgid "Baker City" msgstr "Baker City" #. A city in California in the United States msgid "Bakersfield" msgstr "Bakersfield" #. A city in Maryland in the United States msgid "Baltimore" msgstr "Baltimore" #. A city in Maine in the United States msgid "Bangor" msgstr "Bangor" #. A city in Maine in the United States msgid "Bar Harbor" msgstr "Bar Harbor" #. A city in Wisconsin in the United States msgid "Baraboo" msgstr "Baraboo" #. A city in Vermont in the United States msgid "Barre" msgstr "Barre" #. A city in Georgia in the United States msgid "Barretts" msgstr "Barretts" #. A city in Alaska in the United States msgid "Barrow" msgstr "Barrow" #. A city in Oklahoma in the United States msgid "Bartlesville" msgstr "Bartlesville" #. A city in Florida in the United States msgid "Bartow" msgstr "Bartow" #. A city in Arkansas in the United States msgid "Batesville" msgstr "Batesville" #. A city in Louisiana in the United States msgid "Baton Rouge" msgstr "Baton Rouge" #. A city in Michigan in the United States msgid "Battle Creek" msgstr "Battle Creek" #. A city in Minnesota in the United States msgid "Baudette" msgstr "Baudette" #. A city in Texas in the United States msgid "Bay City" msgstr "Bay City" #. A city in Nebraska in the United States msgid "Beatrice" msgstr "Beatrice" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Beaufort" msgstr "Beaufort" #. A city in South Carolina in the United States msgctxt "City in South Carolina, United States" msgid "Beaufort" msgstr "Beaufort" #. A city in Texas in the United States msgid "Beaumont" msgstr "Beaumont" #. A city in Pennsylvania in the United States msgid "Beaver Falls" msgstr "Beaver Falls" #. A city in West Virginia in the United States msgid "Beckley" msgstr "Beckley" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Bedford" msgstr "Bedford" #. A city in Michigan in the United States msgid "Bellaire" msgstr "Bellaire" #. A city in Illinois in the United States msgid "Belleville" msgstr "Belleville" #. A city in Washington in the United States msgid "Bellevue" msgstr "Bellevue" #. A city in Washington in the United States msgid "Bellingham" msgstr "Bellingham" #. A city in New Jersey in the United States msgid "Belmar" msgstr "Belmar" #. A city in Minnesota in the United States msgid "Bemidji" msgstr "Bemidji" #. A city in Vermont in the United States msgid "Bennington" msgstr "Bennington" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Benson" msgstr "Benson" #. A city in Michigan in the United States msgid "Benton Harbor" msgstr "Benton Harbor" #. A city in Arkansas in the United States msgid "Bentonville" msgstr "Bentonville" #. A city in California in the United States msgid "Berkeley" msgstr "Berkeley" #. A city in New Hampshire in the United States msgctxt "City in New Hampshire, United States" msgid "Berlin" msgstr "Berlin" #. A city in Alaska in the United States msgid "Bethel" msgstr "Bethel" #. A city in Alaska in the United States msgid "Bettles" msgstr "Bettles" #. A city in Massachusetts in the United States msgid "Beverly" msgstr "Beverly" #. A city in Wyoming in the United States msgid "Big Piney" msgstr "Big Piney" #. A city in Michigan in the United States msgid "Big Rapids" msgstr "Big Rapids" #. A city in Texas in the United States msgid "Big Spring" msgstr "Big Spring" #. A city in Minnesota in the United States msgid "Bigfork" msgstr "Bigfork" #. A city in Montana in the United States msgid "Billings" msgstr "Billings" #. A city in Mississippi in the United States msgid "Biloxi" msgstr "Biloxi" #. A city in New York in the United States msgid "Binghamton" msgstr "Binghamton" #. A city in Alaska in the United States msgid "Birchwood" msgstr "Birchwood" #. A city in Alabama in the United States msgctxt "City in Alabama, United States" msgid "Birmingham" msgstr "Birmingham" #. A city in California in the United States msgid "Bishop" msgstr "Bishop" #. A city in North Dakota in the United States msgid "Bismarck" msgstr "Bismarck" #. A city in Montana in the United States msgid "Black Eagle" msgstr "Black Eagle" #. A city in New York in the United States msgid "Black River" msgstr "Black River" #. A city in Virginia in the United States msgid "Blacksburg" msgstr "Blacksburg" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Bloomington" msgstr "Bloomington" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Bloomington" msgstr "Bloomington" #. A city in West Virginia in the United States msgid "Bluefield" msgstr "Bluefield" #. A city in California in the United States msgid "Blythe" msgstr "Blythe" #. A city in Arkansas in the United States msgid "Blytheville" msgstr "Blytheville" #. A city in Florida in the United States msgid "Boca Raton" msgstr "Boca Raton" #. A city in North Carolina in the United States msgid "Bogue" msgstr "Bogue" #. A city in Idaho in the United States msgid "Boise" msgstr "Boise" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Boone" msgstr "Boone" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Boone" msgstr "Boone" #. A city in Louisiana in the United States msgid "Boothville" msgstr "Boothville" #. A city in Wyoming in the United States msgctxt "City in Wyoming, United States" msgid "Bordeaux" msgstr "Bordeaux" #. A city in Texas in the United States msgid "Borger" msgstr "Borger" #. A city in Wisconsin in the United States msgid "Boscobel" msgstr "Boscobel" #. A city in Massachusetts in the United States msgid "Boston" msgstr "Boston" msgctxt "City in Colorado, United States" msgid "Boulder" msgstr "Boulder" #. A city in Kentucky in the United States msgid "Bowling Green" msgstr "Bowling Green" #. A city in North Dakota in the United States msgid "Bowman" msgstr "Bowman" #. A city in South Dakota in the United States msgid "Box Elder" msgstr "Box Elder" #. A city in Montana in the United States msgid "Bozeman" msgstr "Bozeman" #. A city in Pennsylvania in the United States msgid "Bradford" msgstr "Bradford" #. A city in Texas in the United States msgid "Brady" msgstr "Brady" #. A city in Minnesota in the United States msgid "Brainerd" msgstr "Brainerd" #. A city in Washington in the United States msgid "Bremerton" msgstr "Bremerton" #. A city in Texas in the United States msgid "Brenham" msgstr "Brenham" #. A city in Connecticut in the United States msgid "Bridgeport" msgstr "Bridgeport" #. A city in Nebraska in the United States msgid "Broken Bow" msgstr "Broken Bow" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Brookings" msgstr "Brookings" #. A city in South Dakota in the United States msgctxt "City in South Dakota, United States" msgid "Brookings" msgstr "Brookings" #. A city in Florida in the United States msgid "Brooksville" msgstr "Brooksville" #. A city in Colorado in the United States msgid "Broomfield" msgstr "Broomfield" #. A city in Montana in the United States msgid "Browning" msgstr "Browning" #. A city in Texas in the United States msgid "Brownsville" msgstr "Brownsville" #. A city in Texas in the United States msgid "Brownwood" msgstr "Brownwood" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Brunswick" msgstr "Brunswick" #. A city in Maine in the United States msgctxt "City in Maine, United States" msgid "Brunswick" msgstr "Brunswick" #. A city in Utah in the United States msgid "Bryce Canyon" msgstr "Bryce Canyon" #. A city in West Virginia in the United States msgid "Buckhannon" msgstr "Buckhannon" #. A city in Alaska in the United States msgid "Buckland" msgstr "Buckland" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Buffalo" msgstr "Buffalo" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Buffalo" msgstr "Buffalo" #. A city in South Dakota in the United States msgctxt "City in South Dakota, United States" msgid "Buffalo" msgstr "Buffalo" #. A city in Wyoming in the United States msgctxt "City in Wyoming, United States" msgid "Buffalo" msgstr "Buffalo" #. A city in Arizona in the United States msgid "Bullhead City" msgstr "Bullhead City" #. A city in California in the United States msgid "Burbank" msgstr "Burbank" #. A city in Idaho in the United States msgid "Burley" msgstr "Burley" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Burlington" msgstr "Burlington" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Burlington" msgstr "Burlington" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Burlington" msgstr "Burlington" #. A city in Vermont in the United States msgctxt "City in Vermont, United States" msgid "Burlington" msgstr "Burlington" #. A city in Washington in the United States msgctxt "City in Washington, United States" msgid "Burlington" msgstr "Burlington" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Burlington" msgstr "Burlington" #. A city in Texas in the United States msgid "Burnet" msgstr "Burnet" #. A city in Oregon in the United States msgid "Burns" msgstr "Burns" #. A city in Pennsylvania in the United States msgid "Butler" msgstr "Butler" #. A city in Montana in the United States msgid "Butte" msgstr "Butte" #. A city in Michigan in the United States msgid "Cadillac" msgstr "Cadillac" #. A city in Illinois in the United States msgid "Cahokia" msgstr "Cahokia" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Cairo" msgstr "Cairo" #. A city in Idaho in the United States msgctxt "City in Idaho, United States" msgid "Caldwell" msgstr "Caldwell" #. A city in New Jersey in the United States msgctxt "City in New Jersey, United States" msgid "Caldwell" msgstr "Caldwell" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Caldwell" msgstr "Caldwell" #. A city in California in the United States msgid "Camarillo" msgstr "Camarillo" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Cambridge" msgstr "Cambridge" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Cambridge" msgstr "Cambridge" #. A city in Arkansas in the United States msgid "Camden" msgstr "Camden" #. A city in Wisconsin in the United States msgid "Camp Douglas" msgstr "Camp Douglas" #. A city in Maryland in the United States msgid "Camp Springs" msgstr "Camp Springs" #. A city in California in the United States msgid "Campo" msgstr "Campo" #. A city in Texas in the United States msgid "Canadian" msgstr "Kanadski" #. A city in Georgia in the United States msgid "Canton" msgstr "Canton" #. A city in Florida in the United States msgid "Cape Canaveral" msgstr "Cape Canaveral" #. A city in Florida in the United States msgid "Cape Coral" msgstr "Cape Coral" #. A city in Missouri in the United States msgid "Cape Girardeau" msgstr "Cape Girardeau" #. A city in Illinois in the United States msgid "Carbondale" msgstr "Carbondale" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Cardiff" msgstr "Cardiff" #. A city in Maine in the United States msgid "Caribou" msgstr "Caribou" #. A city in California in the United States msgctxt "City in California, United States" msgid "Carlsbad" msgstr "Carlsbad" #. A city in New Mexico in the United States msgctxt "City in New Mexico, United States" msgid "Carlsbad" msgstr "Carlsbad" #. A city in Illinois in the United States msgid "Carmi" msgstr "Carmi" #. A city in Michigan in the United States msgid "Caro" msgstr "Caro" #. A city in Iowa in the United States msgid "Carroll" msgstr "Carroll" #. A city in Texas in the United States msgid "Carrollton" msgstr "Carrollton" #. A city in Georgia in the United States msgid "Cartersville" msgstr "Cartersville" #. A city in Arizona in the United States msgid "Casa Grande" msgstr "Casa Grande" #. A city in Wyoming in the United States msgid "Casper" msgstr "Casper" #. A city in Utah in the United States msgid "Cedar City" msgstr "Cedar City" #. A city in Iowa in the United States msgid "Cedar Rapids" msgstr "Cedar Rapids" #. A city in Illinois in the United States msgid "Centralia" msgstr "Centralia" #. A city in Nebraska in the United States msgid "Chadron" msgstr "Chadron" #. A city in Idaho in the United States msgid "Challis" msgstr "Challis" #. A city in New Mexico in the United States msgid "Chama" msgstr "Chama" #. A city in South Dakota in the United States msgid "Chamberlain" msgstr "Chamberlain" #. A city in Illinois in the United States msgid "Champaign" msgstr "Champaign" #. A city in Alaska in the United States msgid "Chandalar" msgstr "Chandalar" #. A city in Arizona in the United States msgctxt "City in Arizona, United States" msgid "Chandler" msgstr "Chandler" #. A city in Oklahoma in the United States msgctxt "City in Oklahoma, United States" msgid "Chandler" msgstr "Chandler" #. A city in Kansas in the United States msgid "Chanute" msgstr "Chanute" #. A city in North Carolina in the United States msgid "Chapel Hill" msgstr "Chapel Hill" #. A city in Iowa in the United States msgid "Chariton" msgstr "Chariton" #. A city in Iowa in the United States msgid "Charles City" msgstr "Charles City" #. A city in South Carolina in the United States msgctxt "City in South Carolina, United States" msgid "Charleston" msgstr "Charleston" #. A city in West Virginia in the United States msgctxt "City in West Virginia, United States" msgid "Charleston" msgstr "Charleston" #. A city in Michigan in the United States msgid "Charlevoix" msgstr "Charlevoix" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Charlotte" msgstr "Charlotte" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Charlotte" msgstr "Charlotte" #. A city in Virginia in the United States msgid "Charlottesville" msgstr "Charlottesville" #. A city in Massachusetts in the United States msgid "Chatham" msgstr "Chatham" #. A city in Tennessee in the United States msgid "Chattanooga" msgstr "Chattanooga" #. A city in Michigan in the United States msgid "Cheboygan" msgstr "Cheboygan" #. A city in Iowa in the United States msgid "Cherokee" msgstr "Cherokee" #. A city in Virginia in the United States msgid "Chesapeake" msgstr "Chesapeake" #. A city in Missouri in the United States msgid "Chesterfield" msgstr "Chesterfield" #. A city in Wyoming in the United States msgid "Cheyenne" msgstr "Cheyenne" #. A city in Illinois in the United States msgid "Chicago" msgstr "Chicago" #. A city in Oklahoma in the United States msgid "Chickasha" msgstr "Chickasha" #. A city in California in the United States msgid "Chico" msgstr "Chico" #. A city in Massachusetts in the United States msgid "Chicopee Falls" msgstr "Slapovi Chicopee" #. A city in Alaska in the United States msgid "Chignik" msgstr "Chignik" #. A city in Texas in the United States msgid "Childress" msgstr "Childress" #. A city in Arizona in the United States msgid "Childs" msgstr "Childs" #. A city in Missouri in the United States msgid "Chillicothe" msgstr "Chillicothe" #. A city in California in the United States msgid "China Lake" msgstr "Kinesko jezero" #. A city in Virginia in the United States msgid "Chincoteague" msgstr "Chincoteague" #. A city in California in the United States msgid "Chino" msgstr "Chino" #. A city in Alaska in the United States msgid "Chisana" msgstr "Chisana" #. A city in Alaska in the United States msgid "Chistochina" msgstr "Chistochina" #. A city in California in the United States msgid "Chula Vista" msgstr "Chula Vista" #. A city in Alaska in the United States msgid "Chulitna" msgstr "Chulitna" #. A city in Ohio in the United States msgid "Cincinnati" msgstr "Cincinnati" #. A city in Oklahoma in the United States msgid "Claremore" msgstr "Claremore" #. A city in Iowa in the United States msgid "Clarinda" msgstr "Clarinda" #. A city in Iowa in the United States msgid "Clarion" msgstr "Clarion" #. A city in West Virginia in the United States msgid "Clarksburg" msgstr "Clarksburg" #. A city in Tennessee in the United States msgctxt "City in Tennessee, United States" msgid "Clarksville" msgstr "Clarksville" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Clarksville" msgstr "Clarksville" #. A city in New Mexico in the United States msgid "Clayton" msgstr "Clayton" #. A city in Pennsylvania in the United States msgid "Clearfield" msgstr "Clearfield" #. A city in Florida in the United States msgid "Clearwater" msgstr "Clearwater" #. A city in South Carolina in the United States msgid "Clemson" msgstr "Clemson" #. A city in Ohio in the United States msgid "Cleveland" msgstr "Cleveland" #. A city in New Mexico in the United States msgid "Clines Corners" msgstr "Clines Corners" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Clinton" msgstr "Clinton" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Clinton" msgstr "Clinton" #. A city in Oklahoma in the United States msgctxt "City in Oklahoma, United States" msgid "Clinton" msgstr "Clinton" #. A city in Wisconsin in the United States msgid "Clintonville" msgstr "Clintonville" #. A city in Minnesota in the United States msgid "Cloquet" msgstr "Cloquet" #. A city in New Mexico in the United States msgid "Clovis" msgstr "Clovis" #. A city in Florida in the United States msgid "Cocoa" msgstr "Cocoa" #. A city in Wyoming in the United States msgid "Cody" msgstr "Cody" #. A city in Idaho in the United States msgid "Coeur d'Alene" msgstr "Coeur d'Alene" #. A city in Kansas in the United States msgid "Coffeyville" msgstr "Coffeyville" #. A city in Alaska in the United States msgid "Cold Bay" msgstr "Zaljev Cold" #. A city in Michigan in the United States msgid "Coldwater" msgstr "Coldwater" #. A city in Texas in the United States msgid "College Station" msgstr "College stanica" #. A city in Colorado in the United States msgid "Colorado Springs" msgstr "Colorado Springs" #. A city in Missouri in the United States msgctxt "City in Missouri, United States" msgid "Columbia" msgstr "Columbia" #. A city in South Carolina in the United States msgctxt "City in South Carolina, United States" msgid "Columbia" msgstr "Columbia" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Columbus" msgstr "Columbus" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Columbus" msgstr "Columbus" #. A city in Mississippi in the United States msgctxt "City in Mississippi, United States" msgid "Columbus" msgstr "Columbus" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Columbus" msgstr "Columbus" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Columbus" msgstr "Columbus" #. A city in California in the United States msgctxt "City in California, United States" msgid "Concord" msgstr "Concord" #. A city in New Hampshire in the United States msgctxt "City in New Hampshire, United States" msgid "Concord" msgstr "Concord" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Concord" msgstr "Concord" #. A city in Kansas in the United States msgid "Concordia" msgstr "Concordia" #. A city in Texas in the United States msgid "Conroe" msgstr "Conroe" #. A city in Minnesota in the United States msgid "Cook" msgstr "Cook" #. A city in Michigan in the United States msgid "Copper Harbor" msgstr "Luka Copper" #. A city in Alaska in the United States msgid "Cordova" msgstr "Cordova" #. A city in California in the United States msgctxt "City in California, United States" msgid "Corona" msgstr "Corona" #. A city in New Mexico in the United States msgctxt "City in New Mexico, United States" msgid "Corona" msgstr "Corona" #. A city in Texas in the United States msgid "Corpus Christi" msgstr "Corpus Christi" #. A city in Texas in the United States msgid "Corsicana" msgstr "Corsicana" #. A city in Colorado in the United States msgid "Cortez" msgstr "Cortez" #. A city in Oregon in the United States msgid "Corvallis" msgstr "Corvallis" #. A city in California in the United States msgid "Costa Mesa" msgstr "Costa Mesa" #. A city in Texas in the United States msgid "Cotulla" msgstr "Cotulla" #. A city in Iowa in the United States msgid "Council Bluffs" msgstr "Council Bluffs" #. A city in Colorado in the United States msgid "Craig" msgstr "Craig" #. A city in Minnesota in the United States msgid "Crane Lake" msgstr "Jezero Crane" #. A city in California in the United States msgid "Crescent City" msgstr "Crescent City" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Creston" msgstr "Creston" #. A city in Florida in the United States msgid "Crestview" msgstr "Crestview" #. A city in Texas in the United States msgid "Crockett" msgstr "Crockett" #. A city in Minnesota in the United States msgid "Crookston" msgstr "Crookston" #. A city in Florida in the United States msgid "Cross City" msgstr "Cross City" #. A city in Tennessee in the United States msgid "Crossville" msgstr "Crossville" #. A city in Alabama in the United States msgid "Cullman" msgstr "Cullman" #. A city in Virginia in the United States msgid "Culpeper" msgstr "Culpeper" #. A city in Maryland in the United States msgid "Cumberland" msgstr "Cumberland" #. A city in North Carolina in the United States msgid "Currituck" msgstr "Currituck" #. A city in Oklahoma in the United States msgid "Cushing" msgstr "Cushing" #. A city in South Dakota in the United States msgid "Custer" msgstr "Custer" #. A city in Montana in the United States msgid "Cut Bank" msgstr "Cut Bank" #. A city in California in the United States msgid "Daggett" msgstr "Daggett" #. A city in Alabama in the United States msgid "Daleville" msgstr "Daleville" #. A city in Texas in the United States msgid "Dalhart" msgstr "Dalhart" #. A city in Texas in the United States msgid "Dallas" msgstr "Dallas" #. A city in Georgia in the United States msgid "Dalton" msgstr "Dalton" #. A city in California in the United States msgid "Daly City" msgstr "Daly City" #. A city in South Carolina in the United States msgid "Dalzell" msgstr "Dalzell" #. A city in Connecticut in the United States msgid "Danbury" msgstr "Danbury" #. A city in New York in the United States msgid "Dansville" msgstr "Dansville" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Danville" msgstr "Danville" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Danville" msgstr "Danville" #. A city in South Carolina in the United States msgid "Darlington" msgstr "Darlington" #. A city in Iowa in the United States msgid "Davenport" msgstr "Davenport" #. A city in Ohio in the United States msgid "Dayton" msgstr "Dayton" #. A city in Florida in the United States msgid "Daytona Beach" msgstr "Daytona Beach" #. A city in Arkansas in the United States msgid "De Queen" msgstr "De Queen" #. A city in Illinois in the United States msgid "DeKalb" msgstr "DeKalb" #. A city in Louisiana in the United States msgid "DeRidder" msgstr "DeRidder" #. A city in Alaska in the United States msgid "Deadhorse" msgstr "Deadhorse" #. A city in Alabama in the United States msgctxt "City in Alabama, United States" msgid "Decatur" msgstr "Decatur" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Decatur" msgstr "Decatur" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Decatur" msgstr "Decatur" #. A city in Iowa in the United States msgid "Decorah" msgstr "Decorah" #. A city in Washington in the United States msgid "Deer Park" msgstr "Deer Park" #. A city in Ohio in the United States msgid "Defiance" msgstr "Defiance" #. A city in Texas in the United States msgid "Del Rio" msgstr "Del Rio" #. A city in Utah in the United States msgid "Delta" msgstr "Delta" #. A city in Alaska in the United States msgid "Delta Junction" msgstr "Delta Junction" #. A city in New Mexico in the United States msgid "Deming" msgstr "Deming" #. A city in Iowa in the United States msgid "Denison" msgstr "Denison" #. A city in Texas in the United States msgid "Denton" msgstr "Denton" #. A city in Colorado in the United States msgid "Denver" msgstr "Denver" #. A city in Iowa in the United States msgid "Des Moines" msgstr "Des Moines" #. A city in Florida in the United States msgid "Destin" msgstr "Destin" #. A city in Michigan in the United States msgid "Detroit" msgstr "Detroit" #. A city in Minnesota in the United States msgid "Detroit Lakes" msgstr "Detroitska jezera" #. A city in North Dakota in the United States msgid "Devils Lake" msgstr "Jezero Devils" #. A city in North Dakota in the United States msgid "Dickinson" msgstr "Dickinson" #. A city in Alaska in the United States msgid "Dillingham" msgstr "Dillingham" #. A city in Montana in the United States msgid "Dillon" msgstr "Dillon" #. A city in Minnesota in the United States msgid "Dodge Center" msgstr "Dodge Center" #. A city in Kansas in the United States msgid "Dodge City" msgstr "Dodge City" #. A city in Alabama in the United States msgid "Dothan" msgstr "Dothan" #. A city in Arizona in the United States msgctxt "City in Arizona, United States" msgid "Douglas" msgstr "Douglas" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Douglas" msgstr "Douglas" #. A city in Wyoming in the United States msgctxt "City in Wyoming, United States" msgid "Douglas" msgstr "Douglas" #. A city in Delaware in the United States msgid "Dover" msgstr "Dover" #. A city in Pennsylvania in the United States msgid "Doylestown" msgstr "Doylestown" #. A city in Montana in the United States msgid "Drummond" msgstr "Drummond" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Dryden" msgstr "Dryden" #. A city in Pennsylvania in the United States msgid "Du Bois" msgstr "Du Bois" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Dublin" msgstr "Dublin" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Dublin" msgstr "Dublin" #. A city in Iowa in the United States msgid "Dubuque" msgstr "Dubuque" #. A city in Minnesota in the United States msgid "Duluth" msgstr "Duluth" #. A city in Texas in the United States msgid "Dumas" msgstr "Dumas" #. A city in Oklahoma in the United States msgid "Duncan" msgstr "Duncan" #. A city in New York in the United States msgid "Dunkirk" msgstr "Dunkirk" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Durango" msgstr "Durango" #. A city in Oklahoma in the United States msgid "Durant" msgstr "Durant" #. A city in North Carolina in the United States msgid "Durham" msgstr "Durham" #. A city in Tennessee in the United States msgid "Dyersburg" msgstr "Dyersburg" #. A city in Alaska in the United States msgctxt "City in Alaska, United States" msgid "Eagle" msgstr "Eagle" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Eagle" msgstr "Eagle" #. A city in Wisconsin in the United States msgid "Eagle River" msgstr "Rijeka Eagle" #. A city in New York in the United States msgid "East Hampton" msgstr "East Hampton" #. A city in Massachusetts in the United States msgid "East Milton" msgstr "Istočni Milton" #. A city in Maryland in the United States msgid "Easton" msgstr "Easton" #. A city in Washington in the United States msgid "Eastsound" msgstr "Eastsound" #. A city in Wisconsin in the United States msgid "Eau Claire" msgstr "Eau Claire" #. A city in North Carolina in the United States msgid "Edenton" msgstr "Edenton" #. A city in Texas in the United States msgid "Edinburg" msgstr "Edinburg" #. A city in California in the United States msgid "Edwards" msgstr "Edwards" #. A city in Illinois in the United States msgid "Effingham" msgstr "Effingham" #. A city in Alaska in the United States msgid "Egegik" msgstr "Egegik" #. A city in California in the United States msgid "El Centro" msgstr "El Centro" #. A city in Arkansas in the United States msgid "El Dorado" msgstr "El Dorado" #. A city in California in the United States msgid "El Monte" msgstr "El Monte" #. A city in Texas in the United States msgid "El Paso" msgstr "El Paso" #. A city in Oklahoma in the United States msgid "El Reno" msgstr "El Reno" #. A city in Colorado in the United States msgid "Elbert" msgstr "Elbert" #. A city in Alaska in the United States msgid "Elfin Cove" msgstr "Elfin Cove" #. A city in New Jersey in the United States msgid "Elizabeth" msgstr "Elizabeth" #. A city in North Carolina in the United States msgid "Elizabeth City" msgstr "Elizabeth City" #. A city in North Carolina in the United States msgid "Elizabethtown" msgstr "Elizabethtown" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Elkhart" msgstr "Elkhart" #. A city in Kansas in the United States msgctxt "City in Kansas, United States" msgid "Elkhart" msgstr "Elkhart" #. A city in West Virginia in the United States msgid "Elkins" msgstr "Elkins" #. A city in Nevada in the United States msgid "Elko" msgstr "Elko" #. A city in Washington in the United States msgid "Ellensburg" msgstr "Ellensburg" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Elmira" msgstr "Elmira" #. A city in Kansas in the United States msgid "Elwood" msgstr "Elwood" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Ely" msgstr "Ely" #. A city in Nevada in the United States msgctxt "City in Nevada, United States" msgid "Ely" msgstr "Ely" #. A city in Ohio in the United States msgid "Elyria" msgstr "Elyria" #. A city in California in the United States msgid "Emigrant Gap" msgstr "Emigrant Gap" #. A city in Alaska in the United States msgid "Emmonak" msgstr "Emmonak" #. A city in Kansas in the United States msgctxt "City in Kansas, United States" msgid "Emporia" msgstr "Emporia" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Emporia" msgstr "Emporia" #. A city in Oklahoma in the United States msgid "Enid" msgstr "Enid" #. A city in Washington in the United States msgid "Ephrata" msgstr "Ephrata" #. A city in Pennsylvania in the United States msgid "Erie" msgstr "Erie" #. A city in North Carolina in the United States msgid "Erwin" msgstr "Erwin" #. A city in Michigan in the United States msgid "Escanaba" msgstr "Escanaba" #. A city in California in the United States msgid "Escondido" msgstr "Escondido" #. A city in Iowa in the United States msgid "Estherville" msgstr "Estherville" #. A city in Oregon in the United States msgid "Eugene" msgstr "Eugene" #. A city in Nevada in the United States msgctxt "City in Nevada, United States" msgid "Eureka" msgstr "Eureka" #. A city in Alaska in the United States msgid "Eureka Roadhouse" msgstr "Eureka Roadhouse" #. A city in Wyoming in the United States msgid "Evanston" msgstr "Evanston" #. A city in Indiana in the United States msgid "Evansville" msgstr "Evansville" #. A city in Minnesota in the United States msgid "Eveleth" msgstr "Eveleth" #. A city in Washington in the United States msgid "Everett" msgstr "Everett" #. A city in Alabama in the United States msgid "Evergreen" msgstr "Evergreen" #. A city in Alaska in the United States msgid "Fairbanks" msgstr "Fairbanks" #. A city in Washington in the United States msgid "Fairchild" msgstr "Fairchild" #. A city in California in the United States msgctxt "City in California, United States" msgid "Fairfield" msgstr "Fairfield" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Fairfield" msgstr "Fairfield" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Fairfield" msgstr "Fairfield" #. A city in Minnesota in the United States msgid "Fairmont" msgstr "Fairmont" #. A city in South Dakota in the United States msgid "Faith" msgstr "Faith" #. A city in Texas in the United States msgid "Falfurrias" msgstr "Falfurrias" #. A city in Nevada in the United States msgid "Fallon" msgstr "Fallon" #. A city in Nebraska in the United States msgid "Falls City" msgstr "Falls City" #. A city in North Dakota in the United States msgid "Fargo" msgstr "Fargo" #. A city in Minnesota in the United States msgid "Faribault" msgstr "Faribault" #. A city in New York in the United States msgid "Farmingdale" msgstr "Farmingdale" #. A city in Missouri in the United States msgctxt "City in Missouri, United States" msgid "Farmington" msgstr "Farmington" #. A city in New Mexico in the United States msgctxt "City in New Mexico, United States" msgid "Farmington" msgstr "Farmington" #. A city in Virginia in the United States msgid "Farmville" msgstr "Farmville" #. A city in Arkansas in the United States msgctxt "City in Arkansas, United States" msgid "Fayetteville" msgstr "Fayetteville" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Fayetteville" msgstr "Fayetteville" #. A city in Minnesota in the United States msgid "Fergus Falls" msgstr "Fergus slapovi" #. A city in Ohio in the United States msgid "Findlay" msgstr "Findlay" #. A city in Massachusetts in the United States msgid "Fitchburg" msgstr "Fitchburg" #. A city in Arizona in the United States msgid "Flagstaff" msgstr "Flagstaff" #. A city in Michigan in the United States msgid "Flint" msgstr "Flint" #. A city in Arkansas in the United States msgid "Flippin" msgstr "Flippin" #. A city in Illinois in the United States msgid "Flora" msgstr "Flora" #. A city in South Carolina in the United States msgctxt "City in South Carolina, United States" msgid "Florence" msgstr "Florence" #. A city in Wisconsin in the United States msgid "Fond du Lac" msgstr "Fond du Lac" #. A city in California in the United States msgid "Fontana" msgstr "Fontana" #. A city in Georgia in the United States msgid "Fort Benning" msgstr "Fort Benning" #. A city in Colorado in the United States msgid "Fort Carson" msgstr "Fort Carson" #. A city in Colorado in the United States msgid "Fort Collins" msgstr "Fort Collins" #. A city in Iowa in the United States msgid "Fort Dodge" msgstr "Fort Dodge" #. A city in Florida in the United States msgid "Fort Lauderdale" msgstr "Fort Lauderdale" #. A city in Iowa in the United States msgid "Fort Madison" msgstr "Fort Madison" #. A city in Florida in the United States msgid "Fort Myers" msgstr "Fort Myers" #. A city in Alabama in the United States msgid "Fort Payne" msgstr "Fort Payne" #. A city in Florida in the United States msgid "Fort Pierce" msgstr "Fort Pierce" #. A city in Louisiana in the United States msgid "Fort Polk" msgstr "Fort Polk" #. A city in Arkansas in the United States msgctxt "City in Arkansas, United States" msgid "Fort Smith" msgstr "Fort Smith" #. A city in Texas in the United States msgid "Fort Stockton" msgstr "Fort Stockton" #. A city in Florida in the United States msgid "Fort Walton Beach" msgstr "Fort Walton Beach" #. A city in Indiana in the United States msgid "Fort Wayne" msgstr "Fort Wayne" #. A city in Texas in the United States msgid "Fort Worth" msgstr "Fort Worth" #. A city in Alaska in the United States msgid "Fort Yukon" msgstr "Fort Yukon" #. A city in Minnesota in the United States msgid "Fosston" msgstr "Fosston" #. A city in Kentucky in the United States msgctxt "City in Kentucky, United States" msgid "Frankfort" msgstr "Frankfort" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Frankfort" msgstr "Frankfort" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Franklin" msgstr "Franklin" #. A city in Pennsylvania in the United States msgctxt "City in Pennsylvania, United States" msgid "Franklin" msgstr "Franklin" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Franklin" msgstr "Franklin" #. A city in Maryland in the United States msgctxt "City in Maryland, United States" msgid "Frederick" msgstr "Frederick" #. A city in Oklahoma in the United States msgctxt "City in Oklahoma, United States" msgid "Frederick" msgstr "Frederick" #. A city in Texas in the United States msgid "Fredericksburg" msgstr "Fredericksburg" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Freeport" msgstr "Freeport" #. A city in California in the United States msgctxt "City in California, United States" msgid "Fremont" msgstr "Fremont" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Fremont" msgstr "Fremont" #. A city in Maine in the United States msgid "Frenchville" msgstr "Frenchville" #. A city in California in the United States msgid "Fresno" msgstr "Fresno" #. A city in Washington in the United States msgid "Friday Harbor" msgstr "Luka Friday" #. A city in Maine in the United States msgid "Fryeburg" msgstr "Fryeburg" #. A city in California in the United States msgid "Fullerton" msgstr "Fullerton" #. A city in New York in the United States msgid "Fulton" msgstr "Fulton" #. A city in Alabama in the United States msgid "Gadsden" msgstr "Gadsden" #. A city in Oklahoma in the United States msgid "Gage" msgstr "Gage" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Gainesville" msgstr "Gainesville" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Gainesville" msgstr "Gainesville" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Gainesville" msgstr "Gainesville" #. A city in Alaska in the United States msgid "Galena" msgstr "Galena" #. A city in Illinois in the United States msgid "Galesburg" msgstr "Galesburg" #. A city in Louisiana in the United States msgid "Galliano" msgstr "Galliano" #. A city in New Mexico in the United States msgid "Gallup" msgstr "Gallup" #. A city in Texas in the United States msgid "Galveston" msgstr "Galveston" #. A city in Alaska in the United States msgid "Gambell" msgstr "Gambell" #. A city in Kansas in the United States msgctxt "City in Kansas, United States" msgid "Garden City" msgstr "Garden City" #. A city in Louisiana in the United States msgctxt "City in Louisiana, United States" msgid "Garden City" msgstr "Garden City" #. A city in California in the United States msgid "Garden Grove" msgstr "Garden Grove" #. A city in Texas in the United States msgid "Garland" msgstr "Garland" #. A city in North Dakota in the United States msgid "Garrison" msgstr "Garrison" #. A city in Indiana in the United States msgid "Gary" msgstr "Gary" #. A city in North Carolina in the United States msgid "Gastonia" msgstr "Gastonia" #. A city in Texas in the United States msgid "Gatesville" msgstr "Gatesville" #. A city in Michigan in the United States msgid "Gaylord" msgstr "Gaylord" #. A city in Delaware in the United States msgctxt "City in Delaware, United States" msgid "Georgetown" msgstr "Georgetown" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Georgetown" msgstr "Georgetown" #. A city in Texas in the United States msgid "Giddings" msgstr "Giddings" #. A city in Arizona in the United States msgid "Gilbert" msgstr "Gilbert" #. A city in Wyoming in the United States msgid "Gillette" msgstr "Gillette" #. A city in Texas in the United States msgid "Gilmer" msgstr "Gilmer" #. A city in Kentucky in the United States msgctxt "City in Kentucky, United States" msgid "Glasgow" msgstr "Glasgow" #. A city in Montana in the United States msgctxt "City in Montana, United States" msgid "Glasgow" msgstr "Glasgow" #. A city in Minnesota in the United States msgid "Glencoe" msgstr "Glencoe" #. A city in Arizona in the United States msgctxt "City in Arizona, United States" msgid "Glendale" msgstr "Glendale" #. A city in California in the United States msgctxt "City in California, United States" msgid "Glendale" msgstr "Glendale" #. A city in Montana in the United States msgid "Glendive" msgstr "Glendive" #. A city in New York in the United States msgid "Glens Falls" msgstr "Glens slapovi" #. A city in Minnesota in the United States msgid "Glenwood" msgstr "Glenwood" #. A city in North Carolina in the United States msgid "Goldsboro" msgstr "Goldsboro" #. A city in Kansas in the United States msgid "Goodland" msgstr "Goodland" #. A city in Arizona in the United States msgid "Goodyear" msgstr "Goodyear" #. A city in Louisiana in the United States msgid "Goosport" msgstr "Goosport" #. A city in New Hampshire in the United States msgid "Gorham" msgstr "Gorham" #. A city in Indiana in the United States msgid "Goshen" msgstr "Goshen" #. A city in Illinois in the United States msgid "Grafton" msgstr "Grafton" #. A city in Texas in the United States msgid "Graham" msgstr "Graham" #. A city in Texas in the United States msgid "Granbury" msgstr "Granbury" #. A city in Arizona in the United States msgid "Grand Canyon" msgstr "Grand Canyon" #. A city in North Dakota in the United States msgid "Grand Forks" msgstr "Grand Forks" #. A city in Nebraska in the United States msgid "Grand Island" msgstr "Grand Island" #. A city in Louisiana in the United States msgid "Grand Isle" msgstr "Grand Isle" #. A city in Colorado in the United States msgid "Grand Junction" msgstr "Grand Junction" #. A city in Minnesota in the United States msgid "Grand Marais" msgstr "Grand Marais" #. A city in Texas in the United States msgid "Grand Prairie" msgstr "Grand Prairie" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Grand Rapids" msgstr "Grand Rapids" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Grand Rapids" msgstr "Grand Rapids" #. A city in Minnesota in the United States msgid "Granite Falls" msgstr "Slapovi Granite" #. A city in New Mexico in the United States msgid "Grants" msgstr "Grants" #. A city in Michigan in the United States msgid "Grayling" msgstr "Grayling" #. A city in Kansas in the United States msgid "Great Bend" msgstr "Great Bend" #. A city in Montana in the United States msgid "Great Falls" msgstr "Veliki slapovi" #. A city in Wisconsin in the United States msgid "Green Bay" msgstr "Green Bay" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Greensboro" msgstr "Greensboro" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Greensboro" msgstr "Greensboro" #. A city in Maine in the United States msgctxt "City in Maine, United States" msgid "Greenville" msgstr "Greenville" #. A city in Mississippi in the United States msgctxt "City in Mississippi, United States" msgid "Greenville" msgstr "Greenville" #. A city in South Carolina in the United States msgctxt "City in South Carolina, United States" msgid "Greenville" msgstr "Greenville" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Greenville" msgstr "Greenville" #. A city in Mississippi in the United States msgctxt "City in Mississippi, United States" msgid "Greenwood" msgstr "Greenwood" #. A city in South Carolina in the United States msgctxt "City in South Carolina, United States" msgid "Greenwood" msgstr "Greenwood" #. A city in South Carolina in the United States msgid "Greer" msgstr "Greer" #. A city in Wyoming in the United States msgid "Greybull" msgstr "Greybull" #. A city in Connecticut in the United States msgid "Groton" msgstr "Groton" #. A city in Oklahoma in the United States msgid "Grove" msgstr "Grove" #. A city in Mississippi in the United States msgid "Gulfport" msgstr "Gulfport" #. A city in Alaska in the United States msgid "Gulkana" msgstr "Gulkana" #. A city in Colorado in the United States msgid "Gunnison" msgstr "Gunnison" #. A city in Alaska in the United States msgid "Gustavus" msgstr "Gustavus" #. A city in Oklahoma in the United States msgid "Guthrie" msgstr "Guthrie" #. A city in Oklahoma in the United States msgid "Guymon" msgstr "Guymon" #. A city in Maryland in the United States msgid "Hagerstown" msgstr "Hagerstown" #. A city in Idaho in the United States msgid "Hailey" msgstr "Hailey" #. A city in Alaska in the United States msgid "Haines" msgstr "Haines" #. A city in Alabama in the United States msgid "Haleyville" msgstr "Haleyville" #. A city in Minnesota in the United States msgid "Hallock" msgstr "Hallock" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Hamilton" msgstr "Hamilton" #. A city in Louisiana in the United States msgid "Hammond" msgstr "Hammond" #. A city in Virginia in the United States msgid "Hampton" msgstr "Hampton" #. A city in Michigan in the United States msgid "Hancock" msgstr "Hancock" #. A city in California in the United States msgctxt "City in California, United States" msgid "Hanford" msgstr "Hanford" #. A city in Washington in the United States msgctxt "City in Washington, United States" msgid "Hanford" msgstr "Hanford" #. A city in Utah in the United States msgid "Hanksville" msgstr "Hanksville" #. A city in Michigan in the United States msgid "Harbor Springs" msgstr "Harbor Springs" #. A city in Iowa in the United States msgid "Harlan" msgstr "Harlan" #. A city in Texas in the United States msgid "Harlingen" msgstr "Harlingen" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Harrisburg" msgstr "Harrisburg" #. A city in Pennsylvania in the United States msgctxt "City in Pennsylvania, United States" msgid "Harrisburg" msgstr "Harrisburg" #. A city in Arkansas in the United States msgid "Harrison" msgstr "Harrison" #. A city in Connecticut in the United States msgid "Hartford" msgstr "Hartford" #. A city in Nebraska in the United States msgid "Hastings" msgstr "Hastings" #. A city in North Carolina in the United States msgid "Hatteras" msgstr "Hatteras" #. A city in Mississippi in the United States msgid "Hattiesburg" msgstr "Hattiesburg" #. A city in North Carolina in the United States msgid "Havelock" msgstr "Havelock" #. A city in Montana in the United States msgid "Havre" msgstr "Havre" #. A city in California in the United States msgid "Hawthorne" msgstr "Hawthorne" #. A city in Colorado in the United States msgid "Hayden" msgstr "Hayden" #. A city in Kansas in the United States msgid "Hays" msgstr "Hays" #. A city in California in the United States msgctxt "City in California, United States" msgid "Hayward" msgstr "Hayward" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Hayward" msgstr "Hayward" #. A city in Alaska in the United States msgid "Healy" msgstr "Healy" #. A city in Texas in the United States msgid "Hearne" msgstr "Hearne" #. A city in Texas in the United States msgid "Hebbronville" msgstr "Hebbronville" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Hebron" msgstr "Hebron" #. A city in Montana in the United States msgid "Helena" msgstr "Helena" #. A city in Kentucky in the United States msgctxt "City in Kentucky, United States" msgid "Henderson" msgstr "Henderson" #. A city in Nevada in the United States msgctxt "City in Nevada, United States" msgid "Henderson" msgstr "Henderson" #. A city in Oregon in the United States msgid "Hermiston" msgstr "Hermiston" #. A city in North Dakota in the United States msgid "Hettinger" msgstr "Hettinger" #. A city in Florida in the United States msgid "Hialeah" msgstr "Hialeah" #. A city in Minnesota in the United States msgid "Hibbing" msgstr "Hibbing" #. A city in North Carolina in the United States msgid "Hickory" msgstr "Hickory" #. A city in Louisiana in the United States msgid "Hicks" msgstr "Hicks" #. A city in Kansas in the United States msgid "Hill City" msgstr "Hill City" #. A city in Texas in the United States msgid "Hillsboro" msgstr "Hillsboro" #. A city in Michigan in the United States msgid "Hillsdale" msgstr "Hillsdale" #. A city in Virginia in the United States msgid "Hillsville" msgstr "Hillsville" #. A city in Hawaii in the United States msgid "Hilo" msgstr "Hilo" #. A city in South Carolina in the United States msgid "Hilton Head Island" msgstr "Hilton Head Island" #. A city in Georgia in the United States msgid "Hinesville" msgstr "Hinesville" #. A city in Oklahoma in the United States msgctxt "City in Oklahoma, United States" msgid "Hobart" msgstr "Hobart" #. A city in New Mexico in the United States msgid "Hobbs" msgstr "Hobbs" #. A city in North Carolina in the United States msgid "Hoffman" msgstr "Hoffman" #. A city in Nebraska in the United States msgid "Holdrege" msgstr "Holdrege" #. A city in Michigan in the United States msgid "Holland" msgstr "Holland" #. A city in Florida in the United States msgid "Hollywood" msgstr "Hollywood" #. A city in Alaska in the United States msgid "Homer" msgstr "Homer" #. A city in Florida in the United States msgid "Homestead" msgstr "Homestead" #. A city in Texas in the United States msgid "Hondo" msgstr "Hondo" #. A city in Hawaii in the United States msgid "Honolulu" msgstr "Honolulu" #. A city in Alaska in the United States msgid "Hoonah" msgstr "Hoonah" #. A city in Alaska in the United States msgid "Hooper Bay" msgstr "Hooper Bay" #. A city in Washington in the United States msgid "Hoquiam" msgstr "Hoquiam" #. A city in Arkansas in the United States msgctxt "City in Arkansas, United States" msgid "Hot Springs" msgstr "Hot Springs" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Hot Springs" msgstr "Hot Springs" #. A city in Michigan in the United States msgid "Houghton Lake" msgstr "Jezero Houghton" #. A city in Maine in the United States msgid "Houlton" msgstr "Houlton" #. A city in Louisiana in the United States msgid "Houma" msgstr "Houma" #. A city in Texas in the United States msgid "Houston" msgstr "Houston" #. A city in Michigan in the United States msgid "Howell" msgstr "Howell" #. A city in West Virginia in the United States msgid "Huntington" msgstr "Huntington" #. A city in California in the United States msgid "Huntington Beach" msgstr "Huntington Beach" #. A city in Alabama in the United States msgctxt "City in Alabama, United States" msgid "Huntsville" msgstr "Huntsville" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Huntsville" msgstr "Huntsville" #. A city in South Dakota in the United States msgid "Huron" msgstr "Huron" #. A city in Alaska in the United States msgid "Huslia" msgstr "Huslia" #. A city in Kansas in the United States msgctxt "City in Kansas, United States" msgid "Hutchinson" msgstr "Hutchinson" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Hutchinson" msgstr "Hutchinson" #. A city in Massachusetts in the United States msgid "Hyannis" msgstr "Hyannis" #. A city in Alaska in the United States msgid "Hydaburg" msgstr "Hydaburg" #. A city in Oklahoma in the United States msgid "Idabel" msgstr "Idabel" #. A city in Idaho in the United States msgid "Idaho Falls" msgstr "Idaho slapovi" #. A city in California in the United States msgctxt "City in California, United States" msgid "Imperial" msgstr "Imperial" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Imperial" msgstr "Imperial" #. A city in California in the United States msgid "Imperial Beach" msgstr "Imperial Beach" #. A city in Missouri in the United States msgid "Independence" msgstr "Independence" #. A city in Pennsylvania in the United States msgctxt "City in Pennsylvania, United States" msgid "Indiana" msgstr "Indiana" #. A city in Indiana in the United States msgid "Indianapolis" msgstr "Indianapolis" #. A city in Pennsylvania in the United States msgid "Indiantown" msgstr "Indiantown" #. A city in California in the United States msgid "Inglewood" msgstr "Inglewood" #. A city in Minnesota in the United States msgid "International Falls" msgstr "International slapovi" #. A city in Minnesota in the United States msgid "Inver Grove Heights" msgstr "Inver Grove Heights" #. A city in California in the United States msgid "Inyokern" msgstr "Inyokern" #. A city in Iowa in the United States msgid "Iowa City" msgstr "Iowa City" #. A city in Michigan in the United States msgid "Iron Mountain" msgstr "Iron Mountain" #. A city in Michigan in the United States msgid "Ironwood" msgstr "Ironwood" #. A city in California in the United States msgid "Irvine" msgstr "Irvine" #. A city in Texas in the United States msgid "Irving" msgstr "Irving" #. A city in New York in the United States msgid "Islip" msgstr "Islip" #. A city in New York in the United States msgid "Ithaca" msgstr "Ithaca" #. A city in Kentucky in the United States msgctxt "City in Kentucky, United States" msgid "Jackson" msgstr "Jackson" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Jackson" msgstr "Jackson" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Jackson" msgstr "Jackson" #. A city in Mississippi in the United States msgctxt "City in Mississippi, United States" msgid "Jackson" msgstr "Jackson" #. A city in Tennessee in the United States msgctxt "City in Tennessee, United States" msgid "Jackson" msgstr "Jackson" #. A city in Wyoming in the United States msgctxt "City in Wyoming, United States" msgid "Jackson" msgstr "Jackson" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Jacksonville" msgstr "Jacksonville" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Jacksonville" msgstr "Jacksonville" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Jacksonville" msgstr "Jacksonville" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Jacksonville" msgstr "Jacksonville" #. A city in New Hampshire in the United States msgid "Jaffrey" msgstr "Jaffrey" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Jamestown" msgstr "Jamestown" #. A city in North Dakota in the United States msgctxt "City in North Dakota, United States" msgid "Jamestown" msgstr "Jamestown" #. A city in Wisconsin in the United States msgid "Janesville" msgstr "Janesville" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Jasper" msgstr "Jasper" #. A city in North Carolina in the United States msgid "Jefferson" msgstr "Jefferson" #. A city in Missouri in the United States msgid "Jefferson City" msgstr "Jefferson City" #. A city in Idaho in the United States msgid "Jerome" msgstr "Jerome" #. A city in New Jersey in the United States msgid "Jersey City" msgstr "Jersey City" #. A city in Pennsylvania in the United States msgid "Johnstown" msgstr "Johnstown" #. A city in Illinois in the United States msgid "Joliet" msgstr "Joliet" #. A city in Arkansas in the United States msgid "Jonesboro" msgstr "Jonesboro" #. A city in Missouri in the United States msgid "Joplin" msgstr "Joplin" #. A city in Montana in the United States msgctxt "City in Montana, United States" msgid "Jordan" msgstr "Jordan" #. A city in New Jersey in the United States msgid "Juliustown" msgstr "Juliustown" #. A city in Texas in the United States msgid "Junction" msgstr "Junction" #. A city in Kansas in the United States msgid "Junction City" msgstr "Junction City" #. A city in Alaska in the United States msgctxt "City in Alaska, United States" msgid "Juneau" msgstr "Juneau" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Juneau" msgstr "Juneau" #. A city in Hawaii in the United States msgid "Kahului" msgstr "Kahului" #. A city in Hawaii in the United States msgid "Kailua" msgstr "Kailua" #. A city in Missouri in the United States msgid "Kaiser" msgstr "Kaiser" #. A city in Alaska in the United States msgid "Kake" msgstr "Kake" #. A city in Alaska in the United States msgid "Kaktovik" msgstr "Kaktovik" #. A city in Michigan in the United States msgid "Kalamazoo" msgstr "Kalamazoo" #. A city in Montana in the United States msgid "Kalispell" msgstr "Kalispell" #. A city in Alaska in the United States msgid "Kaltag" msgstr "Kaltag" #. A city in Illinois in the United States msgid "Kankakee" msgstr "Kankakee" #. A city in Kansas in the United States msgctxt "City in Kansas, United States" msgid "Kansas City" msgstr "Kansas City" #. A city in Missouri in the United States msgctxt "City in Missouri, United States" msgid "Kansas City" msgstr "Kansas City" #. A city in Hawaii in the United States msgid "Kaumalapau" msgstr "Kaumalapau" #. A city in Hawaii in the United States msgid "Kaunakakai" msgstr "Kaunakakai" #. A city in Nebraska in the United States msgid "Kearney" msgstr "Kearney" #. A city in New Hampshire in the United States msgid "Keene" msgstr "Keene" #. A city in Hawaii in the United States msgid "Kekaha" msgstr "Kekaha" #. A city in Washington in the United States msgid "Kelso" msgstr "Kelso" #. A city in Alaska in the United States msgid "Kenai" msgstr "Kenai" #. A city in North Carolina in the United States msgid "Kenansville" msgstr "Kenansville" #. A city in Wisconsin in the United States msgid "Kenosha" msgstr "Kenosha" #. A city in Iowa in the United States msgid "Keokuk" msgstr "Keokuk" #. A city in Texas in the United States msgid "Kerrville" msgstr "Kerrville" #. A city in Alaska in the United States msgid "Ketchikan" msgstr "Ketchikan" #. A city in Florida in the United States msgid "Key West" msgstr "Key West" #. A city in North Carolina in the United States msgid "Kill Devil Hills" msgstr "Kill Devil Hills" #. A city in Texas in the United States msgid "Killeen" msgstr "Killeen" #. A city in Nebraska in the United States msgid "Kimball" msgstr "Kimball" #. A city in Alaska in the United States msgid "King Salmon" msgstr "King Salmon" #. A city in Arizona in the United States msgid "Kingman" msgstr "Kingman" #. A city in Tennessee in the United States msgid "Kingsport" msgstr "Kingsport" #. A city in Texas in the United States msgid "Kingsville" msgstr "Kingsville" #. A city in Michigan in the United States msgid "Kinross" msgstr "Kinross" #. A city in North Carolina in the United States msgid "Kinston" msgstr "Kinston" #. A city in Alaska in the United States msgid "Kipnuk" msgstr "Kipnuk" #. A city in Missouri in the United States msgid "Kirksville" msgstr "Kirksville" #. A city in Alaska in the United States msgid "Kivalina" msgstr "Kivalina" #. A city in Oregon in the United States msgid "Klamath Falls" msgstr "Klamath slapovi" #. A city in Alaska in the United States msgid "Klawock" msgstr "Klawock" #. A city in Missouri in the United States msgid "Knob Noster" msgstr "Knob Noster" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Knoxville" msgstr "Knoxville" #. A city in Tennessee in the United States msgctxt "City in Tennessee, United States" msgid "Knoxville" msgstr "Knoxville" #. A city in Alaska in the United States msgid "Kodiak" msgstr "Kodiak" #. A city in Indiana in the United States msgid "Kokomo" msgstr "Kokomo" #. A city in Alaska in the United States msgid "Kotzebue" msgstr "Kotzebue" #. A city in Alaska in the United States msgid "Koyuk" msgstr "Koyuk" #. A city in Alaska in the United States msgid "Kustatan" msgstr "Kustatan" #. A city in Wisconsin in the United States msgid "La Crosse" msgstr "La Crosse" #. A city in Oregon in the United States msgid "La Grande" msgstr "La Grande" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "La Grange" msgstr "La Grange" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "La Grange" msgstr "La Grange" #. A city in Colorado in the United States msgid "La Junta" msgstr "La Junta" #. A city in California in the United States msgid "La Verne" msgstr "La Verne" #. A city in Colorado in the United States msgid "La Veta" msgstr "La Veta" #. A city in Illinois in the United States msgid "Lacon" msgstr "Lacon" #. A city in New Hampshire in the United States msgid "Laconia" msgstr "Laconia" #. A city in Wisconsin in the United States msgid "Ladysmith" msgstr "Ladysmith" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Lafayette" msgstr "Lafayette" #. A city in Louisiana in the United States msgctxt "City in Louisiana, United States" msgid "Lafayette" msgstr "Lafayette" #. A city in Hawaii in the United States msgid "Lahaina" msgstr "Lahaina" #. A city in Louisiana in the United States msgid "Lake Charles" msgstr "Lake Charles" #. A city in Alaska in the United States msgid "Lake Minchumina" msgstr "Lake Minchumina" #. A city in Florida in the United States msgid "Lakeland" msgstr "Lakeland" #. A city in Oregon in the United States msgid "Lakeview" msgstr "Lakeview" #. A city in Colorado in the United States msgid "Lakewood" msgstr "Lakewood" #. A city in Colorado in the United States msgid "Lamar" msgstr "Lamar" #. A city in Michigan in the United States msgid "Lambertville" msgstr "Lambertville" #. A city in Iowa in the United States msgid "Lamoni" msgstr "Lamoni" #. A city in California in the United States msgctxt "City in California, United States" msgid "Lancaster" msgstr "Lancaster" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Lancaster" msgstr "Lancaster" #. A city in Pennsylvania in the United States msgctxt "City in Pennsylvania, United States" msgid "Lancaster" msgstr "Lancaster" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Lancaster" msgstr "Lancaster" #. A city in Wisconsin in the United States msgid "Land O' Lakes" msgstr "Land O' Lakes" #. A city in Wyoming in the United States msgid "Lander" msgstr "Lander" #. A city in Michigan in the United States msgid "Lansing" msgstr "Lansing" #. A city in Wyoming in the United States msgid "Laramie" msgstr "Laramie" #. A city in Texas in the United States msgid "Laredo" msgstr "Laredo" #. A city in New Mexico in the United States msgid "Las Cruces" msgstr "Las Cruces" #. A city in Nevada in the United States msgctxt "City in Nevada, United States" msgid "Las Vegas" msgstr "Las Vegas" #. A city in New Mexico in the United States msgctxt "City in New Mexico, United States" msgid "Las Vegas" msgstr "Las Vegas" #. A city in Pennsylvania in the United States msgid "Latrobe" msgstr "Latrobe" #. A city in Kansas in the United States msgctxt "City in Kansas, United States" msgid "Lawrence" msgstr "Lawrence" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Lawrence" msgstr "Lawrence" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Lawrenceville" msgstr "Lawrenceville" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Lawrenceville" msgstr "Lawrenceville" #. A city in Oklahoma in the United States msgid "Lawton" msgstr "Lawton" #. A city in Iowa in the United States msgid "Le Mars" msgstr "Le Mars" #. A city in Colorado in the United States msgid "Leadville" msgstr "Leadville" #. A city in New Hampshire in the United States msgctxt "City in New Hampshire, United States" msgid "Lebanon" msgstr "Lebanon" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Leesburg" msgstr "Leesburg" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Leesburg" msgstr "Leesburg" #. A city in Louisiana in the United States msgid "Leeville" msgstr "Leeville" #. A city in California in the United States msgid "Lemoore" msgstr "Lemoore" #. A city in West Virginia in the United States msgid "Lewisburg" msgstr "Lewisburg" #. A city in Idaho in the United States msgid "Lewiston" msgstr "Lewiston" #. A city in Montana in the United States msgid "Lewistown" msgstr "Lewistown" #. A city in Kentucky in the United States msgctxt "City in Kentucky, United States" msgid "Lexington" msgstr "Lexington" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Lexington" msgstr "Lexington" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Lexington" msgstr "Lexington" #. A city in Kansas in the United States msgid "Liberal" msgstr "Liberal" #. A city in Hawaii in the United States msgid "Lihue" msgstr "Lihue" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Lima" msgstr "Lima" #. A city in Alaska in the United States msgid "Lime Village" msgstr "Lime Village" #. A city in Colorado in the United States msgid "Limon" msgstr "Limon" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Lincoln" msgstr "Lincoln" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Lincoln" msgstr "Lincoln" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Litchfield" msgstr "Litchfield" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Litchfield" msgstr "Litchfield" #. A city in Minnesota in the United States msgid "Little Falls" msgstr "Slapovi Little" #. A city in Arkansas in the United States msgid "Little Rock" msgstr "Little Rock" #. A city in California in the United States msgid "Livermore" msgstr "Livermore" #. A city in Montana in the United States msgid "Livingston" msgstr "Livingston" #. A city in Michigan in the United States msgid "Livonia" msgstr "Livonia" #. A city in Texas in the United States msgid "Llano" msgstr "Llano" #. A city in Utah in the United States msgid "Logan" msgstr "Logan" #. A city in California in the United States msgid "Lompoc" msgstr "Lompoc" #. A city in Kentucky in the United States msgctxt "City in Kentucky, United States" msgid "London" msgstr "London" #. A city in Wisconsin in the United States msgid "Lone Rock" msgstr "Lone Rock" #. A city in California in the United States msgid "Long Beach" msgstr "Long Beach" #. A city in Texas in the United States msgid "Longview" msgstr "Longview" #. A city in Minnesota in the United States msgid "Longville" msgstr "Longville" #. A city in California in the United States msgid "Los Alamitos" msgstr "Los Alamitos" #. A city in New Mexico in the United States msgid "Los Alamos" msgstr "Los Alamos" #. A city in California in the United States msgid "Los Angeles" msgstr "Los Angeles" #. A city in Virginia in the United States msgid "Louisa" msgstr "Louisa" #. A city in North Carolina in the United States msgid "Louisburg" msgstr "Louisburg" #. A city in Kentucky in the United States msgid "Louisville" msgstr "Louisville" #. A city in Nevada in the United States msgid "Lovelock" msgstr "Lovelock" #. A city in Idaho in the United States msgctxt "City in Idaho, United States" msgid "Lowell" msgstr "Lowell" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Lowell" msgstr "Lowell" #. A city in Texas in the United States msgid "Lubbock" msgstr "Lubbock" #. A city in Michigan in the United States msgid "Ludington" msgstr "Ludington" #. A city in Texas in the United States msgid "Lufkin" msgstr "Lufkin" #. A city in North Carolina in the United States msgid "Lumberton" msgstr "Lumberton" #. A city in Minnesota in the United States msgid "Luverne" msgstr "Luverne" #. A city in Virginia in the United States msgid "Lynchburg" msgstr "Lynchburg" #. A city in Michigan in the United States msgid "Mackinac Island" msgstr "Mackinac Island" #. A city in Illinois in the United States msgid "Macomb" msgstr "Macomb" #. A city in Georgia in the United States msgid "Macon" msgstr "Macon" #. A city in California in the United States msgid "Madera" msgstr "Madera" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Madison" msgstr "Madison" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Madison" msgstr "Madison" #. A city in Idaho in the United States msgctxt "City in Idaho, United States" msgid "Malta" msgstr "Malta" #. A city in Virginia in the United States msgid "Manassas" msgstr "Manassas" #. A city in New Hampshire in the United States msgctxt "City in New Hampshire, United States" msgid "Manchester" msgstr "Manchester" #. A city in Kansas in the United States msgid "Manhattan" msgstr "Manhattan" #. A city in Michigan in the United States msgid "Manistee" msgstr "Manistee" #. A city in Michigan in the United States msgid "Manistique" msgstr "Manistique" #. A city in Wisconsin in the United States msgid "Manitowoc" msgstr "Manitowoc" #. A city in Minnesota in the United States msgid "Mankato" msgstr "Mankato" #. A city in Alaska in the United States msgid "Manley Hot Springs" msgstr "Manley Hot Springs" #. A city in Ohio in the United States msgid "Mansfield" msgstr "Mansfield" #. A city in North Carolina in the United States msgid "Manteo" msgstr "Manteo" #. A city in Minnesota in the United States msgid "Maple Lake" msgstr "Jezero Maple" #. A city in Florida in the United States msgid "Marathon" msgstr "Marathon" #. A city in Texas in the United States msgid "Marfa" msgstr "Marfa" #. A city in Florida in the United States msgid "Marianna" msgstr "Marianna" #. A city in Georgia in the United States msgid "Marietta" msgstr "Marietta" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Marion" msgstr "Marion" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Marion" msgstr "Marion" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Marion" msgstr "Marion" #. A city in Michigan in the United States msgid "Marquette" msgstr "Marquette" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Marshall" msgstr "Marshall" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Marshall" msgstr "Marshall" #. A city in Iowa in the United States msgid "Marshalltown" msgstr "Marshalltown" #. A city in Wisconsin in the United States msgid "Marshfield" msgstr "Marshfield" #. A city in West Virginia in the United States msgid "Martinsburg" msgstr "Martinsburg" #. A city in Virginia in the United States msgid "Martinsville" msgstr "Martinsville" #. A city in California in the United States msgctxt "City in California, United States" msgid "Marysville" msgstr "Marysville" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Marysville" msgstr "Marysville" #. A city in Michigan in the United States msgid "Mason" msgstr "Mason" #. A city in Iowa in the United States msgid "Mason City" msgstr "Mason City" #. A city in New York in the United States msgid "Massena" msgstr "Massena" #. A city in Illinois in the United States msgid "Mattoon" msgstr "Mattoon" #. A city in North Carolina in the United States msgid "Maxton" msgstr "Maxton" #. A city in Florida in the United States msgid "Mayport" msgstr "Mayport" #. A city in Oklahoma in the United States msgid "McAlester" msgstr "McAlester" #. A city in Texas in the United States msgid "McAllen" msgstr "McAllen" #. A city in Idaho in the United States msgid "McCall" msgstr "McCall" #. A city in Alaska in the United States msgid "McCarthy" msgstr "McCarthy" #. A city in Mississippi in the United States msgid "McComb" msgstr "McComb" #. A city in Nebraska in the United States msgid "McCook" msgstr "McCook" #. A city in Alaska in the United States msgid "McGrath" msgstr "McGrath" #. A city in Minnesota in the United States msgid "McGregor" msgstr "McGregor" #. A city in Alaska in the United States msgid "McKinley Park" msgstr "McKinley Park" #. A city in Texas in the United States msgid "McKinney" msgstr "McKinney" #. A city in Oregon in the United States msgid "McMinnville" msgstr "McMinnville" #. A city in Oregon in the United States msgid "Meacham" msgstr "Meacham" #. A city in Pennsylvania in the United States msgid "Meadville" msgstr "Meadville" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Medford" msgstr "Medford" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Medford" msgstr "Medford" #. A city in Kansas in the United States msgid "Medicine Lodge" msgstr "Medicine Lodge" #. A city in Colorado in the United States msgid "Meeker" msgstr "Meeker" #. A city in Alaska in the United States msgid "Mekoryuk" msgstr "Mekoryuk" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Melbourne" msgstr "Melbourne" #. A city in Virginia in the United States msgid "Melfa" msgstr "Melfa" #. A city in Tennessee in the United States msgid "Memphis" msgstr "Memphis" #. A city in Arkansas in the United States msgid "Mena" msgstr "Mena" #. A city in Michigan in the United States msgid "Menominee" msgstr "Menominee" #. A city in Wisconsin in the United States msgid "Menomonie" msgstr "Menomonie" #. A city in California in the United States msgid "Merced" msgstr "Merced" #. A city in Nevada in the United States msgid "Mercury" msgstr "Mercury" #. A city in Connecticut in the United States msgid "Meriden" msgstr "Meriden" #. A city in Mississippi in the United States msgid "Meridian" msgstr "Meridian" #. A city in Wisconsin in the United States msgid "Merrill" msgstr "Merrill" #. A city in Arizona in the United States msgid "Mesa" msgstr "Mesa" #. A city in Texas in the United States msgid "Mesquite" msgstr "Mesquite" #. A city in Alaska in the United States msgid "Metlakatla" msgstr "Metlakatla" #. A city in Illinois in the United States msgid "Metropolis" msgstr "Metropolis" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Miami" msgstr "Miami" #. A city in Kentucky in the United States msgid "Middlesboro" msgstr "Middlesboro" #. A city in Texas in the United States msgid "Midland" msgstr "Midland" #. A city in Texas in the United States msgid "Midlothian" msgstr "Midlothian" #. A city in Montana in the United States msgid "Miles City" msgstr "Miles City" #. A city in Utah in the United States msgid "Milford" msgstr "Milford" #. A city in Georgia in the United States msgid "Milledgeville" msgstr "Milledgeville" #. A city in Tennessee in the United States msgid "Millington" msgstr "Millington" #. A city in Maine in the United States msgid "Millinocket" msgstr "Millinocket" #. A city in New Jersey in the United States msgid "Millville" msgstr "Millville" #. A city in Florida in the United States msgid "Milton" msgstr "Milton" #. A city in Wisconsin in the United States msgid "Milwaukee" msgstr "Milwaukee" #. A city in Texas in the United States msgid "Mineral Wells" msgstr "Mineral Wells" #. A city in Minnesota in the United States msgid "Minneapolis" msgstr "Minneapolis" #. A city in North Dakota in the United States msgid "Minot" msgstr "Minot" #. A city in Montana in the United States msgid "Missoula" msgstr "Missoula" #. A city in South Dakota in the United States msgid "Mitchell" msgstr "Mitchell" #. A city in Utah in the United States msgid "Moab" msgstr "Moab" #. A city in Alabama in the United States msgid "Mobile" msgstr "Mobile" #. A city in South Dakota in the United States msgid "Mobridge" msgstr "Mobridge" #. A city in California in the United States msgid "Modesto" msgstr "Modesto" #. A city in Illinois in the United States msgid "Moline" msgstr "Moline" #. A city in Louisiana in the United States msgctxt "City in Louisiana, United States" msgid "Monroe" msgstr "Monroe" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Monroe" msgstr "Monroe" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Monroe" msgstr "Monroe" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Monroe" msgstr "Monroe" #. A city in California in the United States msgid "Montague" msgstr "Montague" #. A city in New York in the United States msgid "Montauk" msgstr "Montauk" #. A city in California in the United States msgid "Monterey" msgstr "Monterey" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Montevideo" msgstr "Montevideo" #. A city in Alabama in the United States msgctxt "City in Alabama, United States" msgid "Montgomery" msgstr "Montgomery" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Montgomery" msgstr "Montgomery" #. A city in Arkansas in the United States msgctxt "City in Arkansas, United States" msgid "Monticello" msgstr "Monticello" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Monticello" msgstr "Monticello" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Monticello" msgstr "Monticello" #. A city in Colorado in the United States msgid "Montrose" msgstr "Montrose" #. A city in Minnesota in the United States msgid "Moorhead" msgstr "Moorhead" #. A city in Minnesota in the United States msgid "Moose Lake" msgstr "Jezero Moose" #. A city in Minnesota in the United States msgid "Mora" msgstr "Mora" #. A city in West Virginia in the United States msgid "Morgantown" msgstr "Morgantown" #. A city in New Mexico in the United States msgid "Moriarty" msgstr "Moriarty" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Morris" msgstr "Morris" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Morris" msgstr "Morris" #. A city in New Jersey in the United States msgid "Morristown" msgstr "Morristown" #. A city in Vermont in the United States msgid "Morrisville" msgstr "Morrisville" #. A city in Idaho in the United States msgctxt "City in Idaho, United States" msgid "Moscow" msgstr "Moscow" #. A city in Washington in the United States msgid "Moses Lake" msgstr "Jezero Moses" #. A city in Wisconsin in the United States msgid "Mosinee" msgstr "Mosinee" #. A city in Georgia in the United States msgid "Moultrie" msgstr "Moultrie" #. A city in North Carolina in the United States msgid "Mount Airy" msgstr "Mount Airy" #. A city in Illinois in the United States msgid "Mount Carmel" msgstr "Mount Carmel" #. A city in New Jersey in the United States msgid "Mount Holly" msgstr "Mount Holly" #. A city in Arkansas in the United States msgid "Mount Ida" msgstr "Mount Ida" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Mount Pleasant" msgstr "Mount Pleasant" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Mount Pleasant" msgstr "Mount Pleasant" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Mount Pleasant" msgstr "Mount Pleasant" #. A city in Pennsylvania in the United States msgid "Mount Pocono" msgstr "Mount Pocono" #. A city in California in the United States msgid "Mount Shasta" msgstr "Mount Shasta" #. A city in Illinois in the United States msgid "Mount Vernon" msgstr "Mount Vernon" #. A city in California in the United States msgid "Mount Wilson" msgstr "Mount Wilson" #. A city in Arkansas in the United States msgctxt "City in Arkansas, United States" msgid "Mountain Home" msgstr "Mountain Home" #. A city in Idaho in the United States msgctxt "City in Idaho, United States" msgid "Mountain Home" msgstr "Mountain Home" #. A city in California in the United States msgid "Mountain View" msgstr "Mountain View" #. A city in Kentucky in the United States msgid "Muldraugh" msgstr "Muldraugh" #. A city in Idaho in the United States msgid "Mullan" msgstr "Mullan" #. A city in Indiana in the United States msgid "Muncie" msgstr "Muncie" #. A city in Michigan in the United States msgid "Munising" msgstr "Munising" #. A city in Iowa in the United States msgid "Muscatine" msgstr "Muscatine" #. A city in Alabama in the United States msgid "Muscle Shoals" msgstr "Muscle Shoals" #. A city in Michigan in the United States msgid "Muskegon" msgstr "Muskegon" #. A city in Oklahoma in the United States msgid "Muskogee" msgstr "Muskogee" #. A city in South Carolina in the United States msgid "Myrtle Beach" msgstr "Myrtle Beach" #. A city in Alaska in the United States msgid "Nabesna" msgstr "Nabesna" #. A city in Texas in the United States msgid "Nacogdoches" msgstr "Nacogdoches" #. A city in Massachusetts in the United States msgid "Nantucket" msgstr "Nantucket" #. A city in California in the United States msgid "Napa" msgstr "Napa" #. A city in Illinois in the United States msgid "Naperville" msgstr "Naperville" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Naples" msgstr "Naples" #. A city in New Hampshire in the United States msgid "Nashua" msgstr "Nashua" #. A city in Tennessee in the United States msgid "Nashville" msgstr "Nashville" #. A city in Mississippi in the United States msgid "Natchez" msgstr "Natchez" #. A city in Louisiana in the United States msgid "Natchitoches" msgstr "Natchitoches" #. A city in Nebraska in the United States msgid "Nebraska City" msgstr "Nebraska City" #. A city in California in the United States msgid "Needles" msgstr "Needles" #. A city in Alaska in the United States msgid "Nenana" msgstr "Nenana" #. A city in Massachusetts in the United States msgid "New Bedford" msgstr "New Bedford" #. A city in North Carolina in the United States msgid "New Bern" msgstr "New Bern" #. A city in Texas in the United States msgid "New Braunfels" msgstr "New Braunfels" #. A city in Pennsylvania in the United States msgid "New Castle" msgstr "New Castle" #. A city in Connecticut in the United States msgid "New Haven" msgstr "New Haven" #. A city in Louisiana in the United States msgid "New Iberia" msgstr "New Iberia" #. A city in Louisiana in the United States msgid "New Orleans" msgstr "New Orleans" #. A city in Ohio in the United States msgid "New Philadelphia" msgstr "New Philadelphia" #. A city in Wisconsin in the United States msgid "New Richmond" msgstr "New Richmond" #. A city in Florida in the United States msgid "New Smyrna Beach" msgstr "New Smyrna Beach" #. A city in Minnesota in the United States msgid "New Ulm" msgstr "New Ulm" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "New York" msgstr "New York" #. A city in New Jersey in the United States msgctxt "City in New Jersey, United States" msgid "Newark" msgstr "Newark" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Newark" msgstr "Newark" #. A city in Michigan in the United States msgid "Newberry" msgstr "Newberry" #. A city in New York in the United States msgid "Newburgh" msgstr "Newburgh" #. A city in Alaska in the United States msgid "Newhalen" msgstr "Newhalen" #. A city in California in the United States msgid "Newhall" msgstr "Newhall" #. A city in Georgia in the United States msgid "Newnan" msgstr "Newnan" #. A city in Arkansas in the United States msgctxt "City in Arkansas, United States" msgid "Newport" msgstr "Newport" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Newport" msgstr "Newport" #. A city in Rhode Island in the United States msgctxt "City in Rhode Island, United States" msgid "Newport" msgstr "Newport" #. A city in Virginia in the United States msgid "Newport News" msgstr "Newport News" #. A city in Kansas in the United States msgid "Newton" msgstr "Newton" #. A city in New York in the United States msgid "Niagara Falls" msgstr "Niagarini slapovi" #. A city in Alaska in the United States msgid "Noatak" msgstr "Noatak" #. A city in Arizona in the United States msgid "Nogales" msgstr "Nogales" #. A city in Alaska in the United States msgid "Nome" msgstr "Nome" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Norfolk" msgstr "Norfolk" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Norfolk" msgstr "Norfolk" #. A city in Oklahoma in the United States msgid "Norman" msgstr "Norman" #. A city in Massachusetts in the United States msgid "North Adams" msgstr "North Adams" #. A city in Oregon in the United States msgid "North Bend" msgstr "North Bend" #. A city in Nevada in the United States msgid "North Las Vegas" msgstr "Sjeverni Las Vegas" #. A city in South Carolina in the United States msgid "North Myrtle Beach" msgstr "North Myrtle Beach" #. A city in Nebraska in the United States msgid "North Platte" msgstr "North Platte" #. A city in North Carolina in the United States msgid "North Wilkesboro" msgstr "North Wilkesboro" #. A city in Alaska in the United States msgid "Northway" msgstr "Northway" #. A city in California in the United States msgid "Norwalk" msgstr "Norwalk" #. A city in Massachusetts in the United States msgid "Norwood" msgstr "Norwood" #. A city in Alaska in the United States msgid "Nuiqsut" msgstr "Nuiqsut" #. A city in Nebraska in the United States msgid "O'Neill" msgstr "O'Neill" #. A city in Washington in the United States msgid "Oak Harbor" msgstr "Oak Harbor" #. A city in North Carolina in the United States msgid "Oak Island" msgstr "Oak otok" #. A city in Tennessee in the United States msgid "Oak Ridge" msgstr "Oak Ridge" #. A city in Louisiana in the United States msgid "Oakdale" msgstr "Oakdale" #. A city in California in the United States msgid "Oakland" msgstr "Oakland" #. A city in Florida in the United States msgid "Ocala" msgstr "Ocala" #. A city in Maryland in the United States msgid "Ocean City" msgstr "Ocean City" #. A city in California in the United States msgid "Oceanside" msgstr "Oceanside" #. A city in Texas in the United States msgid "Odessa" msgstr "Odessa" #. A city in Iowa in the United States msgid "Oelwein" msgstr "Oelwein" #. A city in Nebraska in the United States msgid "Ogallala" msgstr "Ogallala" #. A city in Utah in the United States msgid "Ogden" msgstr "Ogden" #. A city in Florida in the United States msgid "Okeechobee" msgstr "Okeechobee" #. A city in Oklahoma in the United States msgid "Oklahoma City" msgstr "Oklahoma City" #. A city in Oklahoma in the United States msgid "Okmulgee" msgstr "Okmulgee" #. A city in Kansas in the United States msgid "Olathe" msgstr "Olathe" #. A city in Mississippi in the United States msgid "Olive Branch" msgstr "Olive Branch" #. A city in Minnesota in the United States msgid "Olivia" msgstr "Olivia" #. A city in Illinois in the United States msgid "Olney" msgstr "Olney" #. A city in Washington in the United States msgid "Olympia" msgstr "Olympia" #. A city in Nebraska in the United States msgid "Omaha" msgstr "Omaha" #. A city in Washington in the United States msgid "Omak" msgstr "Omak" #. A city in California in the United States msgctxt "City in California, United States" msgid "Ontario" msgstr "Ontario" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Ontario" msgstr "Ontario" #. A city in California in the United States msgctxt "City in California, United States" msgid "Orange" msgstr "Orange" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Orange" msgstr "Orange" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Orange" msgstr "Orange" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Orange" msgstr "Orange" #. A city in Iowa in the United States msgid "Orange City" msgstr "Orange City" #. A city in South Carolina in the United States msgid "Orangeburg" msgstr "Orangeburg" #. A city in Nebraska in the United States msgid "Ord" msgstr "Ord" #. A city in Florida in the United States msgid "Orlando" msgstr "Orlando" #. A city in Florida in the United States msgid "Ormond Beach" msgstr "Ormond Beach" #. A city in California in the United States msgid "Oroville" msgstr "Oroville" #. A city in Minnesota in the United States msgid "Orr" msgstr "Orr" #. A city in Minnesota in the United States msgid "Ortonville" msgstr "Ortonville" #. A city in Wisconsin in the United States msgid "Osceola" msgstr "Osceola" #. A city in Michigan in the United States msgid "Oscoda" msgstr "Oscoda" #. A city in Wisconsin in the United States msgid "Oshkosh" msgstr "Oshkosh" #. A city in Iowa in the United States msgid "Oskaloosa" msgstr "Oskaloosa" #. A city in Iowa in the United States msgid "Ottumwa" msgstr "Ottumwa" #. A city in Kansas in the United States msgid "Overland Park" msgstr "Overland Park" #. A city in Minnesota in the United States msgid "Owatonna" msgstr "Owatonna" #. A city in Kentucky in the United States msgid "Owensboro" msgstr "Owensboro" #. A city in Michigan in the United States msgid "Owosso" msgstr "Owosso" #. A city in Connecticut in the United States msgctxt "City in Connecticut, United States" msgid "Oxford" msgstr "Oxford" #. A city in Mississippi in the United States msgctxt "City in Mississippi, United States" msgid "Oxford" msgstr "Oxford" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Oxford" msgstr "Oxford" #. A city in California in the United States msgid "Oxnard" msgstr "Oxnard" #. A city in Alabama in the United States msgid "Ozark" msgstr "Ozark" #. A city in Kentucky in the United States msgid "Paducah" msgstr "Paducah" #. A city in Arizona in the United States msgid "Page" msgstr "Page" #. A city in Colorado in the United States msgid "Pagosa Springs" msgstr "Pagosa Springs" #. A city in Texas in the United States msgid "Palacios" msgstr "Palacios" #. A city in Texas in the United States msgid "Palestine" msgstr "Palestine" #. A city in California in the United States msgid "Palm Springs" msgstr "Palm Springs" #. A city in California in the United States msgid "Palmdale" msgstr "Palmdale" #. A city in Alaska in the United States msgid "Palmer" msgstr "Palmer" #. A city in California in the United States msgid "Palo Alto" msgstr "Palo Alto" #. A city in Texas in the United States msgid "Pampa" msgstr "Pampa" #. A city in Florida in the United States msgid "Panama City" msgstr "Panama City" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Paris" msgstr "Paris" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Paris" msgstr "Paris" #. A city in Minnesota in the United States msgid "Park Rapids" msgstr "Park Rapids" #. A city in West Virginia in the United States msgid "Parkersburg" msgstr "Parkersburg" #. A city in Kansas in the United States msgid "Parsons" msgstr "Parsons" #. A city in California in the United States msgctxt "City in California, United States" msgid "Pasadena" msgstr "Pasadena" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Pasadena" msgstr "Pasadena" #. A city in Mississippi in the United States msgid "Pascagoula" msgstr "Pascagoula" #. A city in Washington in the United States msgid "Pasco" msgstr "Pasco" #. A city in California in the United States msgid "Paso Robles" msgstr "Paso Robles" #. A city in New Jersey in the United States msgid "Paterson" msgstr "Paterson" #. A city in Louisiana in the United States msgid "Patterson" msgstr "Patterson" #. A city in Maryland in the United States msgid "Patuxent" msgstr "Patuxent" #. A city in Oklahoma in the United States msgid "Pauls Valley" msgstr "Pauls Valley" #. A city in Rhode Island in the United States msgid "Pawtucket" msgstr "Pawtucket" #. A city in Alaska in the United States msgid "Paxson" msgstr "Paxson" #. A city in Minnesota in the United States msgid "Paynesville" msgstr "Paynesville" #. A city in Louisiana in the United States msgid "Peason" msgstr "Peason" #. A city in Texas in the United States msgid "Pecos" msgstr "Pecos" #. A city in Iowa in the United States msgid "Pella" msgstr "Pella" #. A city in Michigan in the United States msgid "Pellston" msgstr "Pellston" #. A city in Florida in the United States msgid "Pembroke Pines" msgstr "Pembroke Pines" #. A city in Oregon in the United States msgid "Pendleton" msgstr "Pendleton" #. A city in New York in the United States msgid "Penn Yan" msgstr "Penn Yan" #. A city in Florida in the United States msgid "Pensacola" msgstr "Pensacola" #. A city in Arizona in the United States msgctxt "City in Arizona, United States" msgid "Peoria" msgstr "Peoria" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Peoria" msgstr "Peoria" #. A city in Florida in the United States msgid "Perry" msgstr "Perry" #. A city in Texas in the United States msgid "Perryton" msgstr "Perryton" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Peru" msgstr "Peru" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Peru" msgstr "Peru" #. A city in Alaska in the United States msgctxt "City in Alaska, United States" msgid "Petersburg" msgstr "Petersburg" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Petersburg" msgstr "Petersburg" #. A city in West Virginia in the United States msgctxt "City in West Virginia, United States" msgid "Petersburg" msgstr "Petersburg" #. A city in Pennsylvania in the United States msgid "Philadelphia" msgstr "Philadelphia" #. A city in South Dakota in the United States msgid "Philip" msgstr "Philip" #. A city in Wisconsin in the United States msgid "Phillips" msgstr "Phillips" #. A city in Arizona in the United States msgid "Phoenix" msgstr "Phoenix" #. A city in South Dakota in the United States msgid "Pierre" msgstr "Pierre" #. A city in Arkansas in the United States msgid "Pine Bluff" msgstr "Pine Bluff" #. A city in South Dakota in the United States msgid "Pine Ridge" msgstr "Pine Ridge" #. A city in Minnesota in the United States msgid "Pine River" msgstr "Pine River" #. A city in Texas in the United States msgid "Pine Springs" msgstr "Pine Springs" #. A city in Wyoming in the United States msgid "Pinedale" msgstr "Pinedale" #. A city in North Carolina in the United States msgid "Pinehurst" msgstr "Pinehurst" #. A city in Minnesota in the United States msgid "Pipestone" msgstr "Pipestone" #. A city in Pennsylvania in the United States msgid "Pittsburgh" msgstr "Pittsburgh" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Pittsfield" msgstr "Pittsfield" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Pittsfield" msgstr "Pittsfield" #. A city in Oregon in the United States msgid "Placer" msgstr "Placer" #. A city in Texas in the United States msgid "Plainview" msgstr "Plainview" #. A city in Texas in the United States msgid "Plano" msgstr "Plano" #. A city in Alaska in the United States msgid "Platinum" msgstr "Platinum" #. A city in New York in the United States msgid "Plattsburgh" msgstr "Plattsburgh" #. A city in Nebraska in the United States msgid "Plattsmouth" msgstr "Plattsmouth" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Plymouth" msgstr "Plymouth" #. A city in New Hampshire in the United States msgctxt "City in New Hampshire, United States" msgid "Plymouth" msgstr "Plymouth" #. A city in Idaho in the United States msgid "Pocatello" msgstr "Pocatello" #. A city in Virginia in the United States msgid "Pohick" msgstr "Pohick" #. A city in Alaska in the United States msgid "Point Hope" msgstr "Point Hope" #. A city in Alaska in the United States msgid "Point Lay" msgstr "Point Lay" #. A city in West Virginia in the United States msgid "Point Pleasant" msgstr "Point Pleasant" #. A city in California in the United States msgid "Pomona" msgstr "Pomona" #. A city in Florida in the United States msgid "Pompano Beach" msgstr "Pompano Beach" #. A city in Oklahoma in the United States msgid "Ponca City" msgstr "Ponca City" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Pontiac" msgstr "Pontiac" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Pontiac" msgstr "Pontiac" #. A city in Missouri in the United States msgid "Poplar Bluff" msgstr "Poplar Bluff" #. A city in Alaska in the United States msgid "Port Alexander" msgstr "Port Alexander" #. A city in Alaska in the United States msgid "Port Alsworth" msgstr "Port Alsworth" #. A city in Washington in the United States msgid "Port Angeles" msgstr "Port Angeles" #. A city in Texas in the United States msgid "Port Aransas" msgstr "Port Aransas" #. A city in Alaska in the United States msgid "Port Heiden" msgstr "Port Heiden" #. A city in Michigan in the United States msgid "Port Hope" msgstr "Port Hope" #. A city in Texas in the United States msgid "Port Isabel" msgstr "Port Isabel" #. A city in Texas in the United States msgid "Port Lavaca" msgstr "Port Lavaca" #. A city in California in the United States msgid "Porterville" msgstr "Porterville" #. A city in Maine in the United States msgctxt "City in Maine, United States" msgid "Portland" msgstr "Portland" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Portland" msgstr "Portland" #. A city in New Hampshire in the United States msgctxt "City in New Hampshire, United States" msgid "Portsmouth" msgstr "Portsmouth" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Portsmouth" msgstr "Portsmouth" #. A city in Oklahoma in the United States msgid "Poteau" msgstr "Poteau" #. A city in Pennsylvania in the United States msgid "Pottstown" msgstr "Pottstown" #. A city in New York in the United States msgid "Poughkeepsie" msgstr "Poughkeepsie" #. A city in Wisconsin in the United States msgid "Prairie du Chien" msgstr "Prairie du Chien" #. A city in Kansas in the United States msgid "Pratt" msgstr "Pratt" #. A city in Arizona in the United States msgid "Prescott" msgstr "Prescott" #. A city in Maine in the United States msgid "Presque Isle" msgstr "Presque Isle" #. A city in Minnesota in the United States msgid "Preston" msgstr "Preston" #. A city in Utah in the United States msgid "Price" msgstr "Price" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Princeton" msgstr "Princeton" #. A city in Rhode Island in the United States msgid "Providence" msgstr "Providence" #. A city in Massachusetts in the United States msgid "Provincetown" msgstr "Provincetown" #. A city in Utah in the United States msgid "Provo" msgstr "Provo" #. A city in Colorado in the United States msgid "Pueblo" msgstr "Pueblo" #. A city in Florida in the United States msgid "Punta Gorda" msgstr "Punta Gorda" #. A city in Pennsylvania in the United States msgid "Quakertown" msgstr "Quakertown" #. A city in Virginia in the United States msgid "Quantico" msgstr "Quantico" #. A city in Washington in the United States msgid "Quillayute" msgstr "Quillayute" #. A city in Illinois in the United States msgid "Quincy" msgstr "Quincy" #. A city in Wisconsin in the United States msgid "Racine" msgstr "Racine" #. A city in North Carolina in the United States msgid "Raleigh" msgstr "Raleigh" #. A city in California in the United States msgid "Ramona" msgstr "Ramona" #. A city in California in the United States msgid "Rancho Cucamonga" msgstr "Rancho Cucamonga" #. A city in Illinois in the United States msgid "Rantoul" msgstr "Rantoul" #. A city in South Dakota in the United States msgid "Rapid City" msgstr "Rapid City" #. A city in New Mexico in the United States msgid "Raton" msgstr "Raton" #. A city in Wyoming in the United States msgid "Rawlins" msgstr "Rawlins" #. A city in Pennsylvania in the United States msgid "Reading" msgstr "Reading" #. A city in California in the United States msgid "Red Bluff" msgstr "Red Bluff" #. A city in Iowa in the United States msgid "Red Oak" msgstr "Red Oak" #. A city in Minnesota in the United States msgid "Red Wing" msgstr "Red Wing" #. A city in California in the United States msgid "Redding" msgstr "Redding" #. A city in Oregon in the United States msgid "Redmond" msgstr "Redmond" #. A city in Minnesota in the United States msgid "Redwood Falls" msgstr "Redwood slapovi" #. A city in Nevada in the United States msgid "Reno" msgstr "Reno" #. A city in Washington in the United States msgid "Renton" msgstr "Renton" #. A city in Idaho in the United States msgid "Rexburg" msgstr "Rexburg" #. A city in Wisconsin in the United States msgid "Rhinelander" msgstr "Rhinelander" #. A city in Wisconsin in the United States msgid "Rice Lake" msgstr "Rice jezero" #. A city in Virginia in the United States msgctxt "City in Virginia, United States" msgid "Richmond" msgstr "Richmond" #. A city in Colorado in the United States msgid "Rifle" msgstr "Rifle" #. A city in California in the United States msgid "Riverside" msgstr "Riverside" #. A city in Wyoming in the United States msgid "Riverton" msgstr "Riverton" #. A city in Virginia in the United States msgid "Roanoke" msgstr "Roanoke" #. A city in North Carolina in the United States msgid "Roanoke Rapids" msgstr "Roanoke Rapids" #. A city in Illinois in the United States msgid "Robinson" msgstr "Robinson" #. A city in Illinois in the United States msgid "Rochelle" msgstr "Rochelle" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Rochester" msgstr "Rochester" #. A city in New Hampshire in the United States msgctxt "City in New Hampshire, United States" msgid "Rochester" msgstr "Rochester" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Rochester" msgstr "Rochester" #. A city in South Carolina in the United States msgid "Rock Hill" msgstr "Rock Hill" #. A city in Wyoming in the United States msgid "Rock Springs" msgstr "Rock Springs" #. A city in Illinois in the United States msgid "Rockford" msgstr "Rockford" #. A city in Maine in the United States msgid "Rockland" msgstr "Rockland" #. A city in Texas in the United States msgid "Rockport" msgstr "Rockport" #. A city in Texas in the United States msgid "Rocksprings" msgstr "Rocksprings" #. A city in North Carolina in the United States msgid "Rocky Mount" msgstr "Rocky Mount" #. A city in North Carolina in the United States msgid "Roe" msgstr "Roe" #. A city in Arkansas in the United States msgid "Rogers" msgstr "Rogers" #. A city in Michigan in the United States msgid "Rogers City" msgstr "Rogers City" #. A city in Georgia in the United States msgctxt "City in Georgia, United States" msgid "Rome" msgstr "Rome" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Rome" msgstr "Rome" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Rome" msgstr "Rome" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Roseau" msgstr "Roseau" #. A city in Oregon in the United States msgid "Roseburg" msgstr "Roseburg" #. A city in New Mexico in the United States msgid "Roswell" msgstr "Roswell" #. A city in North Carolina in the United States msgid "Roxboro" msgstr "Roxboro" #. A city in New Mexico in the United States msgid "Ruidoso" msgstr "Ruidoso" #. A city in Minnesota in the United States msgid "Rush City" msgstr "Rush City" #. A city in Kansas in the United States msgid "Russell" msgstr "Russell" #. A city in Arkansas in the United States msgid "Russellville" msgstr "Russellville" #. A city in Louisiana in the United States msgid "Ruston" msgstr "Ruston" #. A city in Vermont in the United States msgid "Rutland" msgstr "Rutland" #. A city in California in the United States msgid "Sacramento" msgstr "Sacramento" #. A city in Arizona in the United States msgid "Safford" msgstr "Safford" #. A city in Michigan in the United States msgid "Saginaw" msgstr "Saginaw" #. A city in Colorado in the United States msgid "Saguache" msgstr "Saguache" #. A city in Minnesota in the United States msgid "Saint Cloud" msgstr "Saint Cloud" #. A city in Alaska in the United States msgctxt "City in Alaska, United States" msgid "Saint George" msgstr "Saint George" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Saint James" msgstr "Saint James" #. A city in Minnesota in the United States msgctxt "City in Minnesota, United States" msgid "Saint James" msgstr "Saint James" #. A city in Arizona in the United States msgid "Saint Johns" msgstr "Saint Johns" #. A city in Vermont in the United States msgid "Saint Johnsbury" msgstr "Saint Johnsbury" #. A city in Alaska in the United States msgid "Saint Marys" msgstr "Saint Marys" #. A city in Maryland in the United States msgid "Saint Marys City" msgstr "Saint Marys City" #. A city in Alaska in the United States msgid "Saint Paul" msgstr "Saint Paul" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Salem" msgstr "Salem" #. A city in Oregon in the United States msgctxt "City in Oregon, United States" msgid "Salem" msgstr "Salem" #. A city in Colorado in the United States msgid "Salida" msgstr "Salida" #. A city in Kansas in the United States msgid "Salina" msgstr "Salina" #. A city in California in the United States msgid "Salinas" msgstr "Salinas" #. A city in Maryland in the United States msgctxt "City in Maryland, United States" msgid "Salisbury" msgstr "Salisbury" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Salisbury" msgstr "Salisbury" #. A city in Oklahoma in the United States msgid "Sallisaw" msgstr "Sallisaw" #. A city in Idaho in the United States msgid "Salmon" msgstr "Salmon" #. A city in Utah in the United States msgid "Salt Lake City" msgstr "Salt Lake City" #. A city in Texas in the United States msgid "San Angelo" msgstr "San Angelo" #. A city in Texas in the United States msgid "San Antonio" msgstr "San Antonio" #. A city in California in the United States msgid "San Bernardino" msgstr "San Bernardino" #. A city in California in the United States msgid "San Carlos" msgstr "San Carlos" #. A city in California in the United States msgid "San Diego" msgstr "San Diego" #. A city in California in the United States msgid "San Francisco" msgstr "San Francisco" #. A city in California in the United States msgid "San Jose" msgstr "San Jose" #. A city in California in the United States msgid "San Luis Obispo" msgstr "San Luis Obispo" #. A city in Texas in the United States msgid "San Marcos" msgstr "San Marcos" #. A city in Alaska in the United States msgid "Sand Point" msgstr "Sand Point" #. A city in California in the United States msgid "Sandberg" msgstr "Sandberg" #. A city in Idaho in the United States msgid "Sandpoint" msgstr "Sandpoint" #. A city in Massachusetts in the United States msgid "Sandwich" msgstr "Sandwich" #. A city in Maine in the United States msgctxt "City in Maine, United States" msgid "Sanford" msgstr "Sanford" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Sanford" msgstr "Sanford" #. A city in California in the United States msgid "Santa Ana" msgstr "Santa Ana" #. A city in California in the United States msgid "Santa Barbara" msgstr "Santa Barbara" #. A city in California in the United States msgctxt "City in California, United States" msgid "Santa Clara" msgstr "Santa Clara" #. A city in Utah in the United States msgctxt "City in Utah, United States" msgid "Santa Clara" msgstr "Santa Clara" #. A city in New Mexico in the United States msgid "Santa Fe" msgstr "Santa Fe" #. A city in California in the United States msgctxt "City in California, United States" msgid "Santa Maria" msgstr "Santa Maria" #. A city in California in the United States msgid "Santa Monica" msgstr "Santa Monica" #. A city in California in the United States msgid "Santa Rosa" msgstr "Santa Rosa" #. A city in New York in the United States msgid "Saranac Lake" msgstr "Jezero Saranac" #. A city in Florida in the United States msgid "Sarasota" msgstr "Sarasota" #. A city in Michigan in the United States msgid "Sault Ste. Marie" msgstr "Sault Ste. Marie" #. A city in Illinois in the United States msgid "Savanna" msgstr "Savanna" #. A city in Georgia in the United States msgid "Savannah" msgstr "Savannah" #. A city in Alaska in the United States msgid "Savoonga" msgstr "Savoonga" #. A city in Alaska in the United States msgid "Scammon Bay" msgstr "Scammon Bay" #. A city in Oregon in the United States msgid "Scappoose" msgstr "Scappoose" #. A city in Nebraska in the United States msgid "Scottsbluff" msgstr "Scottsbluff" #. A city in Arizona in the United States msgid "Scottsdale" msgstr "Scottsdale" #. A city in Arkansas in the United States msgid "Searcy" msgstr "Searcy" #. A city in Washington in the United States msgid "Seattle" msgstr "Seattle" #. A city in Missouri in the United States msgid "Sedalia" msgstr "Sedalia" #. A city in Alaska in the United States msgid "Selawik" msgstr "Selawik" #. A city in Alaska in the United States msgid "Seldovia" msgstr "Seldovia" #. A city in Pennsylvania in the United States msgid "Selinsgrove" msgstr "Selinsgrove" #. A city in Oklahoma in the United States msgctxt "City in Oklahoma, United States" msgid "Seminole" msgstr "Seminole" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Seminole" msgstr "Seminole" #. A city in Alaska in the United States msgid "Seward" msgstr "Seward" #. A city in Oklahoma in the United States msgid "Shawnee" msgstr "Shawnee" #. A city in Wisconsin in the United States msgid "Sheboygan" msgstr "Sheboygan" #. A city in North Carolina in the United States msgid "Shelby" msgstr "Shelby" #. A city in Indiana in the United States msgid "Shelbyville" msgstr "Shelbyville" #. A city in Iowa in the United States msgid "Sheldon" msgstr "Sheldon" #. A city in Washington in the United States msgid "Shelton" msgstr "Shelton" #. A city in Iowa in the United States msgid "Shenandoah" msgstr "Shenandoah" #. A city in Wyoming in the United States msgid "Sheridan" msgstr "Sheridan" #. A city in Texas in the United States msgid "Sherman" msgstr "Sherman" #. A city in New York in the United States msgid "Shirley" msgstr "Shirley" #. A city in Alaska in the United States msgid "Shishmaref" msgstr "Shishmaref" #. A city in Arizona in the United States msgid "Show Low" msgstr "Show Low" #. A city in Louisiana in the United States msgid "Shreveport" msgstr "Shreveport" #. A city in Montana in the United States msgctxt "City in Montana, United States" msgid "Sidney" msgstr "Sidney" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "Sidney" msgstr "Sidney" #. A city in Arizona in the United States msgid "Sierra Vista" msgstr "Sierra Vista" #. A city in Arkansas in the United States msgid "Siloam Springs" msgstr "Siloam Springs" #. A city in Minnesota in the United States msgid "Silver Bay" msgstr "Silver Bay" #. A city in New Mexico in the United States msgid "Silver City" msgstr "Silver City" #. A city in California in the United States msgid "Simi Valley" msgstr "Simi Valley" #. A city in Iowa in the United States msgid "Sioux City" msgstr "Sioux City" #. A city in South Dakota in the United States msgid "Sioux Falls" msgstr "Sioux slapovi" #. A city in Wisconsin in the United States msgid "Siren" msgstr "Siren" #. A city in South Dakota in the United States msgid "Sisseton" msgstr "Sisseton" #. A city in Alaska in the United States msgid "Sitka" msgstr "Sitka" #. A city in Alaska in the United States msgid "Skagway" msgstr "Skagway" #. A city in Minnesota in the United States msgid "Slayton" msgstr "Slayton" #. A city in Alaska in the United States msgid "Sleetmute" msgstr "Sleetmute" #. A city in Louisiana in the United States msgid "Slidell" msgstr "Slidell" #. A city in North Carolina in the United States msgid "Smithfield" msgstr "Smithfield" #. A city in Tennessee in the United States msgid "Smyrna" msgstr "Smyrna" #. A city in Texas in the United States msgid "Snyder" msgstr "Snyder" #. A city in Idaho in the United States msgid "Soda Springs" msgstr "Soda Springs" #. A city in Alaska in the United States msgid "Soldotna" msgstr "Soldotna" #. A city in Kentucky in the United States msgid "Somerset" msgstr "Somerset" #. A city in New Jersey in the United States msgid "Somerville" msgstr "Somerville" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Sonora" msgstr "Sonora" #. A city in Indiana in the United States msgid "South Bend" msgstr "Južni Bend" #. A city in Michigan in the United States msgid "South Haven" msgstr "South Haven" #. A city in Virginia in the United States msgid "South Hill" msgstr "South Hill" #. A city in California in the United States msgid "South Lake Tahoe" msgstr "South Lake Tahoe" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Sparta" msgstr "Sparta" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Sparta" msgstr "Sparta" #. A city in Iowa in the United States msgid "Spencer" msgstr "Spencer" #. A city in Texas in the United States msgid "Spofford" msgstr "Spofford" #. A city in Washington in the United States msgid "Spokane" msgstr "Spokane" #. A city in Arkansas in the United States msgid "Springdale" msgstr "Springdale" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Springfield" msgstr "Springfield" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Springfield" msgstr "Springfield" #. A city in Illinois in the United States msgctxt "City in Illinois, United States" msgid "Springfield" msgstr "Springfield" #. A city in Massachusetts in the United States msgctxt "City in Massachusetts, United States" msgid "Springfield" msgstr "Springfield" #. A city in Missouri in the United States msgctxt "City in Missouri, United States" msgid "Springfield" msgstr "Springfield" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Springfield" msgstr "Springfield" #. A city in Vermont in the United States msgctxt "City in Vermont, United States" msgid "Springfield" msgstr "Springfield" #. A city in Missouri in the United States msgid "St. Louis" msgstr "St. Louis" #. A city in Virginia in the United States msgid "Stafford" msgstr "Stafford" #. A city in Connecticut in the United States msgid "Stamford" msgstr "Stamford" #. A city in Washington in the United States msgid "Stampede" msgstr "Stampede" #. A city in Idaho in the United States msgctxt "City in Idaho, United States" msgid "Stanley" msgstr "Stanley" #. A city in Minnesota in the United States msgid "Stanton" msgstr "Stanton" #. A city in Minnesota in the United States msgid "Staples" msgstr "Staples" #. A city in Pennsylvania in the United States msgid "State College" msgstr "State College" #. A city in Georgia in the United States msgid "Statesboro" msgstr "Statesboro" #. A city in North Carolina in the United States msgid "Statesville" msgstr "Statesville" #. A city in Virginia in the United States msgid "Staunton" msgstr "Staunton" #. A city in Colorado in the United States msgid "Steamboat Springs" msgstr "Steamboat Springs" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Stephenville" msgstr "Stephenville" #. A city in Illinois in the United States msgid "Sterling" msgstr "Sterling" #. A city in Michigan in the United States msgid "Sterling Heights" msgstr "Sterling Heights" #. A city in Wisconsin in the United States msgid "Stevens Point" msgstr "Stevens Point" #. A city in Oklahoma in the United States msgid "Stillwater" msgstr "Stillwater" #. A city in California in the United States msgctxt "City in California, United States" msgid "Stockton" msgstr "Stockton" #. A city in Iowa in the United States msgid "Storm Lake" msgstr "Jezero Storm" #. A city in Florida in the United States msgid "Stuart" msgstr "Stuart" #. A city in Wisconsin in the United States msgid "Sturgeon Bay" msgstr "Sturgeon Bay" #. A city in Michigan in the United States msgid "Sturgis" msgstr "Sturgis" #. A city in Arkansas in the United States msgctxt "City in Arkansas, United States" msgid "Stuttgart" msgstr "Stuttgart" #. A city in Virginia in the United States msgid "Suffolk" msgstr "Suffolk" #. A city in Texas in the United States msgid "Sulphur Springs" msgstr "Sulphur Springs" #. A city in California in the United States msgid "Sunnyvale" msgstr "Sunnyvale" #. A city in Wisconsin in the United States msgid "Superior" msgstr "Superior" #. A city in New Jersey in the United States msgid "Sussex" msgstr "Sussex" #. A city in Alaska in the United States msgctxt "City in Alaska, United States" msgid "Sutton" msgstr "Sutton" #. A city in West Virginia in the United States msgctxt "City in West Virginia, United States" msgid "Sutton" msgstr "Sutton" #. A city in Texas in the United States msgid "Sweetwater" msgstr "Sweetwater" #. A city in Georgia in the United States msgid "Sylvania" msgstr "Sylvania" #. A city in New York in the United States msgid "Syracuse" msgstr "Syracuse" #. A city in Washington in the United States msgid "Tacoma" msgstr "Tacoma" #. A city in Oklahoma in the United States msgid "Tahlequah" msgstr "Tahlequah" #. A city in Alaska in the United States msgid "Takotna" msgstr "Takotna" #. A city in Alaska in the United States msgid "Talkeetna" msgstr "Talkeetna" #. A city in Florida in the United States msgid "Tallahassee" msgstr "Tallahassee" #. A city in Florida in the United States msgid "Tampa" msgstr "Tampa" #. A city in Alaska in the United States msgid "Tanana" msgstr "Tanana" #. A city in New Mexico in the United States msgid "Taos" msgstr "Taos" #. A city in Colorado in the United States msgid "Tarryall" msgstr "Tarryall" #. A city in Illinois in the United States msgid "Taylorville" msgstr "Taylorville" #. A city in Nebraska in the United States msgid "Tekamah" msgstr "Tekamah" #. A city in Colorado in the United States msgid "Telluride" msgstr "Telluride" #. A city in Arizona in the United States msgid "Tempe" msgstr "Tempe" #. A city in Texas in the United States msgid "Temple" msgstr "Hram" #. A city in Indiana in the United States msgid "Terre Haute" msgstr "Terre Haute" #. A city in Texas in the United States msgid "Terrell" msgstr "Terrell" #. A city in New Jersey in the United States msgid "Teterboro" msgstr "Teterboro" #. A city in Arkansas in the United States msgid "Texarkana" msgstr "Texarkana" #. A city in Oregon in the United States msgid "The Dalles" msgstr "The Dalles" #. A city in Florida in the United States msgid "The Villages" msgstr "The Villages" #. A city in Nebraska in the United States msgid "Thedford" msgstr "Thedford" #. A city in Minnesota in the United States msgid "Thief River Falls" msgstr "Slapovi rijeke Thief" #. A city in Georgia in the United States msgid "Thomaston" msgstr "Thomaston" #. A city in Georgia in the United States msgid "Thomson" msgstr "Thomson" #. A city in California in the United States msgid "Thousand Oaks" msgstr "Thousand Oaks" #. A city in Washington in the United States msgid "Tillicum" msgstr "Tillicum" #. A city in Alaska in the United States msgid "Tin City" msgstr "Tin City" #. A city in Florida in the United States msgid "Titusville" msgstr "Titusville" #. A city in Alaska in the United States msgid "Togiak" msgstr "Togiak" #. A city in Ohio in the United States msgid "Toledo" msgstr "Toledo" #. A city in Wisconsin in the United States msgid "Tomahawk" msgstr "Tomahawk" #. A city in Nevada in the United States msgid "Tonopah" msgstr "Tonopah" #. A city in Kansas in the United States msgid "Topeka" msgstr "Topeka" #. A city in California in the United States msgid "Torrance" msgstr "Torrance" #. A city in New Mexico in the United States msgid "Torreon" msgstr "Torreon" #. A city in Wyoming in the United States msgid "Torrington" msgstr "Torrington" #. A city in Minnesota in the United States msgid "Tracy" msgstr "Tracy" #. A city in Michigan in the United States msgid "Traverse City" msgstr "Traverse City" #. A city in New Jersey in the United States msgctxt "City in New Jersey, United States" msgid "Trenton" msgstr "Trenton" #. A city in Colorado in the United States msgctxt "City in Colorado, United States" msgid "Trinidad" msgstr "Trinidad" #. A city in Alabama in the United States msgctxt "City in Alabama, United States" msgid "Troy" msgstr "Troy" #. A city in Michigan in the United States msgctxt "City in Michigan, United States" msgid "Troy" msgstr "Troy" #. A city in California in the United States msgid "Truckee" msgstr "Truckee" #. A city in New Mexico in the United States msgid "Truth or Consequences" msgstr "Istina ili posljedice" #. A city in Arizona in the United States msgid "Tucson" msgstr "Tucson" #. A city in New Mexico in the United States msgid "Tucumcari" msgstr "Tucumcari" #. A city in Oklahoma in the United States msgid "Tulsa" msgstr "Tulsa" #. A city in Mississippi in the United States msgid "Tunica" msgstr "Tunica" #. A city in Mississippi in the United States msgid "Tupelo" msgstr "Tupelo" #. A city in Alabama in the United States msgid "Tuscaloosa" msgstr "Tuscaloosa" #. A city in California in the United States msgid "Twentynine Palms" msgstr "Twentynine Palms" #. A city in Idaho in the United States msgid "Twin Falls" msgstr "Twin Falls" #. A city in Minnesota in the United States msgid "Two Harbors" msgstr "Two Harbors" #. A city in Texas in the United States msgid "Tyler" msgstr "Tyler" #. A city in California in the United States msgid "Ukiah" msgstr "Ukiah" #. A city in Alaska in the United States msgid "Unalakleet" msgstr "Unalakleet" #. A city in Alaska in the United States msgid "Unalaska" msgstr "Unalaska" #. A city in Missouri in the United States msgid "Unity Village" msgstr "Unity Village" #. A city in Texas in the United States msgid "Universal City" msgstr "Universal City" #. A city in Texas in the United States msgid "Uvalde" msgstr "Uvalde" #. A city in California in the United States msgid "Vacaville" msgstr "Vacaville" #. A city in Alaska in the United States msgid "Valdez" msgstr "Valdez" #. A city in Georgia in the United States msgid "Valdosta" msgstr "Valdosta" #. A city in Nebraska in the United States msgid "Valentine" msgstr "Valentine" #. A city in California in the United States msgid "Vallejo" msgstr "Vallejo" #. A city in Florida in the United States msgctxt "City in Florida, United States" msgid "Valparaiso" msgstr "Valparaiso" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Valparaiso" msgstr "Valparaiso" #. A city in California in the United States msgid "Van Nuys" msgstr "Van Nuys" #. A city in Washington in the United States msgctxt "City in Washington, United States" msgid "Vancouver" msgstr "Vancouver" #. A city in California in the United States msgid "Ventura" msgstr "Ventura" #. A city in Utah in the United States msgid "Vernal" msgstr "Vernal" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Vernon" msgstr "Vernon" #. A city in Florida in the United States msgid "Vero Beach" msgstr "Vero Beach" #. A city in Missouri in the United States msgctxt "City in Missouri, United States" msgid "Vichy" msgstr "Vichy" #. A city in Mississippi in the United States msgid "Vicksburg" msgstr "Vicksburg" #. A city in Texas in the United States msgctxt "City in Texas, United States" msgid "Victoria" msgstr "Victoria" #. A city in California in the United States msgid "Victorville" msgstr "Victorville" #. A city in Georgia in the United States msgid "Vidalia" msgstr "Vidalia" #. A city in Florida in the United States msgid "Vilano Beach" msgstr "Vilano Beach" #. A city in Massachusetts in the United States msgid "Vineyard Haven" msgstr "Vineyard Haven" #. A city in Iowa in the United States msgid "Vinton" msgstr "Vinton" #. A city in Virginia in the United States msgid "Virginia Beach" msgstr "Virginia Beach" #. A city in California in the United States msgid "Visalia" msgstr "Visalia" #. A city in Texas in the United States msgid "Waco" msgstr "Waco" #. A city in Minnesota in the United States msgid "Wadena" msgstr "Wadena" #. A city in North Carolina in the United States msgid "Wadesboro" msgstr "Wadesboro" #. A city in Hawaii in the United States msgid "Wahiawā" msgstr "Wahiawā" #. A city in North Dakota in the United States msgid "Wahpeton" msgstr "Wahpeton" #. A city in Hawaii in the United States msgid "Waiki‘i" msgstr "Waiki‘i" #. A city in Alaska in the United States msgid "Wainwright" msgstr "Wainwright" #. A city in Virginia in the United States msgid "Wakefield" msgstr "Wakefield" #. A city in Washington in the United States msgid "Walla Walla" msgstr "Walla Walla" #. A city in Arkansas in the United States msgid "Walnut Ridge" msgstr "Walnut Ridge" #. A city in Georgia in the United States msgid "Warner Robins" msgstr "Warner Robins" #. A city in Michigan in the United States msgid "Warren" msgstr "Warren" #. A city in Minnesota in the United States msgid "Warroad" msgstr "Warroad" #. A city in Indiana in the United States msgctxt "City in Indiana, United States" msgid "Warsaw" msgstr "Warsaw" #. A city in Minnesota in the United States msgid "Waseca" msgstr "Waseca" #. The capital of the United States msgctxt "City in District of Columbia, United States" msgid "Washington" msgstr "Washington" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Washington" msgstr "Washington" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Washington" msgstr "Washington" #. A city in Pennsylvania in the United States msgctxt "City in Pennsylvania, United States" msgid "Washington" msgstr "Washington" #. A city in Alaska in the United States msgid "Wasilla" msgstr "Wasilla" #. A city in Minnesota in the United States msgid "Waskish" msgstr "Waskish" #. A city in Connecticut in the United States msgid "Waterbury" msgstr "Waterbury" #. A city in Iowa in the United States msgctxt "City in Iowa, United States" msgid "Waterloo" msgstr "Waterloo" #. A city in New York in the United States msgctxt "City in New York, United States" msgid "Watertown" msgstr "Watertown" #. A city in South Dakota in the United States msgctxt "City in South Dakota, United States" msgid "Watertown" msgstr "Watertown" #. A city in Wisconsin in the United States msgctxt "City in Wisconsin, United States" msgid "Watertown" msgstr "Watertown" #. A city in Maine in the United States msgid "Waterville" msgstr "Waterville" #. A city in California in the United States msgid "Watsonville" msgstr "Watsonville" #. A city in Illinois in the United States msgid "Waukegan" msgstr "Waukegan" #. A city in Wisconsin in the United States msgid "Waukesha" msgstr "Waukesha" #. A city in Wisconsin in the United States msgid "Waupaca" msgstr "Waupaca" #. A city in Wisconsin in the United States msgid "Wausau" msgstr "Wausau" #. A city in Wisconsin in the United States msgid "Wautoma" msgstr "Wautoma" #. A city in Georgia in the United States msgid "Waycross" msgstr "Waycross" #. A city in Nebraska in the United States msgid "Wayne" msgstr "Wayne" #. A city in Missouri in the United States msgid "Waynesville" msgstr "Waynesville" #. A city in Oklahoma in the United States msgid "Weatherford" msgstr "Weatherford" #. A city in Iowa in the United States msgid "Webster City" msgstr "Webster City" #. A city in New York in the United States msgid "Wellsville" msgstr "Wellsville" #. A city in Washington in the United States msgid "Wenatchee" msgstr "Wenatchee" #. A city in Utah in the United States msgid "Wendover" msgstr "Wendover" #. A city in Texas in the United States msgid "Weslaco" msgstr "Weslaco" #. A city in Wisconsin in the United States msgid "West Bend" msgstr "West Bend" #. A city in Illinois in the United States msgid "West Chicago" msgstr "Zapadni Chicago" #. A city in California in the United States msgid "West Covina" msgstr "West Covina" #. A city in Arkansas in the United States msgid "West Memphis" msgstr "Zapadni Memphis" #. A city in Florida in the United States msgid "West Palm Beach" msgstr "West Palm Beach" #. A city in Missouri in the United States msgid "West Plains" msgstr "West Plains" #. A city in Virginia in the United States msgid "West Point" msgstr "West Point" #. A city in Wyoming in the United States msgid "West Thumb" msgstr "West Thumb" #. A city in Utah in the United States msgid "West Valley City" msgstr "West Valley City" #. A city in Rhode Island in the United States msgid "Westerly" msgstr "Westerly" #. A city in Massachusetts in the United States msgid "Westfield" msgstr "Westfield" #. A city in New York in the United States msgid "Westhampton Beach" msgstr "Westhampton Beach" #. A city in Colorado in the United States msgid "Westminster" msgstr "Westminster" #. A city in Texas in the United States msgid "Wharton" msgstr "Wharton" #. A city in Minnesota in the United States msgid "Wheaton" msgstr "Wheaton" #. A city in West Virginia in the United States msgid "Wheeling" msgstr "Wheeling" #. A city in New York in the United States msgid "White Plains" msgstr "White Plains" #. A city in New Hampshire in the United States msgid "Whitefield" msgstr "Whitefield" #. A city in Alaska in the United States msgid "Whittier" msgstr "Whittier" #. A city in Kansas in the United States msgid "Wichita" msgstr "Wichita" #. A city in Texas in the United States msgid "Wichita Falls" msgstr "Slapovi Wichita" #. A city in Pennsylvania in the United States msgid "Wilkes-Barre" msgstr "Wilkes - Barre" #. A city in Virginia in the United States msgid "Williamsburg" msgstr "Williamsburg" #. A city in Pennsylvania in the United States msgid "Williamsport" msgstr "Williamsport" #. A city in North Dakota in the United States msgid "Williston" msgstr "Williston" #. A city in Alaska in the United States msgid "Willow" msgstr "Willow" #. A city in Delaware in the United States msgctxt "City in Delaware, United States" msgid "Wilmington" msgstr "Wilmington" #. A city in North Carolina in the United States msgctxt "City in North Carolina, United States" msgid "Wilmington" msgstr "Wilmington" #. A city in Ohio in the United States msgctxt "City in Ohio, United States" msgid "Wilmington" msgstr "Wilmington" #. A city in Virginia in the United States msgid "Winchester" msgstr "Winchester" #. A city in Georgia in the United States msgid "Winder" msgstr "Winder" #. A city in Minnesota in the United States msgid "Windom" msgstr "Windom" #. A city in Arizona in the United States msgid "Window Rock" msgstr "Window Rock" #. A city in Connecticut in the United States msgid "Windsor Locks" msgstr "Windsor Locks" #. A city in Kansas in the United States msgid "Winfield" msgstr "Winfield" #. A city in Texas in the United States msgid "Wink" msgstr "Wink" #. A city in Nevada in the United States msgid "Winnemucca" msgstr "Winnemucca" #. A city in Minnesota in the United States msgid "Winona" msgstr "Winona" #. A city in Arizona in the United States msgid "Winslow" msgstr "Winslow" #. A city in North Carolina in the United States msgid "Winston-Salem" msgstr "Winston - Salem" #. A city in Florida in the United States msgid "Winter Haven" msgstr "Winter Haven" #. A city in North Carolina in the United States msgid "Winterville" msgstr "Winterville" #. A city in Maine in the United States msgid "Wiscasset" msgstr "Wiscasset" #. A city in Wisconsin in the United States msgid "Wisconsin Rapids" msgstr "Wisconsin Rapids" #. A city in Virginia in the United States msgid "Wise" msgstr "Wise" #. A city in Montana in the United States msgid "Wolf Point" msgstr "Wolf Point" #. A city in Wisconsin in the United States msgid "Woodruff" msgstr "Woodruff" #. A city in Ohio in the United States msgid "Wooster" msgstr "Wooster" #. A city in Massachusetts in the United States msgid "Worcester" msgstr "Worcester" #. A city in Wyoming in the United States msgid "Worland" msgstr "Worland" #. A city in Minnesota in the United States msgid "Worthington" msgstr "Worthington" #. A city in Alaska in the United States msgid "Wrangell" msgstr "Wrangell" #. A city in Wyoming in the United States msgctxt "City in Wyoming, United States" msgid "Wyoming" msgstr "Wyoming" #. A city in Washington in the United States msgid "Yakima" msgstr "Yakima" #. A city in Alaska in the United States msgid "Yakutat" msgstr "Yakutat" #. A city in South Dakota in the United States msgid "Yankton" msgstr "Yankton" #. A city in New York in the United States msgid "Yonkers" msgstr "Yonkers" #. A city in Nebraska in the United States msgctxt "City in Nebraska, United States" msgid "York" msgstr "York" #. A city in Pennsylvania in the United States msgctxt "City in Pennsylvania, United States" msgid "York" msgstr "York" #. A city in Ohio in the United States msgid "Youngstown" msgstr "Youngstown" #. A city in Arizona in the United States msgid "Yuma" msgstr "Yuma" #. A city in Ohio in the United States msgid "Zanesville" msgstr "Zanesville" #. A city in the United States Minor Outlying Islands msgid "Wake Island, Wake Island Army Airfield Airport" msgstr "Otok Wake, vojna zrakoplovna luka" #. A city in the United States Virgin Islands msgid "Charlotte Amalie" msgstr "Charlotte Amalie" #. A city in the United States Virgin Islands msgid "Christiansted" msgstr "Christiansted" #. A city in Uruguay msgid "Carrasco" msgstr "Carrasco" #. A city in Uruguay msgid "Colonia" msgstr "Colonia" #. A city in Uruguay msgid "Durazno" msgstr "Durazno" #. A city in Uruguay msgid "Maldonado" msgstr "Maldonado" #. The capital of Uruguay msgctxt "City in Uruguay" msgid "Montevideo" msgstr "Montevideo" #. A city in Uzbekistan msgid "Nukus" msgstr "Nukus" #. A city in Uzbekistan msgid "Samarqand" msgstr "Samarqand" #. The capital of Uzbekistan. #. "Tashkent" is the traditional English name. #. The local name is "Toshkent". #. msgid "Tashkent" msgstr "Tashkent" #. A city in Uzbekistan msgid "Termiz" msgstr "Termiz" #. A city in Uzbekistan msgid "Urganch" msgstr "Urganch" #. A city in Venezuela msgid "Acarigua" msgstr "Acarigua" #. A city in Venezuela msgctxt "City in Venezuela" msgid "Barcelona" msgstr "Barcelona" #. A city in Venezuela msgid "Barinas" msgstr "Barinas" #. A city in Venezuela msgid "Barquisimeto" msgstr "Barquisimeto" #. A city in Venezuela msgid "Calabozo" msgstr "Calabozo" #. The capital of Venezuela msgid "Caracas" msgstr "Caracas" #. A city in Venezuela msgid "Ciudad Bolívar" msgstr "Ciudad Bolívar" #. A city in Venezuela msgid "Coro" msgstr "Coro" #. A city in Venezuela msgid "El Variante" msgstr "El Variante" #. A city in Venezuela msgid "El Vigía" msgstr "El Vigía" #. A city in Venezuela msgid "Guanare" msgstr "Guanare" #. A city in Venezuela msgid "Guaricure" msgstr "Guaricure" #. A city in Venezuela msgid "Guasdalito" msgstr "Guasdalito" #. A city in Venezuela msgid "Güiria" msgstr "Güiria" #. A city in Venezuela msgid "La Chica" msgstr "La Chica" #. A city in Venezuela msgid "Maracaibo" msgstr "Maracaibo" #. A city in Venezuela msgid "Maracay" msgstr "Maracay" #. A city in Venezuela msgid "Maturín" msgstr "Maturín" #. A city in Venezuela msgid "Mene Grande" msgstr "Mene Grande" #. A city in Venezuela msgid "Morocure" msgstr "Morocure" #. A city in Venezuela msgctxt "City in Venezuela" msgid "Mérida" msgstr "Mérida" #. A city in Venezuela msgid "Paramillo" msgstr "Paramillo" #. A city in Venezuela msgid "Puerto Ayacucho" msgstr "Puerto Ayacucho" #. A city in Venezuela msgid "Puerto Borburata" msgstr "Puerto Borburata" #. A city in Venezuela msgid "San Antonio del Táchira" msgstr "San Antonio del Táchira" #. A city in Venezuela msgid "San Felipe" msgstr "San Felipe" #. A city in Venezuela msgctxt "City in Venezuela" msgid "San Fernando" msgstr "San Fernando" #. A city in Venezuela msgid "San Juan de los Morros" msgstr "San Juan de los Morros" #. A city in Venezuela msgid "San Tomé" msgstr "San Tomé" #. A city in Venezuela msgid "Santa Bárbara" msgstr "Santa Bárbara" #. A city in Venezuela msgctxt "City in Venezuela" msgid "Valencia" msgstr "Valencia" #. A city in Venezuela msgid "Valera" msgstr "Valera" #. A city in Viet Nam msgid "Da Nang" msgstr "Da Nang" #. The capital of Viet Nam. #. "Hanoi" is the traditional English name. #. The local name in Vietnamese is "Ha Noi". #. msgid "Hanoi" msgstr "Hanoj" #. A city in Viet Nam. #. "Ho Chi Minh City" is the traditional English name. #. The local name in Vietnamese is "Thanh Pho Ho Chi Minh". #. msgid "Ho Chi Minh City" msgstr "Ho Ši Min" #. A city in Wallis and Futuna msgid "Mata'utu" msgstr "Mata'utu" #. A city in Yemen msgid "'Adan" msgstr "'Adan" #. A city in Yemen msgid "'Ataq" msgstr "'Ataq" #. A city in Yemen msgid "Al Hudaydah" msgstr "Al Hudaydah" #. A city in Yemen msgid "Ma'rib" msgstr "Ma'rib" #. A city in Yemen msgid "Mori" msgstr "Mori" #. A city in Yemen msgid "Sa'dah" msgstr "Sa'dah" #. The capital of Yemen. #. "Sanaa" is the traditional English name. #. The local name in Arabic is "San'a'". #. msgid "Sanaa" msgstr "Sanaa" #. A city in Yemen msgid "Say'un" msgstr "Say'un" #. A city in Yemen msgid "Ta'izz" msgstr "Ta'izz" #. A city in Zambia msgid "Chinganze" msgstr "Chinganze" #. A city in Zambia msgid "Livingstone" msgstr "Livingstone" #. The capital of Zambia msgid "Lusaka" msgstr "Lusaka" #. A city in Zambia msgid "Ndola" msgstr "Ndola" #. A city in the Åland Islands. #. The local name in Finnish is "Maarianhamina". #. 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.2.0/keysign/locale/hu/000077500000000000000000000000001355405073600176225ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/hu/LC_MESSAGES/000077500000000000000000000000001355405073600214075ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/hu/LC_MESSAGES/keysign.po000066400000000000000000000352431355405073600234270ustar00rootroot00000000000000# Hungarian translation for gnome-keysign. # Copyright (C) 2019 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. msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-08-07 09:49+0000\n" "PO-Revision-Date: 2019-08-24 21:05+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 18.12.3\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" " 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: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" " 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:187 msgid "Send" msgstr "Küldés" #: keysign/app.py:189 keysign/receive.py:272 msgid "Receive" msgstr "Fogadás" #: keysign/app.ui:62 keysign/send.ui:54 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:218 #| msgid "Select a key for signing" 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:568 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:345 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:360 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:403 #| 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." 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: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 "" "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:474 msgid "Key" msgstr "Kulcs" #: keysign/receive.ui:507 keysign/send.ui:493 msgid "UIDs" msgstr "UID-k" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "_Megerősítés" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "A következő UID-k aláírása:" #: keysign/send.py:207 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:213 msgid "There isn't an Internet connection!" msgstr "Nincs internetkapcsolat!" #: keysign/send.py:219 keysign/send.ui:267 msgid "The signature has been successfully imported!" msgstr "Az aláírás sikeresen importálva lett!" #: 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 "" "Hiba történt az aláírás importálásának kísérlete közben.\n" "Ellenőrizze még egyszer a választott aláírás helyességét." #: keysign/send.py:254 keysign/send.ui:678 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: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 "" "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:263 #, 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:121 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:198 msgid "Very slow or no Internet connection!" msgstr "Nagyon lassú vagy nincs internetkapcsolat." #. 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 "Válassza ki az aláírandó kulcsot" #: keysign/send.ui:338 msgid "Times signed" msgstr "Aláírások száma" #: keysign/send.ui:405 msgid "Keylist" msgstr "Kulcslista" #: keysign/send.ui:425 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:452 msgid "Key Details" msgstr "Kulcs részletei" #: keysign/send.ui:477 msgid "Fingerprint" msgstr "Ujjlenyomat" #: keysign/send.ui:631 msgid "QR Code" msgstr "QR-kód" #: keysign/util.py:223 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.2.0/keysign/locale/id/000077500000000000000000000000001355405073600176025ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/id/LC_MESSAGES/000077500000000000000000000000001355405073600213675ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/id/LC_MESSAGES/keysign.po000066400000000000000000000322331355405073600234030ustar00rootroot00000000000000# 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, 2019. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-04-27 17:03+0000\n" "PO-Revision-Date: 2019-07-11 15:01+0700\n" "Last-Translator: Kukuh Syafaat \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.2.3\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" " GNOME-Keysign memungkinkan penandatanganan kunci OpenPGP dengan nyaman " "dan aman\n" " melalui jaringan lokal atau 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" " 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:181 msgid "Send" msgstr "Kirim" #: keysign/app.py:183 keysign/receive.py:238 msgid "Receive" msgstr "Terima" #: keysign/app.ui:62 keysign/send.ui:617 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Kunci penawaran: {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Info penemuan: {}" #: keysign/avahioffer.py:83 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.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:105 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:124 msgid "Camera" msgstr "Kamera" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Kamera Web Terpadu" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Kode Keamanan" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Pindai Kode Batang" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait..." msgstr "Mengunduh data-kunci. Mohon tunggu..." #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Unduhan kunci terputus!" #: 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 "" "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:365 msgid "Key" msgstr "Kunci" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "K_onfirmasi" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Menandatangani UID berikut:" #: keysign/send.py:156 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:162 msgid "There isn't an Internet connection!" msgstr "Tidak ada koneksi internet!" #: keysign/send.py:190 keysign/send.ui:545 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: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 "" "Tidak dapat membuat sambungan aman.\n" "Entah pasangan Anda memasukkan kode yang salah atau seseorang mencoba " "mencegat koneksi Anda" #: keysign/send.py:199 #, 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:58 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:135 msgid "Very slow or no Internet connection!" msgstr "Koneksi internet sangat lambat atau tidak ada!" #. 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 "Pilih kunci untuk menandatangani" #: keysign/send.ui:206 msgid "Times signed" msgstr "Jumlah tanda tangan" #: keysign/send.ui:272 msgid "Keylist" msgstr "Daftar kunci" #: keysign/send.ui:292 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:319 msgid "Key Details" msgstr "Detail Kunci" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Sidik Jari" #: keysign/send.ui:498 msgid "QR Code" msgstr "Kode QR" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Pilih dan Kirim kunci" #: keysign/send.ui:594 msgid "" "Uses the Internet to transport the key rather than the local network and " "Bluetooth (if available)" msgstr "" "Menggunakan Internet untuk memindahkan kunci daripada jaringan lokal dan " "Bluetooth (jika tersedia)" #: 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 "" "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" #~ msgid "Translated for gettext (C)" #~ msgstr "Diterjemahkan untuk gettext (C)" #~ msgid "Translated for Python (C)" #~ msgstr "Diterjemahkan untuk Python (C)" #~ msgid "page1" #~ msgstr "halaman1" #~ msgid "page2" #~ msgstr "halaman2" #~ msgid "page3" #~ msgstr "halaman3" #~ msgid "Your signed key $fingerprint" #~ msgstr "Kunci yang Anda tandatangani $sidikjari" #~ msgid "installing symlinks for sockets from %s to %s" #~ msgstr "memasang symlink untuk soket dari %s ke %s" gnome-keysign-1.2.0/keysign/locale/it/000077500000000000000000000000001355405073600176225ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/it/LC_MESSAGES/000077500000000000000000000000001355405073600214075ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/it/LC_MESSAGES/keysign.po000066400000000000000000000311341355405073600234220ustar00rootroot00000000000000# Italian translations for gnome-keysign. # Copyright (C) 2017 Tobias Mueller # Copyright (C) 2018, 2019 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. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign 0.9\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-02-14 15:55+0000\n" "PO-Revision-Date: 2019-02-25 10:00+0100\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.2.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" " 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: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" " È 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:181 msgid "Send" msgstr "Invia" #: keysign/app.py:183 keysign/receive.py:238 msgid "Receive" msgstr "Ricevi" #: keysign/app.ui:62 keysign/send.ui:617 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Invio della chiave: {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Informazioni per la ricerca: {}" #: keysign/avahioffer.py:83 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.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 "" "Nessun server di GNOME Keysign servers nelle vicinanze :-(\n" "Cercare un amico con cui usare GNOME Keysign.\n" "Potrebbe anche essere un problema di connettività.\n" "Per maggiori informazioni visitare here." #: keysign/receive.ui:105 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:124 msgid "Camera" msgstr "Fotocamera" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Fotocamera integrata" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Codice di sicurezza" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Scansiona codice a barre" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait..." msgstr "Scaricamento dati, attendere..." #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Scaricamento della chiave interrotto." #: 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 "" "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:365 msgid "Key" msgstr "Chiave" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "C_onferma" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Firmando i seguenti UID:" #: keysign/send.py:156 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:162 msgid "There isn't an Internet connection!" msgstr "Non c'è una connessione a Internet." #: keysign/send.py:190 keysign/send.ui:545 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: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 "" "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:199 #, 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:58 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:135 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:190 msgid "Select a key for signing" msgstr "Scegliere una chiave da firmare" #: keysign/send.ui:206 msgid "Times signed" msgstr "Volte firmata" #: keysign/send.ui:272 msgid "Keylist" msgstr "Elenco chiavi" #: keysign/send.ui:292 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:319 msgid "Key Details" msgstr "Dettagli chiave" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Impronta" #: keysign/send.ui:498 msgid "QR Code" msgstr "Codice QR" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Scegliere e inviare la chiave" #: keysign/send.ui:594 msgid "" "Uses the Internet to transport the key rather than the local network and " "Bluetooth (if available)" msgstr "" "Utilizza Internet per inviare la chiave al posto della rete locale e del " "Bluetooth (se disponibile)" #: 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 "" "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.2.0/keysign/locale/nl/000077500000000000000000000000001355405073600176175ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/nl/LC_MESSAGES/000077500000000000000000000000001355405073600214045ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/nl/LC_MESSAGES/keysign.po000066400000000000000000000313021355405073600234140ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign master\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-02-14 15:55+0000\n" "PO-Revision-Date: 2019-02-27 16:15+0100\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 2.2.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" " 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: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" " 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:181 msgid "Send" msgstr "Verzenden" #: keysign/app.py:183 keysign/receive.py:238 msgid "Receive" msgstr "Ontvangen" #: keysign/app.ui:62 keysign/send.ui:617 msgid "Internet" msgstr "Internet" #: keysign/avahioffer.py:81 keysign/bluetoothoffer.py:126 msgid "Offering key: {}" msgstr "Sleutel wordt aangeboden: {}" #: keysign/avahioffer.py:82 keysign/bluetoothoffer.py:127 msgid "Discovery info: {}" msgstr "Ontdekkingsinfo: {}" #: keysign/avahioffer.py:83 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.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 "" "Geen Gnome Keysign-servers in de buurt :-(\n" "Probeer Gnome Keysign uit met een vriend.\n" "U kunt mogelijk last ondervinden van verbindingsproblemen.\n" "Voor meer informatie, klik hier." #: keysign/receive.ui:105 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:124 msgid "Camera" msgstr "Camera" #: keysign/receive.ui:139 msgid "Integrated Web Cam" msgstr "Geïntegreerde webcam" #: keysign/receive.ui:176 keysign/send.ui:435 msgid "Security Code" msgstr "Beveiligingscode" #: keysign/receive.ui:209 msgid "Scan Barcode" msgstr "Barcode scannen" #: keysign/receive.ui:226 msgid "Downloading key-data. Please wait..." msgstr "Sleutelgegevens worden gedownload. Even geduld…" #: keysign/receive.ui:251 msgid "Key download was interrupted!" msgstr "Downloaden van sleutel onderbroken!" #: 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 "" "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:365 msgid "Key" msgstr "Sleutel" #: keysign/receive.ui:398 keysign/send.ui:360 msgid "UIDs" msgstr "UID’s" #: keysign/receive.ui:485 msgid "C_onfirm" msgstr "B_evestigen" #: keysign/receive.ui:539 msgid "Signing the following UIDs:" msgstr "Volgende UID’s worden ondertekend:" #: keysign/send.py:156 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:162 msgid "There isn't an Internet connection!" msgstr "Er is geen internetverbinding!" #: keysign/send.py:190 keysign/send.ui:545 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: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 "" "Kon geen beveiligde verbinding instellen.\n" "Uw partner heeft een verkeerde code ingevoerd, of iemand heeft uw verbinding " "proberen onderscheppen" #: keysign/send.py:199 #, 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:58 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:135 msgid "Very slow or no Internet connection!" msgstr "Zeer trage of geen internetverbinding!" #. 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 "Selecteer een sleutel voor ondertekenen" #: keysign/send.ui:206 msgid "Times signed" msgstr "Aantal keer ondertekend" #: keysign/send.ui:272 msgid "Keylist" msgstr "Sleutellijst" #: keysign/send.ui:292 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:319 msgid "Key Details" msgstr "Sleuteldetails" #: keysign/send.ui:344 msgid "Fingerprint" msgstr "Vingerafdruk" #: keysign/send.ui:498 msgid "QR Code" msgstr "QR-code" #: keysign/send.ui:575 msgid "Select and Send key" msgstr "Sleutel kiezen en verzenden" #: keysign/send.ui:594 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)" #: 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 "" "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 "Translated for gettext (C)" #~ msgstr "Vertaald voor gettext (C)" #~ msgid "Translated for Python (C)" #~ msgstr "Vertaald voor Python (C)" gnome-keysign-1.2.0/keysign/locale/pl/000077500000000000000000000000001355405073600176215ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/pl/LC_MESSAGES/000077500000000000000000000000001355405073600214065ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/pl/LC_MESSAGES/keysign.po000066400000000000000000000337321355405073600234270ustar00rootroot00000000000000# Polish translation for gnome-keysign. # Copyright © 2018-2019 the gnome-keysign authors. # This file is distributed under the same license as the gnome-keysign package. # Piotr Drąg , 2018-2019. # Aviary.pl , 2018-2019. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-08-07 09:49+0000\n" "PO-Revision-Date: 2019-08-11 14:49+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:10 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: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" " 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:187 msgid "Send" msgstr "Wyślij" #: keysign/app.py:189 keysign/receive.py:272 msgid "Receive" msgstr "Odbierz" #: keysign/app.ui:62 keysign/send.ui:54 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:218 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:568 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:345 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:360 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: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 "" "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: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 "" "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:474 msgid "Key" msgstr "Klucz" #: keysign/receive.ui:507 keysign/send.ui:493 msgid "UIDs" msgstr "UID" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "P_otwierdź" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "Podpisywanie tych UID:" #: keysign/send.py:207 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:213 msgid "There isn't an Internet connection!" msgstr "Nie ma połączenia z Internetem." #: keysign/send.py:219 keysign/send.ui:267 msgid "The signature has been successfully imported!" msgstr "Pomyślnie zaimportowano podpis." #: 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 "" "Wystąpił błąd podczas importowania podpisu.\n" "Proszę się upewnić, że wybrany podpis jest prawidłowy." #: keysign/send.py:254 keysign/send.ui:678 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: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 "" "Nie można nawiązać bezpiecznego połączenia.\n" "Partner wpisał błędny kod lub ktoś próbuje przechwycić połączenie" #: keysign/send.py:263 #, 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:121 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:198 msgid "Very slow or no Internet connection!" msgstr "Bardzo wolne lub niedziałające połączenie z Internetem." #. 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 "Wybór klucza do podpisania" #: keysign/send.ui:338 msgid "Times signed" msgstr "Ile razy podpisano" #: keysign/send.ui:405 msgid "Keylist" msgstr "Lista kluczy" #: keysign/send.ui:425 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:452 msgid "Key Details" msgstr "Informacje o kluczu" #: keysign/send.ui:477 msgid "Fingerprint" msgstr "Odcisk" #: keysign/send.ui:631 msgid "QR Code" msgstr "Kod QR" #: keysign/util.py:223 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.2.0/keysign/locale/pt_BR/000077500000000000000000000000001355405073600202145ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001355405073600220015ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/locale/pt_BR/LC_MESSAGES/keysign.po000066400000000000000000000354521355405073600240230ustar00rootroot00000000000000# Portuguese (Brazil) translations for gnome-keysign. # Copyright (C) 2019 Tobias Mueller # This file is distributed under the same license as the gnome-keysign project. # Rafael Fontenelle , 2017-2019. # msgid "" msgstr "" "Project-Id-Version: gnome-keysign\n" "Report-Msgid-Bugs-To: tobiasmue@gnome.org\n" "POT-Creation-Date: 2019-08-07 09:49+0000\n" "PO-Revision-Date: 2019-08-18 01:14-0300\n" "Last-Translator: Rafael Fontenelle \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: Gtranslator 3.32.0\n" "Generated-By: Babel 2.5.1\n" "X-Project-Style: gnome\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" " 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: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" " 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:187 msgid "Send" msgstr "Enviar" #: keysign/app.py:189 keysign/receive.py:272 msgid "Receive" msgstr "Receber" #: keysign/app.ui:62 keysign/send.ui:54 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:218 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:568 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:345 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:360 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: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 "" "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: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 "" "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:474 msgid "Key" msgstr "Chave" #: keysign/receive.ui:507 keysign/send.ui:493 msgid "UIDs" msgstr "UIDs" #: keysign/receive.ui:594 msgid "C_onfirm" msgstr "C_onfirmar" #: keysign/receive.ui:716 msgid "Signing the following UIDs:" msgstr "Assinando os seguintes UIDs:" #: keysign/send.py:207 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:213 msgid "There isn't an Internet connection!" msgstr "Não há conexão com a Internet!" #: keysign/send.py:219 keysign/send.ui:267 msgid "The signature has been successfully imported!" msgstr "A assinatura foi importada com sucesso!" #: 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 "" "Ocorreu um erro ao tentar importar a assinatura.\n" "Por favor, verifique se a assinatura escolhida está correta." #: keysign/send.py:254 keysign/send.ui:678 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: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 "" "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:263 #, 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:121 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:198 msgid "Very slow or no Internet connection!" msgstr "Conexão muito lenta ou sem conexão com a Internet!" #. 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 "Selecione uma chave para assinar" #: keysign/send.ui:338 msgid "Times signed" msgstr "Quantidade de assinaturas" #: keysign/send.ui:405 msgid "Keylist" msgstr "Lista de chaves" #: keysign/send.ui:425 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:452 msgid "Key Details" msgstr "Detalhes da chave" #: keysign/send.ui:477 msgid "Fingerprint" msgstr "Impressão digital" #: keysign/send.ui:631 msgid "QR Code" msgstr "Código QR" #: keysign/util.py:223 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" #~ msgid "" #~ "Uses the Internet to transport the key rather than the local network and " #~ "Bluetooth (if available)" #~ msgstr "" #~ "Usa a Internet para transportar a chave em vez da rede local e Bluetooth " #~ "(se disponível)" #~ msgid "Translated for gettext (C)" #~ msgstr "Traduzido para gettext (pt_BR)" #~ msgid "Translated for Python (C)" #~ msgstr "Traduzido para Python (pt_BR)" #~ msgid "installing symlinks for sockets from %s to %s" #~ msgstr "instalando links simbólicos para soquetes de %s para %s" #~ msgid "page1" #~ msgstr "página1" #~ msgid "page2" #~ msgstr "página2" #~ msgid "page3" #~ msgstr "página3" #~ msgid "Your signed key $fingerprint" #~ msgstr "Sua chave assinada $fingerprint" gnome-keysign-1.2.0/keysign/network/000077500000000000000000000000001355405073600174405ustar00rootroot00000000000000gnome-keysign-1.2.0/keysign/network/AvahiBrowser.py000066400000000000000000000135611355405073600224140ustar00rootroot00000000000000#!/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.2.0/keysign/network/AvahiConstants.py000066400000000000000000000041401355405073600227360ustar00rootroot00000000000000#!/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.2.0/keysign/network/AvahiPublisher.py000066400000000000000000000133411355405073600227220ustar00rootroot00000000000000#!/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.2.0/keysign/network/__init__.py000066400000000000000000000015311355405073600215510ustar00rootroot00000000000000#!/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.2.0/keysign/offer.py000066400000000000000000000045651355405073600174340ustar00rootroot00000000000000import 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.2.0/keysign/receive.py000077500000000000000000000266471355405073600177650ustar00rootroot00000000000000#!/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 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 tmpfiles_plaintext = list(sign_keydata_and_send(keydata)) 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_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.2.0/keysign/receive.ui000066400000000000000000001005061355405073600177320ustar00rootroot00000000000000 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 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 0 True False vertical 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 0 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 True 1 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.2.0/keysign/scan_barcode.py000077500000000000000000000316251355405073600207360ustar00rootroot00000000000000#!/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.2.0/keysign/send.py000066400000000000000000000371461355405073600172650ustar00rootroot00000000000000#!/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.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() 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 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()) try: for signature in signatures: gpgmeh.import_signature(signature) self.signature_imported() except errors.GPGMEError as e: log.exception("Could not import signatures") self.signature_import_error() @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): self.klw.image_ib_import.set_from_icon_name(Gtk.STOCK_OK, Gtk.IconSize.BUTTON) self.klw.label_ib_import.set_label(_("The signature has been successfully imported!")) self.klw.ib_import.show() log.info("Signature imported") def signature_import_error(self): self.klw.image_ib_import.set_from_icon_name(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.BUTTON) self.klw.label_ib_import.set_label(_("An error occurred while trying to import the signature.\n" "Please double check the correctness of the chosen signature.")) self.klw.ib_import.show() 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.set_label(_("Key successfully sent.\n" "You should receive soon an email with the signature.")) self.stack.set_visible_child(self.rb) else: if type(message) == WrongPasswordError: self.result_label.set_label(_("Could not establish a secure connection.\n" "Either your partner has entered a wrong code or " "someone tried to intercept your connection")) else: 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.2.0/keysign/send.ui000066400000000000000000001036171355405073600172470ustar00rootroot00000000000000 False Select and send key 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 5 Internet False True 1 1 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 False False 0 True True 2 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 3 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 Key successfully sent. You should receive soon an email with the signature. center True char True False True 0 page2 page2 2 gnome-keysign-1.2.0/keysign/util.py000077500000000000000000000355511355405073600173120ustar00rootroot00000000000000#!/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.2.0/keysign/wormholeoffer.py000066400000000000000000000146631355405073600212110ustar00rootroot00000000000000#!/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.2.0/keysign/wormholereceive.py000066400000000000000000000131601355405073600215210ustar00rootroot00000000000000#!/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.2.0/packaging/000077500000000000000000000000001355405073600162225ustar00rootroot00000000000000gnome-keysign-1.2.0/packaging/PKGBUILD000066400000000000000000000021261355405073600173470ustar00rootroot00000000000000# 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.2.0/packaging/avoid_monkeysign.patch000066400000000000000000000013001355405073600226020ustar00rootroot00000000000000--- 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.2.0/packaging/gnome-keysign.install000066400000000000000000000005741355405073600223740ustar00rootroot00000000000000post_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.2.0/packaging/gnome-keysign.spec000066400000000000000000000032501355405073600216520ustar00rootroot00000000000000%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-lxml BuildRequires: python2-babel 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: python2-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.2.0/setup.cfg000066400000000000000000000013561355405073600161240ustar00rootroot00000000000000# 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 [nosetests] detailed-errors=1 with-doctest=1 with-coverage=0 cover-package=keysign cover-erase=1 #verbosity=2 cover-html=1 cover-html-dir=coverage/ cover-branches=1 cover-min-percentage=70 #where=tests gnome-keysign-1.2.0/setup.py000066400000000000000000000154121355405073600160130ustar00rootroot00000000000000#!/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 import translate_desktop_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) # Inspired by the example at https://pytest.org/latest/goodpractises.html class NoseTestCommand(TestCommand): def finalize_options(self): TestCommand.finalize_options(self) self.test_args = [] self.test_suite = True def run_tests(self): # Run nose ensuring that argv simulates running nosetests directly import nose nose.run_exit(argv=['nosetests' , 'tests']) 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", "lxml", "BabelGladeExtractor", ], tests_require=[ "nose", "tox", "pycodestyle", "pylint", ], license='GPLv3+', long_description=open('README.rst').read(), entry_points = { 'console_scripts': [ 'gnome-keysign-sign-key = keysign.SignKey: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', 'Programming Language :: Python :: 2', # I think we are only 2.7 compatible 'Programming Language :: Python :: 2.7', # We're still lacking support for 3 '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': NoseTestCommand, }, # test_suite = 'nose.collector', ) gnome-keysign-1.2.0/tests/000077500000000000000000000000001355405073600154405ustar00rootroot00000000000000gnome-keysign-1.2.0/tests/fixtures/000077500000000000000000000000001355405073600173115ustar00rootroot00000000000000gnome-keysign-1.2.0/tests/fixtures/alpha.asc000066400000000000000000000050551355405073600210730ustar00rootroot00000000000000-----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.2.0/tests/fixtures/pubkey-1.asc000066400000000000000000000027211355405073600214400ustar00rootroot00000000000000-----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.2.0/tests/fixtures/pubkey-2-uids.asc000066400000000000000000000024001355405073600223750ustar00rootroot00000000000000-----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.2.0/tests/fixtures/seckey-2.asc000066400000000000000000000065671355405073600214410ustar00rootroot00000000000000-----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.2.0/tests/fixtures/seckey-colon.asc000066400000000000000000000042641355405073600224020ustar00rootroot00000000000000pub 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.2.0/tests/fixtures/seckey-latin1.asc000066400000000000000000000040661355405073600224600ustar00rootroot00000000000000-----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.2.0/tests/fixtures/seckey-multiple-uid-colon.asc000066400000000000000000000072001355405073600250030ustar00rootroot00000000000000pub 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.2.0/tests/fixtures/seckey-no-pw-1.asc000066400000000000000000000042101355405073600224550ustar00rootroot00000000000000-----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.2.0/tests/fixtures/seckey-no-pw-2.asc000066400000000000000000000035731355405073600224710ustar00rootroot00000000000000-----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.2.0/tests/fixtures/seckey-subkeys.asc000066400000000000000000000114271355405073600227540ustar00rootroot00000000000000pub 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.2.0/tests/fixtures/seckey-utf8-2.asc000066400000000000000000000037411355405073600223140ustar00rootroot00000000000000pub 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.2.0/tests/fixtures/seckey-utf8.asc000066400000000000000000000037641355405073600221620ustar00rootroot00000000000000pub 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.2.0/tests/test_bluetooth.py000066400000000000000000000140671355405073600210660ustar00rootroot00000000000000import 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 nose.twistedtools import deferred from nose.tools import * from twisted.internet import threads from twisted.internet.defer import inlineCallbacks try: from keysign.bluetoothoffer import BluetoothOffer from keysign.bluetoothreceive import BluetoothReceive 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) @deferred(timeout=15) @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() # 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, _ = msg_tuple assert_true(success) log.info("Checking with key: %r", downloaded_key_data) assert_equal(downloaded_key_data.encode("utf-8"), file_key_data) @deferred(timeout=15) @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, _ = msg_tuple assert_false(success) @deferred(timeout=15) @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_is_none(downloaded_key_data) assert_false(success) assert_equal(error.args[0], "(112, 'Host is down')") @deferred(timeout=15) @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_false(result) assert_equal(type(error), ValueError) gnome-keysign-1.2.0/tests/test_gpgmeh.py000066400000000000000000000473241355405073600203320ustar00rootroot00000000000000#!/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 from nose.tools import * import gpg 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 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.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 @raises(ValueError) def test_uid_export_0(): "You should not be able to export uid < 1" data = read_fixture_file("pubkey-1.asc") uid_data = UIDExport(data, 0) assert False 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_equal(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_equal(1, len(imports)) uids1_key = c.get_key(fpr).uids assert_equal(1, len(uids1_key)) uid1 = uids1_key[0] # assert_equal(uid1, uids[0]) assert_equal(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_not_equal(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_equal(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_equal(1, len(imports)) uids1_key = c.get_key(fpr).uids assert_equal(1, len(uids1_key)) uid1 = uids1_key[0] # assert_equal(uid1, uids[0]) assert_equal(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_equal(1, len(imports)) uids2_key = c.get_key(fpr).uids assert_equal(1, len(uids2_key)) uid2 = uids2_key[0] # FIXME: The objects don't implement __eq__ it seems :-/ # assert_equal(uid2, uids[1]) assert_equal(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_equal(2, len(uids)) exported_uids = list(export_uids(data)) assert_equal(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_equal(uids[0].uid, uid1) assert_equal(uids[1].uid, uid2) # The first exported UID c = TempContext() c.op_import(uid1_data) result = c.op_import_result() imports = result.imports assert_equal(1, len(imports)) uids1_key = c.get_key(fpr).uids assert_equal(1, len(uids1_key)) uid1_key = uids1_key[0] # assert_equal(uid1, uids[0]) assert_equal(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_equal(1, len(imports)) uids2_key = c.get_key(fpr).uids assert_equal(1, len(uids2_key)) uid2_key = uids2_key[0] # FIXME: The objects don't implement __eq__ it seems :-/ # assert_equal(uid2, uids[1]) assert_equal(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_equal(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_equal(1, len(uid_key.uids)) key_uid = uid_key.uids[0] # FIXME: Enable __eq__ # assert_equal(uids[i-1], key_uid) assert_equal(uids[i-1].name, key_uid.name) assert_equal(uids[i-1].email, key_uid.email) @raises(ValueError) def test_fingerprint_from_data(): fingerprint = fingerprint_from_keydata("This is not a key...") assert False class TestKey1: def setup(self): data = read_fixture_file("pubkey-1.asc") self.key = openpgpkey_from_data(data) def test_fingerprint(self): assert_equal("ADAB7FCC1F4DE2616ECFA402AF82244F9CD9FD55", self.key.fingerprint) def test_uids(self): uids = self.key.uidslist assert_equal(1, len(uids)) uid = uids[0] assert_equal('Joe Random Hacker', uid.name) assert_equal('joe@example.com', uid.email) @raises(ValueError) def test_get_public_key_no_data(): tmp = tempfile.mkdtemp() d = get_public_key_data(None, homedir=tmp) assert_equal("", d) 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_equal(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_equal(fpr, newkey.fingerprint) @raises(ValueError) def test_no_match(self): data = get_public_key_data("nothing should match this", homedir=self.homedir) newkey = openpgpkey_from_data(data) assert False def test_get_empty_usable_keys(): homedir = tempfile.mkdtemp() keys = get_usable_keys(homedir=homedir) assert_equal(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_equal(1, len(keys)) key = keys[0] assert_equal(self.originalkey, key) def test_get_usable_key_fpr(self): fpr = self.originalkey.fingerprint keys = get_usable_keys(fpr, homedir=self.homedir) assert_equal(1, len(keys)) key = keys[0] assert_equal(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_equal(1, len(keys)) key = keys[0] assert_equal(self.originalkey, key) def test_get_usable_key_fpr(self): fpr = self.originalkey.fingerprint keys = get_usable_secret_keys(fpr, homedir=self.homedir) assert_equal(1, len(keys)) key = keys[0] assert_equal(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 class TestSignAndEncrypt: SENDER_KEY = "seckey-no-pw-1.asc" RECEIVER_KEY = "seckey-no-pw-2.asc" def setup(self): self.key_sender_key = get_fixture_file(self.SENDER_KEY) 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_equal(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_equal(len(uids), len(uid_encrypted)) # We need to explicitly request signatures uids_before = uids assert_equal(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_equal(uid, uid_enc[0]) assert_in(uid.name, uid_enc_str) assert_in(uid.email, 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_equal(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_greater(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_equal(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_equal(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_equal(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_equal(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_in(to_valid_utf8_string(uid.name), uid_enc_str) assert_in(to_valid_utf8_string(uid.email), 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_equal(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_greater(len(sigs_after), len(sigs_before)) 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.2.0/tests/test_latin1.py000066400000000000000000000032261355405073600202440ustar00rootroot00000000000000#!/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.2.0/tests/test_uids.py000066400000000000000000000021141355405073600200130ustar00rootroot00000000000000#!/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.2.0/tests/test_wormhole.py000066400000000000000000000143311355405073600207070ustar00rootroot00000000000000#!/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 nose.twistedtools import deferred from nose.tools import * from wormhole.errors import WrongPasswordError, LonelyError from twisted.internet.defer 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) @deferred(timeout=10) @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_true(success) log.info("Checking with key: %r", downloaded_key_data) assert_equal(downloaded_key_data, file_key_data) @deferred(timeout=10) @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_true(success) log.info("Checking with key: %r", downloaded_key_data) assert_equal(downloaded_key_data, file_key_data) @deferred(timeout=10) @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_false(success) assert_is_not_none(message) assert_equal(message, WrongPasswordError) @deferred(timeout=10) @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_false(success) assert_is_not_none(message) assert_equal(message, WrongPasswordError) @deferred(timeout=10) @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_true(success) log.info("Checking with key: %r", downloaded_key_data) assert_equal(downloaded_key_data, file_key_data) @deferred(timeout=10) @inlineCallbacks def test_offer_cancel(): def _received(start_data): success, message = start_data assert_is_not_none(message) assert_equal(type(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.2.0/tox.ini000066400000000000000000000013171355405073600156130ustar00rootroot00000000000000[tox] # I don't seem to be able to say "python 2" and "python 3", only. skip_missing_interpreters = true envlist = py26,py27,py32,py35,flake8 #deps = # -rrequirements.txt [testenv] deps = nose coverage commands=nosetests -v --with-coverage --cover-html --cover-erase --cover-branch --cover-package=keysign --cover-min-percentage=75 #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