From e7bf0b4b4ad24a4c6530286ff21be72127d8df60 Mon Sep 17 00:00:00 2001 From: Ruben de Vries Date: Wed, 28 Oct 2015 11:15:56 +0100 Subject: [PATCH] initial release of translations package --- .gitignore | 2 + LICENSE.md | 661 +++++++++++++++++++++++ README.md | 31 ++ export-csv.js | 72 +++ import-csv.js | 182 +++++++ mobile-duplicates.js | 192 +++++++ package.json | 14 + translations/americanEnglish.json | 3 + translations/dutch.json | 36 ++ translations/english.json | 443 +++++++++++++++ translations/french.json | 363 +++++++++++++ translations/mobile/americanEnglish.json | 1 + translations/mobile/dutch.json | 1 + translations/mobile/english.json | 75 +++ translations/mobile/french.json | 1 + 15 files changed, 2077 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 export-csv.js create mode 100644 import-csv.js create mode 100644 mobile-duplicates.js create mode 100644 package.json create mode 100644 translations/americanEnglish.json create mode 100644 translations/dutch.json create mode 100644 translations/english.json create mode 100644 translations/french.json create mode 100644 translations/mobile/americanEnglish.json create mode 100644 translations/mobile/dutch.json create mode 100644 translations/mobile/english.json create mode 100644 translations/mobile/french.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f348ab --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.csv +.~lock* diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + 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 AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ab60bf9 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# Blocktrail Wallet Translations +This repo contains JSON files with all translations used for the Blocktrail Web and Mobile Wallet. +The scripts to convert from JSON -> CSV -> JSON are horrific right now, but they do what they're supposed to, will be cleaned up at a later stage ... + +## Structure +`translations/*.json` are the main translation files, they're used in the Web Wallet. +`translations/mobile/*.json` are merged over the main translation files for the Mobile Wallet, this is mainly for button text etc. that is otherwise too big to fit. + +## Install +``` +npm install +``` + +## Create CSV to translate in Libre Calc / MS Excel +``` +node export-csv.js > translations.csv +``` + +## Import CSV with changes back into the JSON files +``` +# asumes translations.csv is in the root dir +node import-csv.js +``` + +## RegEx used for converting JS files to JSON +` ([A-Z].+): ?["'](.+)['"],` `"$1": "$2",` + +## License +The Blocktrail Wallet source code is released under the GNU Affero General Public License. +The Blocktrail Logo and any other images / graphics are not part of this. +See [LICENSE.md](LICENSE.md). diff --git a/export-csv.js b/export-csv.js new file mode 100644 index 0000000..3c9ac94 --- /dev/null +++ b/export-csv.js @@ -0,0 +1,72 @@ +var _ = require('lodash'); +var stripJsonComments = require('strip-json-comments'); +var fs = require('fs'); +var Q = require('q'); +var csv = require('csv'); + +var BASE_LANGUAGE = "english"; +var BLACKLIST = ['package.json']; +var DIR = __dirname + "/translations"; +var MOBILE_DIR = DIR + "/mobile"; + +var translations = {}; + +fs.readdirSync(DIR).forEach(function(filename) { + if (filename.match(/\.json$/) && BLACKLIST.indexOf(filename) === -1) { + var language = filename.replace(/\.json$/, ""); + + var raw = fs.readFileSync(DIR + "/" + filename); + translations[language] = JSON.parse(stripJsonComments(raw.toString('utf8'))); + } +}); + +fs.readdirSync(MOBILE_DIR).forEach(function(filename) { + if (filename.match(/\.json$/) && BLACKLIST.indexOf(filename) === -1) { + var language = filename.replace(/\.json$/, ""); + + var raw = fs.readFileSync(MOBILE_DIR + "/" + filename); + translations[language + "_mobile"] = JSON.parse(stripJsonComments(raw.toString('utf8'))); + } +}); + +var languages = Object.keys(translations).sort(); +// bring BASE_LANGUAGE to front +languages.splice(languages.indexOf(BASE_LANGUAGE), 1); +languages.unshift(BASE_LANGUAGE); + +// put _mobile behind it's parent +_.forEach(languages, function(language, idx) { + if (language.match(/_mobile$/)) { + var _language = language.substr(0, language.length -7); + + languages.splice(languages.indexOf(language), 1); + languages.splice(languages.indexOf(_language)+1, 0, language); + } +}); + +var keys = Object.keys(translations[BASE_LANGUAGE]).filter(function(key) { return ['NULL'].indexOf(key) === -1; }); + +var rows = _.map(keys, function(key) { + return [key].concat(_.map(languages, function(language) { + return translations[language][key] || ""; + })); +}); + +rows.unshift(['KEY'].concat(languages)); + +rows = rows.map(function(row) { + return row.map(function(v) { + // in JSON we do multiline as ["line1", "line2"] + if (typeof v !== "string") { + v = v.join("\n"); + } + + return v; + }); +}); + +csv.stringify(rows, {delimiter: ";", quoted: true}, function(err, raw) { + if (err) throw err; + + console.log(raw); +}); diff --git a/import-csv.js b/import-csv.js new file mode 100644 index 0000000..c24da6b --- /dev/null +++ b/import-csv.js @@ -0,0 +1,182 @@ +var _ = require('lodash'); +var stripJsonComments = require('strip-json-comments'); +var fs = require('fs'); +var Q = require('q'); +var csv = require('csv'); +var _debug = require('debug'); + +var debug = function(prefix) { + var d = _debug(prefix); + return function() { + var args = Array.prototype.slice.call(arguments); + return d.apply(void 0, [args.map(function() { return '%o'; }).join(" ")].concat(args)); + }; +}; + +var BASE_LANGUAGE = "english"; +var BLACKLIST = ['package.json']; +var DIR = __dirname + "/translations"; +var MOBILE_DIR = DIR + "/mobile"; + +var translations = {}; + +fs.readdirSync(DIR).forEach(function(filename) { + if (filename.match(/\.json$/) && BLACKLIST.indexOf(filename) === -1) { + var language = filename.replace(/\.json$/, ""); + + var raw = fs.readFileSync(DIR + "/" + filename); + translations[language] = JSON.parse(stripJsonComments(raw.toString('utf8'))); + } +}); + +fs.readdirSync(MOBILE_DIR).forEach(function(filename) { + if (filename.match(/\.json$/) && BLACKLIST.indexOf(filename) === -1) { + var language = filename.replace(/\.json$/, ""); + + var raw = fs.readFileSync(MOBILE_DIR + "/" + filename); + translations[language + "_mobile"] = JSON.parse(stripJsonComments(raw.toString('utf8'))); + } +}); + +var languages = Object.keys(translations).sort(); +// bring BASE_LANGUAGE to front +languages.splice(languages.indexOf(BASE_LANGUAGE), 1); +languages.unshift(BASE_LANGUAGE); + +// put _mobile behind it's parent +_.forEach(languages, function(language, idx) { + if (language.match(/_mobile$/)) { + var _language = language.substr(0, language.length -7); + + languages.splice(languages.indexOf(language), 1); + languages.splice(languages.indexOf(_language)+1, 0, language); + } +}); + +var keys = Object.keys(translations[BASE_LANGUAGE]).filter(function(key) { return ['NULL'].indexOf(key) === -1; }); + +var raw = fs.readFileSync(__dirname + "/translations.csv").toString('utf8'); + +csv.parse(raw, {delimiter: ";", columns: true}, function(err, data) { + if (err) throw err; + + data.forEach(function(row) { + languages.forEach(function(language) { + if (row[language]) { + if (row[language].match(/\n/)) { + row[language] = row[language].split(/\n/); + } + + if (keys.indexOf(row.KEY) !== -1) { + translations[language][row.KEY] = row[language]; + } + } + }); + }); + + languages.forEach(function(language) { + var isMobile = language.match(/_mobile$/); + var filename = isMobile ? language.substr(0, language.length -7) : language; + + var rawOriginal = fs.readFileSync((isMobile ? MOBILE_DIR : DIR) + "/" + filename + ".json").toString('utf8'); + var rowsOriginal = rawOriginal.split("\n"); + var commentLines = {}; + var blankLines = {}; // @TODO + var comments = {}; + var skip = 0; + + _.forEach(rowsOriginal, function(row, idx) { + if (skip > 0) { + skip--; + return; + } + + var blankLine = row.match(/^\s*$/); + var commentLine = row.match(/^( *?)\/\/(.+)/); + var comment = row.match(/".+?[^\\]",(( *?)\/\/(.+))$/); + + debug('import-csv:parse-original')("-----------"); + debug('import-csv:parse-original')(row, !!blankLine, !!commentLine, !!comment); + + if (blankLine) { + var beforeKey = null; + + _.any(rowsOriginal.slice(idx+1), function(nextRow, nextIdx) { + var key = nextRow.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:parse-original')(nextRow, !!commentLine, !!key); + + if (key) { + beforeKey = key[2]; + + return true; + } + }); + + if (beforeKey) { + blankLines[beforeKey] = true; + } + + } else if (commentLine) { + var _commentLine = [commentLine[0]]; + var beforeKey = null; + + _.any(rowsOriginal.slice(idx+1), function(nextRow, nextIdx) { + var commentLine = nextRow.match(/^( *)\/\/(.+)/); + var key = nextRow.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:parse-original')(nextRow, !!commentLine, !!key); + + if (key) { + beforeKey = key[2]; + + return true; + } else if (commentLine) { + _commentLine.push(commentLine[0]); + skip++; + } else { + debug('import-csv:parse-original')('WHAT IS THIS?', nextRow); + } + }); + + debug('import-csv:parse-original')(_commentLine); + if (beforeKey) { + commentLines[beforeKey] = _commentLine; + } + } else if (comment) { + var key = row.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:parse-original')(!!comment && comment[1], !!key && key[2]); + + if (key) { + comments[key[2]] = comment[1]; + } + + } + }); + + var json = JSON.stringify(translations[language], null, 4).split("\n"); + + json.slice().forEach(function(line) { + var key = line.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:output')(line, !!key && key[2], !!key && typeof commentLines[key[2]] !== "undefined"); + + if (!!key && blankLines[key[2]]) { + json.splice(json.indexOf(line), 0, ""); + } + + if (!!key && commentLines[key[2]]) { + commentLines[key[2]].reverse().forEach(function(comment) { + json.splice(json.indexOf(line), 0, comment); + }); + } + + if (!!key && comments[key[2]]) { + json.splice(json.indexOf(line), 1, line + comments[key[2]]); + } + }); + + fs.writeFileSync((isMobile ? MOBILE_DIR : DIR) + "/" + filename + ".json", json.join("\n") + "\n"); + }); +}); diff --git a/mobile-duplicates.js b/mobile-duplicates.js new file mode 100644 index 0000000..ab10487 --- /dev/null +++ b/mobile-duplicates.js @@ -0,0 +1,192 @@ +var _ = require('lodash'); +var stripJsonComments = require('strip-json-comments'); +var fs = require('fs'); +var Q = require('q'); +var csv = require('csv'); +var _debug = require('debug'); + +var debug = function(prefix) { + var d = _debug(prefix); + return function() { + var args = Array.prototype.slice.call(arguments); + return d.apply(void 0, [args.map(function() { return '%o'; }).join(" ")].concat(args)); + }; +}; + +var BASE_LANGUAGE = "english"; +var BLACKLIST = ['package.json']; +var DIR = __dirname + "/translations"; +var MOBILE_DIR = DIR + "/mobile"; + +var translations = {}; + +fs.readdirSync(DIR).forEach(function(filename) { + if (filename.match(/\.json$/) && BLACKLIST.indexOf(filename) === -1) { + var language = filename.replace(/\.json$/, ""); + + var raw = fs.readFileSync(DIR + "/" + filename); + translations[language] = JSON.parse(stripJsonComments(raw.toString('utf8'))); + } +}); + +fs.readdirSync(MOBILE_DIR).forEach(function(filename) { + if (filename.match(/\.json$/) && BLACKLIST.indexOf(filename) === -1) { + var language = filename.replace(/\.json$/, ""); + + var raw = fs.readFileSync(MOBILE_DIR + "/" + filename); + translations[language + "_mobile"] = JSON.parse(stripJsonComments(raw.toString('utf8'))); + } +}); + +var languages = Object.keys(translations).sort(); + +var keys = Object.keys(translations[BASE_LANGUAGE]).filter(function(key) { return ['NULL'].indexOf(key) === -1; }); + +languages.forEach(function(language) { + var isMobile = language.match(/_mobile$/); + var _language = isMobile ? language.substr(0, language.length - 7) : language; + var filename = _language; + + if (isMobile) { + // merge keys unknown in base file to base file + Object.keys(translations[language]).forEach(function(key) { + if (!translations[_language][key]) { + translations[_language][key] = translations[language][key]; + delete translations[language][key]; + keys.push(key); + } + }); + + // + keys.forEach(function(key) { + if (translations[_language][key] == translations[language][key]) { + delete translations[language][key]; + } + }); + + var rawOriginal = fs.readFileSync((isMobile ? MOBILE_DIR : DIR) + "/" + filename + ".json").toString('utf8'); + var rowsOriginal = rawOriginal.split("\n"); + var commentLines = {}; + var blankLines = {}; // @TODO + var comments = {}; + var skip = 0; + + _.forEach(rowsOriginal, function(row, idx) { + if (skip > 0) { + skip--; + return; + } + + var blankLine = row.match(/^\s*$/); + var commentLine = row.match(/^( *?)\/\/(.+)/); + var comment = row.match(/".+?[^\\]",(( *?)\/\/(.+))$/); + + debug('import-csv:parse-original')("-----------"); + debug('import-csv:parse-original')(row, !!blankLine, !!commentLine, !!comment); + + if (blankLine) { + var beforeKey = null; + + _.any(rowsOriginal.slice(idx+1), function(nextRow, nextIdx) { + var key = nextRow.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:parse-original')(nextRow, !!commentLine, !!key); + + if (key) { + beforeKey = key[2]; + + return true; + } + }); + + if (beforeKey) { + blankLines[beforeKey] = true; + } + + } else if (commentLine) { + var _commentLine = [commentLine[0]]; + var beforeKey = null; + + _.any(rowsOriginal.slice(idx+1), function(nextRow, nextIdx) { + var commentLine = nextRow.match(/^( *)\/\/(.+)/); + var key = nextRow.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:parse-original')(nextRow, !!commentLine, !!key); + + if (key) { + beforeKey = key[2]; + + return true; + } else if (commentLine) { + _commentLine.push(commentLine[0]); + skip++; + } else { + debug('import-csv:parse-original')('WHAT IS THIS?', nextRow); + } + }); + + debug('import-csv:parse-original')(_commentLine); + if (beforeKey) { + commentLines[beforeKey] = _commentLine; + } + } else if (comment) { + var key = row.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:parse-original')(!!comment && comment[1], !!key && key[2]); + + if (key) { + comments[key[2]] = comment[1]; + } + + } + }); + + var json = JSON.stringify(translations[language], null, 4).split("\n"); + + json.slice().forEach(function(line) { + var key = line.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:output')(line, !!key && key[2], !!key && typeof commentLines[key[2]] !== "undefined"); + + if (!!key && blankLines[key[2]]) { + json.splice(json.indexOf(line), 0, ""); + } + + if (!!key && commentLines[key[2]]) { + commentLines[key[2]].reverse().forEach(function(comment) { + json.splice(json.indexOf(line), 0, comment); + }); + } + + if (!!key && comments[key[2]]) { + json.splice(json.indexOf(line), 1, line + comments[key[2]]); + } + }); + + fs.writeFileSync(MOBILE_DIR + "/" + filename + ".json", json.join("\n") + "\n"); + + var json = JSON.stringify(translations[_language], null, 4).split("\n"); + + json.slice().forEach(function(line) { + var key = line.match(/^( +?)"(.+?)"( *?):/); + + debug('import-csv:output')(line, !!key && key[2], !!key && typeof commentLines[key[2]] !== "undefined"); + + if (!!key && blankLines[key[2]]) { + json.splice(json.indexOf(line), 0, ""); + } + + if (!!key && commentLines[key[2]]) { + commentLines[key[2]].reverse().forEach(function(comment) { + json.splice(json.indexOf(line), 0, comment); + }); + } + + if (!!key && comments[key[2]]) { + json.splice(json.indexOf(line), 1, line + comments[key[2]]); + } + }); + + fs.writeFileSync(DIR + "/" + filename + ".json", json.join("\n") + "\n"); + } +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..b92bb2c --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "blocktrail-wallet-translations", + "version": "1.0.0", + "description": "Translation package for Wallet - by BlockTrail", + "dependencies": { + "csv": "^0.4.6", + "debug": "^2.2.0", + "jsesc": "^0.5.0", + "lodash": "^3.7.0", + "q": "^1.4.1", + "strip-json-comments": "^1.0.2" + }, + "devDependencies": {} +} diff --git a/translations/americanEnglish.json b/translations/americanEnglish.json new file mode 100644 index 0000000..009af74 --- /dev/null +++ b/translations/americanEnglish.json @@ -0,0 +1,3 @@ +{ + "MSG_INIT_WALLET": "initializing wallet..." +} diff --git a/translations/dutch.json b/translations/dutch.json new file mode 100644 index 0000000..cfd42e3 --- /dev/null +++ b/translations/dutch.json @@ -0,0 +1,36 @@ +{ + // general + "LOGOUT": "uitloggen", + "SEND": "verzenden", + "RECEIVE": "ontvangen", + "BACK": "terug", + "GO_BACK": "ga terug", + "NEXT": "volgende", + "CONTINUE": "verder", + "CANCEL": "anuleren", + "OK": "OK", + "DONE": "klaar", + "CONFIRM": "bevestig", + "SYNC": "sync", + "SYNC_NOW": "nu syncen", + "OPTIONAL": "optioneel", + "SUCCESS": "successvol", + "COMPLETE": "voltooid", + "THANKS_1": "bedankt", + "THANKS_2": "bedankt", + "FAIL": "mislukt", + "LOADING": "laden", + "SAVING": "opslaan", + "WORKING": "bezig", + "VERIFYING": "verifieren", + "SYNCING": "syncen", + + "SETUP_WALLET_BACKUP_TEXT_APPEND": [ + "Het is belangrijk om je backup veilig, offline te bewaren.", + "In geval van nood kan je met dit backup document altijd bij je bitcoins die in je wallet zitten." + ], + "MSG_BACKUP_EMAIL_BODY_1": [ + "bijgevoegd is het backup document van je Blocktrail Wallet.", + "Bewaar het op een veilige plek, in geval van nood zal je dit document en je wachtwoord nodig hebben om je Wallet te herstellen. " + ] +} diff --git a/translations/english.json b/translations/english.json new file mode 100644 index 0000000..9925307 --- /dev/null +++ b/translations/english.json @@ -0,0 +1,443 @@ +{ + "LOGOUT": "logout!!", + // general + "SEND": "send", + "RECEIVE": "receive", + "BACK": "back", + "GO_BACK": "go back", + "NEXT": "next", + "CONTINUE": "continue", + "CANCEL": "cancel", + "OK": "OK", + "DONE": "done", + "CONFIRM": "confirm", + "APPLY": "apply", + "SYNC": "sync", + "SYNC_NOW": "sync now", + "OPTIONAL": "optional", + "SUCCESS": "success", + "COMPLETE": "complete", + "THANKS_1": "thanks", + "THANKS_2": "thank you", + "FAIL": "failed", + "LOADING": "loading", + "SAVING": "saving", + "WORKING": "working", + "VERIFYING": "verifying", + "SYNCING": "syncing", + "SKIP_STEP": "skip this step", + "PLEASE_WAIT": "please wait", + "PLEASE_WAIT_2": "just a sec", + "NONE": "none", + "TAKEN": "taken", + "SEARCH": "search", + "STATUS": "status", + "COPY": "copy", + "EMAIL": "email", + "SMS": "SMS", + "ERROR_TITLE_1": "oh dear", + "ERROR_TITLE_2": "oops", + "ERROR_TITLE_3": "error", + "ION_REFRESHER": "Pull to refresh...", + "BALANCE": "balance", + "BALANCE_AVAILABLE": "available balance", + "BALANCE_CONFIRMED": "confirmed balance", + "BALANCE_UNCONFIRMED": "unconfirmed balance", + "TRANSACTIONS": "transactions", + "WELCOME": "welcome", + "TWO_FACTOR_TOKEN": "2FA token", + "NAVBAR_WALLET": "wallet", + "NAvbar_EXPLORER": "explorer", + "NAVBAR_DEVELOPER": "developer", + "NAVBAR_SIGNUP": "developer", + "NAVBAR_LOGIN": "developer", + "MENU_TRANSACTIONS": "transactions", + "MENU_SEND": "send", + "MENU_RECEIVE": "receive", + "MENU_SETTINGS": "settings", + "APP_DOWNLOAD_ON": "get it on", + "ANDROID": "android", + "IOS": "iOS", + + // launch & setup screens + "LAUNCH_NEW_ACCOUNT": "create a new account", + "LAUNCH_EXISTING_ACCOUNT": "already have an account?", + "SETUP_FORGOT_PASSWORD": "Reset your password", + "SETUP_FORGOT_PASSWORD_Q": "forgot password?", + "'SETUP_FORGOT_PASS_PLACEHOLDER'": "email address", + "SETUP_LOGIN": "sign in", + "LOGGING_IN": "signing in", + "SETUP_LOGIN_PLACEHOLDER": "username or email", + "SETUP_USERNAME_PLACEHOLDER": "username", + "SETUP_EMAIL_PLACEHOLDER": "email", + "SETUP_PASSWORD_PLACEHOLDER": "password", + "SETUP_PASSWORD_REPEAT_PLACEHOLDER": "password repeat", + "SETUP_PIN_PLACEHOLDER": "Create a PIN", + "SETUP_PIN_REPEAT_PLACEHOLDER": "Repeat PIN", + "SETUP_LOGIN_FAILED": "login failed", + "SETUP_REGISTER": "create new wallet", + "SETUP_EXISTING_WALLET": "existing wallet found", + "SETUP_WALLET_PASSWORD": "wallet password", + "SETUP_WALLET_BACKUP": "Download your wallet backup", + "'SETUP_WALLET_BACKUP_CHECKBOX'": "please confirm that you have saved your wallet recovery phrases", + "SETUP_WALLET_BACKUP_TEXT": "before you start using your new wallet, please", + "SETUP_WALLET_BACKUP_TEXT_BOLD": "download the below backup document", + "SETUP_WALLET_BACKUP_TEXT_APPEND": "It is important to keep this backup confidential and to store it securely offline. In case of emergency, this backup document lets you access and recover any funds stored on the wallet.", + "BACKUP_EMAIL_PDF": "email backup PDF", + "BACKUP_CREATE_PDF": "download wallet backup", + "BACKUP_CHECKBOX": "I saved my backup securely", + "SETUP_PHONE": "setup phone", + "SETUP_SYNC_CONTACTS": "sync contacts", + "SETUP_PROFILE_PIC": "set profile picture", + "SETUP_COMPLETE": "go to my wallet", + "CREATING_ACCOUNT": "creating account", + "CREATING_WALLET": "creating wallet", + "CREATING_GENERATE_PRIMARYKEY": "generating primary key", + "CREATING_GENERATE_BACKUPKEY": "generating backup key", + "CREATING_SUBMIT_WALLET": "synchronizing with servers", + "CREATING_INIT_WALLET": "initialising wallet", + "CREATING_DONE": "Done. Redirecting...", + "SAVING_WALLET": "saving wallet", + "LOADING_WALLET": "loading wallet", + "MSG_BAD_NETWORK": "no network connection", + "MSG_BAD_LOGIN": "incorrect login details", + "MSG_INCORRECT_PASSWORD": "incorrect password", + "MSG_INCORRECT_PASSWORD_CAPS_ON": "warning; you had your caps-lock on while typing in the password!", + "MSG_MISSING_LOGIN": "please enter your login details", + "MSG_MISSING_PASSWORD": "please enter your password", + "MSG_MISSING_TWO_FACTOR_TOKEN": "please enter your two-factor authentication token", + "MSG_INCORRECT_TWO_FACTOR_TOKEN": "incorrect two-factor authentication token", + "MSG_INVALID_USERNAME": "invalid username", + "MSG_BAD_USERNAME": "please choose a username with at least 4 alphanumeric characters", + "MSG_BAD_PASSWORD": "please enter a valid password", + "MSG_BAD_PASSWORD_REPEAT": "the passwords don't match", + "MSG_USERNAME_TAKEN": "that username already taken", + "MSG_BAD_EMAIL": "invalid email", + "MSG_EMAIL_TAKEN": "that email is already taken", + "MSG_UPGRADE_REQUIRED": "Please login on www.blocktrail.com first to automatically upgrade your account and enable the mobile wallet", + "MSG_PIN_HELP": "Create a PIN which you will use to unlock your wallet to make transaction", + "MSG_WALLET_PASSWORD_MISMATCH": "You have an existing wallet which was created with a different password", + "MSG_WALLET_PASSWORD": "please enter the old wallet password", + "MSG_REPEAT_PASSWORD": "please repeat your password", + "MSG_SAVE_BACKUP": "please save a backup to continue", + "MSG_BACKUP_EMAIL_SUBJECT_1": "BlockTrail mobile wallet backup", + "MSG_BACKUP_EMAIL_BODY_1": [ + "your mobile wallet backup document is attached.", + "Store it in a safe place.", + "you will need it along with your current password to recover your wallet in an emergency." + ], + // side menu + "MY_WALLET": "my wallet", + "SEND_FEEDBACK": "send feedback", + // My Wallet screen + "INTERNAL_TRANSACTION_TITLE": "sent to self", + "WALLET_NO_TXS": "no transactions, yet", + "WALLET_ACTION_PRE": "get started by", + "WALLET_ACTION_LINK": "funding your wallet", + "WALLET_NO_MORE_TXS": "no more transactions", + "TX_INFO_SENT": "sent bitcoin", + "TX_INFO_RECEIVED": "received bitcoin", + "TX_INFO_HASH": "transaction ID", + "TX_INFO_TIME_SUBTITLE": "at time of transaction", + "TX_INFO_TIME_SUBTITLE_2": "at current price", + "TX_INFO_DATE_SENT": "date sent", + "TX_INFO_DATE_RECEIVED": "date received", + "TX_INFO_PENDING": "pending", + "TX_INFO_CONFIRMATIONS_TITLE": "confirmations", + "TX_INFO_SENT_TO": "sent to", + "TX_INFO_RECEIVED_FROM": "received from", + "TX_INFO_MESSAGE_TITLE": "message/reference", + // Sending screens + "QR": "QR", + "CONTACTS": "contacts", + "BLUETOOTH": "bluetooth", + "BITCOIN_ADDRESS": "address", + "SENDING": "sending", + "SEARCH_CONTACTS": "Search Contacts...", + "SEND_TO": "recipient address", + "SEND_ADDRESS_FOUND": "address copied", + "SEND_MESSAGE_PLACEHOLDER": "Message or payment reference...", + "WALLET_PIN": "wallet PIN", + "TRANSACTION_SEND_SUCCESS": "Transaction Sent", + "WALLET_PASSWORD": "Wallet Password", + "AMOUNT": "amount", + "TWO_FACTOR_TOKEN_DESC": "a two-factor authentication token is required to send transactions.", + "TO": "to", + "SENDING_CONFIRM_TITLE": "Confirm your password", + "SENDING_CONFIRM_MSG": "You are sending", + "ESITIMATED_FEE": "Network fee: ", + "SEND_BITCOIN_TITLE": "send bitcoin", + // messages + "MSG_GET_CONTACT_ADDR": "getting contact address...", + "MSG_INIT_WALLET": "initialising wallet...", + "MSG_SENDING": "sending...", + "MSG_MISSING_AMOUNT": "please enter a valid amount", + "MSG_MISSING_RECIPIENT": "please specify a recipient", + "MSG_INVALID_RECIPIENT": "invalid recipient", + "MSG_INSUFFICIENT_FUNDS": "insufficient funds", + "MSG_BAD_PIN": "incorrect pin", + "MSG_BAD_PWD": "incorrect password", + "MSG_BAD_ADDRESS": "invalid bitcoin address", + "MSG_BAD_CONTACT": "unable to get an address for that contact", + "MSG_BAD_CLIPBOARD": "no valid address found in clipboard", + "MSG_CLIPBOARD_ADDRESS": "an address was found in your clipboard", + "MSG_SEND_FAIL_UNKNOWN": "there was a problem sending your transaction", + // contacts list + "CONTACTS_NONE": "no contacts found", + "CONTACTS_NO_WALLETS": "none of your contacts have a BlockTrail wallet", + "CONTACTS_INVITE": "invite to Wallet", + "CONTACTS_MORE_NUMBERS": "more", + "CONTACTS_FILTER_TITLE": "filter contacts", + "CONTACTS_SHOW_ALL": "all contacts", + "CONTACTS_WALLETS_ONLY": "with wallets", + "CONTACTS_REFRESH": "refresh contacts", + "CONTACTS_RESYNC": "re-sync contacts", + "MSG_INVITE_CONTACT": [ + "Hi, get the BlockTrail Wallet app for Bitcoin!", + "Download it here: https://www.blocktrail.com/mywallet/download" + ], + "RECEIVE_BITCOIN_TITLE": "receive bitcoin", + "BITCOIN_ADDRESS_RECEIVE_HELP": "A new bitcoin address has been created for you. Use this address to receive funds.", + "WAITING_FOR_PAYMENT": "waiting for payment", + "PAYMENT_RECEIVED": "payment received", + // Receiving Screens + "REQUEST_SEND": "send request", + "MSG_REQUEST_EMAIL_SUBJECT_1": "Please send me bitcoins", + "MSG_REQUEST_EMAIL_BODY_1": [ + "Hi,

Please send funds to my Bitcoin wallet (QR code attached).", + "

Address: {{address}} ", + "


Sent with Wallet by BlockTrail

" + ], + "MSG_REQUEST_EMAIL_SUBJECT_2": "Please send me {{btcValue}} bitcoins (approx {{fiatValue}} {{localCurrency}})", + "MSG_REQUEST_EMAIL_BODY_2": [ + "Hi,

Please send funds to my Bitcoin wallet (QR code attached).", + "

Address: {{address}} ", + "
Amount: {{btcValue}} BTC (approx {{fiatValue}} {{localCurrency}})

", + "


Sent with my BlockTrail Wallet

" + ], + "MSG_REQUEST_SMS_1": [ + "Hi,", + "Please send funds to my Bitcoin wallet.", + "Address: {{address}}" + ], + "MSG_REQUEST_SMS_2": [ + "Hi,", + "Please send {{btcValue}} BTC (approx {{fiatValue}} {{localCurrency}}) to my Bitcoin wallet.", + "Address: {{address}}" + ], + // Settings page + "SETTINGS": "settings", + "SETTINGS_ACCOUNT": "account", + "SETTINGS_PROFILE": "profile", + "SETTING_USERNAME": "username", + "SETTINGS_TAKE_PHOTO": "take a photo", + "SETTINGS_CHOOSE_PHOTO": "choose a photo", + "SETTINGS_REMOVE_PHOTO": "remove photo", + "SETTINGS_CURRENCY": "currency", + "SETTINGS_LANGUAGE": "language", + "SETTINGS_WALLET": "wallet", + "SETTINGS_CURRENT_WALLET": "current wallet", + "SETTINGS_CHANGE_PIN": "change pin", + "SETTINGS_CHANGE_PASSWORD": "change password", + "SETTINGS_RECOMMENDED": "recommended", + "SETTINGS_NEWSLETTER": "Keep me updated with Blocktrail news", + "SETTINGS_RESET_ACCOUNT": "reset wallet", + "SETTINGS_WALLET_BACKUP": "wallet backup", + "SETTINGS_INFO": "info", + "SETTINGS_ABOUT": "about", + "SETTINGS_VERSION": "version", + "SETTINGS_DEVELOPMENT": "development", + "SETTINGS_WALLET_POLLING": "wallet polling", + "SETTINGS_PHONE": "phone", + "SETTINGS_CONTACTS_SYNC": "contacts sync", + "SETTINGS_CONTACTS_SYNCED": "synced", + "SETTINGS_CONTACTS_UNSYNCED": "not synced", + "SETTINGS_PHONE_NUMBER": "phone number", + "SETTINGS_PHONE_UPDATE": "update phone", + "SETTINGS_PHONE_CHANGE": "change phone", + "SETTINGS_PHONE_RESEND": "resend code", + "SETTINGS_PHONE_REMOVE": "remove phone", + "SETTINGS_PHONE_CHANGE_COUNTRY": "change country", + "SETTINGS_PHONE_PLACEHOLDER": "phone number", + "SETTINGS_TOKEN_PLACEHOLDER": "verification code", + "SETTINGS_PHONE_REQUIRE_VERIFY": "phone verification required", + "SETTINGS_PROFILE_PICTURE": "Profile Picture", + "SETTINGS_SAVE": "Save Settings", + "SETTINGS_CROP_PROFILE_PIC": "crop your profile picture", + "SETTINGS_CROP_ALLOWED_FILE_TYPES": "allowed file types", + "SETTINGS_PROFILE_PIC_SAVED": "your profile picture has been saved", + "SETTINGS_2FA": "two-factor authentication", + "SETTINGS_2FA_STEP1": "step 1. verify password", + "SETTINGS_2FA_STEP1_BODY": "please enter your password to set up two-factor authentication", + "SETTINGS_2FA_PASSWORD": "password", + "SETTINGS_2FA_STEP2": "step 2. account setup", + "SETTINGS_2FA_STEP2_BODY": [ + "download google authentication", + " or Authy on your smartphone and scan the QRCode below to add Blocktrail to your app." + ], + "SETINGS_2FA_STEP2_CODE": "or manually enter this code: {{ secret }}.", + "SETTINGS_2FA_STEP3": "step 3. verification", + "SETTINGS_2FA_STEP3_BODY": "enter a token from your smartphone app to verify everything is working.", + "SETTINGS_2FA_VERIFY_TOKEN": "verify token", + "SETTINGS_2FA_DONE": "successfully set up two-factor authentication!", + "SETTINGS_2FA_DISABLE_BODY": "enter a token from your smartphone app to disable two-factor authentication.", + "SETTINGS_2FA_DISABLE_2FA": "disable 2FA", + "SETTINGS_2FA_HELP": "Secure your account using multi-device authentication", + "SETTINGS_CURRENT_PIN": "Current PIN", + "SETTINGS_NEW_PIN": "New PIN", + "SETTINGS_REPEAT_PIN": "Repeat PIN", + "MSG_ARE_YOU_SURE": "are you sure?", + "MSG_RESET_WALLET": [ + "Resetting your wallet will delete all data from the app.", + "You can then login again to reload your wallet or create a new account and wallet.", + "Would you like to continue?" + ], + "MSG_ENTER_PIN": "please enter your current PIN", + "MSG_ENTER_NEW_PIN": "enter a new PIN (min 4 numbers)", + "MSG_REPEAT_PIN": "please repeat the PIN", + "MSG_BAD_PIN_REPEAT": "the PINs don't match", + "MSG_BAD_PIN_LENGTH": "the new PIN must be at least 4 numbers", + "MSG_TRY_AGAIN": "please try again", + "MSG_PIN_CHANGED": "your PIN has been changed", + "SEND_PHONE_NUMBER_REQUIRED": "To be able to send bitcoin to contacts in your phone's address book you need to provide your phone number.", + "SEND_PHONE_NUMBER_REQUIRED_IOS": [ + "To be able to send bitcoin to contacts in your phone's address book you need to provide your phone number ", + "and give access to your contacts." + ], + // messages + "SETTINGS_PHONE_VERIFIED": "verified", + "SETTINGS_PHONE_UNVERIFIED": "unverified", + "MSG_BAD_TOKEN": "invalid or expired token", + "MSG_PHONE_UPDATED": "A code has been sent to your phone for verification", + "MSG_PHONE_VERIFIED": "your phone has been verified", + "MSG_PHONE_REQUIRE_VERIFY": "please verify your phone to continue", + + // feedback + "FEEDBACK": "feedback", + "SEND_FEEDBACK_PLACEHOLDER": "your message...", + "MSG_BAD_FEEDBACK": "please enter a message", + "MSG_FEEDBACK_SUCCESS": "your feedback has been sent", + // languages + "ENGLISH": "english", + "ENGLISH_US": "english (US)", + "FRENCH": "french", + "GERMAN": "german", + "DUTCH": "dutch", + "CHANGE_PASSWORD": "change password", + "ENTER_CURRENT_PASSWORD": "please enter your current password", + "ENTER_NEW_PASSWORD": "please enter your new password", + "ENTER_REPEAT_PASSWORD": "please repeat your new password", + "CHANGE_PASSWORD_WALLET_INPROGRESS": "please wait while we encrypt your wallet with your new password", + "CHANGE_PASSWORD_ACCOUNT_INPROGRESS": "please wait while we update your password for your account", + "CHANGE_PASSWORD_SUCCESS": "your password has been changed!", + "CHANGE_PASSWORD_BACKUP": [ + "your password has been updated!
", + "because your old backup will not work with the new password you need to download 1 extra page ", + "and store that with the existing document!" + ], + // permission popups + "PERMISSION_REQUIRED": "permission required", + "PERMISSION_REQUIRED_CONTACTS": "Wallet needs access to your contacts", + "PERMISSION_REQUIRED_CAMERA": "Wallet needs access to your camera", + "PERMISSION_REQUIRED_PHOTOS": "Wallet needs access to your photos", + "MSG_CONTACTS_PERMISSIONS": "To grant access to your contacts go to settings>BlockTrail Wallet>Contacts", + "MSG_CAMERA_PERMISSIONS": "To grant access to your camera go to settings>BlockTrail Wallet>App.photo", + "MSG_PHOTOS_PERMISSIONS": "To grant access to your photos go to settings>BlockTrail Wallet>Photos", + "SORRY": "sorry", + "SYNCING_ALL": "syncing all", + "MSG_COPIED_TO_CLIPBOARD": "copied to clipboard", + "SETUP_WALLET_BACKUP_CONFIRM": "I have saved my backup", + "SETUP_SKIP_BACKUP": "do this later", + "TWO_FACTOR_REQUIRED": "two factor required", + "MSG_CANT_OPEN_PDF": "there's no app installed to open the backup PDF.", + "MSG_TWO_FACTOR_REQUIRED": "a 2fa code is required", + "MSG_SKIP_BACKUP": [ + "You will be able to save your backup later by going to Settings>Wallet Backup", + "Please note that the backup info will remain on this phone until then, which is a security risk" + ], + "MSG_EMAIL_NOT_SETUP": [ + "You don't have a default mail account configured on this phone.", + "", + "Please configure your mail app, or you can skip this step and save your backup later when we support alternative apps" + ], + "TX_INFO_FEE": "fee", + "ESTIMATED_FEE": "estimated fee", + "QR_SCAN_OVERLAY": "scan QR code", + "MSG_BAD_ADDRESS_2": "that doesn't appear to be a valid bitcoin address", + "MSG_NEW_TX": "New transaction received!", + "MSG_ADDRESS_COPIED": "address copied to clipboard", + // Promo code page + "PROMO_CODES": "Promo Codes", + "REDEEM": "redeem", + "CHECKING": "checking", + "MSG_MISSING_PROMO_CODE": "please enter a promo code", + "MSG_BAD_PROMO_CODE": "that doesn't seem to be a valid code", + "SETTINGS_BACKUP_COMPLETE": "backup saved", + "SETTINGS_BACKUP_INCOMPLETE": "backup not saved", + "SETTINGS_DISPLAY": "display", + "SETTINGS_PRIVACY": "privacy", + "SETTINGS_USAGE_DATA": "send usage data", + "MSG_BACKUP_SAVED_ALREADY": [ + "your backup has already been saved. ", + "The backup data is no longer stored on this phone." + ], + "NULL": null, + "ENABLE": "enable", + "DISABLE": "disable", + "ENABLED": "enabled", + "DISABLED": "disabled", + "ADDRESS": "address", + "MSG_CORRUPT_DATA": "Unfortunately your data has become corrupted. Please log back in to reload your wallet.", + "MSG_ORPHAN_BLOCK": "Warning: orphan block detected. Your wallet will resync it's transactions", + "SETUP_SIGNUP_METHOD": "sign up with", + "SETUP_PIN_DESC_TITLE": "Create a PIN code of 4 or more digits.", + "SETUP_PIN_DESC_SUBTITLE": "Make sure you can easily remember it, you will need it to make transactions and access some settings and features.", + "SETUP_PHONE_DESC_TITLE": "Link your phone number to your wallet?", + "SETUP_PHONE_DESC_SUBTITLE": "Your contacts will then be able to send funds directly to your wallet using your phone number.", + "SETUP_PHONE_SKIP_MSG": "You can always do this later in the settings.", + "SETUP_PHONE_LINKED": "Phone linked", + "SETUP_CONTACTS_DESC_TITLE": "Synchronise your contacts?", + "SETUP_CONTACTS_DESC_SUBTITLE": "This will let the app to search the contacts on your phone for other Wallet users, so you can easily send bitcoins directly to them.", + "SETUP_WEB_SYNC": "Sync contacts to web wallet", + "SETUP_COMPLETE_TITLE": "You're all done!", + "SETUP_COMPLETE_SUBTITLE": "Welcome to the world of Bitcoin", + "SETUP_COMPLETE_SUBTITLE_2": "Visit www.blocktrail.com/faq for tips and tricks.", + "MSG_USERNAME_WARNING": "*Signing up with a username gives you greater privacy and anonymity, but at a cost of being able to recover passwords and receive critical emails from us.", + "MSG_BACKUP_DESCRIPTION": "Save your wallet backup and store it safely so you can recover your wallet if anything happens.", + "WALLET_YOUR_BITCOINS": "Your Bitcoins", + "TX_INFO_MORE_TITLE": "more info", + "TX_INFO_MORE_LINK": "see on blocktrail.com", + "AVAILABLE_BALANCE": "Available Balance", + "AMOUNT_PLACEHOLDER": "amount", + "RECIPIENT_PLACEHOLDER": "send to", + "ENTER_ADDRESS_TITLE": "enter a bitcoin address", + "CONTACTS_DISABLED": "contacts disabled", + "MSG_REQUIRE_CONTACTS_ACCESS": "Please enable 'Contacts' on the settings menu to use this feature", + "SETTINGS_UPDATE_PHOTO": "update photo", + "SETTINGS_PROFILE_DESCRIPTION": "Set a profile picture that your contacts will see when you send to them.", + "SETTINGS_BTC_DECIMALS": "BTC decimal display", + "SETTINGS_ENABLE_CONTACTS": "enable contacts?", + "SETTINGS_DISABLE_CONTACTS": "disable contacts syncing?", + "SETTINGS_PHONE_DESCRIPTION": "Linking your wallet to your phone number will allow you to send to contacts in your phone who also have a Blocktrail Wallet.", + "SETTINGS_ENCRYPTION": "encryption", + "MSG_BACKUP_UNSAVED": [ + "WARNING!", + "You have not saved your backup sheet. If you log out this data will be lost and cannot be created again.", + "Are you sure you wish to continue?" + ], + "MSG_PHONE_CODE_SENT": "A code has been sent to your phone. Please enter it below to confirm your number.", + "MSG_ENABLE_CONTACTS": [ + "This will enable contacts syncing to discover contacts on your device with a wallet. ", + "You will then be able to send directly to them." + ], + "MSG_DISABLE_CONTACTS": "Disabling contacts will delete all synced data and you won't be able send to your contacts any more.", + // About + "ABOUT_TITLE": "Wallet", + "ABOUT_SUBTITLE": "by Blocktrail", + "ABOUT_DESCRIPTION": "Blocktrail is an Amsterdam based Bitcoin tech startup.", + "ABOUT_LABEL_NEWS": "news", + "ABOUT_LABEL_RATEAPP": "Do you like the app?", + "ABOUT_RATEAPP": "Please Rate Wallet!", + "PROMO_REDEEM": "redeem a promo code", + "PROMO_CODE_PLACEHOLDER": "Promo Code" +} diff --git a/translations/french.json b/translations/french.json new file mode 100644 index 0000000..3c512f8 --- /dev/null +++ b/translations/french.json @@ -0,0 +1,363 @@ +{ + //contacts list + "CONTACTS_SHOW_ALL_BUTTON": "afficher tous", + "CONTACTS_WALLETS_ONLY_BUTTON": "masquer sans portefeuilles", + + // general + "SEND": "envoyer", + "RECEIVE": "recevoir", + "BACK": "précédent", + "GO_BACK": "précédent", + "NEXT": "suivant", + "CONTINUE": "suivant", + "CANCEL": "annuler", + "OK": "OK", + "DONE": "fini", + "CONFIRM": "confirmer", + "APPLY": "appliquer", + "ENABLE": "activer", + "DISABLE": "désactiver", + "ENABLED": "activé", + "DISABLED": "désactivé", + "SYNC": "synchroniser", + "SYNC_NOW": "synchroniser", + "OPTIONAL": "optionnel", + "SUCCESS": "succès", + "COMPLETE": "complet", + "THANKS_1": "merci", + "THANKS_2": "merci", + "SORRY": "Désolé", + "FAIL": "manqué", + "LOADING": "chargement", + "SAVING": "sauvegarder", + "WORKING": "finalisation", + "VERIFYING": "vérifier", + "SYNCING": "synchronisation", + "SYNCING_ALL": "synchronisation", + "SKIP_STEP": "sauter cette étape", + "PLEASE_WAIT": "veuillez patienter", + "PLEASE_WAIT_2": "juste une minute", + "NONE": "aucun", + "TAKEN": "occupé", + "SEARCH": "recherche", + "STATUS": "statut", + "COPY": "copier", + "EMAIL": "email", + "SMS": "SMS", + "ERROR_TITLE_1": "erreur", + "ERROR_TITLE_2": "oops", + "ERROR_TITLE_3": "erreur", + "ION_REFRESHER": "Glisser pour actualiser...", + "ADDRESS": "adresse", + "BALANCE": "solde", + "BALANCE_AVAILABLE": "solde disponible", + "BALANCE_CONFIRMED": "solde confirmé", + "BALANCE_UNCONFIRMED": "solde non confirmé", + "MSG_COPIED_TO_CLIPBOARD": "copié dans le presse-papier", + "MSG_CORRUPT_DATA": "Malheureusement vos données sont corrompues. Veuillez vous reconnecter pour recharger votre portefeuille.", + "MSG_ORPHAN_BLOCK": "Attention : bloc orphelin détecté. Votre portefeuille va resynchroniser ses transactions", + // launch & setup screens + "LAUNCH_NEW_ACCOUNT": "nouveau compte", + "LAUNCH_EXISTING_ACCOUNT": "se connecter", + "SETUP_LOGIN": "se connecter", + "LOGGING_IN": "connexion", + "SETUP_SIGNUP_METHOD": "s'inscrire avec", + "SETUP_LOGIN_PLACEHOLDER": "nom d'utilisateur ou email", + "SETUP_USERNAME_PLACEHOLDER": "nom d'utilisateur", + "SETUP_EMAIL_PLACEHOLDER": "email", + "SETUP_PASSWORD_PLACEHOLDER": "mot de passe", + "SETUP_PASSWORD_REPEAT_PLACEHOLDER": "répétez le mot de passe", + "SETUP_PIN_DESC_TITLE": "Créez un code PIN de 4 chiffres ou plus.", + "SETUP_PIN_DESC_SUBTITLE": "Soyez sûr(e) de vous en souvenir, vous en aurez besoin pour faire des transactions et pour accéder à certains paramètres et fonctionnalités.", + "SETUP_PIN_PLACEHOLDER": "Nouveau code PIN", + "SETUP_PIN_REPEAT_PLACEHOLDER": "Répétez le code PIN", + "SETUP_LOGIN_FAILED": "connexion échouée", + "SETUP_REGISTER": "créer un compte", + "SETUP_EXISTING_WALLET": "portefeuille existant trouvé", + "SETUP_WALLET_PASSWORD": "mot de passe du portefeuille", + "SETUP_WALLET_BACKUP": "sauvegarde du portefeuille", + "SETUP_WALLET_BACKUP_CONFIRM": "J'ai enregistré ma sauvegarde", + "SETUP_SKIP_BACKUP": "le faire plus tard", + "BACKUP_EMAIL_PDF": "envoyer par email la sauvegarde PDF", + "BACKUP_CREATE_PDF": "ouvrir la sauvegarde PDF", + "SETUP_PHONE_DESC_TITLE": "Relier votre numéro de téléphone à votre portefeuille ?", + "SETUP_PHONE_DESC_SUBTITLE": "Vos contacts seront capables de vous envoyer des fonds directement à votre portefeuille en utilisant votre numéro de téléphone.", + "SETUP_PHONE_SKIP_MSG": "Vous pouvez toujours faire ceci plus tard dans les paramètres.", + "SETUP_PHONE_LINKED": "Téléphone relié", + "SETUP_PHONE": "configurer le téléphone", + "SETUP_CONTACTS_DESC_TITLE": "Synchroniser vos contacts ?", + "SETUP_CONTACTS_DESC_SUBTITLE": "Ceci permettra à l'appli de rechercher les contacts de votre téléphone pour les autres utilisateurs de portefeuille, vous pourrez donc envoyer facilement et directement des bitcoins à eux.", + "SETUP_SYNC_CONTACTS": "Synchroniser les contacts", + "SETUP_WEB_SYNC": "Synchroniser les contacts dans le portefeuille web", + "SETUP_PROFILE_PIC": "définir une photo de profil", + "SETUP_COMPLETE_TITLE": "C'est terminé !", + "SETUP_COMPLETE_SUBTITLE": "Bienvenue dans l'univers de Bitcoin", + "SETUP_COMPLETE_SUBTITLE_2": "Visitez www.blocktrail.com/faq pour les trucs et astuces.", + "SETUP_COMPLETE": "aller dans mon portefeuille", + "CREATING_ACCOUNT": "création du compte", + "CREATING_WALLET": "création du portefeuille", + "TWO_FACTOR_REQUIRED": "2FA requis", + "CREATING_GENERATE_PRIMARYKEY": "génération de la clé primaire", + "CREATING_GENERATE_BACKUPKEY": "génération de la clé de sauvegarde", + "CREATING_SUBMIT_WALLET": "envoi des infos du portefeuille au serveur", + "CREATING_INIT_WALLET": "initialisation du portefeuille", + "CREATING_DONE": "terminé", + "SAVING_WALLET": "enregistrement du portefeuille", + "LOADING_WALLET": "chargement du portefeuille", + "MSG_USERNAME_WARNING": "*S'inscrire avec un nom d'utilisateur renforce votre anonymat, mais vous ne pourrez pas récupérer vos mots de passe et recevoir des emails critiques de notre part.", + "MSG_CANT_OPEN_PDF": "il n'y a pas d'appli installé pour ouvrir la sauvegarde PDF.", + "MSG_BAD_NETWORK": "aucune connexion réseau", + "MSG_BAD_LOGIN": "informations de connexion incorrectes", + "MSG_MISSING_LOGIN": "veuillez entrer vos informations de connexion", + "MSG_INVALID_USERNAME": "nom d'utilisateur invalide", + "MSG_BAD_USERNAME": "veuillez choisir un nom d'utilisateur avec au moins 4 caractères alphanumériques", + "MSG_BAD_PASSWORD": "veuillez entrer un mot de passe valide", + "MSG_BAD_PASSWORD_REPEAT": "les mots de passe ne correspondent pas", + "MSG_USERNAME_TAKEN": "ce nom d'utilisateur est déjà pris", + "MSG_BAD_EMAIL": "email invalide", + "MSG_EMAIL_TAKEN": "cet email est déjà pris", + "MSG_TWO_FACTOR_REQUIRED": "un code 2FA est requis", + "MSG_UPGRADE_REQUIRED": "Veuillez d'abord vous connecter sur www.blocktrail.com pour mettre à jour automatiquement votre compte et activer le portefeuille mobile", + "MSG_PIN_HELP": "Créer un PIN que vous utiliserez pour déverrouiller votre portefeuille pour faire des transactions", + "MSG_WALLET_PASSWORD_MISMATCH": "Vous avez un portefeuille existant qui a été créé avec un mot de passe différent", + "MSG_WALLET_PASSWORD": "veuillez entrer l'ancien mot de passe", + "MSG_REPEAT_PASSWORD": "veuillez répéter votre mot de passe", + "MSG_BACKUP_DESCRIPTION": "Enregistrez votre sauvegarde de portefeuille et conservez-la dans un endroit sûr pour récupérer votre portefeuille si quelque chose arrive.", + "MSG_SAVE_BACKUP": "veuillez enregistrer une sauvegarde pour continuer", + "MSG_SKIP_BACKUP": [ + "Vous pourrez sauvegarder votre sauvegarde plus tard en allant dans Paramètres>Sauvegarde de portefeuille", + "Veuillez noter que les infos de sauvegarde resteront sur ce téléphone jusqu'à la sauvegarde, ce qui présente un risque de sécurité" + ], + "MSG_EMAIL_NOT_SETUP": [ + "Vous n'avez pas de compte email par défaut configuré sur ce téléphone.", + "", + "Veuillez configurer votre application email, ou passer cette étape et enregistrer votre sauvegarde plus tard quand nous supporteront des app alternatives" + ], + "MSG_BACKUP_EMAIL_SUBJECT_1": "Sauvegarde du portefeuille mobile Blocktrail", + "MSG_BACKUP_EMAIL_BODY_1": [ + "Votre document de sauvegarde du portefeuille mobile est attaché.", + "Conservez-le dans un endroit sûr.", + "Vous en aurez besoin avec votre mot de passe actuel pour récupérer votre portefeuille en cas d'urgence." + ], + // side menu + "MY_WALLET": "mon portefeuille", + "SEND_FEEDBACK": "envoyer feedback", + // My Wallet screen + "INTERNAL_TRANSACTION_TITLE": "envoyé à vous-même", + "WALLET_NO_TXS": "pas de transactions", + "WALLET_NO_MORE_TXS": "pas plus de transactions", + "WALLET_YOUR_BITCOINS": "Vos Bitcoins", + "TX_INFO_SENT": "bitcoin envoyé", + "TX_INFO_RECEIVED": "bitcoin reçu", + "TX_INFO_HASH": "hash de transaction", + "TX_INFO_TIME_SUBTITLE": "au moment de la transaction", + "TX_INFO_TIME_SUBTITLE_2": "au prix courant", + "TX_INFO_FEE": "frais", + "TX_INFO_DATE_SENT": "date d'envoi", + "TX_INFO_DATE_RECEIVED": "date de réception", + "TX_INFO_PENDING": "en attendant", + "TX_INFO_CONFIRMATIONS_TITLE": "confirmations", + "TX_INFO_SENT_TO": "envoyé à", + "TX_INFO_RECEIVED_FROM": "reçu de", + "TX_INFO_MESSAGE_TITLE": "message/référence", + "TX_INFO_MORE_TITLE": "plus d'infos", + "TX_INFO_MORE_LINK": "voir sur blocktrail.com", + // Sending screens + "QR": "QR", + "CONTACTS": "contacts", + "BLUETOOTH": "bluetooth", + "BITCOIN_ADDRESS": "adresse bitcoin", + "AVAILABLE_BALANCE": "Solde disponible", + "AMOUNT_PLACEHOLDER": "montant", + "RECIPIENT_PLACEHOLDER": "envoyer a", + "ENTER_ADDRESS_TITLE": "entrer une adresse bitcoin", + "SENDING": "envoi", + "SEARCH_CONTACTS": "Recherche...", + "SEND_TO": "envoyer à", + "SEND_ADDRESS_FOUND": "adresse copiée", + "SEND_MESSAGE_PLACEHOLDER": "Message ou référence de paiement...", + "WALLET_PIN": "PIN du portefeuille", + "TRANSACTION_SEND_SUCCESS": "votre transaction a été envoyé", + "ESTIMATED_FEE": "frais estimés", + "QR_SCAN_OVERLAY": "scanner un code QR", + // messages + "MSG_GET_CONTACT_ADDR": "obtention de l'adresse du contact...", + "MSG_INIT_WALLET": "initialisation du portefeuille...", + "MSG_SENDING": "envoi...", + "MSG_MISSING_AMOUNT": "veuillez entrer un montant en bitcoins", + "MSG_MISSING_RECIPIENT": "veuillez entrer un bénéficiaire", + "MSG_INSUFFICIENT_FUNDS": "pas assez de fonds pour cette transaction", + "MSG_BAD_PIN": "mauvais code PIN", + "MSG_BAD_PWD": "mauvais mot de passe", + "MSG_BAD_ADDRESS": "adresse Bitcoin invalide", + "MSG_BAD_ADDRESS_2": "adresse Bitcoin invalide", + "MSG_BAD_CONTACT": "impossible d'obtenir une adresse pour ce contact", + "MSG_BAD_CLIPBOARD": "aucune adresse Bitcoin trouvée dans le presse-papier", + "MSG_CLIPBOARD_ADDRESS": "une adresse a été trouvée dans votre presse-papier", + "MSG_SEND_FAIL_UNKNOWN": "il y avait un problème d'envoi", + // contacts list + "CONTACTS_NONE": "aucun contact trouvé", + "CONTACTS_NO_WALLETS": "aucun de vos contacts n'a de portefeuille Blocktrail", + "CONTACTS_INVITE": "inviter au portefeuille", + "CONTACTS_MORE_NUMBERS": "plus", + "CONTACTS_FILTER_TITLE": "filtrer les contacts", + "CONTACTS_SHOW_ALL": "tous les contacts", + "CONTACTS_WALLETS_ONLY": "avec portefeuilles", + "CONTACTS_REFRESH": "actualiser les contacts", + "CONTACTS_RESYNC": "resynchroniser les contacts", + "CONTACTS_DISABLED": "contacts désactivés", + "MSG_REQUIRE_CONTACTS_ACCESS": "Veuillez activer les 'Contacts' dans le menu des paramètres pour utiliser cette fonctionnalité", + "MSG_INVITE_CONTACT": [ + "Salut, télécharge l'appli Blocktrail Wallet pour utiliser Bitcoin !", + "Télécharge-la ici : https://blocktrail.com/download" + ], + // Receiving Screens + "REQUEST_SEND": "envoyer une demande", + "MSG_NEW_TX": "Nouvelle transaction reçue !", + "MSG_ADDRESS_COPIED": "adresse copiée dans le presse-papier", + "MSG_REQUEST_EMAIL_SUBJECT_1": "Envoyez-moi des bitcoins", + "MSG_REQUEST_EMAIL_BODY_1": [ + "Bonjour,

Envoyez-moi des fonds dans mon portefeuille Bitcoin (code QR attaché)", + "

Adresse : {{address}} ", + "


envoyé avec Portefeuille par Blocktrail

" + ], + "MSG_REQUEST_EMAIL_SUBJECT_2": "Envoyez-moi {{btcValue}} bitcoins (environ {{fiatValue}} {{localCurrency}})", + "MSG_REQUEST_EMAIL_BODY_2": [ + "Bonjour,

Envoyez-moi des fonds dans mon portefeuille Bitcoin (code QR attaché)", + "

Adresse : {{address}} ", + "
Montant : {{btcValue}} BTC (environ {{fiatValue}} {{localCurrency}})

", + "


envoyé avec Wallet by Blocktrail

" + ], + "MSG_REQUEST_SMS_1": [ + "Bonjour, ", + "Envoyez-moi des fonds dans mon portefeuille Bitcoin. ", + "Adresse : {{address}}" + ], + "MSG_REQUEST_SMS_2": [ + "Bonjour, ", + "Envoyez-moi {{btcValue}} BTC (environ {{fiatValue}} {{localCurrency}}) a mon portefeuille Bitcoin. ", + "Adresse : {{address}}" + ], + // Settings page + "SETTINGS": "paramètres", + "SETTINGS_ACCOUNT": "compte", + "SETTINGS_PROFILE": "profil", + "SETTING_USERNAME": "nom d'utilisateur", + "SETTINGS_TAKE_PHOTO": "prendre une photo", + "SETTINGS_CHOOSE_PHOTO": "choisir une photo", + "SETTINGS_REMOVE_PHOTO": "supprimer la photo", + "SETTINGS_UPDATE_PHOTO": "mettre à jour la photo", + "SETTINGS_PROFILE_DESCRIPTION": "Ajoutez une photo de profil que vos contacts veront quand vous leur envoyez.", + "SETTINGS_CURRENCY": "monnaie", + "SETTINGS_LANGUAGE": "langue", + "SETTINGS_WALLET": "portefeuille", + "SETTINGS_CURRENT_WALLET": "portefeuille actuel", + "SETTINGS_BTC_DECIMALS": "Affichage des décimales BTC", + "SETTINGS_CHANGE_PIN": "changer le code PIN", + "SETTINGS_RESET_ACCOUNT": "se déconnecter", + "SETTINGS_WALLET_BACKUP": "sauvegarde de portefeuille", + "SETTINGS_BACKUP_COMPLETE": "sauvegarde enregistrée", + "SETTINGS_BACKUP_INCOMPLETE": "sauvegarde non enregistrée", + "SETTINGS_DISPLAY": "affichage", + "SETTINGS_INFO": "infos", + "SETTINGS_ABOUT": "à propos", + "SETTINGS_VERSION": "version", + "SETTINGS_DEVELOPMENT": "développement", + "SETTINGS_WALLET_POLLING": "auto actualisation", + "SETTINGS_PHONE": "téléphone", + "SETTINGS_CONTACTS_SYNC": "synchroniser les contacts", + "SETTINGS_CONTACTS_SYNCED": "synchronisés", + "SETTINGS_CONTACTS_UNSYNCED": "non synchronisés", + "SETTINGS_ENABLE_CONTACTS": "activer les contacts ?", + "SETTINGS_DISABLE_CONTACTS": "activer la synchronisation des contacts ?", + "SETTINGS_PHONE_DESCRIPTION": "Relier votre portefeuille à votre numéro de téléphone vous permettra d'envoyer des bitcoins à vos contacts téléphoniques qui ont des portefeuilles Blocktrail.", + "SETTINGS_PHONE_NUMBER": "numéro", + "SETTINGS_PHONE_UPDATE": "mettre à jour le téléphone", + "SETTINGS_PHONE_CHANGE": "changer le téléphone", + "SETTINGS_PHONE_RESEND": "renvoyer le code", + "SETTINGS_PHONE_REMOVE": "supprimer le téléphone", + "SETTINGS_PHONE_CHANGE_COUNTRY": "changer le pays", + "SETTINGS_PHONE_PLACEHOLDER": "numéro de téléphone", + "SETTINGS_TOKEN_PLACEHOLDER": "code de vérification", + "SETTINGS_PHONE_REQUIRE_VERIFY": "vérification de téléphone requise", + "SETTINGS_PRIVACY": "confidentialité", + "SETTINGS_ENCRYPTION": "chiffrement", + "SETTINGS_USAGE_DATA": "envoyer des données d'utilisation", + "SETTINGS_CURRENT_PIN": "PIN actuel", + "SETTINGS_NEW_PIN": "Nouveau PIN", + "SETTINGS_REPEAT_PIN": "Répétez le PIN", + "MSG_ARE_YOU_SURE": "êtes-vous sûr(e) ?", + "MSG_RESET_WALLET": [ + "Voulez-vous vous déconnecter de votre portefeuille actuel ?", + "Vous pourrez vous reconnecter, ou créer un nouveau compte" + ], + "MSG_BACKUP_UNSAVED": [ + "ATTENTION !", + "Vous n'avez pas sauvegardé votre feuille de sauvegarde. Si vous vous déconnectez ces données seront perdues et ne pourront pas être recréées.", + "Êtes-vous certain(e) de vouloir continuer ?" + ], + "MSG_ENTER_PIN": "veuillez saisir votre PIN actuel", + "MSG_ENTER_NEW_PIN": "entrez un nouveau PIN (min 4 chiffres)", + "MSG_REPEAT_PIN": "veuillez répéter le PIN", + "MSG_BAD_PIN_REPEAT": "les PIN ne correspondent pas", + "MSG_BAD_PIN_LENGTH": "Le nouveau PIN doit contenir au moins 4 chiffres", + "MSG_TRY_AGAIN": "veuillez réessayer", + "MSG_PIN_CHANGED": "votre PIN a été changé", + "MSG_PHONE_CODE_SENT": "Un code a été envoyé a votre téléphone. Veuillez le saisir ci-dessous pour confirmer votre nombre.", + "MSG_ENABLE_CONTACTS": [ + "Ceci va activer la synchronisation des contacts pour découvrir ceux qui disposent d'un portefeuille. ", + "Vous serez capable d'envoyer directement des bitcoins à eux." + ], + "MSG_DISABLE_CONTACTS": "La désactivation des contacts supprimera toutes les données synchronisées et vous ne pourrez plus envoyer des bitcoins à vos contacts.", + "MSG_BACKUP_SAVED_ALREADY": [ + "votre sauvegarde a déjà été sauvegardée. ", + "La sauvegarde n'est plus stockée sur ce téléphone." + ], + "SEND_PHONE_NUMBER_REQUIRED": "Pour être capable d'envoyer des bitcoins aux contacts de votre carnet d'adresses de votre téléphone, vous devez fournir votre numéro de téléphone.", + "SEND_PHONE_NUMBER_REQUIRED_IOS": [ + "Pour être capable d'envoyer des bitcoins aux contacts de votre carnet d'adresses de votre téléphone, vous devez fournir votre numéro de téléphone ", + "et donner l'accès à vos contacts." + ], + // About + "ABOUT_TITLE": "Portefeuille", + "ABOUT_SUBTITLE": "par Blocktrail", + "ABOUT_DESCRIPTION": "Blocktrail est une startup Bitcoin basée à Amsterdam.", + "ABOUT_LABEL_NEWS": "news", + "ABOUT_LABEL_RATEAPP": "Aimez-vous l'appli ?", + "ABOUT_RATEAPP": "Notez le portefeuille !", + // messages + "SETTINGS_PHONE_VERIFIED": "vérifié", + "SETTINGS_PHONE_UNVERIFIED": "non vérifié", + "MSG_BAD_TOKEN": "token invalide ou périmé", + "MSG_PHONE_UPDATED": "Un code a été envoyé à votre téléphone pour vérification", + "MSG_PHONE_VERIFIED": "votre téléphone a été vérifié", + "MSG_PHONE_REQUIRE_VERIFY": "veuillez vérifier votre téléphone pour continuer", + // Promo code page + "PROMO_CODES": "Codes Promo", + "REDEEM": "racheter", + "CHECKING": "vérification", + "PROMO_REDEEM": "racheter un code promotionnel", + "PROMO_CODE_PLACEHOLDER": "Promo Code", + "MSG_MISSING_PROMO_CODE": "veuillez entrer un code promotionnel", + "MSG_BAD_PROMO_CODE": "ce n'est pas un code valide", + "MSG_PROMO_CODE_SUCCESS": "Code valide", + // feedback + "FEEDBACK": "commentaires", + "SEND_FEEDBACK_PLACEHOLDER": "vos commentaires...", + "MSG_BAD_FEEDBACK": "veuillez entrer un message", + "MSG_FEEDBACK_SUCCESS": "votre commentaire a été envoyé", + // languages + "ENGLISH": "anglais", + "ENGLISH_US": "anglais (USA)", + "FRENCH": "français", + "GERMAN": "allemand", + "DUTCH": "néerlandais", + // permission popups + "PERMISSION_REQUIRED": "permission requise", + "PERMISSION_REQUIRED_CONTACTS": "Le portefeuille a besoin d'accéder à vos contacts", + "PERMISSION_REQUIRED_CAMERA": "Le portefeuille a besoin d'accéder à votre caméra", + "PERMISSION_REQUIRED_PHOTOS": "Le portefeuille a besoin d'accéder à vos photos", + "MSG_CONTACTS_PERMISSIONS": "Pour accorder l'accès à vos contacts sur votre appareil, allez dans réglages>Blocktrail Wallet>Contacts", + "MSG_CAMERA_PERMISSIONS": "Pour accorder l'accès à votre caméra sur votre appareil, allez dans réglages>Blocktrail Wallet>App.photo", + "MSG_PHOTOS_PERMISSIONS": "Pour accorder l'accès à vos photos sur votre appareil, allez dans réglages>Blocktrail Wallet>Photo" +} diff --git a/translations/mobile/americanEnglish.json b/translations/mobile/americanEnglish.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/translations/mobile/americanEnglish.json @@ -0,0 +1 @@ +{} diff --git a/translations/mobile/dutch.json b/translations/mobile/dutch.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/translations/mobile/dutch.json @@ -0,0 +1 @@ +{} diff --git a/translations/mobile/english.json b/translations/mobile/english.json new file mode 100644 index 0000000..b3cec61 --- /dev/null +++ b/translations/mobile/english.json @@ -0,0 +1,75 @@ +{ + + // launch & setup screens + "LAUNCH_NEW_ACCOUNT": "new account", + "LAUNCH_EXISTING_ACCOUNT": "sign in", + "SETUP_PIN_PLACEHOLDER": "New PIN code", + "SETUP_PIN_REPEAT_PLACEHOLDER": "Repeat PIN code", + "SETUP_REGISTER": "create account", + "SETUP_WALLET_BACKUP": "wallet backup", + "BACKUP_CREATE_PDF": "open backup PDF", + "CREATING_SUBMIT_WALLET": "sending wallet info to server", + "CREATING_DONE": "done", + "MSG_SKIP_BACKUP": [ + "You will be able to save your backup later by going to Settings>Wallet Backup", + "Please note that the backup info will remain on this phone until then, which is a security risk" + ], + "MSG_EMAIL_NOT_SETUP": [ + "You don't have a default mail account configured on this phone.", + "", + "Please configure your mail app, or you can skip this step and save your backup later when we support alternative apps" + ], + "MSG_BACKUP_EMAIL_SUBJECT_1": "Blocktrail mobile wallet backup", + "MSG_BACKUP_EMAIL_BODY_1": [ + "Your mobile wallet backup document is attached.", + "Store it in a safe place. ", + "You will need it along with your current password to recover your wallet in an emergency." + ], + "WALLET_NO_TXS": "no transactions", + "TX_INFO_HASH": "transaction hash", + "BITCOIN_ADDRESS": "bitcoin address", + "SEND_TO": "send to", + "WALLET_PIN": "wallet PIN code", + "TRANSACTION_SEND_SUCCESS": "your transaction has been sent", + "MSG_MISSING_AMOUNT": "please enter an amount in Bitcoin", + "MSG_INSUFFICIENT_FUNDS": "you do not have enough funds for this transaction", + "CONTACTS_NO_WALLETS": "none of your contacts have a Blocktrail wallet", + "MSG_INVITE_CONTACT": [ + "Hi, get the Blocktrail Wallet app for Bitcoin!", + "Download it here: https://blocktrail.com/download" + ], + "MSG_REQUEST_EMAIL_BODY_1": [ + "Hi,

Please send funds to my Bitcoin wallet (QR code attached)", + "

Address: {{address}} ", + "


Sent with Wallet by Blocktrail

" + ], + "MSG_REQUEST_EMAIL_BODY_2": [ + "Hi,

Please send funds to my Bitcoin wallet (QR code attached)", + "

Address: {{address}} ", + "
Amount: {{btcValue}} BTC (approx {{fiatValue}} {{localCurrency}})

", + "


Sent with my Blocktrail Wallet

" + ], + "MSG_REQUEST_SMS_1": [ + "Hi, ", + "Please send funds to my Bitcoin wallet. ", + "Address: {{address}}" + ], + "MSG_REQUEST_SMS_2": [ + "Hi, ", + "Please send {{btcValue}} BTC (approx {{fiatValue}} {{localCurrency}}) to my Bitcoin wallet. ", + "Address: {{address}}" + ], + "SETTINGS_RESET_ACCOUNT": "logout", + "SETTINGS_WALLET_POLLING": "background polling", + "MSG_RESET_WALLET": [ + "Would you like to logout of your current wallet?", + "You can then log back in, or create a new account" + ], + "SEND_PHONE_NUMBER_REQUIRED_IOS": [ + "To be able to send bitcoin to contacts in your phone's address book you need to provide your phone number ", + "and give access to your contacts." + ], + "MSG_CONTACTS_PERMISSIONS": "To grant access to your contacts on your device, go to settings>Blocktrail Wallet>Contacts", + "MSG_CAMERA_PERMISSIONS": "To grant access to your camera on your device, go to settings>Blocktrail Wallet>App.photo", + "MSG_PHOTOS_PERMISSIONS": "To grant access to your photos on your device, go to settings>Blocktrail Wallet>Photo" +} diff --git a/translations/mobile/french.json b/translations/mobile/french.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/translations/mobile/french.json @@ -0,0 +1 @@ +{}