Merge branch 'master' into martin/IOS-2053

This commit is contained in:
Martin Böttcher 2022-01-05 09:58:29 +01:00
commit 85339e95d1
78 changed files with 885 additions and 833 deletions

11
Podfile
View File

@ -28,8 +28,6 @@ pod 'blurhash', git: 'https://github.com/signalapp/blurhash', branch: 'signal-ma
pod 'SignalServiceKit', path: '.', testspecs: ["Tests"]
pod 'ZKGroup', git: 'https://github.com/signalapp/zkgroup', testspecs: ["Tests"]
pod 'SignalArgon2', git: 'https://github.com/signalapp/Argon2.git', submodules: true, testspecs: ["Tests"]
# pod 'SignalArgon2', path: '../Argon2', testspecs: ["Tests"]
@ -257,11 +255,6 @@ def disable_non_development_pod_warnings(installer)
!installer.development_pod_targets.include?(target)
end
# ZKGroup is security sensitive and is going to be around for the foreseeable
# future. Let's always warn for it to keep an eye on the warnings
# (and also fix the warnings)
always_warn_names = ['ZKGroup']
installer.pods_project.targets.each do |target|
target.build_configurations.each do |build_configuration|
# Only suppress warnings for the debug configuration
@ -272,10 +265,6 @@ def disable_non_development_pod_warnings(installer)
target.name.include?(non_dev_target.name)
end
next if always_warn_names.any? do |warnable_target_name|
target.name.include?(warnable_target_name)
end
build_configuration.build_settings['GCC_WARN_INHIBIT_ALL_WARNINGS'] = 'YES'
build_configuration.build_settings['OTHER_SWIFT_FLAGS'] ||= '$(inherited)'
build_configuration.build_settings['OTHER_SWIFT_FLAGS'] << ' -suppress-warnings'

View File

@ -90,9 +90,9 @@ PODS:
- SAMKeychain (1.5.3)
- SignalArgon2 (1.3.2)
- SignalArgon2/Tests (1.3.2)
- SignalClient (0.9.0):
- SignalClient (0.12.0):
- SignalCoreKit
- SignalClient/Tests (0.9.0):
- SignalClient/Tests (0.12.0):
- SignalCoreKit
- SignalCoreKit (1.0.0):
- CocoaLumberjack
@ -205,8 +205,6 @@ PODS:
- YYImage/Core
- YYImage/WebP (1.0.4):
- YYImage/Core
- ZKGroup (0.8.2)
- ZKGroup/Tests (0.8.2)
DEPENDENCIES:
- blurhash (from `https://github.com/signalapp/blurhash`, branch `signal-master`)
@ -241,8 +239,6 @@ DEPENDENCIES:
- SwiftProtobuf (>= 1.14.0)
- YYImage (from `https://github.com/signalapp/YYImage`)
- YYImage/libwebp (from `https://github.com/signalapp/YYImage`)
- ZKGroup (from `https://github.com/signalapp/zkgroup`)
- ZKGroup/Tests (from `https://github.com/signalapp/zkgroup`)
SPEC REPOS:
trunk:
@ -320,8 +316,6 @@ EXTERNAL SOURCES:
:git: https://github.com/signalapp/Starscream.git
YYImage:
:git: https://github.com/signalapp/YYImage
ZKGroup:
:git: https://github.com/signalapp/zkgroup
CHECKOUT OPTIONS:
blurhash:
@ -353,7 +347,7 @@ CHECKOUT OPTIONS:
:git: https://github.com/signalapp/Argon2.git
:submodules: true
SignalClient:
:commit: aaa24f6efae6114f1252ae86f02aeedc69a8b151
:commit: 3da7078ffe3f818b0b6c871f12cc4fd6d7c25fa8
:git: https://github.com/signalapp/libsignal-client.git
SignalCoreKit:
:commit: 517562ffa87cd18fe812d2abe50ff152e03e47e7
@ -367,9 +361,6 @@ CHECKOUT OPTIONS:
YYImage:
:commit: 62a4cede20bcf31da73d18163408e46a92f171c6
:git: https://github.com/signalapp/YYImage
ZKGroup:
:commit: bbd71fd1fb56cbaf5af6e20d3837b210d5bbd5e2
:git: https://github.com/signalapp/zkgroup
SPEC CHECKSUMS:
blurhash: 4b3b2b8909cf41ab59fa349788654b8387284ff4
@ -399,7 +390,7 @@ SPEC CHECKSUMS:
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
SignalArgon2: 1c24183835ca861e6af06631c18b1671cdf35571
SignalClient: 5e281d5917af94036553debe8450b209d603c280
SignalClient: 2dcc2d86deaf6736af34dfa11caa23d54f5a0aed
SignalCoreKit: 87da14c58d57760793b892ff03838c5ef2ce1167
SignalMetadataKit: eb928ec98376ab5a6ef2108a7fcd3b2d792b8c65
SignalRingRTC: f78bb3674dd0baee0e60a920064ee07f5ba82ae8
@ -419,8 +410,7 @@ SPEC CHECKSUMS:
SwiftNIOTransportServices: 896c9a4ac98698d32aa2feea7657ade219ae80bb
SwiftProtobuf: 3320217e9d8fb75f36b40282e78c482640fd75dd
YYImage: f1ddd15ac032a58b78bbed1e012b50302d318331
ZKGroup: 8f762d76c98c38d4de3c9a3406309e873a856383
PODFILE CHECKSUM: 94178b0d43076f2339b589fc4cc0e76b1855e94c
PODFILE CHECKSUM: 1e25c00efcbd52fb42b214c37129048ddbf653e4
COCOAPODS: 1.10.1

2
Pods

@ -1 +1 @@
Subproject commit ec43624433612adacdbd8fc7c411d9eb6eeb1805
Subproject commit 1782e1973f3430ed4ef153c785f0c74f758c3927

View File

@ -1014,6 +1014,7 @@
F0038601273F6388000B5ABD /* Stripe.swift in Sources */ = {isa = PBXBuildFile; fileRef = F00385FE273F6388000B5ABD /* Stripe.swift */; };
F02564D8274EDF4600D7B48A /* BadgeExpirationSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = F02564D7274EDF4600D7B48A /* BadgeExpirationSheet.swift */; };
F05F51C926A90D6B00861034 /* ContextMenuActionsAccessory.swift in Sources */ = {isa = PBXBuildFile; fileRef = F05F51C826A90D6B00861034 /* ContextMenuActionsAccessory.swift */; };
F090C8202762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F090C81F2762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift */; };
F0B872B6269CF6D900D26481 /* ContextMenuInteraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0B872B5269CF6D900D26481 /* ContextMenuInteraction.swift */; };
F0B872B8269D079B00D26481 /* ContextMenuConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0B872B7269D079B00D26481 /* ContextMenuConfiguration.swift */; };
F0CA67FA2728A89A002B9DFE /* SubscriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0CA67F92728A89A002B9DFE /* SubscriptionViewController.swift */; };
@ -2342,6 +2343,7 @@
F00385FE273F6388000B5ABD /* Stripe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stripe.swift; sourceTree = "<group>"; };
F02564D7274EDF4600D7B48A /* BadgeExpirationSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeExpirationSheet.swift; sourceTree = "<group>"; };
F05F51C826A90D6B00861034 /* ContextMenuActionsAccessory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuActionsAccessory.swift; sourceTree = "<group>"; };
F090C81F2762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiReactionPickerConfigViewController.swift; sourceTree = "<group>"; };
F0B872B5269CF6D900D26481 /* ContextMenuInteraction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuInteraction.swift; sourceTree = "<group>"; };
F0B872B7269D079B00D26481 /* ContextMenuConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuConfiguration.swift; sourceTree = "<group>"; };
F0C124B626D4788A0031C96F /* NSE-Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "NSE-Images.xcassets"; sourceTree = "<group>"; };
@ -3951,6 +3953,7 @@
isa = PBXGroup;
children = (
880D90292480887F003D2B14 /* EmojiPickerSheet.swift */,
F090C81F2762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift */,
880D902B2480889B003D2B14 /* EmojiPickerCollectionView.swift */,
880D902D2480A23E003D2B14 /* EmojiPickerSectionToolbar.swift */,
88238EBB24F21EE400F28079 /* EmojiSkinTonePicker.swift */,
@ -5320,7 +5323,6 @@
"${BUILT_PRODUCTS_DIR}/SignalServiceKit/SignalServiceKit.framework",
"${BUILT_PRODUCTS_DIR}/SwiftProtobuf/SwiftProtobuf.framework",
"${BUILT_PRODUCTS_DIR}/YYImage/YYImage.framework",
"${BUILT_PRODUCTS_DIR}/ZKGroup/ZKGroup.framework",
"${BUILT_PRODUCTS_DIR}/blurhash/blurhash.framework",
"${BUILT_PRODUCTS_DIR}/libPhoneNumber-iOS/libPhoneNumber_iOS.framework",
"${BUILT_PRODUCTS_DIR}/libwebp/libwebp.framework",
@ -5372,7 +5374,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SignalServiceKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftProtobuf.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYImage.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZKGroup.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/blurhash.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libPhoneNumber_iOS.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libwebp.framework",
@ -5452,7 +5453,6 @@
"${BUILT_PRODUCTS_DIR}/SignalServiceKit/SignalServiceKit.framework",
"${BUILT_PRODUCTS_DIR}/SwiftProtobuf/SwiftProtobuf.framework",
"${BUILT_PRODUCTS_DIR}/YYImage/YYImage.framework",
"${BUILT_PRODUCTS_DIR}/ZKGroup/ZKGroup.framework",
"${BUILT_PRODUCTS_DIR}/blurhash/blurhash.framework",
"${BUILT_PRODUCTS_DIR}/libPhoneNumber-iOS/libPhoneNumber_iOS.framework",
"${BUILT_PRODUCTS_DIR}/libwebp/libwebp.framework",
@ -5476,7 +5476,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SignalServiceKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftProtobuf.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYImage.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZKGroup.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/blurhash.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libPhoneNumber_iOS.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libwebp.framework",
@ -5572,7 +5571,6 @@
"${BUILT_PRODUCTS_DIR}/SignalServiceKit/SignalServiceKit.framework",
"${BUILT_PRODUCTS_DIR}/SwiftProtobuf/SwiftProtobuf.framework",
"${BUILT_PRODUCTS_DIR}/YYImage/YYImage.framework",
"${BUILT_PRODUCTS_DIR}/ZKGroup/ZKGroup.framework",
"${BUILT_PRODUCTS_DIR}/blurhash/blurhash.framework",
"${BUILT_PRODUCTS_DIR}/libPhoneNumber-iOS/libPhoneNumber_iOS.framework",
"${BUILT_PRODUCTS_DIR}/libwebp/libwebp.framework",
@ -5596,7 +5594,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SignalServiceKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftProtobuf.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYImage.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZKGroup.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/blurhash.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libPhoneNumber_iOS.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libwebp.framework",
@ -6087,6 +6084,7 @@
45B27B862037FFB400A539DF /* DebugUIFileBrowser.swift in Sources */,
3498AC892513896400B1F315 /* Dependencies+MainApp.swift in Sources */,
347C3834252CE69400F3D941 /* CVItemModel.swift in Sources */,
F090C8202762F2C5005C20FC /* EmojiReactionPickerConfigViewController.swift in Sources */,
34404275273C0E41008C9FA4 /* RegistrationPinAttemptsExhaustedViewController.swift in Sources */,
3496955D219B605E00DCFE74 /* PhotoCollectionPickerController.swift in Sources */,
34A4D8852677DF6B00A794E7 /* ConversationViewController+ConversationInputToolbarDelegate.swift in Sources */,

View File

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "emoji-settings-outline-24.pdf",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "emoji-settings-solid-24.pdf",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -839,6 +839,26 @@ THIS SOFTWARE IS PROVIDED BY ZETETIC LLC ''AS IS'' AND ANY EXPRESS OR IMPLIED WA
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.
&lt;one line to give the program's name and a brief idea of what it does.&gt; Copyright (C) &lt;year&gt; &lt;name of author&gt;
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 &lt;https://www.gnu.org/licenses/&gt;.
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 &lt;https://www.gnu.org/licenses/&gt;.
</string>
<key>License</key>
<string>AGPL-3.0-only</string>
@ -1629,240 +1649,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>This software is provided under:
SPDX-License-Identifier: GPL-3.0-only
The complete license text:
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt; Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for software and other kinds of works.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based on the Program.
To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.
A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices".
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
</string>
<key>License</key>
<string>GPLv3</string>
<key>Title</key>
<string>ZKGroup</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Copyright (c) 2018 Wolt Enterprises

View File

@ -5,7 +5,7 @@
<key>BuildDetails</key>
<dict>
<key>WebRTCCommit</key>
<string>0c2bab0285b8e10879ee59daa3c048e503a89704 Production build of v2.16.0</string>
<string>132420bab6f207ab1951acf630ff1432f34bbb55 Production build of v2.16.1</string>
</dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
@ -43,7 +43,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>73</string>
<string>75</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LOGS_EMAIL</key>
@ -141,7 +141,7 @@
<string>INStartCallIntent</string>
</array>
<key>OWSBundleVersion4</key>
<string>5.27.0.73</string>
<string>5.27.0.75</string>
<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
<true/>
<key>UIAppFonts</key>

View File

@ -4,6 +4,7 @@
import Foundation
import UIKit
import SignalServiceKit
@objc
class EmojiPickerSheet: InteractiveSheetViewController {
@ -14,18 +15,34 @@ class EmojiPickerSheet: InteractiveSheetViewController {
let collectionView = EmojiPickerCollectionView()
lazy var sectionToolbar = EmojiPickerSectionToolbar(delegate: self)
let allowReactionConfiguration: Bool
lazy var searchBar: UISearchBar = {
let searchBar = UISearchBar()
searchBar.placeholder = NSLocalizedString("HOME_VIEW_CONVERSATION_SEARCHBAR_PLACEHOLDER", comment: "Placeholder text for search bar which filters conversations.")
searchBar.delegate = self
searchBar.searchBarStyle = .minimal
searchBar.backgroundColor = Theme.isDarkThemeEnabled ? .ows_gray80 : .ows_white
return searchBar
}()
init(completionHandler: @escaping (EmojiWithSkinTones?) -> Void) {
lazy var configureButton: UIButton = {
let button = UIButton()
button.setImage(Theme.iconImage(.emojiSettings), for: .normal)
button.tintColor = Theme.primaryIconColor
button.addTarget(self, action: #selector(didSelectConfigureButton), for: .touchUpInside)
return button
}()
init(allowReactionConfiguration: Bool = true, completionHandler: @escaping (EmojiWithSkinTones?) -> Void) {
self.allowReactionConfiguration = allowReactionConfiguration
self.completionHandler = completionHandler
super.init()
if !allowReactionConfiguration {
self.backdropColor = .clear
}
}
public required init() {
@ -41,9 +58,25 @@ class EmojiPickerSheet: InteractiveSheetViewController {
override public func viewDidLoad() {
super.viewDidLoad()
contentView.addSubview(searchBar)
searchBar.autoPinWidthToSuperview()
searchBar.autoPinEdge(toSuperviewEdge: .top)
contentView.backgroundColor = Theme.isDarkThemeEnabled ? .ows_gray80 : .ows_white
let topStackView = UIStackView()
topStackView.axis = .horizontal
topStackView.isLayoutMarginsRelativeArrangement = true
topStackView.spacing = 8
if allowReactionConfiguration {
topStackView.layoutMargins = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 16)
topStackView.addArrangedSubviews([searchBar, configureButton])
} else {
topStackView.addArrangedSubview(searchBar)
}
contentView.addSubview(topStackView)
topStackView.autoPinWidthToSuperview()
topStackView.autoPinEdge(toSuperviewEdge: .top)
contentView.addSubview(collectionView)
collectionView.autoPinEdge(.top, to: .bottom, of: searchBar)
@ -54,7 +87,8 @@ class EmojiPickerSheet: InteractiveSheetViewController {
contentView.addSubview(sectionToolbar)
sectionToolbar.autoPinWidthToSuperview()
autoPinView(toBottomOfViewControllerOrKeyboard: sectionToolbar, avoidNotch: false, adjustmentWithKeyboardPresented: 32)
let offset: CGFloat = UIDevice.current.hasIPhoneXNotch ? 32 : 0
autoPinView(toBottomOfViewControllerOrKeyboard: sectionToolbar, avoidNotch: false, adjustmentWithKeyboardPresented: offset)
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
@ -77,6 +111,7 @@ class EmojiPickerSheet: InteractiveSheetViewController {
let contentInset = UIEdgeInsets(top: 0, leading: 0, bottom: sectionToolbar.height, trailing: 0)
collectionView.contentInset = contentInset
collectionView.scrollIndicatorInsets = contentInset
}
private func expandSheetAnimated() {
@ -88,6 +123,13 @@ class EmojiPickerSheet: InteractiveSheetViewController {
self.backdropView?.alpha = 1
})
}
@objc
private func didSelectConfigureButton(sender: UIButton) {
let configVC = EmojiReactionPickerConfigViewController()
let navController = UINavigationController(rootViewController: configVC)
self.present(navController, animated: true)
}
}
extension EmojiPickerSheet: EmojiPickerSectionToolbarDelegate {

View File

@ -0,0 +1,101 @@
//
// Copyright (c) 2020 Open Whisper Systems. All rights reserved.
//
import Foundation
import UIKit
import SignalServiceKit
public class EmojiReactionPickerConfigViewController: UIViewController {
private lazy var reactionPicker: MessageReactionPicker = {
return MessageReactionPicker(selectedEmoji: nil, delegate: nil, configureMode: true)
}()
private lazy var instructionLabel: UILabel = {
let label = UILabel()
label.text = NSLocalizedString("TAP_REPLACE_EMOJI", comment: "Tap to Replace Emoji string for reaction configuration")
label.font = UIFont.ows_dynamicTypeBody2
label.textColor = Theme.secondaryTextAndIconColor
return label
}()
public override func viewDidLoad() {
super.viewDidLoad()
title = NSLocalizedString("CONFIGURE_REACTIONS", comment: "Configure reactions title text")
view.backgroundColor = Theme.isDarkThemeEnabled ? Theme.actionSheetBackgroundColor : UIColor.color(rgbHex: 0xF0F0F0)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped(sender:)))
navigationItem.setRightBarButton(doneButton, animated: false)
let resetButton = UIBarButtonItem(title: NSLocalizedString("RESET", comment: "Configure reactions reset button text"), style: .plain, target: self, action: #selector(resetButtonTapped(sender:)))
navigationItem.setLeftBarButton(resetButton, animated: false)
//Reaction picker
reactionPicker.delegate = self
view.addSubview(reactionPicker)
reactionPicker.autoHCenterInSuperview()
reactionPicker.autoPinEdge(toSuperviewMargin: .top, withInset: 95)
view.addSubview(instructionLabel)
instructionLabel.autoHCenterInSuperview()
instructionLabel.autoPinEdge(.top, to: .bottom, of: reactionPicker, withOffset: 30)
}
@objc
private func resetButtonTapped(sender: UIButton) {
let emojiSet: [EmojiWithSkinTones] = SDSDatabaseStorage.shared.read { transaction in
return ReactionManager.defaultEmojiSet.compactMap { Emoji(rawValue: $0)?.withPreferredSkinTones(transaction: transaction) }
}
for (index, emoji) in reactionPicker.currentEmojiSet().enumerated() {
if let newEmoji = emojiSet[safe: index]?.rawValue {
reactionPicker.replaceEmojiReaction(emoji, newEmoji: newEmoji)
}
}
}
@objc
private func doneButtonTapped(sender: UIButton) {
let currentEmojiSet = reactionPicker.currentEmojiSet()
SDSDatabaseStorage.shared.write { transaction in
ReactionManager.setEmojiSet(currentEmojiSet, transaction: transaction)
}
Self.storageServiceManager.recordPendingLocalAccountUpdates()
dismiss(animated: true, completion: nil)
}
}
extension EmojiReactionPickerConfigViewController: MessageReactionPickerDelegate {
func didSelectReaction(reaction: String, isRemoving: Bool) {
if presentedViewController != nil {
self.reactionPicker.endReplaceAnimation()
presentedViewController?.dismiss(animated: true, completion: nil)
return
}
let picker = EmojiPickerSheet(allowReactionConfiguration: false) { [weak self] emoji in
guard let self = self else { return }
guard let emojiString = emoji?.rawValue else {
self.reactionPicker.endReplaceAnimation()
return
}
self.reactionPicker.replaceEmojiReaction(reaction, newEmoji: emojiString)
self.reactionPicker.endReplaceAnimation()
}
picker.backdropColor = .clear
reactionPicker.startReplaceAnimation(focusedEmoji: reaction)
present(picker, animated: true)
}
func didSelectAnyEmoji() {
//No-op for configuration
}
}

View File

@ -13,6 +13,7 @@ public class InteractiveSheetViewController: OWSViewController {
public weak var externalBackdropView: UIView?
private lazy var _internalBackdropView = UIView()
public var backdropView: UIView? { externalBackdropView ?? _internalBackdropView }
public var backdropColor = Theme.backdropColor
public var maxWidth: CGFloat { 512 }
public var minHeight: CGFloat { 346 }
@ -290,9 +291,9 @@ private class InteractiveSheetAnimationController: UIPresentationController {
return vc.externalBackdropView != nil
}
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?) {
init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?, backdropColor: UIColor? = Theme.backdropColor) {
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
backdropView?.backgroundColor = Theme.backdropColor
backdropView?.backgroundColor = backdropColor
}
override func presentationTransitionWillBegin() {
@ -328,6 +329,7 @@ private class InteractiveSheetAnimationController: UIPresentationController {
extension InteractiveSheetViewController: UIViewControllerTransitioningDelegate {
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
return InteractiveSheetAnimationController(presentedViewController: presented, presenting: presenting)
let controller = InteractiveSheetAnimationController(presentedViewController: presented, presenting: presenting, backdropColor: self.backdropColor)
return controller
}
}

View File

@ -3,6 +3,7 @@
//
import Foundation
import SignalUI
protocol MessageReactionPickerDelegate: AnyObject {
func didSelectReaction(reaction: String, isRemoving: Bool)
@ -18,11 +19,14 @@ class MessageReactionPicker: UIStackView {
let pickerPadding: CGFloat = 6
var reactionHeight: CGFloat { return pickerDiameter - (pickerPadding * 2) }
var selectedBackgroundHeight: CGFloat { return pickerDiameter - 4 }
let configureMode: Bool
private var buttonForEmoji = [String: OWSFlatButton]()
private var selectedEmoji: EmojiWithSkinTones?
private var backgroundView: UIView?
init(selectedEmoji: String?, delegate: MessageReactionPickerDelegate?) {
init(selectedEmoji: String?, delegate: MessageReactionPickerDelegate?, configureMode: Bool = false) {
self.configureMode = configureMode
if let selectedEmoji = selectedEmoji {
self.selectedEmoji = EmojiWithSkinTones(rawValue: selectedEmoji)
owsAssertDebug(self.selectedEmoji != nil)
@ -58,13 +62,12 @@ class MessageReactionPicker: UIStackView {
layoutMargins = UIEdgeInsets(top: pickerPadding, leading: pickerPadding, bottom: pickerPadding, trailing: pickerPadding)
var emojiSet: [EmojiWithSkinTones] = SDSDatabaseStorage.shared.read { transaction in
return ReactionManager.emojiSet.compactMap { Emoji(rawValue: $0)?.withPreferredSkinTones(transaction: transaction) }
return ReactionManager.emojiSet(transaction: transaction).compactMap { Emoji(rawValue: $0)?.withPreferredSkinTones(transaction: transaction) }
}
owsAssertDebug(emojiSet.count == ReactionManager.emojiSet.count)
var addAnyButton = true
var addAnyButton = !self.configureMode
if let selectedEmoji = self.selectedEmoji {
if !self.configureMode, let selectedEmoji = self.selectedEmoji {
// If the local user reacted with any of the default emoji set,
// regardless of skin tone, we should show it in the normal place
// in the picker bar.
@ -111,6 +114,65 @@ class MessageReactionPicker: UIStackView {
}
}
public func replaceEmojiReaction(_ oldEmoji: String, newEmoji: String) {
let button = buttonForEmoji[oldEmoji]
if let button = button {
button.setTitle(title: newEmoji, font: .systemFont(ofSize: reactionFontSize), titleColor: Theme.primaryTextColor)
buttonForEmoji[newEmoji] = button
}
}
public func currentEmojiSet() -> [String] {
var emojiSet: [String] = []
for view in arrangedSubviews {
if let button = view as? OWSFlatButton, let emoji = button.button.title(for: .normal) {
emojiSet.append(emoji)
}
}
return emojiSet
}
public func startReplaceAnimation(focusedEmoji: String) {
var buttonToWiggle: OWSFlatButton?
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
for view in self.arrangedSubviews {
if let button = view as? OWSFlatButton, let emoji = button.button.title(for: .normal) {
// Shrink and fade
if emoji != focusedEmoji {
button.alpha = 0.3
button.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
} else { // Expand and wiggle
button.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
buttonToWiggle = button
}
}
}
} completion: { finished in
if finished, let buttonToWiggle = buttonToWiggle {
let leftRotationValue = NSValue(caTransform3D: CATransform3DConcat(CATransform3DMakeScale(1.3, 1.3, 1), CATransform3DMakeRotation(-0.08, 0, 0, 1)))
let rightRotationValue = NSValue(caTransform3D: CATransform3DConcat(CATransform3DMakeScale(1.3, 1.3, 1), CATransform3DMakeRotation(0.08, 0, 0, 1)))
let animation = CAKeyframeAnimation(keyPath: "transform")
animation.values = [leftRotationValue, rightRotationValue]
animation.autoreverses = true
animation.duration = 0.2
animation.repeatCount = MAXFLOAT
buttonToWiggle.layer.add(animation, forKey: "wiggle")
}
}
}
public func endReplaceAnimation() {
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
for view in self.arrangedSubviews {
if let button = view as? OWSFlatButton {
button.alpha = 1
button.transform = CGAffineTransform.identity
button.layer.removeAnimation(forKey: "wiggle")
}
}
} completion: { _ in }
}
func playPresentationAnimation(duration: TimeInterval) {
backgroundView?.alpha = 0
UIView.animate(withDuration: duration) { self.backgroundView?.alpha = 1 }

View File

@ -377,7 +377,7 @@
"BADGE_CONFIGURATION_BADGE_SECTION_TITLE" = "My Badges";
/* The title for the badge configuration page */
"BADGE_CONFIGURATION_TITLE" = "Badges";
"BADGE_CONFIGURATION_TITLE" = "Wapens";
/* Text prompting the user to become a signal sustainer */
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Become a Sustainer";
@ -512,19 +512,19 @@
"BOOST_VIEW_BODY_WITH_EXPIRATION_FORMAT" = "Your Boost badge will expire on %@.";
/* Default text for the custom amount field of the boost view. */
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Enter Custom Amount";
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Voer eie bedrag in";
/* Text explaining there are other ways to donate on the boost view. */
"BOOST_VIEW_OTHER_WAYS" = "More Payment Options";
/* Error text notifying the user they must select a large amount on the donate to signal view */
"BOOST_VIEW_SELECT_A_LARGER_AMOUNT" = "Select a larger amount to donate";
"BOOST_VIEW_SELECT_A_LARGER_AMOUNT" = "Kies n groter bedrag te skenk";
/* Error text notifying the user they must select a smaller amount on the donate to signal view */
"BOOST_VIEW_SELECT_A_SMALLER_AMOUNT" = "Select a smaller amount to donate";
"BOOST_VIEW_SELECT_A_SMALLER_AMOUNT" = "Kies n kleiner bedrag om by te dra";
/* Error text notifying the user they must select an amount on the donate to signal view */
"BOOST_VIEW_SELECT_AN_AMOUNT" = "Select an amount to donate";
"BOOST_VIEW_SELECT_AN_AMOUNT" = "Kies n bedrag om by te dra";
/* Title for the donate to signal view */
"BOOST_VIEW_TITLE" = "Give Signal a Boost";
@ -932,10 +932,10 @@
"CONTACT_SUPPORT_FILTER_SOMETHING_NOT_WORKING_SHORT" = "Iets werk nie";
/* The localized representation of the 'Sustainers & Signal Boost' support filter. */
"CONTACT_SUPPORT_FILTER_SUSTAINERS" = "Sustainers & Signal Boost";
"CONTACT_SUPPORT_FILTER_SUSTAINERS" = "Handhawers & Signal-hupstoot";
/* A brief localized representation of the 'Sustainers & Signal Boost' support filter. */
"CONTACT_SUPPORT_FILTER_SUSTAINERS_SHORT" = "Sustainers & Boost";
"CONTACT_SUPPORT_FILTER_SUSTAINERS_SHORT" = "Handhawers & hupstoot";
/* Alert body */
"CONTACT_SUPPORT_PROMPT_ERROR_ALERT_BODY" = "Signal kon nie u steundiensversoek voltooi nie.";
@ -944,19 +944,19 @@
"CONTACT_SUPPORT_PROMPT_ERROR_TRY_AGAIN" = "Probeer weer";
/* Alert body */
"CONTACT_SUPPORT_PROMPT_TO_INCLUDE_DEBUG_LOG_MESSAGE" = "Jou ontfout-logs sal ons help om jou kwessie vinniger op te los. Om logs in te dien, is opsioneel.";
"CONTACT_SUPPORT_PROMPT_TO_INCLUDE_DEBUG_LOG_MESSAGE" = "U ontfoutlogs sal ons help om u kwessie vinniger op te los. Om logs in te dien, is opsioneel.";
/* Alert title */
"CONTACT_SUPPORT_PROMPT_TO_INCLUDE_DEBUG_LOG_TITLE" = "Dien ontfout-log in?";
"CONTACT_SUPPORT_PROMPT_TO_INCLUDE_DEBUG_LOG_TITLE" = "Dien ontfoutlog in?";
/* Placeholder telling user they must select a filter. */
"CONTACT_SUPPORT_SELECT_A_FILTER" = "Kies rede";
/* Button text */
"CONTACT_SUPPORT_SUBMIT_WITH_LOG" = "Dien in met ontfout-log";
"CONTACT_SUPPORT_SUBMIT_WITH_LOG" = "Dien in met ontfoutlog";
/* Button text */
"CONTACT_SUPPORT_SUBMIT_WITHOUT_LOG" = "Dien in sonder ontfout-log";
"CONTACT_SUPPORT_SUBMIT_WITHOUT_LOG" = "Dien in sonder ontfoutlog";
/* Label for 'open address in maps app' button in contact view. */
"CONTACT_VIEW_OPEN_ADDRESS_IN_MAPS_APP" = "Maak oop in Kaarte";
@ -971,7 +971,7 @@
"CONTEXT_MENU_COPY" = "Kopieer";
/* Context menu button title */
"CONTEXT_MENU_DELETE_MESSAGE" = "Wis";
"CONTEXT_MENU_DELETE_MESSAGE" = "Skrap";
/* Context menu button title */
"CONTEXT_MENU_DETAILS" = "Inligting";
@ -1049,10 +1049,10 @@
"CONVERSATION_SETTINGS_AUDIO_CALL_BUTTON" = "oudio";
/* Footer string for a contact's badges in conversation settings */
"CONVERSATION_SETTINGS_BADGES_FOOTER" = "Get badges for your profile by supporting Signal. Tap a badge to learn more.";
"CONVERSATION_SETTINGS_BADGES_FOOTER" = "Kry wapens vir u profiel deur Signal te ondersteun. Tik op n wapen om meer te leer.";
/* Header title for a contact's badges in conversation settings */
"CONVERSATION_SETTINGS_BADGES_HEADER" = "Badges";
"CONVERSATION_SETTINGS_BADGES_HEADER" = "Wapens";
/* Footer text for the 'block and leave' section of contact conversation settings view. */
"CONVERSATION_SETTINGS_BLOCK_AND_LEAVE_SECTION_CONTACT_FOOTER" = "U sal nie meer boodskappe of opdaterings te ontvang van hierdie gebruiker.";
@ -1106,16 +1106,16 @@
"CONVERSATION_SETTINGS_MEMBERS_SECTION_TITLE_FORMAT" = "%@ lede";
/* label for 'always' option for mention notifications in conversation settings */
"CONVERSATION_SETTINGS_MENTION_MODE_AlWAYS" = "Always Notify";
"CONVERSATION_SETTINGS_MENTION_MODE_AlWAYS" = "Laat altyd weet";
/* label for 'never' option for mention notifications in conversation settings */
"CONVERSATION_SETTINGS_MENTION_MODE_NEVER" = "Dont Notify If Muted";
"CONVERSATION_SETTINGS_MENTION_MODE_NEVER" = "Laat nie weet indien gedemp";
/* Title of the 'mention notification mode' action sheet. */
"CONVERSATION_SETTINGS_MENTION_NOTIFICATION_MODE_ACTION_SHEET_TITLE" = "Ontvang kennisgewings wanneer u in gedempte kletse genoem word?";
/* label for 'mentions' cell in conversation settings */
"CONVERSATION_SETTINGS_MENTIONS_LABEL" = "Mentions";
"CONVERSATION_SETTINGS_MENTIONS_LABEL" = "Meldings";
/* Button to message the chat */
"CONVERSATION_SETTINGS_MESSAGE_BUTTON" = "boodskap";
@ -1208,10 +1208,10 @@
"CONVERSATION_SETTINGS_SEND_MESSAGES_SECTION_ONLY_ADMINS" = "Slegs beheerders";
/* Label for 'unblock group' action in conversation settings view. */
"CONVERSATION_SETTINGS_UNBLOCK_GROUP" = "Ontblokkeer groep";
"CONVERSATION_SETTINGS_UNBLOCK_GROUP" = "Ontsper groep";
/* Label for 'unblock user' action in conversation settings view. */
"CONVERSATION_SETTINGS_UNBLOCK_USER" = "Ontblokkeer gebruiker";
"CONVERSATION_SETTINGS_UNBLOCK_USER" = "Ontsper gebruiker";
/* Label for button to unmute a thread. */
"CONVERSATION_SETTINGS_UNMUTE_ACTION" = "Ontdemp";
@ -1238,7 +1238,7 @@
"CONVERSATION_VIEW_DELETE_ALL_MESSAGES" = "Wis alles";
/* Indicates that the app is loading more messages in this conversation. */
"CONVERSATION_VIEW_LOADING_MORE_MESSAGES" = "Laai meer boodskappe...";
"CONVERSATION_VIEW_LOADING_MORE_MESSAGES" = "Laai nog boodskappe…";
/* Indicator on truncated text messages that they can be tapped to see the entire text message. */
"CONVERSATION_VIEW_OVERSIZE_TEXT_TAP_FOR_MORE" = "Lees Meer";
@ -1247,7 +1247,7 @@
"COPIED_TO_CLIPBOARD" = "Na knipbord gekopieer";
/* ActionSheet title */
"CORRUPTED_SESSION_DESCRIPTION" = "Indien jy jou sessie terugstel, sal jy toekomstige boodskappe van %@ kan ontvang, maar dit sal nie enige beskadigde boodskappe teruglaai nie.";
"CORRUPTED_SESSION_DESCRIPTION" = "Indien u u sessie terugstel, sal u toekomstige boodskappe van %@ kan ontvang, maar dit sal nie enige beskadigde boodskappe teruglaai nie.";
/* No comment provided by engineer. */
"COUNTRYCODE_SELECT_TITLE" = "Kies landkode";
@ -1256,7 +1256,7 @@
"CROP_SCALE_IMAGE_VIEW_TITLE" = "Skuif en skaleer";
/* Title for the 'currency picker' view in the app settings. */
"CURRENCY_PICKER_VIEW_TITLE" = "Set Currency";
"CURRENCY_PICKER_VIEW_TITLE" = "Stel geldeenheid";
/* Label for the 'gradient' mode in the custom chat color settings view. */
"CUSTOM_CHAT_COLOR_SETTINGS_GRADIENT" = "Gradiënt";
@ -1304,13 +1304,13 @@
"DEBUG_LOG_ALERT_COULD_NOT_COPY_LOGS" = "Kon nie logs kopieer nie.";
/* Error indicating that the debug logs could not be packaged. */
"DEBUG_LOG_ALERT_COULD_NOT_PACKAGE_LOGS" = "Kon nie logs inpak nie.";
"DEBUG_LOG_ALERT_COULD_NOT_PACKAGE_LOGS" = "Kon nie logs verpak nie.";
/* Error indicating that a debug log could not be uploaded. */
"DEBUG_LOG_ALERT_ERROR_UPLOADING_LOG" = "Kon nie logs oplaai nie.";
/* Message of the debug log alert. */
"DEBUG_LOG_ALERT_MESSAGE" = "Wat wil jy doen met die skakel na jou ontfout-log?";
"DEBUG_LOG_ALERT_MESSAGE" = "Wat wil u doen met die skakel na u ontfoutlog?";
/* Error indicating that no debug logs could be found. */
"DEBUG_LOG_ALERT_NO_LOGS" = "Kon nie enige logs vind nie.";
@ -1322,7 +1322,7 @@
"DEBUG_LOG_ALERT_OPTION_COPY_LINK" = "Kopieer skakel";
/* Label for the 'email debug log' option of the debug log alert. */
"DEBUG_LOG_ALERT_OPTION_EMAIL" = "E-pos steundiens";
"DEBUG_LOG_ALERT_OPTION_EMAIL" = "E-possteundiens";
/* Label for the 'send to self' option of the debug log alert. */
"DEBUG_LOG_ALERT_OPTION_SEND_TO_SELF" = "Stuur na self";
@ -1334,7 +1334,7 @@
"DEBUG_LOG_ALERT_TITLE" = "Nog één stap";
/* Message of the alert before redirecting to GitHub Issues. */
"DEBUG_LOG_GITHUB_ISSUE_ALERT_MESSAGE" = "Die gist-skakel is na jou knipbord gekopieer. Jy gaan nou na die GitHub-kwessielys herlei word.";
"DEBUG_LOG_GITHUB_ISSUE_ALERT_MESSAGE" = "Die gist-skakel is na u knipbord gekopieer. U gaan nou na die GitHub-kwessielys herlei word.";
/* Title of the alert before redirecting to GitHub Issues. */
"DEBUG_LOG_GITHUB_ISSUE_ALERT_TITLE" = "GitHub-herleiding";
@ -1373,10 +1373,10 @@
"DELETE_ACCOUNT_CONFIRMATION_SECTION_TITLE" = "Bevestig u Signal-nommer";
/* Title for the 'delete account' confirmation view. */
"DELETE_ACCOUNT_CONFIRMATION_TITLE" = "Wis rekening";
"DELETE_ACCOUNT_CONFIRMATION_TITLE" = "Skrap rekening";
/* Title for the action sheet when you enter the wrong number on the 'delete account confirmation' view controller. */
"DELETE_ACCOUNT_CONFIRMATION_WRONG_NUMBER" = "The phone number you entered doesnt match your accounts.";
"DELETE_ACCOUNT_CONFIRMATION_WRONG_NUMBER" = "Die foonnommer wat u ingevoer het stem nie met dié van u rekening ooreen nie.";
/* action sheet body */
"DELETE_ALL_MESSAGES_IN_CONVERSATION_ALERT_BODY" = "Skrap alle boodskappe in die klets?";
@ -1403,7 +1403,7 @@
"DEVICE_LINKED_AT_LABEL" = "%@ gekoppel";
/* Alert title that can occur when viewing device manager. */
"DEVICE_LIST_UPDATE_FAILED_TITLE" = "Kon nie toestellys opdateer nie.";
"DEVICE_LIST_UPDATE_FAILED_TITLE" = "Kon nie toestellys bywerk nie.";
/* The stop action of the dialog asking the user if they want to cancel a device transfer */
"DEVICE_TRANSFER_CANCEL_CONFIRMATION_ACTION" = "Stop oordrag";
@ -1436,10 +1436,10 @@
"DEVICE_TRANSFER_CHOICE_TITLE" = "Dra rekening en boodskappe oor";
/* The body for the device transfer 'choice' view 'transfer' option */
"DEVICE_TRANSFER_CHOICE_TRANSFER_BODY" = "Dra jou rekening en boodskapgeskiedenis vanaf jou ou iOS-toestel oor";
"DEVICE_TRANSFER_CHOICE_TRANSFER_BODY" = "Dra u rekening en boodskapgeskiedenis vanaf u ou iOS-toestel oor";
/* The body for the device transfer 'choice' view 'transfer' option when linking a device */
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_BODY" = "Dra jou rekening en boodskapgeskiedenis vanaf jou ou iPad oor";
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_BODY" = "Dra u rekening en boodskapgeskiedenis vanaf u ou iPad oor";
/* The title for the device transfer 'choice' view 'transfer' option when linking a device */
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_TITLE" = "Dra oor van n ander iPad";
@ -1451,7 +1451,7 @@
"DEVICE_TRANSFER_CHOICE_WARNING" = "As u voortgaan, sal dit Signal op enige ander toestelle wat tans met dieselfde foonnommer geregistreer is, deaktiveer.";
/* An error indicating that we were unable to verify the indentity of the new device to complete the transfer */
"DEVICE_TRANSFER_ERROR_CERTIFICATE_MISMATCH" = "Kan nie jou nuwe toestel verifieer nie; probeer asseblief weer";
"DEVICE_TRANSFER_ERROR_CERTIFICATE_MISMATCH" = "Kan nie u nuwe toestel verifieer nie; probeer asb. weer";
/* An error indicating that something went wrong with the transfer and it could not complete */
"DEVICE_TRANSFER_ERROR_GENERIC" = "Kon nie die oordrag voltooi nie; maak seker u toestelle is naby mekaar, en probeer weer";
@ -1523,7 +1523,7 @@
"DISAPPEARING_MESSAGES_DESCRIPTION" = "Indien geaktiveer, sal nuwe boodskappe wat in hierdie klets gestuur en ontvang is, verdwyn nadat dit gesien is.";
/* Accessibility hint that contains current timeout information */
"DISAPPEARING_MESSAGES_HINT" = "Tans verdwyn boodskappe ná %@";
"DISAPPEARING_MESSAGES_HINT" = "Boodskappe verdwyn tans ná %@";
/* The unit for a number of hours */
"DISAPPEARING_MESSAGES_HOURS" = "uur";
@ -1544,10 +1544,10 @@
"DISAPPEARING_MESSAGES_WEEKS" = "weke";
/* Short text to dismiss current modal / actionsheet / screen */
"DISMISS_BUTTON_TEXT" = "Wys weg";
"DISMISS_BUTTON_TEXT" = "Wys af";
/* Dismiss context menu accessibility label */
"DISMISS_CONTEXT_MENU" = "Dismiss Context Menu";
"DISMISS_CONTEXT_MENU" = "Wys kontekskieslys af";
/* Title for switch to enable sharing of badges publicly */
"DISPLAY_BADGES_ON_PROFILE_SETTING" = "Display badges on profile";
@ -1556,40 +1556,40 @@
"DOMAIN_FRONTING_COUNTRY_VIEW_SECTION_HEADER" = "Ligging van sensuuromseiling";
/* Donation amount label for the donate to signal view */
"DONATION_VIEW_AMOUNT_LABEL" = "Donation amount";
"DONATION_VIEW_AMOUNT_LABEL" = "Skenkingsbedrag";
/* Default text for the custom amount field of the donation view. */
"DONATION_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Enter Custom Amount";
"DONATION_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Voer eie bedrag in";
/* Text describing to the user that they're going to pay a donation to Signal */
"DONATION_VIEW_DONATION_TO_SIGNAL" = "Donation to Signal";
"DONATION_VIEW_DONATION_TO_SIGNAL" = "Skenings aan Signal";
/* Text explaining there are other ways to donate on the donation view. */
"DONATION_VIEW_OTHER_WAYS" = "Other Ways to Donate";
"DONATION_VIEW_OTHER_WAYS" = "Ander maniere om te skenk";
/* Error text notifying the user they must select a large amount on the donate to signal view */
"DONATION_VIEW_SELECT_A_LARGER_AMOUNT" = "Select a larger amount to donate";
"DONATION_VIEW_SELECT_A_LARGER_AMOUNT" = "Kies n groter bedrag te skenk";
/* Error text notifying the user they must select a smaller amount on the donate to signal view */
"DONATION_VIEW_SELECT_A_SMALLER_AMOUNT" = "Select a smaller amount to donate";
"DONATION_VIEW_SELECT_A_SMALLER_AMOUNT" = "Kies n kleiner bedrag om te skenk";
/* Error text notifying the user they must select an amount on the donate to signal view */
"DONATION_VIEW_SELECT_AN_AMOUNT" = "Select an amount to donate";
"DONATION_VIEW_SELECT_AN_AMOUNT" = "Kies n bedrag om te skenk";
/* Thank you message on the donate to signal view */
"DONATION_VIEW_THANKS_FOR_YOUR_SUPPORT" = "Thank you for your support!";
"DONATION_VIEW_THANKS_FOR_YOUR_SUPPORT" = "Dankie vir u ondersteuning!";
/* Title for the donate to signal view */
"DONATION_VIEW_TITLE" = "Signal is powered by people like you.";
"DONATION_VIEW_TITLE" = "Signal word aangedryf deur mense soos u.";
/* The body of the 'Why Donate' section of the donate to signal view */
"DONATION_VIEW_WHY_DONATE_BODY" = "The team at Signal is committed to the mission of developing open source privacy technology that protects free expression and enables secure global communication. Your contribution fuels this cause. No ads. No trackers. No kidding.\n\nYour donation helps pay for the development, servers, and bandwidth of an app used by millions around the world for private and instantaneous communication.";
"DONATION_VIEW_WHY_DONATE_BODY" = "Die span by Signal is toegewyd aan die doel om oopbronprivaatheidtegnologie te ontwikkel wat vrye uitdrukking beskerm en veilige globale kommunikasie moontlik maak. U bydrae maak n groot verskil. Geen advertensies. Geen naspoorders. Geen lollery.\n\nU skenking help om vir die ontwikkeling, bedieners en bandwydte van n toep wat deur miljoene regoor die wêreld vir privaat en kitskommunikasie gebruik word, te betaal.";
/* The title of the 'Why Donate' section of the donate to signal view */
"DONATION_VIEW_WHY_DONATE_TITLE" = "Why Donate?";
"DONATION_VIEW_WHY_DONATE_TITLE" = "Waarom skenk?";
/* Alert body for when the user has just tried to edit a contacts after declining to give Signal contacts permissions */
"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_BODY" = "Jy kan toegang in die iOS Settings-program aktiveer.";
"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_BODY" = "U kan toegang in die iOS-instellingstoep aktiveer.";
/* Alert title for when the user has just tried to edit a contacts after declining to give Signal contacts permissions */
"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_TITLE" = "Signal benodig toegang tot kontakte om kontakinligting te wysig";
@ -1607,13 +1607,13 @@
"EDIT_GROUP_ERROR_INVALID_AVATAR" = "Ongeldige foto.";
/* The title for the 'update group' button. */
"EDIT_GROUP_UPDATE_BUTTON" = "Dateer op";
"EDIT_GROUP_UPDATE_BUTTON" = "Werk by";
/* The alert message if user tries to exit update group view without saving changes. */
"EDIT_GROUP_VIEW_UNSAVED_CHANGES_MESSAGE" = "Wil jy die veranderinge wat jy aan hierdie groep gemaak het, stoor?";
"EDIT_GROUP_VIEW_UNSAVED_CHANGES_MESSAGE" = "Wil u die veranderinge wat u aan hierdie groep gemaak het, bewaar?";
/* The alert title if user tries to exit update group view without saving changes. */
"EDIT_GROUP_VIEW_UNSAVED_CHANGES_TITLE" = "Ongestoorde veranderinge";
"EDIT_GROUP_VIEW_UNSAVED_CHANGES_TITLE" = "Onbewaarde veranderinge";
/* Short name for edit menu item to copy contents of media message. */
"EDIT_ITEM_COPY_ACTION" = "Kopie";
@ -1622,19 +1622,19 @@
"EMAIL_INVITE_BODY" = "Dagsê.\n\nEk het onlangs Signal begin gebruik om gesprekke op my iPhone privaat te hou. Ek stel voor u installeer dit ook, sodat ons seker kan weet dat net ek en u ons boodskappe kan lees of ons oproepe kan hoor.\n\nSignal is beskikbaar vir iPhone en Android. Kry dit hier: %@\n\nSignal werk net soos u bestaande boodskaptoepassing. Ons kan fotos en videos stuur, mekaar bel, en groepkletse begin. En niemand anders kan iets daarvan sien nie, selfs nie eens die mense wat Signal maak nie!\n\nVir meer inligting oor Open Whisper Systems, die mense wat Signal maak, kyk hier: %@";
/* subject of email sent to contacts when inviting to install Signal */
"EMAIL_INVITE_SUBJECT" = "Kom ons wissel na Signal";
"EMAIL_INVITE_SUBJECT" = "Kom ons gebruik liewer Signal";
/* Description for the fallback support sheet if user cannot send email */
"EMAIL_SIGNAL_MESSAGE" = "Your device isn't configured to send email. To send a support request, set up email on your device or email support@signal.org";
"EMAIL_SIGNAL_MESSAGE" = "U toestel is nie opgestel om e-pos te stuur nie. Stel e-pos op u toestel op of stuur n e-pos na support@signal.org om n steunversoek te rig.";
/* Title for the fallback support sheet if user cannot send email */
"EMAIL_SIGNAL_TITLE" = "Email unavailable";
"EMAIL_SIGNAL_TITLE" = "E-pos onbeskikbaar";
/* The name for the emoji category 'Activities' */
"EMOJI_CATEGORY_ACTIVITIES_NAME" = "Aktiwiteite";
/* The name for the emoji category 'Animals & Nature' */
"EMOJI_CATEGORY_ANIMALS_NAME" = "Diere & die Natuur";
"EMOJI_CATEGORY_ANIMALS_NAME" = "Diere & die natuur";
/* The name for the emoji category 'Flags' */
"EMOJI_CATEGORY_FLAGS_NAME" = "Vlae";
@ -1658,7 +1658,7 @@
"EMOJI_CATEGORY_TRAVEL_NAME" = "Reis & Plekke";
/* Full width label displayed when attempting to compose message */
"EMPTY_CONTACTS_LABEL_LINE1" = "Geen van jou kontakte het Signal nie.";
"EMPTY_CONTACTS_LABEL_LINE1" = "Geen van u kontakte het Signal nie.";
/* Full width label displayed when attempting to compose message */
"EMPTY_CONTACTS_LABEL_LINE2" = "Nooi n paar van hulle uit!";
@ -1676,34 +1676,34 @@
"ERROR_COULD_NOT_FETCH_CONTACTS" = "Kon nie toegang tot kontakte kry nie.";
/* Error indicating that a message could not be forwarded. */
"ERROR_COULD_NOT_FORWARD_MESSAGES_1" = "Couldn't forward message.";
"ERROR_COULD_NOT_FORWARD_MESSAGES_1" = "Kon nie boodskap aanstuur nie.";
/* Error indicating that a message could not be forwarded. */
"ERROR_COULD_NOT_FORWARD_MESSAGES_MISSING_1" = "Couldn't forward message because it is no longer available.";
"ERROR_COULD_NOT_FORWARD_MESSAGES_MISSING_1" = "Kon nie boodskap aanstuur nie omdat dit nie meer beskikbaar is nie.";
/* Error indicating that messages could not be forwarded. */
"ERROR_COULD_NOT_FORWARD_MESSAGES_MISSING_N" = "Couldn't forward messages because they're no longer available.";
"ERROR_COULD_NOT_FORWARD_MESSAGES_MISSING_N" = "Kon nie boodskappe aanstuur nie omdat dit nie meer beskikbaar is nie.";
/* Error indicating that messages could not be forwarded. */
"ERROR_COULD_NOT_FORWARD_MESSAGES_N" = "Couldn't forward messages";
"ERROR_COULD_NOT_FORWARD_MESSAGES_N" = "Kon nie boodskappe aanstuur nie";
/* Error indicating that 'save video' failed. */
"ERROR_COULD_NOT_SAVE_VIDEO" = "Kon nie video stoor nie.";
"ERROR_COULD_NOT_SAVE_VIDEO" = "Kon nie video bewaar nie.";
/* Generic notice when message failed to send. */
"ERROR_DESCRIPTION_CLIENT_SENDING_FAILURE" = "Kon nie boodskap stuur nie.";
/* Error indicating that openURL for a mailto: URL failed. */
"ERROR_DESCRIPTION_COULD_NOT_LAUNCH_EMAIL" = "Failed to open email app";
"ERROR_DESCRIPTION_COULD_NOT_LAUNCH_EMAIL" = "Kon nie e-postoep open nie";
/* Error indicating that a support mailto link could not be created. */
"ERROR_DESCRIPTION_INVALID_SUPPORT_EMAIL" = "Could not create support request";
"ERROR_DESCRIPTION_INVALID_SUPPORT_EMAIL" = "Kon nie steunversoek skep nie";
/* Generic error indicating that log upload failed */
"ERROR_DESCRIPTION_LOG_UPLOAD_FAILED" = "Failed to upload logs.";
"ERROR_DESCRIPTION_LOG_UPLOAD_FAILED" = "Kon nie logs oplaai nie.";
/* Error message indicating that message send failed due to block list */
"ERROR_DESCRIPTION_MESSAGE_SEND_FAILED_DUE_TO_BLOCK_LIST" = "Kon nie boodskap aan gebruiker stuur nie want jy het hulle geblokkeer.";
"ERROR_DESCRIPTION_MESSAGE_SEND_FAILED_DUE_TO_BLOCK_LIST" = "Kon nie boodskap aan gebruiker stuur nie want u het hulle versper.";
/* Generic error used whenever Signal can't contact the server */
"ERROR_DESCRIPTION_NO_INTERNET" = "Signal kon nie aan die internet koppel nie. Probeer gerus weer.";
@ -1718,16 +1718,16 @@
"ERROR_DESCRIPTION_REQUEST_TIMED_OUT" = "Netwerkversoek het uitgetel.";
/* Error indicating that a socket response failed. */
"ERROR_DESCRIPTION_RESPONSE_FAILED" = "Ongeldige response vanaf diens.";
"ERROR_DESCRIPTION_RESPONSE_FAILED" = "Ongeldige respons vanaf diens.";
/* Error message when attempting to send message */
"ERROR_DESCRIPTION_SENDING_UNAUTHORIZED" = "Hierdie toestel is nie meer met jou foonnommer geregistreer nie. Installeer Signal weer.";
"ERROR_DESCRIPTION_SENDING_UNAUTHORIZED" = "Hierdie toestel is nie meer met u telefoonnommer geregistreer nie. Herinstalleer Signal.";
/* Generic server error */
"ERROR_DESCRIPTION_SERVER_FAILURE" = "Bedienerfout. Probeer gerus later weer.";
/* Description for errors returned from the server due to suspected spam. */
"ERROR_DESCRIPTION_SUSPECTED_SPAM" = "Server requires user verification before sending the message.";
"ERROR_DESCRIPTION_SUSPECTED_SPAM" = "Bediener vereis gebruikersverifiëring woordat die boodskap gestuur word.";
/* Worst case generic error message */
"ERROR_DESCRIPTION_UNKNOWN_ERROR" = "n Onbekende fout het voorgekom.";
@ -1739,7 +1739,7 @@
"ERROR_MESSAGE_ATTACHMENT_DOWNLOAD_FAILED" = "Kon nie aanhegsel aflaai nie.";
/* Error message for a decryption failure. Embeds {{sender short name}}. */
"ERROR_MESSAGE_DECRYPTION_FAILURE" = "A message from %@ could not be delivered";
"ERROR_MESSAGE_DECRYPTION_FAILURE" = "n Boodskap van %@ kon nie afgelewer word nie";
/* Error message for a decryption failure. */
"ERROR_MESSAGE_DECRYPTION_FAILURE_UNKNOWN_SENDER" = "n Boodskap kon nie afgelewer word nie";
@ -1748,10 +1748,10 @@
"ERROR_MESSAGE_DUPLICATE_MESSAGE" = "Het n duplikaatboodskap ontvang.";
/* No comment provided by engineer. */
"ERROR_MESSAGE_INVALID_KEY_EXCEPTION" = "Die ontvanger se sleutel is nie geldig nie.";
"ERROR_MESSAGE_INVALID_KEY_EXCEPTION" = "Die ontvanger se sleutel is ongeldig.";
/* No comment provided by engineer. */
"ERROR_MESSAGE_INVALID_MESSAGE" = "Ontvangde boodskap is nie goed gesinkroniseer nie.";
"ERROR_MESSAGE_INVALID_MESSAGE" = "Ontvange boodskap is nie goed gesinkroniseer nie.";
/* No comment provided by engineer. */
"ERROR_MESSAGE_INVALID_VERSION" = "Het n boodskap ontvang wat nie met hierdie weergawe versoenbaar is nie.";
@ -1763,7 +1763,7 @@
"ERROR_MESSAGE_NON_BLOCKING_IDENTITY_CHANGE" = "Veiligheidsnommer het verander.";
/* Shown when signal users safety numbers changed, embeds the user's {{name or phone number}} */
"ERROR_MESSAGE_NON_BLOCKING_IDENTITY_CHANGE_FORMAT" = "Jou veiligheidsnommer met %@ het verander.";
"ERROR_MESSAGE_NON_BLOCKING_IDENTITY_CHANGE_FORMAT" = "U veiligheidsnommer met %@ het verander.";
/* Text notifying the user that their secure session has been reset */
"ERROR_MESSAGE_SESSION_REFRESH" = "Kletssessie het verfris";
@ -1778,37 +1778,37 @@
"ERROR_NETWORK_FAILURE" = "Netwerkfout";
/* Format string for an error alert notification message. Embes {{ error string }} */
"ERROR_NOTIFICATION_MESSAGE_FORMAT" = "Please help us improve Signal by reporting this error along with debug logs from your device to support@signal.org; %@";
"ERROR_NOTIFICATION_MESSAGE_FORMAT" = "Help ons asb. om Signal te verbeter deur hierdie fout saam met ontfoutlogs van u toestel te rapporteer aan support@signal.org; %@";
/* Format string for an error alert notification title. */
"ERROR_NOTIFICATION_TITLE" = "Signal Beta: An error occurred";
"ERROR_NOTIFICATION_TITLE" = "Signal-beta: n Fout het voorgekom";
/* Error indicating a send failure due to a delinked application. */
"ERROR_SENDING_DELINKED" = "Jou toestel is nie meer gekoppel nie. Koppel dit weer sodat jy verdere boodskappe kan stuur.";
"ERROR_SENDING_DELINKED" = "U toestel is nie meer gekoppel nie. Koppel dit weer sodat u verdere boodskappe kan stuur.";
/* Error indicating a send failure due to a deregistered application. */
"ERROR_SENDING_DEREGISTERED" = "Jou toestel is nie meer geregistreer nie. Herregistreer dit sodat jy verdere boodskappe kan stuur.";
"ERROR_SENDING_DEREGISTERED" = "U toestel is nie meer geregistreer nie. Herregistreer dit sodat u verdere boodskappe kan stuur.";
/* Error indicating a send failure due to an expired application. */
"ERROR_SENDING_EXPIRED" = "Jou weergawe van Signal het verstryk. Dateer dit op sodat jy verdere boodskappe kan stuur.";
"ERROR_SENDING_EXPIRED" = "U weergawe van Signal het verstryk. Werk dit by sodat u verdere boodskappe kan stuur.";
/* Format string for 'unregistered user' error. Embeds {{the unregistered user's name or signal id}}. */
"ERROR_UNREGISTERED_USER_FORMAT" = "Ongeregistreerde gebruiker: %@";
/* Label notifying the user that the app has expired. */
"EXPIRATION_ERROR" = "Your version of Signal has expired! Tap to update to the most recent version.";
"EXPIRATION_ERROR" = "U weergawe van Signal het verstryk! Tik om na die jongste weergawe by te werk.";
/* Label warning the user that the app will expire soon. */
"EXPIRATION_WARNING_SOON" = "Jou weergawe van Signal verstryk oor %d dae. Druk om na die jongste weergawe op te dateer.";
"EXPIRATION_WARNING_SOON" = "U weergawe van Signal verstryk oor %d dae. Tik om na die jongste weergawe by te werk.";
/* Label warning the user that the app will expire today. */
"EXPIRATION_WARNING_TODAY" = "Jou weergawe van Signal verstryk vandag. Druk om na die jongste weergawe op te dateer.";
"EXPIRATION_WARNING_TODAY" = "U weergawe van Signal verstryk vandag. Tik om na die jongste weergawe by te werk.";
/* action sheet header when re-sending message which failed because of too many attempts */
"FAILED_SENDING_BECAUSE_RATE_LIMIT" = "Te veel mislukkings met hierdie kontak. Probeer gerus later weer.";
"FAILED_SENDING_BECAUSE_RATE_LIMIT" = "Te veel mislukkings met hierdie kontak. Probeer later weer.";
/* action sheet header when re-sending message which failed because of untrusted identity keys */
"FAILED_SENDING_BECAUSE_UNTRUSTED_IDENTITY_KEY" = "Jou veiligheidsnommer met %@ het onlangs verander. Jy moet dit miskien verifieer voordat jy weer hierdie boodskap stuur.";
"FAILED_SENDING_BECAUSE_UNTRUSTED_IDENTITY_KEY" = "U veiligheidsnommer met %@ het onlangs verander. U moet dit dalk verifieer voordat u weer hierdie boodskap stuur.";
/* alert title */
"FAILED_VERIFICATION_TITLE" = "Kon nie veiligheidsnommer verifieer nie!";
@ -6044,7 +6044,7 @@
"STICKERS_UNINSTALL_BUTTON" = "Deïnstalleer";
/* Title for the 'Badges' button in sustainer view. */
"SUBSCRIBER_BADGES" = "Badges";
"SUBSCRIBER_BADGES" = "Wapens";
/* Title for the 'Manage Subscription' button in sustainer view. */
"SUBSCRIBER_MANAGE_SUBSCRIPTION" = "Manage Subscription";
@ -6209,7 +6209,7 @@
"SUSTAINER_VIEW_SUBSCRIPTION_CONFIRMATION_NOT_NOW" = "Nie nou nie";
/* Title for the signal sustainer view */
"SUSTAINER_VIEW_TITLE" = "Signal is powered by people like you.";
"SUSTAINER_VIEW_TITLE" = "Signal word aangedryf deur mense soos u.";
/* Update Subscription? Action sheet message, embeds {{Price}} */
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_MESSAGE" = "You will be charged the full amount (%@) of the new subscription price today. Your new subscription will renew monthly.";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Signal-ı gücləndirin";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Gücləndirmə nişanınızın müddəti bitdi və artıq profilinizdə görünməyəcək.\n\nSignal-ı istifadə etməyə davam edə bilərsiniz, ancaq sizin üçün qurulmuş texnologiyanı dəstəkləmək üçün zəhmət olmasa aylıq Dəstəkçi olmağı düşünün.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Gücləndirmə nişanınızın müddəti bitdi və artıq profilinizdə görünməyəcək.\n\nTəksəfərlik töhfə ilə Gücləndirmə nişanınızı daha 30 gün aktivləşdirə bilərsiniz.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Uzun müddət aktiv olmadığınız üçün Dəstəkçi abunəliyiniz avtomatik olaraq ləğv edilmişdir. %@ nişanınız artıq profilinizdə görünmür.\n\nSignal-ı istifadə etməyə davam edə bilərsiniz, ancaq tətbiqi dəstəkləmək və nişanı təkrar aktivləşdirmək üçün indi yeniləyin.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Bir dəstəkçi olun";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Bir Gücləndirmə əlavə et";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Nişanın müddəti bitdi";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Abunəliyi yenilə";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Abunəlik ləğv edildi";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Gücləndirmə üçün təşəkkürlər!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Doneu una empenta al Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "La insígnia d'empenta ha caducat i ja no és visible al perfil.\n\nPodeu continuar usant el Signal, però per donar suport a la tecnologia creada per a vós, considereu convertir-vos-en en un sostenidor mensual.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "La insígnia d'empenta ha caducat i ja no és visible al perfil.\n\nPodeu reactivar-la durant 30 dies més amb una aportació única.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "La subscripció a Sostenidor s'ha cancel·lat automàticament perquè heu estat massa temps inactiu. La insígnia %@ ja no és visible al perfil.\n\nPodeu seguir usant el Signal, però per donar suport a l'aplicació i reactivar la insígnia, renoveu-la ara.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Sigueu-ne un sostenidor";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Afegiu-hi una empenta";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Insígnia vençuda";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renova la subscripció";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscripció cancel·lada";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Gràcies per l'empenta!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Dejte Signalu Boost";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Platnost vašeho odznaku Boost vypršela a již není na vašem profilu viditelný.\n\nSignál můžete používat i nadále, ale abyste podpořili technologii, která je vytvořena pro vás, zvažte, zda se nestát měsíčním podporovatelem.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Platnost vašeho odznaku Boost vypršela a již není na vašem profilu viditelný.\n\nJednorázovým příspěvkem si můžete odznak Boost znovu aktivovat na dalších 30 dní.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Vaše předplatné Sustainer bylo automaticky zrušeno, protože jste byli příliš dlouho neaktivní. Váš %@ odznak již není na vašem profilu viditelný.\n\nSignál můžete používat i nadále, ale abyste aplikaci podpořili a svůj odznak znovu aktivovali, obnovte jej nyní.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Staňte se podporovatelem";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Přidat Boost";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Platnost odznaku vypršela";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Obnovit předplatné";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Předplatné zrušeno";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Díky za Boost!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Rhowch Hwb i Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Mae eich bathodyn Hwb wedi dod i ben, ac nid yw bellach i'w weld ar eich proffil.\n\nGallwch barhau i ddefnyddio Signal ond i gefnogi technoleg sydd wedi'i hadeiladu ar eich cyfer chi, ystyriwch ddod yn Gynhaliwr misol.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Mae eich bathodyn Hwb wedi dod i ben, ac nid yw bellach i'w weld ar eich proffil.\n\nGallwch ail-greu eich bathodyn Hwb am 30 diwrnod arall gyda chyfraniad unigol.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Cafodd eich tanysgrifiad Cynhaliwr ei ganslon awtomatig oherwydd nad oeddech yn weithredol am gyfnod. Nid yw eich bathodyn %@ bellach i'w weld ar eich proffil.\n\nGallwch barhau i ddefnyddio Signal ond i gefnogi'r ap ac ail-greu'ch bathodyn, adnewyddwch nawr.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Dod yn Gynhaliwr";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Ychwanegwch Boost";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Bathodyn Wedi Darfod";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Adnewyddu Tanysgrifiad";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Diddymwyd Tanysgrifiad";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Diolch am yr Hwb!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Giv Signal en saltvandsindsprøjtning";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Dit Boost-emblem er udløbet og vises ikke længere på din profil.\n\nDu kan fortsat bruge Signal, men for at støtte teknologi, der er udviklet til dig, beder vi dig overveje at give et månedligt bidrag.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Dit Boost-emblem er udløbet og vises ikke længere på din profil.\n\nDu kan genaktivere dit Boost-emblem i yderligere 30 dage med et engangsbidrag.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Dit bidragsyder-abonnement blev automatisk opsagt, fordi du har været inaktiv i for lang tid. Dit %@-emblem er ikke længere synligt på din profil.\n\nDu kan fortsætte med at bruge Signal, men hvis du vil støtte appen og genaktivere dit emblem, skal du forny nu.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Bliv bidragsyder";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Tilføj et Boost";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Emblem udløbet";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Forny abonnement";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Abonnement opsagt";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Tak for saltvandsindsprøjtningen!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Gib Signal einen Boost";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Dein Boost-Abzeichen ist abgelaufen und ist nicht mehr in deinem Profil sichtbar.\n\nDu kannst Signal weiterhin verwenden, aber um für dich entwickelte Technologie zu unterstützen, erwäge es, ein monatlicher Unterstützer zu werden.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Dein Boost-Abzeichen ist abgelaufen und nicht mehr in deinem Profil sichtbar.\n\nDu kannst dein Boost-Abzeichen für weitere 30 Tage mit einer Einmalspende reaktivieren.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Deine regelmäßige Unterstützerspende wurde automatisch gekündigt, da du längere Zeit inaktiv warst. Dein %@-Abzeichen ist nicht mehr in deinem Profil sichtbar.\n\nDu kannst Signal weiterhin verwenden, aber um die App zu unterstützen und dein Abzeichen zu reaktivieren, verlängere jetzt deine regelmäßige Spende.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Unterstützer werden";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Boost hinzufügen";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Abzeichen abgelaufen";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Regelmäßige Spende verlängern";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Regelmäßige Spende gekündigt";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Danke für deine Spende!";

View File

@ -781,6 +781,9 @@
/* Multi-line label explaining why compose-screen contact picker is empty. */
"COMPOSE_SCREEN_MISSING_CONTACTS_PERMISSION" = "You can enable contacts access in the iOS Settings app to see which of your contacts are Signal users.";
/* Configure reactions title text */
"CONFIGURE_REACTIONS" = "Configure Reactions";
/* No comment provided by engineer. */
"CONFIRM_DELETE_DATA_TEXT" = "This will reset the application by deleting your messages. The app will close after this process is complete.";
@ -4813,6 +4816,9 @@
/* Title for the research megaphone modal */
"RESEARCH_MODAL_TITLE" = "Signal Research";
/* Configure reactions reset button text */
"RESET" = "Reset";
/* Generic text for button that retries whatever the last action was. */
"RETRY_BUTTON_TEXT" = "Retry";
@ -6334,6 +6340,9 @@
/* Indicator warning about an unknown group thread. */
"SYSTEM_MESSAGE_UNKNOWN_THREAD_WARNING_GROUP" = "No contacts in this group. Review requests carefully.";
/* Tap to Replace Emoji string for reaction configuration */
"TAP_REPLACE_EMOJI" = "Tap to replace an emoji";
/* text indicating the message was remotely deleted */
"THIS_MESSAGE_WAS_DELETED" = "This message was deleted.";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Da un impulso a Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Tu distintivo de impulso ha caducado y ya no es visible en tu perfil.\n\nPuedes continuar usando Signal, pero para sostener la tecnología hecha para ti, y no para tus datos, considera en sostener Signal mensualmente.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Tu distintivo de impulso ha caducado y ya no es visible en tu perfil.\n\nPuedes reactivar tu distintivo de impulso por otros 30 días con una contribución puntual.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Tu suscripción de sostén se ha cancelado automáticamente por inactividad demasiado prolongada en tu cuenta. Tu distintivo «%@» ya no es visible en tu perfil.\n\nPuedes continuar usando Signal, pero para sostener la aplicación y reactivar tu distintivo, renuévalo ahora.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Sostén Signal";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Danos un impulso";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Distintivo caducado";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renovar suscripción";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Suscripción cancelada";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "¡Gracias por el impulso!";
@ -3191,7 +3191,7 @@
"MESSAGE_ACTION_COPY_TEXT" = "Copiar mensaje";
/* The title for the action that deletes a message for all users in the conversation. */
"MESSAGE_ACTION_DELETE_FOR_EVERYONE" = "Eliminar en el chat";
"MESSAGE_ACTION_DELETE_FOR_EVERYONE" = "Eliminar del chat";
/* A one-time confirmation that you want to delete for everyone */
"MESSAGE_ACTION_DELETE_FOR_EVERYONE_CONFIRMATION" = "Este mensaje se eliminará para tod@s en el chat si usan una versión reciente de Signal. En el chat se mostrará que lo has eliminado. ";

View File

@ -386,28 +386,28 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Dale un impulso a Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Tu distintivo de impulso ha caducado y ya no es visible en tu perfil.\n\nPuedes continuar usando Signal, pero para sostener la tecnología hecha para ti, y no para tus datos, considera en sostener Signal mensualmente.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Tu distintivo de impulso ha caducado y ya no es visible en tu perfil.\n\nPuedes reactivar tu distintivo de impulso por otros 30 días con una contribución puntual.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Tu suscripción de sostén se ha cancelado automáticamente por inactividad demasiado prolongada en tu cuenta. Tu distintivo «%@» ya no es visible en tu perfil.\n\nPuedes continuar usando Signal, pero para sostener la aplicación y reactivar tu distintivo, renuévalo ahora.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Sostén Signal";
/* Button title for boost on the badge expiration sheet, used if the user is already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Add a Boost";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Danos un impulso";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Distintivo caducado";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renovar suscripción";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Suscripción cancelada";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "¡Gracias por el impulso!";

View File

@ -512,7 +512,7 @@
"BOOST_VIEW_BODY_WITH_EXPIRATION_FORMAT" = "Merkkisi Boostaus erääntyy %@.";
/* Default text for the custom amount field of the boost view. */
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Syöltä muu summa";
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Syötä muu summa";
/* Text explaining there are other ways to donate on the boost view. */
"BOOST_VIEW_OTHER_WAYS" = "Enemmän maksuvaihtoehtoja";

View File

@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Donner un coup de pouce";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Macaron expiré";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renouveler labonnement";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Abonnement annulé";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Merci pour le coup de pouce!";
@ -5159,7 +5159,7 @@
"SETTINGS_ADVANCED_VIEW_ERROR_LOG" = "Journaux derreurs";
/* Footer for avatar section in appearance settings */
"SETTINGS_APPEARANCE_AVATAR_FOOTER" = "Voir les photos de contact du système lorsque disponibles.";
"SETTINGS_APPEARANCE_AVATAR_FOOTER" = "Afficher les photos de contact du système si disponibles.";
/* Title for switch to toggle preference between contact and profile avatars */
"SETTINGS_APPEARANCE_AVATAR_PREFERENCE_LABEL" = "Utiliser les photos de contact du système";
@ -5321,7 +5321,7 @@
"SETTINGS_MESSAGING" = "Messagerie";
/* Explanation for the 'messaging' privacy settings. */
"SETTINGS_MESSAGING_FOOTER" = "Voir et partager lorsque les messages sont lus et saisis. Lorsque désactivé, vous ne verrez pas les accusés de lecture ni indications de saisie des autres utilisateurs.";
"SETTINGS_MESSAGING_FOOTER" = "Voyez et partagez la lecture et la saisie des messages. Si cette option est désactivée, vous ne verrez ni les accusés de lecture ni les indications de saisie des autres utilisateurs.";
/* Title for settings activity */
"SETTINGS_NAV_BAR_TITLE" = "Paramètres";
@ -5333,7 +5333,7 @@
"SETTINGS_NOTIFICATION_BADGE_COUNT_TITLE" = "Pastille de comptage";
/* table section footer */
"SETTINGS_NOTIFICATION_CONTENT_DESCRIPTION" = "Les notifications d'appels et de messages peuvent apparaître lorsque votre téléphone est verrouillé.";
"SETTINGS_NOTIFICATION_CONTENT_DESCRIPTION" = "Les notifications dappels et de messages peuvent apparaître alors que votre téléphone est verrouillé.";
/* table section header */
"SETTINGS_NOTIFICATION_CONTENT_TITLE" = "Contenu des notifications";
@ -5504,7 +5504,7 @@
"SETTINGS_PAYMENTS_OPT_IN_TITLE" = "Nous présentons les paiements (bêta)";
/* Explanation of the 'payments passphrase' in the 'view payments passphrase' settings. */
"SETTINGS_PAYMENTS_PASSPHRASE_EXPLANATION" = "Votre solde sera automatiquement restitué lorsque vous réinstallez Signal et confirmez votre NIP. Vous pouvez aussi récupérer votre solde en utilisant une phrase de récupération, laquelle est une phrase unique et personnelle de 24-mots. Notez la et rangez la dans un endroit sûr.";
"SETTINGS_PAYMENTS_PASSPHRASE_EXPLANATION" = "Après avoir réinstallé Signal, votre solde sera restauré automatiquement si vous confirmez votre NIP Signal. Vous pouvez aussi restaurer votre solde grâce à une phrase de récupération, une phrase de 24 mots qui vous est propre. Prenez-la par écrit et gardez-la en lieu sûr.";
/* Label for the 'add money' button in the 'send payment' UI. */
"SETTINGS_PAYMENTS_PAYMENT_ADD_MONEY" = "Ajouter des fonds";
@ -5765,7 +5765,7 @@
"SETTINGS_PIN_REMINDER_SWITCH_LABEL" = "Rappels du NIP";
/* Footer for the 'PINs' section of the privacy settings. */
"SETTINGS_PINS_FOOTER" = "NIPs conservent les informations de Signal sous forme chiffrée pour que vous seul puissiez y accéder. Votre NIP ne peut être retrouvé. Votre profil, configuration et contacts sont rétablis lorsque vous ré-installez Signal.";
"SETTINGS_PINS_FOOTER" = "Les NIP conservent les renseignements stockés dans Signal sous forme chiffrée afin que vous seul puissiez y accéder. Votre NIP ne peut pas être récupéré. Votre profil, votre configuration et vos contacts seront restaurés quand vous réinstallez Signal.";
/* Label for the 'pins' item of the privacy settings when the user does have a pin. */
"SETTINGS_PINS_ITEM" = "Changer votre NIP";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "תן אל Signal תמריץ";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "תג התמריץ שלך פג, והוא אינו גלוי יותר בפרופיל שלך.\n\nאתה יכול להמשיך להשתמש ב־Signal אבל כדי לתמוך בטכנולוגיה שנבנתה עבורך, אנא שקול להפוך אל מחזיק חודשי.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "תג התמריץ שלך פג, והוא אינו גלוי יותר בפרופיל שלך.\n\nאתה יכול להפעיל מחדש את תג התמריץ שלך למשך 30 ימים נוספים עם תרומה חד־פעמית.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "מינוי התמריץ שלך בוטל באופן אוטומטי מאחר שהיית בלתי פעיל למשך זמן רב. תג ה%@ שלך אינו גלוי יותר בפרופיל שלך.\n\nאתה יכול להמשיך להשתמש ב־Signal אבל כדי לתמוך ביישום ולהפעיל מחדש את התג שלך, חַדֵשׁ עכשיו.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "הפוך אל מחזיק";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "הוסף תמריץ";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "תג פג";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "חדש מינוי";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "מינוי בוטל";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "תודה על התמריץ!";

View File

@ -380,34 +380,34 @@
"BADGE_CONFIGURATION_TITLE" = "Značke";
/* Text prompting the user to become a signal sustainer */
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Postanite pretplatnik";
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Pretplatite se";
/* Text prompting the user to boost */
"BADGE_DETAILS_GIVE_A_BOOST" = "Donirajte jednokratno";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Vaša \"Boost\" značka je istekla i više nije vidljiva na vašem profilu.\n\nMožete nastaviti koristiti Signal, ali kako biste podržali aplikaciju koja je napravljena za vas, razmislite o tome da postanete mjesečni pretplatnik.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Vaša \"Boost\" značka je istekla i više nije vidljiva na vašem profilu. \n\nSvoju \"Boost\" značku možete ponovno aktivirati na sljedećih 30 dana uz jednokratnu donaciju.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Vaša pretplata je automatski otkazana zbog toga što ste dugo bili neaktivni. Vaša %@ značka više nije vidljiva na vašem profilu. \n\nMožete nastaviti koristiti Signal, ali da biste podržali aplikaciju i ponovno aktivirali svoju značku, obnovite je sada.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Postanite pretplatnik";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Pretplatite se";
/* Button title for boost on the badge expiration sheet, used if the user is already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Add a Boost";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Značka je istekla";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Obnovi pretplatu";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Pretplata je otkazana";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Hvala vam na uplati!";
@ -1817,7 +1817,7 @@
"FEATURED_BADGE_SECTION_HEADER" = "Odaberite značku";
/* The title for the featured badge settings page */
"FEATURED_BADGE_SETTINGS_TITLE" = "Featured Badge";
"FEATURED_BADGE_SETTINGS_TITLE" = "Vaše značke";
/* Button that marks user as verified after a successful fingerprint scan. */
"FINGERPRINT_SCAN_VERIFY_BUTTON" = "Označi kao provjereno";
@ -5864,7 +5864,7 @@
"SETTINGS_SIGNAL_BOOST" = "Jednokratna donacija";
/* Title for the 'become a sustainer' link in settings. */
"SETTINGS_SUBSCRIPTION" = "Postanite Signalov pretplatnik";
"SETTINGS_SUBSCRIPTION" = "Pretplatite se";
/* Label for the 'enable registration lock' switch of the privacy settings. */
"SETTINGS_TWO_FACTOR_AUTH_SWITCH_LABEL" = "Zaključavanje registracije";

View File

@ -2,8 +2,8 @@ NSAppleMusicUsageDescription = "A Signalnak szüksége van Apple Music hozzáfé
NSCameraUsageDescription = "A Signal a kamerád segítségével készít fotókat és végez videóhívásokat.";
NSContactsUsageDescription = "A Signal a kontaktlistádat használja ismerőseid megtalálásához. Nem tárolunk kontaktlistát szerverünkön.";
NSFaceIDUsageDescription = "A Signal képernyőzár Face ID funkciót használ.";
NSLocationWhenInUseUsageDescription = "A Signalnak helyzetadataidra van szüksége pozíciód megosztásához.";
NSMicrophoneUsageDescription = "A Signalnak mikrofon hozzáférésre van szüksége hívások indításához, fogadásához és hangjegyzetek küldéséhez.";
NSLocationWhenInUseUsageDescription = "A Signalnak szüksége van a helyzetadataidra pozíciód megosztásához.";
NSMicrophoneUsageDescription = "A Signalnak szüksége van mikrofon hozzáférésre hívások indításához, fogadásához és hangjegyzetek küldéséhez.";
NSPhotoLibraryAddUsageDescription = "A Signal a fotógalériádba menti képeidet.";
NSPhotoLibraryUsageDescription = "Signalban válogathatsz melyik képet szeretnéd elküldeni.";
NSPhotoLibraryUsageDescription = "A Signalban válogathatsz melyik képet szeretnéd elküldeni.";
NSLocalNetworkUsageDescription = "Amennyiben tudatosan ezt a funkciót választod, a Signal a helyi hálózatot a fiókod új telefonra költöztetéséhez használja - semmilyen más célra nem.";

View File

@ -113,13 +113,13 @@
"ALERT_ACTION_ACKNOWLEDGE" = "Rendben";
/* Format string for delivery issue sheet message. Embeds {{ sender name }}. */
"ALERT_DELIVERY_ISSUE_MESSAGE_FORMAT" = "Egy üzenet, matrica, reakció emoji, kézbesítési nyugta, vagy média küldése %@ kontakttól nem érkezett meg hozzád.";
"ALERT_DELIVERY_ISSUE_MESSAGE_FORMAT" = "Nem sikerült kézbesíteni egy %@ által részedre küldött üzenetet, matricát, reakciót, olvasási nyugtát vagy médiafájlt.";
/* Title for delivery issue sheet */
"ALERT_DELIVERY_ISSUE_TITLE" = "Kézbesítési probléma";
/* Format string for delivery issue sheet message where the original thread is unknown. Embeds {{ sender name }}. */
"ALERT_DELIVERY_ISSUE_UNKNOWN_THREAD_MESSAGE_FORMAT" = "Egy üzenet, matrica, reakció emoji, kézbesítési nyugta, vagy média küldése %@ kontakttól nem érkezett meg hozzád. A küldési kísérlet történhetett egyéni, vagy csoportüzenetben is.";
"ALERT_DELIVERY_ISSUE_UNKNOWN_THREAD_MESSAGE_FORMAT" = "Nem sikerült kézbesíteni egy %@ által küldött üzenetet, matricát, reakciót, olvasási nyugtát vagy médiafájlt. A küldési kísérlet történhetett egyéni, vagy csoportüzenetben is.";
/* The label for the 'discard' button in alerts and action sheets. */
"ALERT_DISCARD_BUTTON" = "Elvetés";
@ -386,28 +386,28 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Adj egy Lökést a Signalnak";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "A Lökés Kitűző lejárt és így többé nem látható a profilképeden.\n\nA Signal további használata nem változik, de ha hosszútávon is támogatnád ezt a mindenki számára fejlesztett technológiát, akkor fontold meg a havi Fenntartóvá válást.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "A Lökés Kitűző lejárt és így többé nem látható a profilképeden.\n\nA Lökés Kitűző újabb 30 napra történő aktiválását egy ismételt egyszeri hozzájárulással tudod megtenni.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Fenntartói előfizetésed automatikusan törlésre került, mert túl sokáig voltál inaktív. A %@ kitűződ már nem látható profilképeden.\n\nA Signal használata nem változik, de ha fenntartanád a támogatásod és újraaktiválnád a kitűződet, akkor előfizetésed megújítása szükséges.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Válj Fenntartóvá!";
/* Button title for boost on the badge expiration sheet, used if the user is already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "\"Löket\" hozzáadása";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "\"Lökés” adása";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "A kitűző lejárt";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Előfizetés megújítása";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Előfizetés törölve";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Köszönet a Lökésért!";
@ -1622,7 +1622,7 @@
"EMAIL_INVITE_BODY" = "Szia,\n\nújabban privát csevegéseimet a Signal üzenetküldő alkalmazással bonyolítom iPhone-on. Örülnék, ha te is telepítenéd, így biztosak lehetünk benne, hogy amit írunk, vagy mondunk a telefonba, az köztünk marad.\n\nA Signal elérhető iPhone és Android telefonokra is innen: %@\n\nA Signal az ismert csevegőprogramokhoz hasonlóan működik: küldhetünk képeket, videókat, hívhatjuk egymást, csoportos csevegést indíthatunk. A legjobb, hogy a fentiekbe senkinek, még a Signal fejlesztőinek sincs semmilyen betekintési, belehallgatási lehetősége.\n\nHa érdekel a készítő gárda (az Open Whisper Systems), vagy hogy kik is az emberek, akik a Signal fejlesztését végzik, akkor látogass el ide: %@";
/* subject of email sent to contacts when inviting to install Signal */
"EMAIL_INVITE_SUBJECT" = "Váltsunk Signal-ra";
"EMAIL_INVITE_SUBJECT" = "Váltsunk Signalra!";
/* Description for the fallback support sheet if user cannot send email */
"EMAIL_SIGNAL_MESSAGE" = "Készülékeden nincs beállítva levelező kliens. Vagy állítsd be, vagy támogatási kérelmedet emailben küldd el erre a címre: support@signal.org";
@ -3875,7 +3875,7 @@
"PAYMENTS_CURRENCY_UNKNOWN" = "?";
/* Message for the 'decline a payment request' alert. Embeds {{ the name of the user requesting payment }}. */
"PAYMENTS_DECLINE_REQUEST_ALERT_MESSAGE_FORMAT" = "%@ értesítésre kerül, hogy elutasítottad.";
"PAYMENTS_DECLINE_REQUEST_ALERT_MESSAGE_FORMAT" = "%@ értesítést kap, hogy elutasítottad.";
/* Title for the 'decline a payment request' alert. */
"PAYMENTS_DECLINE_REQUEST_ALERT_TITLE" = "Elutasítod ezt a kérést?";
@ -3887,7 +3887,7 @@
"PAYMENTS_ERROR_PAYMENT_REQUEST_CANCEL_FAILED" = "A kérés nem megszakítható.";
/* Error indicating that a payment request could not be declined. */
"PAYMENTS_ERROR_PAYMENT_REQUEST_DECLINE_FAILED" = "A kérés em elutasítható.";
"PAYMENTS_ERROR_PAYMENT_REQUEST_DECLINE_FAILED" = "A kérés nem elutasítható.";
/* Status indicator for incoming payments which failed. */
"PAYMENTS_FAILURE_INCOMING_FAILED" = "Sikertelen";
@ -3905,7 +3905,7 @@
"PAYMENTS_FAILURE_OUTGOING_INSUFFICIENT_FUNDS" = "Nincs elég alaptőke";
/* Status indicator for outgoing payments for which the notification could not be sent. */
"PAYMENTS_FAILURE_OUTGOING_NOTIFICATION_SEND_FAILED" = "Nyugta küldése sikertelen a címzettnek";
"PAYMENTS_FAILURE_OUTGOING_NOTIFICATION_SEND_FAILED" = "Sikertelen nyugtaküldés a címzett számára";
/* Status indicator for outgoing payments which failed to verify. */
"PAYMENTS_FAILURE_OUTGOING_VALIDATION_FAILED" = "Érvénytelen";
@ -3938,13 +3938,13 @@
"PAYMENTS_NEW_PAYMENT_ERROR_INVALID_TRANSACTION" = "Érvénytelen tranzakció";
/* Indicates that a payment failed due to an outdated client. */
"PAYMENTS_NEW_PAYMENT_ERROR_OUTDATED_CLIENT" = "Frissítsd a Signalt a fizetések használatához";
"PAYMENTS_NEW_PAYMENT_ERROR_OUTDATED_CLIENT" = "Frissítsd a Signalt a fizetések használatához!";
/* Indicates that an outgoing payment could not be verified in a timely way. */
"PAYMENTS_NEW_PAYMENT_ERROR_OUTGOING_VERIFICATION_TAKING_TOO_LONG" = "A fizetés még nem került ellenőrzésre";
/* Indicates that an unknown error occurred while sending a payment or payment request. */
"PAYMENTS_NEW_PAYMENT_ERROR_UNKNOWN" = "Sikertelen a fizetés befejezése. Ellenőrizd a kapcsolatod és próbáld újra.";
"PAYMENTS_NEW_PAYMENT_ERROR_UNKNOWN" = "A fizetés befejezése sikertelen. Ellenőrizd a netkapcsolatod és próbáld újra.";
/* Label for the 'payment estimated fee' indicator. */
"PAYMENTS_NEW_PAYMENT_ESTIMATED_FEE" = "Hálózati díj";
@ -4886,7 +4886,7 @@
"SCREENSHOT_NAME_LOCAL_PROFILE" = "Freya elnökasszony";
/* This is a message expressing support/happiness/awe/shock. */
"SCREENSHOT_THREAD_DIRECT_FIVE_MESSAGE_ONE" = "Gratulálok! Nem tudom elhinni!";
"SCREENSHOT_THREAD_DIRECT_FIVE_MESSAGE_ONE" = "Gratulálok! El se hiszem!";
/* This is a message. */
"SCREENSHOT_THREAD_DIRECT_FIVE_MESSAGE_THREE" = "Holnap látlak?";
@ -5387,7 +5387,7 @@
"SETTINGS_PAYMENTS_CANNOT_SEND_PAYMENTS_KILL_SWITCH" = "A fizetés funkció a Signalban a továbbiakban nem elérhető. Továbbra is átviheted egyenlegedet egy átváltó szolgáltatáson, de a továbbiakban már nem tudsz küldeni vagy fogadni fizetéseket, vagy feltölteni az egyenleged.adni fizetéseket vagy feltölteni az egyenleged.";
/* Error message indicating that you cannot transfer into your payments wallet because the feature is not currently available. */
"SETTINGS_PAYMENTS_CANNOT_TRANSFER_IN_KILL_SWITCH" = "A Fizetések a Signal-ban a továbbiakban nem elérhető. Átviheted az egyenleged egy tőzsdére, de a továbbiakban már nem tudsz küldeni vagy fogadni fizetéseket vagy feltölteni az egyenleged.";
"SETTINGS_PAYMENTS_CANNOT_TRANSFER_IN_KILL_SWITCH" = "A Fizetések funkció a Signalban a továbbiakban nem elérhető. Átviheted az egyenleged egy átváltó tőzsdére, de a továbbiakban már nem tudsz küldeni vagy fogadni fizetéseket vagy feltölteni az egyenleged.";
/* Message for the 'currency conversions info' alert. */
"SETTINGS_PAYMENTS_CURRENCY_CONVERSIONS_INFO_ALERT_MESSAGE" = "A pénznem váltás csak becslés és elképzelhető, hogy nem pontos.";
@ -5456,7 +5456,7 @@
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_BUTTON" = "PIN frissítése";
/* Description for the 'Update PIN' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_DESCRIPTION" = "Nagy egyenleggel lehet, hogy szeretnél egy alfanumerikus PIN-re frissíteni, hogy további védelmet adj a fiókodhoz.";
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_DESCRIPTION" = "Nagy egyenleggel lehet, hogy tanácsos lenne egy alfanumerikus PIN-re frissíteni, hogy további védelmet adj a fiókodhoz.";
/* Title for the 'Update PIN' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_TITLE" = "Frissítsd a PIN kódodat";
@ -5549,7 +5549,7 @@
"SETTINGS_PAYMENTS_PAYMENT_INSUFFICIENT_BALANCE_ALERT_MESSAGE_FORMAT" = "Nincs elég MOB a birtokodban ehhez a kifizetéshez. Az aktuális egyenleged: %@.";
/* Title for the 'insufficient balance for payment' alert. */
"SETTINGS_PAYMENTS_PAYMENT_INSUFFICIENT_BALANCE_ALERT_TITLE" = "Nem elég egyenleg";
"SETTINGS_PAYMENTS_PAYMENT_INSUFFICIENT_BALANCE_ALERT_TITLE" = "Fedezethiány";
/* Format string for the sender of an incoming payment. Embeds: {{ the name of the sender of the payment}}. */
"SETTINGS_PAYMENTS_PAYMENT_USER_INCOMING_FORMAT" = "Küldte: %@";
@ -5663,7 +5663,7 @@
"SETTINGS_PAYMENTS_TITLE" = "Fizetések";
/* Error indicating that it is not valid to send yourself a payment. */
"SETTINGS_PAYMENTS_TRANSFER_OUT_CANNOT_SEND_TO_SELF" = "Nem küldhetsz a Signal tárca címedre. Add meg a támogatott tőzsdei fiókhoz tartozó tárca címedet ";
"SETTINGS_PAYMENTS_TRANSFER_OUT_CANNOT_SEND_TO_SELF" = "Nem küldhetsz a Signal tárca címedre. Add meg a támogatott átváltói tőzsdei fiókhoz tartozó tárca címedet!";
/* Footer of the 'transfer currency out' view in the payment settings. */
"SETTINGS_PAYMENTS_TRANSFER_OUT_FOOTER" = "Átutalhatsz MobileCoint a tőzsdéd által megadott digitális pénztárca címére. A tárca cím egy szöveg, számokkal és betűkkel, amely legtöbbször a QR kód alatt található.";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Gefðu Signal hvatningu";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Hvatningarmerkið þitt er útrunnið og er ekki lengur sýnilegt á auðkennismyndinni þinni.\n\nÞú getur haldið áfram að nota Signal, en til að styðja við verkefnið í þína þágu, ættirðu að íhuga að gerast mánaðarlegur Stuðningsaðili.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Hvatningarmerkið þitt er útrunnið og er ekki lengur sýnilegt á auðkennismyndinni þinni.\n\nÞú getur virkjað það aftur í aðra 30 daga með eins-skiptis framlagi.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Stuðningsaðilaáskriftin þín var sjálfvirkt felld niður því þú hefur verið óvirk/ur of lengi. %@ merkið þitt er ekki lengur sýnilegt á auðkennismyndinni þinni.\n\nÞú getur haldið áfram að nota Signal, en til að styðja við verkefnið og virkja merkið þitt aftur þarftu að endurnýja áskriftina.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Gerstu stuðningsaðili";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Bæta við hvatningu";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Merki útrunnið";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Endurnýja áskrift";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Áskrift sagt upp";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Þakka þér fyrir hvatninguna!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Dai a Signal un Boost";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = " Il tuo badge Boost è scaduto e non è più visibile sul tuo profilo.\n\nPer continuare a usare Signal, ma per sostenere la tecnologia che è costruita per te, considera di diventare un contributore mensile.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Il tuo badge Boost è scaduto e non è più visibile sul tuo profilo.\n\nPuoi riattivare il tuo badge Boost per altri 30 giorni con un contributo una tantum.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Il tuo contributo da sostenitore è stato automaticamente cancellato perché sei stato inattivo per troppo tempo. Il tuo badge %@ non è più visibile sul tuo profilo.\n\nPuoi continuare a usare Signal ma per sostenere l'app e riattivare il tuo badge, rinnova ora.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Diventa un sostenitore";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Aggiungi un Boost";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Badge scaduto";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Rinnova contributo";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Contributo annullato";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Grazie per il Boost!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Signalをブーストしましょう";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "あなたのブーストバッジは有効期限が切れたため、プロフィールには表示されません。\n\nSignalは使い続けられますが、あなたのために作られた技術をサポートするため、月次サポーターへの登録をご検討ください。";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "あなたのブーストバッジは有効期限が切れたため、プロフィールには表示されません。\n\n1回の寄付で、ブーストバッジをさらに30日間有効にすることができます。";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "長い間ご利用がなかったため、あなたのサポーターサブスクリプションは自動で解除されました。あなたの%@バッジは、プロフィールに表示されなくなっています。\n\nSignalは使い続けられますが、アプリのサポートやバッジを再び有効にするには、今すぐ更新してください。";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "サポーターになりませんか";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "ブーストを追加";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "バッジが失効しました";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "サブスクリプションを更新";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "サブスクリプションが解除されました";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "ブーストをありがとうございます!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Suteikite Signal paskatinimą";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Jūsų paskatinimo ženkliukas nebegalioja ir daugiau nebėra matomas jūsų profilyje.\n\nGalite ir toliau naudoti Signal, bet norėdami palaikyti jums kuriamą technologiją, apsvarstykite galimybę tapti remėju ir remti kas mėnesį.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Jūsų paskatinimo ženkliukas nebegalioja ir daugiau nebėra matomas jūsų profilyje.\n\nPaaukodami, galite dar 30-čiai dienų iš naujo aktyvuoti paskatinimo ženkliuką.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Jūsų remėjo prenumerata buvo automatiškai nutraukta, nes pernelyg ilgą laiką buvote neaktyvūs. Jūsų %@ ženkliukas yra daugiau nebematomas jūsų profilyje.\n\nGalite ir toliau naudotis Signal programėle, bet norėdami ją paremti ir iš naujo aktyvuoti ženkliuką, atnaujinkite prenumeratą dabar.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Tapti remėju";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Pridėti paskatinimą";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Ženkliukas nebegalioja";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Atnaujinti prenumeratą";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Prenumerata nutraukta";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Dėkojame už paskatinimą!";

View File

@ -383,7 +383,7 @@
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Станете поддржувач";
/* Text prompting the user to boost */
"BADGE_DETAILS_GIVE_A_BOOST" = "Give Signal a Boost";
"BADGE_DETAILS_GIVE_A_BOOST" = "Дајте му поттик на Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
@ -398,7 +398,7 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Станете поддржувач";
/* Button title for boost on the badge expiration sheet, used if the user is already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Add a Boost";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Додај поттик";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
@ -410,7 +410,7 @@
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Thanks for the Boost!";
"BADGE_THANKS_BOOST_TITLE" = "Благодариме за поттикот!";
/* Label prompting the user to display the new badge on their profile on the badge thank you sheet. */
"BADGE_THANKS_DISPLAY_ON_PROFILE_LABEL" = "Прикажи на профил";
@ -527,7 +527,7 @@
"BOOST_VIEW_SELECT_AN_AMOUNT" = "Select an amount to donate";
/* Title for the donate to signal view */
"BOOST_VIEW_TITLE" = "Give Signal a Boost";
"BOOST_VIEW_TITLE" = "Дајте му поттик на Signal";
/* Label for the 'add' button. */
"BUTTON_ADD" = "Додадете...";
@ -4049,7 +4049,7 @@
"PAYMENTS_RECIPIENT_MISSING_PROFILE_KEY_MESSAGE_W_MESSAGES" = "To send a payment to this user they need to accept a message request from you.";
/* Message for error alert indicating that a given user cannot receive payments because of a pending message request for a recipient that they have not sent message to. */
"PAYMENTS_RECIPIENT_MISSING_PROFILE_KEY_MESSAGE_WO_MESSAGES" = "To send a payment to this user they need to accept a message request from you. Send them a message to create a message request.";
"PAYMENTS_RECIPIENT_MISSING_PROFILE_KEY_MESSAGE_WO_MESSAGES" = "За да испратите плаќање на овој корисник, прво тие мора да го прифатат барањето за порака од Вас. Испратете им порака за да креирате барање за порака.";
/* Title for error alert indicating that a given user cannot receive payments because of a pending message request. */
"PAYMENTS_RECIPIENT_MISSING_PROFILE_KEY_TITLE" = "Cant send payment";
@ -5363,7 +5363,7 @@
"SETTINGS_PAYMENTS_ADD_MONEY" = "Add Funds";
/* Explanation of the process for adding money in the 'add money' settings view. */
"SETTINGS_PAYMENTS_ADD_MONEY_DESCRIPTION" = "To add funds, send MobileCoin to your wallet address. Start a transaction from your account on an exchange that supports MobileCoin, then scan the QR code or copy your wallet address.";
"SETTINGS_PAYMENTS_ADD_MONEY_DESCRIPTION" = "За да додадете средства, испратете MobileCoin на адресата на Вашиот паричник. Започнете трансакција од Вашата сметка на берза која што поддржува MobileCoin, потоа скенирајте го QR кодот или ископирајте ја адресата на Вашиот паричник.";
/* Indicator that the payments wallet address has been copied to the pasteboard. */
"SETTINGS_PAYMENTS_ADD_MONEY_WALLET_ADDRESS_COPIED" = "Wallet Address Copied";
@ -5375,7 +5375,7 @@
"SETTINGS_PAYMENTS_BALANCE_CONVERSION_FORMAT" = "%1$@ %2$@ at %3$@";
/* Error message indicating that payments could not be activated because the feature is not currently available. */
"SETTINGS_PAYMENTS_CANNOT_ACTIVATE_PAYMENTS_KILL_SWITCH" = "Payments in Signal is no longer available. You can still transfer funds to an exchange but you can no longer send and receive payments or add funds.";
"SETTINGS_PAYMENTS_CANNOT_ACTIVATE_PAYMENTS_KILL_SWITCH" = "Плаќањата во Signal не се повеќе достапни. Сѐ уште можете да префрлате средства за менување но не можете да испраќате и примате или пак додавате средства.";
/* Error message indicating that payments could not be deactivated because the current balance is unavailable. */
"SETTINGS_PAYMENTS_CANNOT_DEACTIVATE_PAYMENTS_NO_BALANCE" = "Can't deactivate payments because your balance is not available. Check your connection and try again.";
@ -5384,10 +5384,10 @@
"SETTINGS_PAYMENTS_CANNOT_SEND_PAYMENT_NO_BALANCE" = "Couldn't complete payment because your balance is not available. Check your connection and try again.";
/* Error message indicating that payments cannot be sent because the feature is not currently available. */
"SETTINGS_PAYMENTS_CANNOT_SEND_PAYMENTS_KILL_SWITCH" = "Payments in Signal is no longer available. You can still transfer funds to an exchange but you can no longer send and receive payments or add funds.";
"SETTINGS_PAYMENTS_CANNOT_SEND_PAYMENTS_KILL_SWITCH" = "Плаќањата во Signal не се повеќе достапни. Сѐ уште можете да префрлате средства за менување но не можете да испраќате и примате или пак додавате средства.";
/* Error message indicating that you cannot transfer into your payments wallet because the feature is not currently available. */
"SETTINGS_PAYMENTS_CANNOT_TRANSFER_IN_KILL_SWITCH" = "Payments in Signal is no longer available. You can still transfer funds to an exchange but you can no longer send and receive payments or add funds.";
"SETTINGS_PAYMENTS_CANNOT_TRANSFER_IN_KILL_SWITCH" = "Плаќањата во Signal не се повеќе достапни. Сѐ уште можете да префрлате средства за менување но не можете да испраќате и примате или пак додавате средства.";
/* Message for the 'currency conversions info' alert. */
"SETTINGS_PAYMENTS_CURRENCY_CONVERSIONS_INFO_ALERT_MESSAGE" = "Конверзиите се само проценки и можеби не се точни.";
@ -5417,7 +5417,7 @@
"SETTINGS_PAYMENTS_DEACTIVATE_WITH_BALANCE_EXPLANATION" = "Its recommended that you transfer your funds to another wallet address before deactivating payments. If you choose not to transfer your funds now, they will remain in your wallet linked to Signal if you reactivate payments.";
/* Description for the 'deactivate payments confirmation' UI in the payment settings. */
"SETTINGS_PAYMENTS_DEACTIVATE_WITHOUT_TRANSFER_CONFIRM_DESCRIPTION" = "Your balance will remain in your wallet linked to Signal if you choose to reactivate payments.";
"SETTINGS_PAYMENTS_DEACTIVATE_WITHOUT_TRANSFER_CONFIRM_DESCRIPTION" = "Вашата состјоба ќе остане на Вашиот паричник врзан со Signal ако одберете да ги реактивирате плаќањата.";
/* Title for the 'deactivate payments confirmation' UI in the payment settings. */
"SETTINGS_PAYMENTS_DEACTIVATE_WITHOUT_TRANSFER_CONFIRM_TITLE" = "Deactivate Without Transferring?";
@ -5447,16 +5447,16 @@
"SETTINGS_PAYMENTS_HELP_CARD_ADDING_TO_YOUR_WALLET_TITLE" = "Adding Funds";
/* Description for the 'Cashing Out' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_CASHING_OUT_DESCRIPTION" = "You can cash out MobileCoin anytime on an exchange that supports MobileCoin. Just make a transfer to your account at that exchange.";
"SETTINGS_PAYMENTS_HELP_CARD_CASHING_OUT_DESCRIPTION" = "Можете да си ги исплатите MobileCoin било кога на берза што поддржува MobileCoin. Само направете трансакциска сметка на таа берза.";
/* Title for the 'Cashing Out' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_CASHING_OUT_TITLE" = "Cashing out";
"SETTINGS_PAYMENTS_HELP_CARD_CASHING_OUT_TITLE" = "Исплата";
/* Label for button in the 'Update PIN' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_BUTTON" = "Ажурирај PIN";
/* Description for the 'Update PIN' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_DESCRIPTION" = "With a high balance, you may want to update to an alphanumeric PIN to add more protection to your account.";
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_DESCRIPTION" = "Со висок баланс, можеби ќе сакате да надградите на алфанумерички PIN за да додадете повеќе заштита на Вашата сметка.";
/* Title for the 'Update PIN' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_UPDATE_PIN_TITLE" = "Ажурирајте го Вашиот PIN";
@ -5465,10 +5465,10 @@
"SETTINGS_PAYMENTS_HELP_CARD_VIEW_PASSPHRASE_BUTTON" = "Record Recovery Phrase";
/* Description for the 'View Passphrase' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_VIEW_PASSPHRASE_DESCRIPTION" = "Your recovery phrase gives you another way to restore your payments account.";
"SETTINGS_PAYMENTS_HELP_CARD_VIEW_PASSPHRASE_DESCRIPTION" = "Вашата резервна фраза Ви овозможува друг начин за да ја повратите Вашата сметка за плаќање.";
/* Title for the 'View Passphrase' help card in the payments settings. */
"SETTINGS_PAYMENTS_HELP_CARD_VIEW_PASSPHRASE_TITLE" = "Record recovery phrase";
"SETTINGS_PAYMENTS_HELP_CARD_VIEW_PASSPHRASE_TITLE" = "Сними резервна фраза";
/* Indicator that the payments wallet address is invalid. */
"SETTINGS_PAYMENTS_INVALID_WALLET_ADDRESS" = "Invalid Wallet Address";
@ -5543,7 +5543,7 @@
"SETTINGS_PAYMENTS_PAYMENT_DETAILS_STATUS_FOOTER" = "Деталите за трансакцијата, вклучувајќи го износот на плаќање и времето на трансакцијата, се дел од MobileCoin регистарот.";
/* Footer string for the status section of the payment details view in the app settings for defragmentation transactions. */
"SETTINGS_PAYMENTS_PAYMENT_DETAILS_STATUS_FOOTER_DEFRAGMENTATION" = "A “coin cleanup fee” is charged when the coins in your possession can not be combined to complete a transaction. Cleanup will allow you to continue sending payments.";
"SETTINGS_PAYMENTS_PAYMENT_DETAILS_STATUS_FOOTER_DEFRAGMENTATION" = "„Сума за чистење на монети“ се наплаќа кога монетите кои што ги поседувате не можат да се искомбинираат за да се направи трансакција. Чистењето ќе Ви овозможи да продолжите да испраќате плаќања.";
/* Message for the 'insufficient balance for payment' alert. Embeds: {{ The current payments balance }}. */
"SETTINGS_PAYMENTS_PAYMENT_INSUFFICIENT_BALANCE_ALERT_MESSAGE_FORMAT" = "You dont have enough MOB to complete this payment. Your current balance is %@.";
@ -5615,7 +5615,7 @@
"SETTINGS_PAYMENTS_RESTORE_WALLET_PASTE_FROM_PASTEBOARD" = "Paste From Clipboard";
/* Format for the placeholder text in the 'restore payments wallet from pasteboard' view of the app settings. */
"SETTINGS_PAYMENTS_RESTORE_WALLET_PASTE_PLACEHOLDER" = "Recovery phrase";
"SETTINGS_PAYMENTS_RESTORE_WALLET_PASTE_PLACEHOLDER" = "Резервна фраза";
/* Title for the 'restore payments wallet from pasteboard' view of the app settings. */
"SETTINGS_PAYMENTS_RESTORE_WALLET_PASTE_TITLE" = "Paste Recovery Phrase";
@ -5666,7 +5666,7 @@
"SETTINGS_PAYMENTS_TRANSFER_OUT_CANNOT_SEND_TO_SELF" = "You cant transfer to your Signal wallet address. Enter the wallet address from your account at a supported exchange.";
/* Footer of the 'transfer currency out' view in the payment settings. */
"SETTINGS_PAYMENTS_TRANSFER_OUT_FOOTER" = "You can transfer MobileCoin by completing a transfer to the wallet address provided by the exchange. The wallet address is the string of numbers and letters most commonly below the QR code.";
"SETTINGS_PAYMENTS_TRANSFER_OUT_FOOTER" = "Можете да префрлате MobileCoin трансакција на адресата на паричникот што Ви е даден од берзата. Адресата на паричникот е низа од броеви и букви кои најчесто се наоѓаат под QR кодот.";
/* Error indicating that MobileCoin public address is not valid. */
"SETTINGS_PAYMENTS_TRANSFER_OUT_INVALID_PUBLIC_ADDRESS" = "Check the wallet address youre attempting to transfer to and try again.";
@ -5711,7 +5711,7 @@
"SETTINGS_PAYMENTS_VIEW_PASSPHRASE_COPY_TO_CLIPBOARD" = "Copy to Clipboard";
/* Message for the 'copy recovery passphrase to clipboard confirm' alert in the payment settings. */
"SETTINGS_PAYMENTS_VIEW_PASSPHRASE_COPY_TO_CLIPBOARD_CONFIRM_MESSAGE" = "If you choose to store your recovery phrase digitally, ensure it is securely stored somewhere you trust.";
"SETTINGS_PAYMENTS_VIEW_PASSPHRASE_COPY_TO_CLIPBOARD_CONFIRM_MESSAGE" = "Ако одберете да ја складирате резервната фраза дигитално, осигурајте се дека сте 100% сигурни дека е складирана на безбедно место.";
/* Title for the 'copy recovery passphrase to clipboard confirm' alert in the payment settings. */
"SETTINGS_PAYMENTS_VIEW_PASSPHRASE_COPY_TO_CLIPBOARD_CONFIRM_TITLE" = "Copy to Clipboard?";
@ -5861,7 +5861,7 @@
"SETTINGS_SHARING_SUGGESTIONS_NOTIFICATIONS_FOOTER" = "Allow iOS access to Signal contacts and chats for features such as sharing suggestions and notifications.";
/* Title for the 'signal boost' link in settings. */
"SETTINGS_SIGNAL_BOOST" = "Signal Boost";
"SETTINGS_SIGNAL_BOOST" = "Signal поттик";
/* Title for the 'become a sustainer' link in settings. */
"SETTINGS_SUBSCRIPTION" = "Станете поддржувач на Signal";
@ -6137,7 +6137,7 @@
"SUSTAINER_STILL_PROCESSING_BADGE_TITLE" = "Still Processing";
/* Sustainer view Add Boost button title */
"SUSTAINER_VIEW_ADD_BOOST" = "Add a Signal Boost";
"SUSTAINER_VIEW_ADD_BOOST" = "Додај поттик за Signal";
/* Description text for sustainer view badges, embeds {{localized badge name}} */
"SUSTAINER_VIEW_BADGE_DESCRIPTION" = "Get a %@ badge";
@ -6149,7 +6149,7 @@
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION_CONFIRMATION_CONFIRM" = "Потврди";
/* Confirm Cancellation? Action sheet message */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION_CONFIRMATION_MESSAGE" = "You won't be charged again. Your badge will be removed from your profile at the end of your billing period.";
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION_CONFIRMATION_MESSAGE" = "Нема да Ви биде наплатено повторно. Вашиот беџ ќе биде отстранет од Вашиот профил на крајот од Вашиот претплатнички период.";
/* Confirm Cancellation? Action sheet title */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION_CONFIRMATION_TITLE" = "Потврди откажување?";
@ -6200,7 +6200,7 @@
"SUSTAINER_VIEW_RENEWAL" = "Renews %@";
/* Action sheet message for Still Processing Badge sheet */
"SUSTAINER_VIEW_STILL_PROCESSING_BADGE_MESSAGE" = "Your payment is still being processed. This can take a few minutes depending on your connection.";
"SUSTAINER_VIEW_STILL_PROCESSING_BADGE_MESSAGE" = "Вашето плаќање сѐ уште се обработува. Ова може да потрае неколку минути, во зависност од Вашата врска.";
/* Toast indicating that the subscription has been cancelled */
"SUSTAINER_VIEW_SUBSCRIPTION_CANCELLED" = "Your subscription has been cancelled";

View File

@ -386,28 +386,28 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Help Signal met een eenmalige bijdrage";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Je eenmalige donateur-bagde is verlopen en is daarom niet langer voor anderen zichtbaar op je profiel.\n\nJe kunt Signal gewoon blijven gebruiken, maar als je Signal ook wilt helpen mogelijk maken overweeg dan om maandelijkse donaties in te stellen.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Je eenmalige donateur-badge is verlopen en is daarom niet langer voor anderen zichtbaar op je profiel.\n\nJe kunt je eenmalige donateur-badge opniew voor 30 dagen krijgen als je opnieuw een eenmalige donatie doet.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Je maandelijkse donaties zijn automatisch geannuleerd omdat je te lang inactief bent geweest. Je %@-badge is niet langer voor anderen te zien op je profiel.\n\nJe kunt Signal gewoon blijven gebruiken, maar als je Signal ook wilt helpen mogelijk maken of als je graag je badge wilt houden dan is dit het moment om je maandelijkse donaties te vernieuwen.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Help Signal mogelijk maken";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Vanaf nu maandelijks doneren";
/* Button title for boost on the badge expiration sheet, used if the user is already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Nogmaals eenmalig doneren";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Badge verlopen";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Maandelijkse donaties vernieuwen";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Maandelijkse donaties geannuleerd";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Bedankt voor je bijdrage!";
@ -2963,7 +2963,7 @@
"IN_CALL_RECONNECTING" = "Opnieuw verbinden …";
/* Call setup status label */
"IN_CALL_RINGING" = "Gaat over …";
"IN_CALL_RINGING" = "gaat over…";
/* Call setup status label */
"IN_CALL_RINGING_AUDIO" = "Audio-oproep …";
@ -5339,7 +5339,7 @@
"SETTINGS_NOTIFICATION_CONTENT_TITLE" = "Meldingsinhoud";
/* When the local device discovers a contact has recently installed signal, the app can generates a message encouraging the local user to say hello. Turning this switch off disables that feature. */
"SETTINGS_NOTIFICATION_EVENTS_CONTACT_JOINED_SIGNAL" = "Nieuw persoon bereikbaar via Signal";
"SETTINGS_NOTIFICATION_EVENTS_CONTACT_JOINED_SIGNAL" = "Een contactpersoon uit mijn systeemcontactenlijst sinds kort via Signal bereikbaar is";
/* table section header */
"SETTINGS_NOTIFICATION_NOTIFY_WHEN_TITLE" = "Geef me een melding wanneer …";

View File

@ -380,7 +380,7 @@
"BADGE_CONFIGURATION_TITLE" = "ਬੈਜ";
/* Text prompting the user to become a signal sustainer */
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Become a Sustainer";
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "ਸਹਾਇਕ ਬਣੋ";
/* Text prompting the user to boost */
"BADGE_DETAILS_GIVE_A_BOOST" = "Give Signal a Boost";
@ -395,10 +395,10 @@
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Become a Sustainer";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "ਸਹਾਇਕ ਬਣੋ";
/* Button title for boost on the badge expiration sheet, used if the user is already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Add a Boost";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "ਬੂਸਟ ਜੋੜੋ";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
@ -413,7 +413,7 @@
"BADGE_THANKS_BOOST_TITLE" = "Thanks for the Boost!";
/* Label prompting the user to display the new badge on their profile on the badge thank you sheet. */
"BADGE_THANKS_DISPLAY_ON_PROFILE_LABEL" = "Display on Profile";
"BADGE_THANKS_DISPLAY_ON_PROFILE_LABEL" = "ਪ੍ਰੋਫ਼ਾਈਲ ਉੱਤੇ ਦਿਖਾਓ";
/* Label prompting the user to feature the new badge on their profile on the badge thank you sheet. */
"BADGE_THANKS_MAKE_FEATURED" = "Make Featured Badge";
@ -5201,7 +5201,7 @@
"SETTINGS_COPYRIGHT" = "ਕਾਪੀਰਾਈਟ Signal ਮਸੈਂਜਰ\n GPLv3 ਹੇਠ ਲਇਸੰਸਸ਼ੁਦਾ";
/* Title for the 'Subscription' link in settings. */
"SETTINGS_CURRENT_SUBSCRIPTION" = "Subscription";
"SETTINGS_CURRENT_SUBSCRIPTION" = "ਮੈਂਬਰੀ";
/* Label for the 'data' section of the app settings. */
"SETTINGS_DATA" = "ਡਾਟਾ ਵਰਤੋਂ";
@ -5861,10 +5861,10 @@
"SETTINGS_SHARING_SUGGESTIONS_NOTIFICATIONS_FOOTER" = "Allow iOS access to Signal contacts and chats for features such as sharing suggestions and notifications.";
/* Title for the 'signal boost' link in settings. */
"SETTINGS_SIGNAL_BOOST" = "Signal Boost";
"SETTINGS_SIGNAL_BOOST" = "Signal ਬੂਸਟ";
/* Title for the 'become a sustainer' link in settings. */
"SETTINGS_SUBSCRIPTION" = "Become a Signal Sustainer";
"SETTINGS_SUBSCRIPTION" = "ਇੱਕ Signal ਸਹਾਇਕ ਬਣੋ";
/* Label for the 'enable registration lock' switch of the privacy settings. */
"SETTINGS_TWO_FACTOR_AUTH_SWITCH_LABEL" = "ਰਜਿਸਟ੍ਰੇਸ਼ਨ ਲੌਕ";
@ -6050,10 +6050,10 @@
"SUBSCRIBER_MANAGE_SUBSCRIPTION" = "Manage Subscription";
/* Title for the 'Subscription FAQ' button in sustainer view. */
"SUBSCRIBER_SUBSCRIPTION_FAQ" = "Subscription FAQ";
"SUBSCRIBER_SUBSCRIPTION_FAQ" = "ਮੈਂਬਰੀ ਲਈ ਸਵਾਲ-ਜਵਾਬ";
/* Action text for subscription megaphone */
"SUBSCRIPTION_MEGAPHONE_ACTION" = "Contribute";
"SUBSCRIPTION_MEGAPHONE_ACTION" = "ਯੋਗਦਾਨ";
/* Body for subscription megaphone */
"SUBSCRIPTION_MEGAPHONE_BODY" = "Signal is powered by people like you. Contribute and receive a badge.";
@ -6062,7 +6062,7 @@
"SUBSCRIPTION_MEGAPHONE_CANCEL" = "ਨਹੀਂ ਧੰਨਵਾਦ";
/* Title for subscription megaphone */
"SUBSCRIPTION_MEGAPHONE_TITLE" = "Become a Sustainer";
"SUBSCRIPTION_MEGAPHONE_TITLE" = "ਸਹਾਇਕ ਬਣੋ";
/* Alert body after verifying privacy with {{other user's name}} */
"SUCCESSFUL_VERIFICATION_DESCRIPTION" = "%@ ਦੇ ਨਾਲ ਤੁਹਾਡਾ ਸੁਰੱਖਿਆ ਨੰਬਰ ਮੇਲ ਖਾਂਦਾ ਹੈ। ਤੁਸੀਂ ਇਸ ਸੰਪਰਕ 'ਤੇ ਤਸਦੀਕਸ਼ੁਦਾ ਵਜੋਂ ਚਿੰਨ੍ਹ ਲਗਾ ਸਕਦੇ ਹੋ।";
@ -6131,7 +6131,7 @@
"SUSTAINER_READ_MORE_TITLE" = "Support technology that is built for you - not for your data - by joining the community that sustains it.";
/* Why Contribute title for the signal sustainer read more view */
"SUSTAINER_READ_MORE_WHY_CONTRIBUTE" = "Why Contribute?";
"SUSTAINER_READ_MORE_WHY_CONTRIBUTE" = "ਯੋਗਦਾਨ ਕਿਓ ਪਾਈਏ?";
/* Action sheet title for Still Processing Badge sheet */
"SUSTAINER_STILL_PROCESSING_BADGE_TITLE" = "Still Processing";
@ -6143,7 +6143,7 @@
"SUSTAINER_VIEW_BADGE_DESCRIPTION" = "Get a %@ badge";
/* Sustainer view Cancel Subscription button title */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION" = "Cancel Subscription";
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION" = "ਮੈਂਬਰੀ ਰੱਦ ਕਰੋ";
/* Confirm Cancellation? Action sheet confirm button */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION_CONFIRMATION_CONFIRM" = "ਪੁਸ਼ਟੀ ਕਰੋ";
@ -6164,7 +6164,7 @@
"SUSTAINER_VIEW_CANT_ADD_BADGE_TITLE" = "Couldn't Add Badge";
/* Contact support link */
"SUSTAINER_VIEW_CONTACT_SUPPORT" = "Please contact support.";
"SUSTAINER_VIEW_CONTACT_SUPPORT" = "ਮਦਦ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।";
/* Set currency label in sustainer view */
"SUSTAINER_VIEW_CURRENCY" = "Set currency";
@ -6200,7 +6200,7 @@
"SUSTAINER_VIEW_RENEWAL" = "Renews %@";
/* Action sheet message for Still Processing Badge sheet */
"SUSTAINER_VIEW_STILL_PROCESSING_BADGE_MESSAGE" = "Your payment is still being processed. This can take a few minutes depending on your connection.";
"SUSTAINER_VIEW_STILL_PROCESSING_BADGE_MESSAGE" = "ਤੁਹਾਡੇ ਭੁਗਤਾਨ ਉੱਤੇ ਹਾਲੇ ਵੀ ਕਾਰਵਾਈ ਜਾਰੀ ਹੈ। ਇਸ ਨੂੰ ਤੁਹਾਡੇ ਕਨੈਕਸ਼ਨ ਮੁਤਾਬਕ ਕੁਝ ਮਿੰਟ ਲੱਗ ਸਕਦੇ ਹਨ।";
/* Toast indicating that the subscription has been cancelled */
"SUSTAINER_VIEW_SUBSCRIPTION_CANCELLED" = "Your subscription has been cancelled";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Wesprzyj Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Twoja odznaka Wsparcie wygasła i inni nie będą jej już widzieć w Twoim profilu.\n\nMożesz nadal korzystać z Signal, ale rozważ zostanie comiesięcznym Wspierającym, aby wspierać technologię stworzoną dla Ciebie.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Twoja odznaka Wsparcie wygasła i inni nie będą jej już widzieć w Twoim profilu.\n\nMożesz reaktywować swoją odznakę Wsparcie na kolejne 30 dni, składając jednorazowy datek.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Twoja subskrypcja Wspierającego została automatycznie anulowana, gdyż zbyt długo pozostajesz nieaktywny(a). Twoja odznaka %@ nie jest już widoczna w Twoim profilu.\n\nMożesz nadal korzystać z Signal, ale reaktywacja odznaki wymaga wznowienia subskrypcji.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Zostań wspierającym";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Wesprzyj";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Odznaka wygasła";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Odnów subskrypcję";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subskrypcja anulowana";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Dziękujemy za datek!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Fazer uma doação ao Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "O seu selo de Apoiador expirou e não é mais visualizado por outras pessoas no seu perfil.\n\nVocê pode continuar usando o Signal, mas para apoiar essa tecnologia desenvolvida para você, considere se tornar um Apoiador mensal.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "O seu selo de Apoiador expirou e não é mais visualizado por outras pessoas no seu perfil.\n\nVocê pode reativar o seu selo Boost por mais 30 dias ao fazer uma doação.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Sua doação como Apoiador mensal foi cancelada automaticamente porque você ficou sem usar o Signal por muito tempo. Seu selo %@ não é mais visualizado por outras pessoas no seu perfil.\n\nVocê pode continuar usando o Signal, mas para apoiar o aplicativo e reativar seu selo, faça uma doação agora.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Torne-se um apoiador";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Fazer uma doação";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Selo expirado";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Fazer doação mensal";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Doação mensal cancelada";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Agradecemos por sua doação única!";

View File

@ -380,19 +380,19 @@
"BADGE_CONFIGURATION_TITLE" = "Crachás";
/* Text prompting the user to become a signal sustainer */
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Torne-se num apoiante";
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Torne-se num Apoiante";
/* Text prompting the user to boost */
"BADGE_DETAILS_GIVE_A_BOOST" = "Dê ao Signal um Apoio";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "O seu crachá de Apoiante expirou e deixou de estar visível no seu perfil.\n\nPode continuar a utilizar o Signal mas, para apoiar a tecnologia que foi construída para si, considere em ser um Apoiante mensal.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "O seu crachá de Apoiante expirou e deixou de estar visível no seu perfil.\n\nPode continuar a utilizar o Signal durante outros 30 dias com uma contribuição única.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "A sua classificação de Apoiante foi cancelada automaticamente porque você se encontra inativo à muito tempo. O seu crachá de %@ deixou de estar visível no seu perfil.\n\nPode continuar a utilizar o Signal mas para apoiar a aplicação e reativar o seu crachá, apoie agora.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Torne-se num Apoiante";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Apoiar o Signal";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Crachá expirado";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renovar assinatura";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscrição cancelada";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Obrigado pelo seu Apoio!";

View File

@ -86,7 +86,7 @@
"ADD_TO_GROUP_ACTION_PROCEED_BUTTON" = "Adaugă la grup";
/* The title on the 'add to group' confirmation action sheet. Embeds {contact name, group name} */
"ADD_TO_GROUP_ACTION_SHEET_MESSAGE_FORMAT" = "Adăugați pe “%1$@” la “%2$@”?";
"ADD_TO_GROUP_ACTION_SHEET_MESSAGE_FORMAT" = "Adaugi pe “%1$@” la “%2$@”?";
/* The title on the 'add to group' confirmation action sheet. */
"ADD_TO_GROUP_ACTION_SHEET_TITLE" = "Adaugă un membru nou";
@ -104,7 +104,7 @@
"ADD_TO_GROUP_SUCCESS_TOAST_FORMAT" = "%@ a fost adăugat la %@";
/* Title of the 'add to group' view. */
"ADD_TO_GROUP_TITLE" = "Adăugați la un grup";
"ADD_TO_GROUP_TITLE" = "Adaugă la un grup";
/* Message shown in conversation view that offers to share your profile with a user. */
"ADD_USER_TO_PROFILE_WHITELIST_OFFER" = "Vrei să partajezi profilul tău cu acest utilizator?";
@ -113,13 +113,13 @@
"ALERT_ACTION_ACKNOWLEDGE" = "Am înțeles";
/* Format string for delivery issue sheet message. Embeds {{ sender name }}. */
"ALERT_DELIVERY_ISSUE_MESSAGE_FORMAT" = "Un mesaj, autocolant, reacție, confirmare de citire, sau fișier media nu v-a putut fi livrat de la %@ în această conversație.";
"ALERT_DELIVERY_ISSUE_MESSAGE_FORMAT" = "Un mesaj, autocolant, reacție, confirmare de citire, sau fișier media de la %@ nu s-a putut livra în această conversație.";
/* Title for delivery issue sheet */
"ALERT_DELIVERY_ISSUE_TITLE" = "Problemă de livrare";
/* Format string for delivery issue sheet message where the original thread is unknown. Embeds {{ sender name }}. */
"ALERT_DELIVERY_ISSUE_UNKNOWN_THREAD_MESSAGE_FORMAT" = "Un mesaj, autocolant, reacție, confirmare de citire sau mesaj media nu a putut fi livrat de la %@. Este posibil ca utilizatorul să fi încercat să trimită mesajul direct sau într-un grup.";
"ALERT_DELIVERY_ISSUE_UNKNOWN_THREAD_MESSAGE_FORMAT" = "Un mesaj, autocolant, reacție, confirmare de citire sau mesaj media de la %@ nu a putut fi livrat . Este posibil ca utilizatorul să fi încercat să îți trimită mesajul direct sau într-un grup.";
/* The label for the 'discard' button in alerts and action sheets. */
"ALERT_DISCARD_BUTTON" = "Renunță";
@ -134,10 +134,10 @@
"ALERT_SAVE" = "Salvează";
/* Message for UI warning about an unknown contact thread. */
"ALERT_UNKNOWN_THREAD_WARNING_CONTACT_MESSAGE" = "Nu aveți grupuri în comun cu această persoană. Examinați cu atenție solicitările înainte de a accepta pentru a evita mesajele nedorite.";
"ALERT_UNKNOWN_THREAD_WARNING_CONTACT_MESSAGE" = "Nu ai grupuri în comun cu această persoană. Examinează cu atenție solicitările înainte de a accepta pentru a evita mesajele nedorite.";
/* Message for UI warning about an unknown group thread. */
"ALERT_UNKNOWN_THREAD_WARNING_GROUP_MESSAGE" = "Nu aveți membrii în comun cu acest grup. Examinați cu atenție solicitările înainte de a accepta pentru a evita mesajele nedorite.";
"ALERT_UNKNOWN_THREAD_WARNING_GROUP_MESSAGE" = "Nu ai membrii în comun cu acest grup. Examinează cu atenție solicitările înainte de a accepta pentru a evita mesajele nedorite.";
/* Label for button to learn more about message requests. */
"ALERT_UNKNOWN_THREAD_WARNING_LEARN_MORE" = "Despre solicitări mesaj";
@ -146,7 +146,7 @@
"ANSWER_CALL_BUTTON_TITLE" = "Răspunde";
/* notification body */
"APN_Message" = "S-ar putea să aveți mesaje noi";
"APN_Message" = "S-ar putea să ai mesaje noi";
/* Message for the 'app launch failed' alert. */
"APP_LAUNCH_FAILURE_ALERT_MESSAGE" = "Signal nu poate porni. Te rog trimite jurnalul tău de depanare la support@signal.org ca să investigăm problema.";
@ -164,7 +164,7 @@
"APP_LAUNCH_FAILURE_INVALID_DATABASE_VERSION_TITLE" = "Versiune de bază de date necunoscută.";
/* Error indicating that the app could not restore transferred data. */
"APP_LAUNCH_FAILURE_RESTORE_FAILED_MESSAGE" = "Datele transferate de pe dispozitivul tău vechi nu au putut fi restabilite. Te rog să trimiți un jurnal de depanare la support@signal.org pentru a putea rezolva această problemă. Dacă reinstalezi Signal, istoricul mesajelor tale poate fi pierdut.";
"APP_LAUNCH_FAILURE_RESTORE_FAILED_MESSAGE" = "Datele transferate de pe dispozitivul tău vechi nu au putut fi restabilite. Te rugăm să trimiți un jurnal de depanare la support@signal.org pentru a putea rezolva această problemă. Dacă reinstalezi Signal, istoricul mesajelor tale poate fi pierdut.";
/* Error indicating that the app could not restore transferred data. */
"APP_LAUNCH_FAILURE_RESTORE_FAILED_TITLE" = "Transferul nu s-a putut finaliza";
@ -176,7 +176,7 @@
"APP_UPDATE_NAG_ALERT_DISMISS_BUTTON" = "Nu acum";
/* Message format for the 'new app version available' alert. Embeds: {{The latest app version number}} */
"APP_UPDATE_NAG_ALERT_MESSAGE_FORMAT" = "Versiunea %@ este disponibilă acum în Magazinul de Aplicații.";
"APP_UPDATE_NAG_ALERT_MESSAGE_FORMAT" = "Versiunea %@ este disponibilă acum în App Store.";
/* Title for the 'new app version available' alert. */
"APP_UPDATE_NAG_ALERT_TITLE" = "O nouă versiune de Signal este disponibilă";
@ -236,7 +236,7 @@
"ATTACHMENT_APPROVAL_MESSAGE_TO_FORMAT" = "Mesaj către %@";
/* Label for 'send' button in the 'attachment approval' dialog. */
"ATTACHMENT_APPROVAL_SEND_BUTTON" = "Trimiteți";
"ATTACHMENT_APPROVAL_SEND_BUTTON" = "Trimite";
/* Generic filename for an attachment with no known name */
"ATTACHMENT_DEFAULT_FILENAME" = "Atașament";
@ -305,7 +305,7 @@
"ATTACHMENT_PICKER_DOCUMENTS_FAILED_ALERT_TITLE" = "Eroare la selectarea documentului.";
/* Alert body when picking a document fails because user picked a directory/bundle */
"ATTACHMENT_PICKER_DOCUMENTS_PICKED_DIRECTORY_FAILED_ALERT_BODY" = "Vă rugăm să creați o arhivă comprimată cu acest fișier sau director și să încerci să o trimiteți pe aceasta.";
"ATTACHMENT_PICKER_DOCUMENTS_PICKED_DIRECTORY_FAILED_ALERT_BODY" = "Te rugăm să creezi o arhivă comprimată cu acest fișier sau director și să încerci să o trimiți pe aceasta.";
/* Alert title when picking a document fails because user picked a directory/bundle */
"ATTACHMENT_PICKER_DOCUMENTS_PICKED_DIRECTORY_FAILED_ALERT_TITLE" = "Fișier nesuportat";
@ -344,13 +344,13 @@
"AVATAR_BUILDER_MEGAPHONE_ACTION" = "Adăugare poză";
/* Body for avatar builder megaphone */
"AVATAR_BUILDER_MEGAPHONE_BODY" = "Alegeți un aspect și o culoare sau personalizați-vă inițialele.";
"AVATAR_BUILDER_MEGAPHONE_BODY" = "Alege un aspect și o culoare sau personaliză-ți inițialele.";
/* Title for avatar builder megaphone */
"AVATAR_BUILDER_MEGAPHONE_TITLE" = "Adăugați o poză de profil";
"AVATAR_BUILDER_MEGAPHONE_TITLE" = "Adaugă o poză de profil";
/* Text prompting the user to choose a color when editing their avatar */
"AVATAR_EDIT_VIEW_CHOOSE_A_COLOR" = "Alegeți o culoare";
"AVATAR_EDIT_VIEW_CHOOSE_A_COLOR" = "Alege o culoare";
/* Segment indicating the user can edit the color of the avatar */
"AVATAR_EDIT_VIEW_COLOR_SEGMENT" = "Culoare";
@ -365,7 +365,7 @@
"AVATAR_SETTINGS_VIEW_PHOTO_BUTTON" = "poză";
/* Title for the previously used and preset avatar section. */
"AVATAR_SETTINGS_VIEW_SELECT_AN_AVATAR" = "Alegeți un avatar";
"AVATAR_SETTINGS_VIEW_SELECT_AN_AVATAR" = "Alege un avatar";
/* Text indicating the user can create a new avatar with text */
"AVATAR_SETTINGS_VIEW_TEXT_BUTTON" = "text";
@ -383,16 +383,16 @@
"BADGE_DETAILS_BECOME_A_SUSTAINER" = "Fii un Susținător";
/* Text prompting the user to boost */
"BADGE_DETAILS_GIVE_A_BOOST" = "Dați un Boost la Signal";
"BADGE_DETAILS_GIVE_A_BOOST" = "Dă un Boost la Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Insigna Boost a expirat și nu mai este vizibilă pe profilul tău.\n\nPoți continua să folosești Signal, dar pentru a sprijini tehnologia creată pentru tine, te rugăm să consideri să devii un susținător lunar.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Insigna Boost a expirat și nu mai este vizibilă pe profilul tău.\n\nPoți reactiva insigna ta Boost pentru încă 30 de zile cu o contribuție unică.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Abonamentul tău de susținător a fost anulat automat deoarece ai fost inactiv pentru o perioadă lungă de timp. Insigna ta %@ nu mai este vizibilă pe profil.\n\nPoți continua să folosești Signal, dar pentru a susține aplicația și pentru ați reactiva insigna, reînnoiește acum.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Fii un Susținător";
@ -401,19 +401,19 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Adaugă un Boost";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Insignă expirată";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Reînnoiește abonamentul";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Abonament anulat";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = " mulțumim pentru Boost!";
"BADGE_THANKS_BOOST_TITLE" = "Îți mulțumim pentru Boost!";
/* Label prompting the user to display the new badge on their profile on the badge thank you sheet. */
"BADGE_THANKS_DISPLAY_ON_PROFILE_LABEL" = "Afișați la profil";
"BADGE_THANKS_DISPLAY_ON_PROFILE_LABEL" = "Afișează la profil";
/* Label prompting the user to feature the new badge on their profile on the badge thank you sheet. */
"BADGE_THANKS_MAKE_FEATURED" = "Folosește ca insignă principală";
@ -422,7 +422,7 @@
"BADGE_THANKS_SUBSCRIPTION_TITLE" = "Îți mulțumim pentru sprijin!";
/* Footer explaining that only one badge can be featured at a time on the thank you sheet. */
"BADGE_THANKS_TOGGLE_FOOTER" = "Atunci când aveți mai mult de o insignă, puteți alege una pe care să o afișați pentru ca ceilalți să o vadă pe profilul dvs.";
"BADGE_THANKS_TOGGLE_FOOTER" = "Atunci când ai mai mult de o insignă, poți alege una pe care să o afișezi pentru ca ceilalți să o vadă pe profilul tău.";
/* String explaing to the user that they've earned a badge on the badge thank you sheet. Embed {badge name}. */
"BADGE_THANKS_YOU_EARNED_FORMAT" = "Ai obținut insigna %@! Ajută Signal să crească gradul de conștientizare prin afișarea acestei insigne pe profilul tău.";
@ -458,7 +458,7 @@
"BLOCK_LIST_UNBLOCK_BUTTON" = "Deblochează";
/* An explanation of what unblocking a contact means. */
"BLOCK_LIST_UNBLOCK_CONTACT_MESSAGE" = "O să puteți să vă trimiteți mesaje și să vă sunați reciproc.";
"BLOCK_LIST_UNBLOCK_CONTACT_MESSAGE" = "Vei putea să trimiți mesaje și să vă sunați reciproc.";
/* Action sheet body when confirming you want to unblock a group */
"BLOCK_LIST_UNBLOCK_GROUP_BODY" = "Membrii existenți vor putea să te adauge la grup din nou.";
@ -512,22 +512,22 @@
"BOOST_VIEW_BODY_WITH_EXPIRATION_FORMAT" = "Insigna ta Boost va expira pe %@.";
/* Default text for the custom amount field of the boost view. */
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Introduceți o sumă specifică";
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Introdu o sumă specifică";
/* Text explaining there are other ways to donate on the boost view. */
"BOOST_VIEW_OTHER_WAYS" = "Mai multe opțiuni de plată";
/* Error text notifying the user they must select a large amount on the donate to signal view */
"BOOST_VIEW_SELECT_A_LARGER_AMOUNT" = "Selectați o sumă mai mare de donat";
"BOOST_VIEW_SELECT_A_LARGER_AMOUNT" = "Selectează o sumă mai mare de donat";
/* Error text notifying the user they must select a smaller amount on the donate to signal view */
"BOOST_VIEW_SELECT_A_SMALLER_AMOUNT" = "Selectați o sumă mai mică de donat";
"BOOST_VIEW_SELECT_A_SMALLER_AMOUNT" = "Selectează o sumă mai mică de donat";
/* Error text notifying the user they must select an amount on the donate to signal view */
"BOOST_VIEW_SELECT_AN_AMOUNT" = "Selectați o sumă de donat";
"BOOST_VIEW_SELECT_AN_AMOUNT" = "Selectează o sumă de donat";
/* Title for the donate to signal view */
"BOOST_VIEW_TITLE" = "Dați un Boost la Signal";
"BOOST_VIEW_TITLE" = "Dă un Boost la Signal";
/* Label for the 'add' button. */
"BUTTON_ADD" = "Adaugă";
@ -569,7 +569,7 @@
"BUTTON_SET" = "Aplicare";
/* Label for the 'share' button. */
"BUTTON_SHARE" = "Distribuiți";
"BUTTON_SHARE" = "Distribuie";
/* Label for the 'start' button. */
"BUTTON_START" = "Start";
@ -602,7 +602,7 @@
"CALL_MISSED_BECAUSE_OF_IDENTITY_CHANGE_NOTIFICATION_BODY" = "☎️ Apel ratat deoarece numărul de siguranță al apelantului s-a schimbat.";
/* Button to return to the current call */
"CALL_RETURN_BUTTON" = "Întoarceți-vă la apel";
"CALL_RETURN_BUTTON" = "Întoarce-te la apel";
/* Call setup status label after outgoing call times out */
"CALL_SCREEN_STATUS_NO_ANSWER" = "Nici un răspuns";
@ -638,7 +638,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Respinge";
/* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Închideți apelul";
"CALL_VIEW_HANGUP_LABEL" = "Închide apelul";
/* Accessibility label for muting the microphone */
"CALL_VIEW_MUTE_LABEL" = "Mut";
@ -692,22 +692,22 @@
"CHAT_COLOR_INCOMING_MESSAGE_2" = "Iată o altă bulă";
/* The outgoing bubble text when setting a chat color. */
"CHAT_COLOR_OUTGOING_MESSAGE" = "Culoarea este vizibilă doar pentru dvs.";
"CHAT_COLOR_OUTGOING_MESSAGE" = "Culoarea este vizibilă doar pentru tine.";
/* The first outgoing bubble text when setting a chat color. */
"CHAT_COLOR_OUTGOING_MESSAGE_1" = "Culoarea este vizibilă doar pentru dvs.";
"CHAT_COLOR_OUTGOING_MESSAGE_1" = "Culoarea este vizibilă doar pentru tine.";
/* The second outgoing bubble text when setting a chat color. */
"CHAT_COLOR_OUTGOING_MESSAGE_2" = "Culoarea este vizibilă doar pentru dvs.";
"CHAT_COLOR_OUTGOING_MESSAGE_2" = "Culoarea este vizibilă doar pentru tine.";
/* Label for the 'automatic chat color' option in the chat color settings view. */
"CHAT_COLOR_SETTINGS_AUTO" = "auto";
/* Message for the 'delete chat color confirm alert' in the chat color settings view. */
"CHAT_COLOR_SETTINGS_DELETE_ALERT_MESSAGE_1" = "Această culoare personalizată este utilizată într-o conversație. Doriți să o ștergeți?";
"CHAT_COLOR_SETTINGS_DELETE_ALERT_MESSAGE_1" = "Această culoare personalizată este utilizată într-o conversație. Vrei să o ștergi?";
/* Message for the 'delete chat color confirm alert' in the chat color settings view. Embeds: {{ the number of conversations that use this chat color }}. */
"CHAT_COLOR_SETTINGS_DELETE_ALERT_MESSAGE_N_FORMAT" = "Această culoare personalizată este utilizată în %@ conversații. Doriți să o ștergeți pentru toate conversațiile?";
"CHAT_COLOR_SETTINGS_DELETE_ALERT_MESSAGE_N_FORMAT" = "Această culoare personalizată este utilizată în %@ conversații. Vrei să o ștergi pentru toate conversațiile?";
/* Title for the 'delete chat color confirm alert' in the chat color settings view. */
"CHAT_COLOR_SETTINGS_DELETE_ALERT_TITLE" = "Șterge culoarea";
@ -719,7 +719,7 @@
"CHAT_COLOR_SETTINGS_UPDATE_ALERT_ALERT_TITLE" = "Editare culoare";
/* Message for the 'edit chat color confirm alert' in the chat color settings view. Embeds: {{ the number of conversations that use this chat color }}. */
"CHAT_COLOR_SETTINGS_UPDATE_ALERT_MESSAGE_N_FORMAT" = "Această culoare este folosită în %@ conversații. Doriți să salvați modificările pentru toate conversațiile?";
"CHAT_COLOR_SETTINGS_UPDATE_ALERT_MESSAGE_N_FORMAT" = "Această culoare este folosită în %@ conversații. Vrei să salvezi modificările pentru toate conversațiile?";
/* Tooltip highlighting the auto chat color option. */
"CHAT_COLORS_AUTO_TOOLTIP" = "Potrivirea automată a culorii cu imaginea de fundal";
@ -728,7 +728,7 @@
"CHAT_COLORS_MEGAPHONE_ACTION" = "Aspect";
/* Body for chat colors megaphone */
"CHAT_COLORS_MEGAPHONE_BODY" = "Acum puteți schimba culorile din conversațiile dvs. cu gradiente și multe altele.";
"CHAT_COLORS_MEGAPHONE_BODY" = "Acum poți schimba culorile din conversațiile tale cu gradiente și multe altele.";
/* Title for chat colors megaphone */
"CHAT_COLORS_MEGAPHONE_TITLE" = "Culori conversație personalizate";
@ -740,7 +740,7 @@
"COMPARE_SAFETY_NUMBER_ACTION" = "Compară cu Clipboard";
/* Accessibility hint describing what you can do with the compose button */
"COMPOSE_BUTTON_HINT" = "Selectați sau căutați un utilizator de Signal pentru a începe o conversație.";
"COMPOSE_BUTTON_HINT" = "Selectează sau caută un utilizator de Signal pentru a începe o conversație.";
/* Accessibility label from compose button. */
"COMPOSE_BUTTON_LABEL" = "Compune";
@ -764,13 +764,13 @@
"CONFIRM_DELETE_DATA_TEXT" = "Această acțiune va reseta aplicația prin ștergerea mesajelor. Aplicația se va închide după ce s-a finalizat procesul.";
/* No comment provided by engineer. */
"CONFIRM_DELETE_DATA_TITLE" = "Ești sigur că vreți să ștergi toate datele?";
"CONFIRM_DELETE_DATA_TITLE" = "Ești sigur că vrei să ștergi toate datele?";
/* No comment provided by engineer. */
"CONFIRM_DELETE_LINKED_DATA_TEXT" = "Această acțiune va reseta aplicația prin ștergerea tuturor mesajelor tale de pe acest dispozitiv. Poți asocia din nou telefonul, dar acest lucru nu va restabili mesajele șterse. Aplicația se va închide după finalizarea acestui proces.";
/* No comment provided by engineer. */
"CONFIRM_DELETE_LINKED_DATA_TITLE" = "Ești sigur că vreți să ștergi toate datele?";
"CONFIRM_DELETE_LINKED_DATA_TITLE" = "Ești sigur că vrei să ștergi toate datele?";
/* Alert body */
"CONFIRM_LEAVE_GROUP_DESCRIPTION" = "Nu vei mai putea trimite sau primi mesaje in acest grup.";
@ -845,7 +845,7 @@
"CONTACT_PERMISSION_ACTION_SHEET_BODY" = "Pentru a vedea numele și fotografiile contactelor tale în conversații:";
/* First step for contact permission action sheet */
"CONTACT_PERMISSION_ACTION_SHEET_STEP_ONE" = "Apasă pe \"Mergi la Setări” mai jos";
"CONTACT_PERMISSION_ACTION_SHEET_STEP_ONE" = "Apasă pe \"Mergi la Setări” mai jos";
/* Third step for contact permission action sheet */
"CONTACT_PERMISSION_ACTION_SHEET_STEP_TWO" = "Activează „Contacte”";
@ -863,7 +863,7 @@
"CONTACT_PERMISSION_REMINDER_MEGAPHONE_BODY" = "Afișează numele și fotografiile contactelor tale în conversații.";
/* Title for contact permission reminder megaphone */
"CONTACT_PERMISSION_REMINDER_MEGAPHONE_TITLE" = "Activați Contacte";
"CONTACT_PERMISSION_REMINDER_MEGAPHONE_TITLE" = "Activezi Contacte?";
/* Label for a contact's phone number. */
"CONTACT_PHONE" = "Telefon";
@ -917,7 +917,7 @@
"CONTACT_SUPPORT_FILTER_PAYMENTS_SHORT" = "Plăți";
/* Prompt telling the user to select a filter for their support request. */
"CONTACT_SUPPORT_FILTER_PROMPT" = "Cum putem ajuta?";
"CONTACT_SUPPORT_FILTER_PROMPT" = "Cum te putem ajuta?";
/* The localized representation of the 'question' support filter. */
"CONTACT_SUPPORT_FILTER_QUESTION" = "Am o întrebare";
@ -950,7 +950,7 @@
"CONTACT_SUPPORT_PROMPT_TO_INCLUDE_DEBUG_LOG_TITLE" = "Trimiți jurnalul de depanare?";
/* Placeholder telling user they must select a filter. */
"CONTACT_SUPPORT_SELECT_A_FILTER" = "Alegeți motivul";
"CONTACT_SUPPORT_SELECT_A_FILTER" = "Alege motivul";
/* Button text */
"CONTACT_SUPPORT_SUBMIT_WITH_LOG" = "Trimite împreună cu jurnalul de depanare";
@ -1010,7 +1010,7 @@
"CONVERSATION_PICKER_SECTION_SIGNAL_CONTACTS" = "Persoane";
/* navbar header */
"CONVERSATION_PICKER_TITLE" = "Alegeți destinatari";
"CONVERSATION_PICKER_TITLE" = "Alege destinatari";
/* keyboard toolbar label when no messages match the search string */
"CONVERSATION_SEARCH_NO_RESULTS" = "Nici o potrivire";
@ -1058,7 +1058,7 @@
"CONVERSATION_SETTINGS_BLOCK_AND_LEAVE_SECTION_CONTACT_FOOTER" = "Nu vei mai putea primi mesaje sau actualizări de la acest utilizator.";
/* Footer text for the 'block and leave' section of group conversation settings view. */
"CONVERSATION_SETTINGS_BLOCK_AND_LEAVE_SECTION_FOOTER" = "Nu veți mai putea primi mesaje sau actualizări de la acest grup.";
"CONVERSATION_SETTINGS_BLOCK_AND_LEAVE_SECTION_FOOTER" = "Nu vei mai putea primi mesaje sau actualizări de la acest grup.";
/* Label for 'block group' action in conversation settings view. */
"CONVERSATION_SETTINGS_BLOCK_GROUP" = "Blochează grupul";
@ -1082,7 +1082,7 @@
"CONVERSATION_SETTINGS_EDIT_MEMBERSHIP_ACCESS" = "Adaugă membri";
/* Description for the 'edit membership access'. */
"CONVERSATION_SETTINGS_EDIT_MEMBERSHIP_ACCESS_FOOTER" = "Alegeți cine poate edita apartenența la grup.";
"CONVERSATION_SETTINGS_EDIT_MEMBERSHIP_ACCESS_FOOTER" = "Alege cine poate edita apartenența la grup.";
/* Label for 'group link' action in conversation settings view. */
"CONVERSATION_SETTINGS_GROUP_LINK" = "Adresa grupului";
@ -1121,7 +1121,7 @@
"CONVERSATION_SETTINGS_MESSAGE_BUTTON" = "mesaj";
/* Title for the mute action sheet */
"CONVERSATION_SETTINGS_MUTE_ACTION_SHEET_TITLE" = "Puneți pe silențios această conversație pentru...";
"CONVERSATION_SETTINGS_MUTE_ACTION_SHEET_TITLE" = "Pune pe silențios această conversație pentru...";
/* Label for button to mute a thread forever. */
"CONVERSATION_SETTINGS_MUTE_ALWAYS_ACTION" = "Întotdeauna";
@ -1190,7 +1190,7 @@
"CONVERSATION_SETTINGS_REVOKE_GROUP_ADMIN_BUTTON" = "Elimină ca administrator";
/* Format for title for 'revoke group admin' confirmation alert. Embeds {user to revoke admin status from}. */
"CONVERSATION_SETTINGS_REVOKE_GROUP_ADMIN_TITLE_FORMAT" = "Revocați pe %@ ca administrator de grup?";
"CONVERSATION_SETTINGS_REVOKE_GROUP_ADMIN_TITLE_FORMAT" = "Elimini pe %@ ca administrator de grup?";
/* Button to search the chat */
"CONVERSATION_SETTINGS_SEARCH_BUTTON" = "căutare";
@ -1199,7 +1199,7 @@
"CONVERSATION_SETTINGS_SEND_MESSAGES_SECTION_ALL_MEMBERS" = "Toți membri";
/* Footer for the 'send messages' section in conversation settings permissions view. */
"CONVERSATION_SETTINGS_SEND_MESSAGES_SECTION_FOOTER" = "Alegeți cine poate trimite mesaje și începe apeluri în acest grup.";
"CONVERSATION_SETTINGS_SEND_MESSAGES_SECTION_FOOTER" = "Alege cine poate trimite mesaje și începe apeluri în acest grup.";
/* Label for 'send messages' action in conversation settings permissions view. */
"CONVERSATION_SETTINGS_SEND_MESSAGES_SECTION_HEADER" = "Trimitere mesaje";
@ -1256,7 +1256,7 @@
"CROP_SCALE_IMAGE_VIEW_TITLE" = "Mută și scalează";
/* Title for the 'currency picker' view in the app settings. */
"CURRENCY_PICKER_VIEW_TITLE" = "Setați Moneda";
"CURRENCY_PICKER_VIEW_TITLE" = "Setează Moneda";
/* Label for the 'gradient' mode in the custom chat color settings view. */
"CUSTOM_CHAT_COLOR_SETTINGS_GRADIENT" = "Gradient";
@ -1274,7 +1274,7 @@
"CUSTOM_CHAT_COLOR_SETTINGS_TITLE" = "Culoare personalizată";
/* Tooltip highlighting the custom chat color controls. */
"CUSTOM_CHAT_COLOR_SETTINGS_TOOLTIP" = "Trageți pentru a schimba direcția gradientului";
"CUSTOM_CHAT_COLOR_SETTINGS_TOOLTIP" = "Trage pentru a schimba direcția gradientului";
/* Subtitle shown while the app is updating its database. */
"DATABASE_VIEW_OVERLAY_SUBTITLE" = "Această operațiune poate dura câteva minute.";
@ -1355,28 +1355,28 @@
"DELETE_ACCOUNT_CONFIRMATION_COUNTRY_CODE_TITLE" = "Prefixul țării";
/* Title for the action sheet when delete failed on the 'delete account confirmation' view controller. */
"DELETE_ACCOUNT_CONFIRMATION_DELETE_FAILED" = "Ștergerea contului nu a reușit. Asigurați-vă că datele Wi-Fi sau mobile sunt activate, apoi încercați din nou.";
"DELETE_ACCOUNT_CONFIRMATION_DELETE_FAILED" = "Ștergerea contului nu a reușit. Asigură-te că datele Wi-Fi sau mobile sunt activate, apoi încearcă din nou.";
/* Description for the 'delete account' confirmation view. */
"DELETE_ACCOUNT_CONFIRMATION_DESCRIPTION" = "Această acțiune va șterge informațiile contului, profilul și toate mesajele dvs.";
"DELETE_ACCOUNT_CONFIRMATION_DESCRIPTION" = "Această acțiune va șterge informațiile contului, profilul și toate mesajele tale.";
/* Indicates the work we are doing while deleting the account */
"DELETE_ACCOUNT_CONFIRMATION_IN_PROGRESS" = "Se șterge contul...";
/* Title for the action sheet when you have no internet on the 'delete account confirmation' view controller. */
"DELETE_ACCOUNT_CONFIRMATION_NO_INTERNET" = "Fără conexiune internet. Asigurați-vă că datele Wi-Fi sau mobile sunt activate, apoi încercați din nou.";
"DELETE_ACCOUNT_CONFIRMATION_NO_INTERNET" = "Fără conexiune internet. Asigură-te că datele Wi-Fi sau mobile sunt activate, apoi încearcă din nou.";
/* Title for the 'phone number' row of the 'delete account confirmation' view controller. */
"DELETE_ACCOUNT_CONFIRMATION_PHONE_NUMBER_TITLE" = "Număr de telefon";
/* Section header */
"DELETE_ACCOUNT_CONFIRMATION_SECTION_TITLE" = "Confirmați numărul Signal";
"DELETE_ACCOUNT_CONFIRMATION_SECTION_TITLE" = "Confirmă numărul Signal";
/* Title for the 'delete account' confirmation view. */
"DELETE_ACCOUNT_CONFIRMATION_TITLE" = "Ștergere cont";
/* Title for the action sheet when you enter the wrong number on the 'delete account confirmation' view controller. */
"DELETE_ACCOUNT_CONFIRMATION_WRONG_NUMBER" = "Numărul de telefon pe care l-ați introdus nu se potrivește cu cel al contului dvs.";
"DELETE_ACCOUNT_CONFIRMATION_WRONG_NUMBER" = "Numărul de telefon pe care l-ai introdus nu se potrivește cu cel al contului tău.";
/* action sheet body */
"DELETE_ALL_MESSAGES_IN_CONVERSATION_ALERT_BODY" = "Ștergi toate mesajele din conversație?";
@ -1409,37 +1409,37 @@
"DEVICE_TRANSFER_CANCEL_CONFIRMATION_ACTION" = "Oprește transferul";
/* The message of the dialog asking the user if they want to cancel a device transfer */
"DEVICE_TRANSFER_CANCEL_CONFIRMATION_MESSAGE" = "Închiderea acestei ferestre va opri transferul pe care îl aveți în curs, sunteți sigur că doriți să continuați?";
"DEVICE_TRANSFER_CANCEL_CONFIRMATION_MESSAGE" = "Închiderea acestei ferestre va opri transferul pe care îl ai în curs, ești sigur că vrei să continui?";
/* The title of the dialog asking the user if they want to cancel a device transfer */
"DEVICE_TRANSFER_CANCEL_CONFIRMATION_TITLE" = "Oprire transfer?";
/* The explanation for the device transfer 'choice' view */
"DEVICE_TRANSFER_CHOICE_EXPLANATION" = "Dacă aveți dispozitivul iOS vechi, vă puteți transfera în siguranță contul și mesajele pe acest dispozitiv.";
"DEVICE_TRANSFER_CHOICE_EXPLANATION" = "Dacă ai dispozitivul iOS vechi, poți transfera în siguranță contul și mesajele pe acest dispozitiv.";
/* The explanation for the device transfer 'choice' view when linking a device */
"DEVICE_TRANSFER_CHOICE_LINKED_EXPLANATION" = "Dacă ați utilizați anterior Signal pe un iPad asociat, puteți transfera în siguranță contul și mesajele pe acest dispozitiv.";
"DEVICE_TRANSFER_CHOICE_LINKED_EXPLANATION" = "Dacă ai utilizat anterior Signal pe un iPad asociat, poți transfera în siguranță contul și mesajele pe acest dispozitiv.";
/* The body for the device transfer 'choice' view 'register' option */
"DEVICE_TRANSFER_CHOICE_REGISTER_BODY" = "Continuă fără transferul contului și a mesajelor tale";
/* The body for the device transfer 'choice' view 'register' option when linking a device */
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_BODY" = "Adăugați acest iPad ca nou dispozitiv asociat fără a transfera istoricul mesajelor";
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_BODY" = "Adaugă acest iPad ca nou dispozitiv asociat fără a transfera istoricul mesajelor";
/* The title for the device transfer 'choice' view 'register' option when linking a device */
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_TITLE" = "Adăugați ca și dispozitiv nou";
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_TITLE" = "Adaugă ca și dispozitiv nou";
/* The title for the device transfer 'choice' view 'register' option */
"DEVICE_TRANSFER_CHOICE_REGISTER_TITLE" = "Înregistrați-vă fără transfer";
"DEVICE_TRANSFER_CHOICE_REGISTER_TITLE" = "Înregistrează-te fără transfer";
/* The title for the device transfer 'choice' view */
"DEVICE_TRANSFER_CHOICE_TITLE" = "Transfer conturi și mesaje";
/* The body for the device transfer 'choice' view 'transfer' option */
"DEVICE_TRANSFER_CHOICE_TRANSFER_BODY" = "Transferați contul și istoricul mesajelor de pe vechiul dispozitiv iOS";
"DEVICE_TRANSFER_CHOICE_TRANSFER_BODY" = "Transferă contul și istoricul mesajelor de pe vechiul dispozitiv iOS";
/* The body for the device transfer 'choice' view 'transfer' option when linking a device */
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_BODY" = "Transferați contul și istoricul mesajelor de pe vechiul iPad";
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_BODY" = "Transferă contul și istoricul mesajelor de pe vechiul iPad";
/* The title for the device transfer 'choice' view 'transfer' option when linking a device */
"DEVICE_TRANSFER_CHOICE_TRANSFER_LINKED_TITLE" = "Transfer de pe un alt iPad";
@ -1451,13 +1451,13 @@
"DEVICE_TRANSFER_CHOICE_WARNING" = "Continuarea va dezactiva Signal pe alte dispozitive înregistrate în prezent cu același număr de telefon.";
/* An error indicating that we were unable to verify the indentity of the new device to complete the transfer */
"DEVICE_TRANSFER_ERROR_CERTIFICATE_MISMATCH" = "Noul dispozitiv nu a putut fi verificat, încercați din nou";
"DEVICE_TRANSFER_ERROR_CERTIFICATE_MISMATCH" = "Noul dispozitiv nu a putut fi verificat, încearcă din nou";
/* An error indicating that something went wrong with the transfer and it could not complete */
"DEVICE_TRANSFER_ERROR_GENERIC" = "Transferul nu a putut fi finalizat, asigură-te că dispozitivele tale sunt aproape unul de celălalt și încearcă din nou";
/* An error indicating the user must scan this code with a linked device to transfer. */
"DEVICE_TRANSFER_ERROR_MODE_MISMATCH_LINKED" = "Pentru a configura acest iPad ca și dispozitiv asociat, trebuie să scani cu vechiul iPad";
"DEVICE_TRANSFER_ERROR_MODE_MISMATCH_LINKED" = "Pentru a configura acest iPad ca și dispozitiv asociat, trebuie să scanezi cu vechiul iPad";
/* An error indicating the user must scan this code with a primary device to transfer. */
"DEVICE_TRANSFER_ERROR_MODE_MISMATCH_PRIMARY" = "Pentru a-ți transfera contul, trebuie să scanezi cu iPhone-ul tău";
@ -1466,7 +1466,7 @@
"DEVICE_TRANSFER_ERROR_NOT_ENOUGH_SPACE" = "Nu există suficient spațiu liber pentru a finaliza transferul";
/* An error indicating the user must update their device before trying to transfer. */
"DEVICE_TRANSFER_ERROR_UNSUPPORTED_VERSION" = "Actualizați Signal la ultima versiune și încercați din nou";
"DEVICE_TRANSFER_ERROR_UNSUPPORTED_VERSION" = "Actualizează Signal la ultima versiune și încearcă din nou";
/* The explanation on the action sheet prompting the user if they want to transfer their device. */
"DEVICE_TRANSFER_PROMPT_EXPLANATION" = "Transferă contul tău Signal la un nou dispozitiv iOS. Asigură-te că noul dispozitiv este în apropiere și este pornit.";
@ -1475,10 +1475,10 @@
"DEVICE_TRANSFER_PROMPT_TITLE" = "Transfer cont";
/* The explanation for the device transfer qr code view */
"DEVICE_TRANSFER_QRCODE_EXPLANATION" = "Deschideți Signal pe dispozitivul vechi, aduceți-l în apropiere și asigurați-vă că Wi-Fi și Bluetooth sunt activate pe ambele dispozitive.";
"DEVICE_TRANSFER_QRCODE_EXPLANATION" = "Deschide Signal pe dispozitivul vechi, adu-l în apropiere și asigură-te că Wi-Fi și Bluetooth sunt activate pe ambele dispozitive.";
/* The second explanation for the device transfer qr code view */
"DEVICE_TRANSFER_QRCODE_EXPLANATION2" = "Poziționați codul QR în vizorul celuilalt dispozitiv.";
"DEVICE_TRANSFER_QRCODE_EXPLANATION2" = "Poziționează codul QR în vizorul celuilalt dispozitiv.";
/* A prompt to provide further explanation if the user is not seeing the transfer on both devices. */
"DEVICE_TRANSFER_QRCODE_NOT_SEEING" = "Nu vezi notificarea pe vechiul tău dispozitiv?";
@ -1487,7 +1487,7 @@
"DEVICE_TRANSFER_QRCODE_TITLE" = "Se așteaptă celălalt dispozitiv...";
/* The explanation on the view that shows receiving progress */
"DEVICE_TRANSFER_RECEIVING_EXPLANATION" = "Țineți ambele dispozitive unul lângă altul. Nu opriți niciun dispozitiv și mențineți Signal deschis. Transferurile sunt criptate integral.";
"DEVICE_TRANSFER_RECEIVING_EXPLANATION" = "Ține ambele dispozitive unul lângă altul. Nu opri niciun dispozitiv și menține Signal deschis. Transferurile sunt criptate integral.";
/* The title on the view that shows receiving progress */
"DEVICE_TRANSFER_RECEIVING_TITLE" = "Se primesc date";
@ -1496,13 +1496,13 @@
"DEVICE_TRANSFER_SCANNING_CONNECTING" = "Se conectează...";
/* The explanation for the action sheet asking the user to scan the QR code to transfer */
"DEVICE_TRANSFER_SCANNING_EXPLANATION" = "Poziționați codul QR în interiorul cercului";
"DEVICE_TRANSFER_SCANNING_EXPLANATION" = "Poziționează codul QR în interiorul cercului";
/* The title for the action sheet asking the user to scan the QR code to transfer */
"DEVICE_TRANSFER_SCANNING_TITLE" = "Țineți dispozitivul nou în fața camerei foto";
"DEVICE_TRANSFER_SCANNING_TITLE" = "Ține dispozitivul nou în fața camerei foto";
/* The explanation on the action sheet that shows transfer progress */
"DEVICE_TRANSFER_TRANSFERRING_EXPLANATION" = "Țineți ambele dispozitive unul lângă altul. Nu opriți niciun dispozitiv și mențineți Signal deschis.";
"DEVICE_TRANSFER_TRANSFERRING_EXPLANATION" = "Ține ambele dispozitive unul lângă altul. Nu opri niciun dispozitiv și menține Signal deschis.";
/* The title on the action sheet that shows transfer progress */
"DEVICE_TRANSFER_TRANSFERRING_TITLE" = "Se transmit datele";
@ -1538,7 +1538,7 @@
"DISAPPEARING_MESSAGES_SECONDS" = "secunde";
/* subheading in privacy settings */
"DISAPPEARING_MESSAGES_UNIVERSAL_DESCRIPTION" = "Când e activată opțiunea, mesajele noi trimise și primite în conversații noi începute de dvs. vor dispărea după ce au fost vizualizate.";
"DISAPPEARING_MESSAGES_UNIVERSAL_DESCRIPTION" = "Când e activată opțiunea, mesajele noi trimise și primite în conversații noi începute de tine vor dispărea după ce au fost vizualizate.";
/* The unit for a number of weeks */
"DISAPPEARING_MESSAGES_WEEKS" = "săptămâni";
@ -1550,7 +1550,7 @@
"DISMISS_CONTEXT_MENU" = "Revocare meniu contextual";
/* Title for switch to enable sharing of badges publicly */
"DISPLAY_BADGES_ON_PROFILE_SETTING" = "Afișați insignele pe profil";
"DISPLAY_BADGES_ON_PROFILE_SETTING" = "Afișează insignele pe profil";
/* Section title for the 'domain fronting country' view. */
"DOMAIN_FRONTING_COUNTRY_VIEW_SECTION_HEADER" = "Locație ocolire cenzură";
@ -1559,7 +1559,7 @@
"DONATION_VIEW_AMOUNT_LABEL" = "Sumă donație";
/* Default text for the custom amount field of the donation view. */
"DONATION_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Introduceți o sumă specifică";
"DONATION_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Introdu o sumă specifică";
/* Text describing to the user that they're going to pay a donation to Signal */
"DONATION_VIEW_DONATION_TO_SIGNAL" = "Donație pentru Signal";
@ -1568,25 +1568,25 @@
"DONATION_VIEW_OTHER_WAYS" = "Alte modalități de a dona";
/* Error text notifying the user they must select a large amount on the donate to signal view */
"DONATION_VIEW_SELECT_A_LARGER_AMOUNT" = "Selectați o sumă mai mare de donat";
"DONATION_VIEW_SELECT_A_LARGER_AMOUNT" = "Selectează o sumă mai mare de donat";
/* Error text notifying the user they must select a smaller amount on the donate to signal view */
"DONATION_VIEW_SELECT_A_SMALLER_AMOUNT" = "Selectați o sumă mai mică de donat";
"DONATION_VIEW_SELECT_A_SMALLER_AMOUNT" = "Selectează o sumă mai mică de donat";
/* Error text notifying the user they must select an amount on the donate to signal view */
"DONATION_VIEW_SELECT_AN_AMOUNT" = "Selectați o sumă de donat";
"DONATION_VIEW_SELECT_AN_AMOUNT" = "Selectează o sumă de donat";
/* Thank you message on the donate to signal view */
"DONATION_VIEW_THANKS_FOR_YOUR_SUPPORT" = "Vă mulțumim pentru sprijinul dvs!";
"DONATION_VIEW_THANKS_FOR_YOUR_SUPPORT" = "Îți mulțumim pentru sprijinul tău!";
/* Title for the donate to signal view */
"DONATION_VIEW_TITLE" = "Signal este susținut de oameni ca tine.";
/* The body of the 'Why Donate' section of the donate to signal view */
"DONATION_VIEW_WHY_DONATE_BODY" = "Echipa Signal este dedicată misiunii de a dezvolta o tehnologie de confidențialitate cu sursă deschisă care protejează libertatea de exprimare și permite o comunicare globală sigură. Contribuția dumneavoastră alimentează această cauză. Fără reclame. Fără elemente de urmărire. Pe bune.\n\nDonația dumneavoastră ajută la plata dezvoltării, a serverelor și a lățimii de bandă pentru o aplicație folosită de milioane de oameni din întreaga lume pentru comunicare privată și instantanee.";
"DONATION_VIEW_WHY_DONATE_BODY" = "Echipa Signal este dedicată misiunii de a dezvolta o tehnologie de confidențialitate cu sursă deschisă care protejează libertatea de exprimare și permite o comunicare globală sigură. Contribuția ta alimentează această cauză. Fără reclame. Fără elemente de urmărire. Pe bune.\n\nDonația ta ajută la plata dezvoltării, a serverelor și a lățimii de bandă pentru o aplicație folosită de milioane de oameni din întreaga lume pentru comunicare privată și instantanee.";
/* The title of the 'Why Donate' section of the donate to signal view */
"DONATION_VIEW_WHY_DONATE_TITLE" = "De ce să doni?";
"DONATION_VIEW_WHY_DONATE_TITLE" = "De ce să donezi?";
/* Alert body for when the user has just tried to edit a contacts after declining to give Signal contacts permissions */
"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_BODY" = "Poți permite accesul din aplicația iOS Setări.";
@ -1610,7 +1610,7 @@
"EDIT_GROUP_UPDATE_BUTTON" = "Actualizează";
/* The alert message if user tries to exit update group view without saving changes. */
"EDIT_GROUP_VIEW_UNSAVED_CHANGES_MESSAGE" = "Vreți să salvați schimbările făcute pentru acest grup?";
"EDIT_GROUP_VIEW_UNSAVED_CHANGES_MESSAGE" = "Vrei să salvezi schimbările făcute pentru acest grup?";
/* The alert title if user tries to exit update group view without saving changes. */
"EDIT_GROUP_VIEW_UNSAVED_CHANGES_TITLE" = "Schimbări nesalvate";
@ -1778,19 +1778,19 @@
"ERROR_NETWORK_FAILURE" = "Eroare de rețea";
/* Format string for an error alert notification message. Embes {{ error string }} */
"ERROR_NOTIFICATION_MESSAGE_FORMAT" = "Vă rugăm să ne ajutați să îmbunătățim Signal raportând această eroare împreună cu jurnalele de depanare de pe dispozitivul dvs. la adresa support@signal.org; %@";
"ERROR_NOTIFICATION_MESSAGE_FORMAT" = "Te rugăm să ne ajuți să îmbunătățim Signal raportând această eroare împreună cu jurnalele de depanare de pe dispozitivul tău la adresa support@signal.org; %@";
/* Format string for an error alert notification title. */
"ERROR_NOTIFICATION_TITLE" = "Signal Beta: S-a produs o eroare";
/* Error indicating a send failure due to a delinked application. */
"ERROR_SENDING_DELINKED" = "Dispozitivul tău nu mai este asociat. Te rog să-l asociezi din nou pentru a trimite mesaje în continuare.";
"ERROR_SENDING_DELINKED" = "Dispozitivul tău nu mai este asociat. Te rugăm să-l asociezi din nou pentru a trimite mesaje în continuare.";
/* Error indicating a send failure due to a deregistered application. */
"ERROR_SENDING_DEREGISTERED" = "Dispozitivul tău nu mai este înregistrat. Te rog să te înregistrezi pentru a trimite mesaje în continuare.";
"ERROR_SENDING_DEREGISTERED" = "Dispozitivul tău nu mai este înregistrat. Te rugăm să te înregistrezi pentru a trimite mesaje în continuare.";
/* Error indicating a send failure due to an expired application. */
"ERROR_SENDING_EXPIRED" = "Versiunea ta de Signal a expirat. Te rog să o actualizezi pentru a putea trimite mesaje mai departe.";
"ERROR_SENDING_EXPIRED" = "Versiunea ta de Signal a expirat. Te rugăm să o actualizezi pentru a putea trimite mesaje mai departe.";
/* Format string for 'unregistered user' error. Embeds {{the unregistered user's name or signal id}}. */
"ERROR_UNREGISTERED_USER_FORMAT" = "Utilizator neînregistrat: %@";
@ -1805,7 +1805,7 @@
"EXPIRATION_WARNING_TODAY" = "Versiunea ta de Signal va expira azi. Apasă pentru a actualiza aplicația la versiunea cea mai recentă.";
/* action sheet header when re-sending message which failed because of too many attempts */
"FAILED_SENDING_BECAUSE_RATE_LIMIT" = "Prea multe erori pentru acest contact. Te rog încearcă din nou mai târziu.";
"FAILED_SENDING_BECAUSE_RATE_LIMIT" = "Prea multe erori pentru acest contact. Te rugăm încearcă din nou mai târziu.";
/* action sheet header when re-sending message which failed because of untrusted identity keys */
"FAILED_SENDING_BECAUSE_UNTRUSTED_IDENTITY_KEY" = "Numărul tău de siguranță pentru %@ s-a schimbat recent. S-ar putea să dorești să-l verifici înainte de trimite acest mesaj din nou.";
@ -1829,10 +1829,10 @@
"FINISH_GROUP_CREATION_LABEL" = "Grupul a fost creat";
/* Label and title for 'contact forwarding' views. */
"FORWARD_CONTACT" = "Redirecționați contactul";
"FORWARD_CONTACT" = "Redirecționează contactul";
/* Label and title for 'message forwarding' views. */
"FORWARD_MESSAGE" = "Redirecționați mesajul";
"FORWARD_MESSAGE" = "Redirecționează mesajul";
/* Message for alert with information about forwarding messages. */
"FORWARD_MESSAGE_FIRST_FORWARD_MESSAGE" = "Mesajele redirecționate sunt acum trimise imediat.";
@ -1853,10 +1853,10 @@
"FORWARD_MESSAGE_MESSAGES_SENT_N" = "Mesaje trimise";
/* Indicates that the user can add a text message to forwarded messages. */
"FORWARD_MESSAGE_TEXT_PLACEHOLDER" = "Adăugați un mesaj";
"FORWARD_MESSAGE_TEXT_PLACEHOLDER" = "Adaugă un mesaj";
/* Title for the 'forward message(s)' view. */
"FORWARD_MESSAGE_TITLE" = "Redirecționați către";
"FORWARD_MESSAGE_TITLE" = "Redirecționează către";
/* Label indicating media gallery is empty */
"GALLERY_TILES_EMPTY_GALLERY" = "Nu ai nici un fișier media în această conversație.";
@ -1889,7 +1889,7 @@
"GET_STARTED_CARD_NEW_GROUP" = "Grup nou";
/* Error displayed when there is a failure fetching a GIF from the remote service. */
"GIF_PICKER_ERROR_FETCH_FAILURE" = "Eroare la obținerea GIF-ului cerut. Te rog verifică dacă ești online.";
"GIF_PICKER_ERROR_FETCH_FAILURE" = "Eroare la obținerea GIF-ului cerut. Te rugăm să verifici dacă ești online.";
/* Generic error displayed when picking a GIF */
"GIF_PICKER_ERROR_GENERIC" = "A apărut o eroare neprevăzută. ";
@ -1913,10 +1913,10 @@
"GIF_VIEW_SEARCH_PLACEHOLDER_TEXT" = "Introdu termenul de căutare";
/* Turn on permission view 'go to settings' button */
"GO_TO_SETTINGS_BUTTON" = "Mergi la Setări";
"GO_TO_SETTINGS_BUTTON" = "Mergi la Setări";
/* Message indicating that the access to the group's attributes was changed by the local user. Embeds {{new access level}}. */
"GROUP_ACCESS_ATTRIBUTES_UPDATED_BY_LOCAL_USER_FORMAT" = "Ați modificat cine poate edita detaliile grupului la “%@“.";
"GROUP_ACCESS_ATTRIBUTES_UPDATED_BY_LOCAL_USER_FORMAT" = "Ai modificat cine poate edita detaliile grupului la “%@“.";
/* Message indicating that the access to the group's attributes was changed by a remote user. Embeds {{ %1$@ user who changed the access, %2$@ new access level}}. */
"GROUP_ACCESS_ATTRIBUTES_UPDATED_BY_REMOTE_USER_FORMAT" = "%1$@ a modificat cine poate edita detaliile grupului la “%2$@“.";
@ -1940,7 +1940,7 @@
"GROUP_ACCESS_LEVEL_UNSATISFIABLE" = "Dezactivat";
/* Message indicating that the access to the group's members was changed by the local user. Embeds {{new access level}}. */
"GROUP_ACCESS_MEMBERS_UPDATED_BY_LOCAL_USER_FORMAT" = "Ați modificat cine poate edita apartenența la grup la “%@“.";
"GROUP_ACCESS_MEMBERS_UPDATED_BY_LOCAL_USER_FORMAT" = "Ai modificat cine poate edita apartenența la grup la “%@“.";
/* Message indicating that the access to the group's members was changed by a remote user. Embeds {{ %1$@ user who changed the access, %2$@ new access level}}. */
"GROUP_ACCESS_MEMBERS_UPDATED_BY_REMOTE_USER_FORMAT" = "%1$@ a modificat cine poate edita apartenența la grup la “%2$@“.";
@ -2000,7 +2000,7 @@
"GROUP_CALL_MISSING_MEDIA_KEYS_FORMAT" = "Nu-l poți auzi sau vedea pe %@";
/* Message body for alert explaining that a group call participant cannot be displayed because of missing keys */
"GROUP_CALL_NO_KEYS_ALERT_MESSAGE" = "Acest lucru se poate datora faptului că nu au verificat modificarea numărului dvs. de siguranță, există o problemă cu dispozitivul lor sau v-au blocat.";
"GROUP_CALL_NO_KEYS_ALERT_MESSAGE" = "Acest lucru se poate datora faptului că nu au verificat modificarea numărului tău de siguranță, există o problemă cu dispozitivul lor sau v-au blocat.";
/* Title for alert explaining that a group call participant cannot be displayed because of missing keys. Embeds {{ user's name }} */
"GROUP_CALL_NO_KEYS_ALERT_TITLE_FORMAT" = "Nu pot primi semnal voce și semnal video de la %@";
@ -2045,19 +2045,19 @@
"GROUP_CALL_SAFETY_NUMBER_CHANGE_BODY" = "Cineva s-a alăturat la apel cu un număr de siguranță care s-a schimbat.";
/* Toast view text informing user about swiping to screen share */
"GROUP_CALL_SCREEN_SHARE_TOAST" = "Glisați pentru a vizualiza partajarea ecranului";
"GROUP_CALL_SCREEN_SHARE_TOAST" = "Glisează pentru a vizualiza partajarea ecranului";
/* Text in conversation view for a group call that someone started. We don't know who */
"GROUP_CALL_SOMEONE_STARTED_MESSAGE" = "Cineva a început un apel de grup";
/* Toast view text informing user about swiping to speaker view */
"GROUP_CALL_SPEAKER_VIEW_TOAST" = "Glisați în sus pentru a schimba ecranul";
"GROUP_CALL_SPEAKER_VIEW_TOAST" = "Glisează în sus pentru a schimba ecranul";
/* Button to start a group call */
"GROUP_CALL_START_BUTTON" = "Începeți apelul";
"GROUP_CALL_START_BUTTON" = "Începe apelul";
/* Tooltip highlighting group calls. */
"GROUP_CALL_START_TOOLTIP" = "Atingeți aici pentru a începe un apel de grup";
"GROUP_CALL_START_TOOLTIP" = "Atinge aici pentru a începe un apel de grup";
/* Text explaining that you started a group call. */
"GROUP_CALL_STARTED_BY_YOU" = "Ai început un apel de grup";
@ -2072,25 +2072,25 @@
"GROUP_CALL_TWO_PEOPLE_HERE_FORMAT" = "%1$@ și %2$@ sunt în acest apel";
/* An error displayed to the user when the group call unexpectedly ends. */
"GROUP_CALL_UNEXPECTEDLY_ENDED" = "Ați fost deconectat de la acest apel. Verificați conexiunea și încercați din nou.";
"GROUP_CALL_UNEXPECTEDLY_ENDED" = "Ai fost deconectat de la acest apel. Verifică conexiunea și încearcă din nou.";
/* Text describing the local user as a participant in a group call. */
"GROUP_CALL_YOU" = "Dvs.";
"GROUP_CALL_YOU" = "Tu";
/* Text explaining that you are in the group call. */
"GROUP_CALL_YOU_ARE_HERE" = "Sunteți în apelul de grup";
"GROUP_CALL_YOU_ARE_HERE" = "Ești în apelul de grup";
/* Text describing the local user in the group call members sheet when connected from another device. */
"GROUP_CALL_YOU_ON_ANOTHER_DEVICE" = "Tu (pe alt dispozitiv)";
/* Body for group calls megaphone */
"GROUP_CALLS_MEGAPHONE_BODY" = "Deschideți un grup nou pentru a începe un apel gratuit de grup criptat";
"GROUP_CALLS_MEGAPHONE_BODY" = "Deschide un grup nou pentru a începe un apel gratuit de grup criptat";
/* Title for group calls megaphone */
"GROUP_CALLS_MEGAPHONE_TITLE" = "Vă prezentăm apeluri de grup";
"GROUP_CALLS_MEGAPHONE_TITLE" = "Îți prezentăm apelurile de grup";
/* Message indicating that group was created by the local user. */
"GROUP_CREATED_BY_LOCAL_USER" = "Ați creat grupul.";
"GROUP_CREATED_BY_LOCAL_USER" = "Ai creat grupul.";
/* Message indicating that group was created by another user. Embeds {{remote user name}}. */
"GROUP_CREATED_BY_REMOTE_USER_FORMAT" = "%@ te-a adăugat la grup.";
@ -2105,7 +2105,7 @@
"GROUP_DESCRIPTION_MORE" = "mai multe";
/* Placeholder text for 'group description' field. */
"GROUP_DESCRIPTION_PLACEHOLDER" = "Adăugați descrierea grupului...";
"GROUP_DESCRIPTION_PLACEHOLDER" = "Adaugă descrierea grupului...";
/* Footer text when editing the group description */
"GROUP_DESCRIPTION_VIEW_EDIT_FOOTER" = "Descrierile grupului vor fi vizibile pentru membrii acestui grup și pentru persoanele care au fost invitate.";
@ -2120,10 +2120,10 @@
"GROUP_INVALID_INVITES_ADDED_1" = "O invitație invalidă a fost adăugată.";
/* Message indicating that 1 invalid invite was added by the local user. */
"GROUP_INVALID_INVITES_ADDED_BY_LOCAL_USER_1" = "Ați adăugat o invitație invalidă.";
"GROUP_INVALID_INVITES_ADDED_BY_LOCAL_USER_1" = "Ai adăugat o invitație invalidă.";
/* Message indicating that multiple invalid invites were added by the local user. */
"GROUP_INVALID_INVITES_ADDED_BY_LOCAL_USER_N" = "Ați adăugat invitații invalide.";
"GROUP_INVALID_INVITES_ADDED_BY_LOCAL_USER_N" = "Ai adăugat invitații invalide.";
/* Message indicating that 1 invalid invite was added by another user. Embeds {{remote user name}}. */
"GROUP_INVALID_INVITES_ADDED_BY_REMOTE_USER_FORMAT_1" = "%@ a adăugat o invitație invalidă.";
@ -2138,10 +2138,10 @@
"GROUP_INVALID_INVITES_REMOVED_1" = "O invitație invalidă a fost revocată.";
/* Message indicating that 1 invalid invite was revoked by the local user. */
"GROUP_INVALID_INVITES_REMOVED_BY_LOCAL_USER_1" = "Ați revocat o invitație invalidă.";
"GROUP_INVALID_INVITES_REMOVED_BY_LOCAL_USER_1" = "Ai revocat o invitație invalidă.";
/* Message indicating that multiple invalid invites were revoked by the local user. */
"GROUP_INVALID_INVITES_REMOVED_BY_LOCAL_USER_N" = "Ați revocat invitațiile invalide.";
"GROUP_INVALID_INVITES_REMOVED_BY_LOCAL_USER_N" = "Ai revocat invitațiile invalide.";
/* Message indicating that 1 invalid invite was revoked by another user. Embeds {{remote user name}}. */
"GROUP_INVALID_INVITES_REMOVED_BY_REMOTE_USER_FORMAT_1" = "%@ a revocat o invitație invalidă.";
@ -2156,7 +2156,7 @@
"GROUP_INVITE_LINK_DISABLED" = "Linkul grupului a fost dezactivat.";
/* Message indicating that the group invite link was disabled by the local user. */
"GROUP_INVITE_LINK_DISABLED_BY_LOCAL_USER" = "Ați dezactivat linkul către grup.";
"GROUP_INVITE_LINK_DISABLED_BY_LOCAL_USER" = "Ai dezactivat linkul către grup.";
/* Message indicating that the group invite link was disabled by a remote user. Embeds {{ user who disabled the group invite link }}. */
"GROUP_INVITE_LINK_DISABLED_BY_REMOTE_USER_FORMAT" = "%@ a dezactivat linkul către grup.";
@ -2165,7 +2165,7 @@
"GROUP_INVITE_LINK_ENABLED_WITH_APPROVAL" = "Adresa grupului a fost activată cu aprobare de acces din partea unui administrator.";
/* Message indicating that the group invite link was enabled by the local user. */
"GROUP_INVITE_LINK_ENABLED_WITH_APPROVAL_BY_LOCAL_USER" = "Ați activat linkul de grup cu aprobarea administratorului activată.";
"GROUP_INVITE_LINK_ENABLED_WITH_APPROVAL_BY_LOCAL_USER" = "Ai activat linkul de grup cu aprobarea administratorului activată.";
/* Message indicating that the group invite link was enabled by a remote user. Embeds {{ user who enabled the group invite link }}. */
"GROUP_INVITE_LINK_ENABLED_WITH_APPROVAL_BY_REMOTE_USER_FORMAT" = "%@ a activat adresa grupului cu aprobare de acces din partea unui administrator.";
@ -2174,7 +2174,7 @@
"GROUP_INVITE_LINK_ENABLED_WITHOUT_APPROVAL" = "Adresa grupului a fost activată fără aprobare de acces din partea unui administrator.";
/* Message indicating that the group invite link was enabled by the local user. */
"GROUP_INVITE_LINK_ENABLED_WITHOUT_APPROVAL_BY_LOCAL_USER" = "Ați activat linkul de grup cu aprobarea administratorului dezactivată.";
"GROUP_INVITE_LINK_ENABLED_WITHOUT_APPROVAL_BY_LOCAL_USER" = "Ai activat linkul de grup cu aprobarea administratorului dezactivată.";
/* Message indicating that the group invite link was enabled by a remote user. Embeds {{ user who enabled the group invite link }}. */
"GROUP_INVITE_LINK_ENABLED_WITHOUT_APPROVAL_BY_REMOTE_USER_FORMAT" = "%@ a activat adresa grupului fără aprobare de acces din partea unui administrator.";
@ -2183,7 +2183,7 @@
"GROUP_INVITE_LINK_RESET" = "Linkul grupului a fost resetat.";
/* Message indicating that the group invite link was reset by the local user. */
"GROUP_INVITE_LINK_RESET_BY_LOCAL_USER" = "Ați resetat linkul grupului.";
"GROUP_INVITE_LINK_RESET_BY_LOCAL_USER" = "Ai resetat linkul grupului.";
/* Message indicating that the group invite link was reset by a remote user. Embeds {{ user who reset the group invite link }}. */
"GROUP_INVITE_LINK_RESET_BY_REMOTE_USER_FORMAT" = "%@ a resetat linkul de grup.";
@ -2258,7 +2258,7 @@
"GROUP_LINK_ACTION_SHEET_VIEW_MESSAGE" = "Vrei să te alături acestui grup și să partajezi numele și fotografia ta cu membrii săi?";
/* Error message the attempt to request to join the group failed due to network connectivity. */
"GROUP_LINK_COULD_NOT_REQUEST_TO_JOIN_GROUP_DUE_TO_NETWORK_ERROR_MESSAGE" = "Te rog verifică dacă ești online și încearcă din nou.";
"GROUP_LINK_COULD_NOT_REQUEST_TO_JOIN_GROUP_DUE_TO_NETWORK_ERROR_MESSAGE" = "Te rugăm să verifici dacă ești online și încearcă din nou.";
/* Error message the attempt to request to join the group failed. */
"GROUP_LINK_COULD_NOT_REQUEST_TO_JOIN_GROUP_ERROR_MESSAGE" = "Te rugăm încearcă din nou.";
@ -3425,7 +3425,7 @@
"MESSAGE_REQUEST_VIEW_NEW_GROUP_PROMPT" = "Te alături acestui grup și împărtășești numele și fotografia cu membrii săi? Nu vor ști că le-ai văzut mesajele până nu accepți.";
/* A prompt asking if the user wants to accept a group invite. */
"MESSAGE_REQUEST_VIEW_NEW_GROUP_PROMPT_V2" = "Te alături acestui grup? Nu vor ști că le-ai văzut mesajele până nu veți accepta.";
"MESSAGE_REQUEST_VIEW_NEW_GROUP_PROMPT_V2" = "Te alături acestui grup? Nu vor ști că le-ai văzut mesajele până nu vei accepta.";
/* A button used to unlock a blocked conversation. */
"MESSAGE_REQUEST_VIEW_UNBLOCK_BUTTON" = "Deblochează";
@ -3809,7 +3809,7 @@
"ONBOARDING_PIN_TITLE" = "Introdu PIN-ul tău";
/* Title label for profile creation step of onboarding */
"ONBOARDING_PROFILE_CREATION_TITLE" = "Profilul dvs.";
"ONBOARDING_PROFILE_CREATION_TITLE" = "Profilul tău";
/* Placeholder text for the family name field of the profile creation view. */
"ONBOARDING_PROFILE_FAMILY_NAME_FIELD" = "Nume (opțional)";
@ -5738,7 +5738,7 @@
"SETTINGS_PAYMENTS_VIEW_TITLE" = "Plăți (Beta)";
/* Label for the payments wallet address. */
"SETTINGS_PAYMENTS_WALLET_ADDRESS_LABEL" = "Adresa portofelului dvs.";
"SETTINGS_PAYMENTS_WALLET_ADDRESS_LABEL" = "Adresa portofelului tău";
/* Label for the 'phone number discoverability' setting. */
"SETTINGS_PHONE_NUMBER_DISCOVERABILITY" = "Să mă găsească după numărul de telefon";
@ -6056,7 +6056,7 @@
"SUBSCRIPTION_MEGAPHONE_ACTION" = "Contribuie";
/* Body for subscription megaphone */
"SUBSCRIPTION_MEGAPHONE_BODY" = "Signal este susținut de oameni ca dvs. Contribuiți și primiți o insignă.";
"SUBSCRIPTION_MEGAPHONE_BODY" = "Signal este susținut de oameni ca tine. Contribuie și primești o insignă.";
/* Cancel text for subscription megaphone */
"SUBSCRIPTION_MEGAPHONE_CANCEL" = "Nu, mulțumesc";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Дайте «Ускорение» приложению Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Ваш значок «Ускорение» истёк и больше не виден в вашем профиле.\n\nВы можете продолжить пользоваться Signal, но чтобы поддержать технологию, сделанную для вас, пожалуйста, подумайте о том, чтобы стать ежемесячным Поддерживающим.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Ваш значок «Ускорение» истёк и больше не виден в вашем профиле.\n\nВы можете заново активировать свой значок «Ускорение» ещё на 30 дней, сделав одноразовое пожертвование.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Ваша подписка Поддерживающего была автоматически отменена, потому что вы были неактивны слишком долго. Ваш значок «%@» больше не виден в вашем профиле.\n\nВы можете продолжить пользоваться Signal, но чтобы поддержать приложение и заново активировать свой значок, продлите подписку сейчас.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Стать Поддерживающим";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Добавить Ускорение";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Значок истёк";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Продлить подписку";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Подписка отменена";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Спасибо за Ускорение!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Začať podporovať Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Platnosť vášho odznaku Podporovateľ vypršala a už sa vo vašom profile nezobrazuje.\n\nSignal môžete používať aj naďalej, ale ak chcete podporiť technológiu, ktorá je pre vás vytvorená, zvážte, či sa nestanete mesačným Podporovateľom.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Platnosť vášho odznaku Podporovateľa vypršala a už sa vo vašom profile nezobrazuje.\n\nSvoj odznak Podporovateľ môžete znova aktivovať na ďalších 30 dní jednorazovým príspevkom.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Vaše prispievanie Podporovateľa bolo automaticky zrušené, pretože ste boli príliš dlho neaktívni. Váš odznak %@ už nie je viditeľný vo vašom profile.\n\nSignal môžete naďalej používať, ale ak chcete podporiť aplikáciu a znova aktivovať svoj odznak, obnovte ho teraz.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Staňte sa Sustainerom";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Pridajte podporu";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Platnosť odznaku vypršala";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Obnoviť prispievanie";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Prispievanie zrušené";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Ďakujem za podporu!";
@ -5201,7 +5201,7 @@
"SETTINGS_COPYRIGHT" = "Autorské práva Signal Messenger \nLicencované pod GPLv3";
/* Title for the 'Subscription' link in settings. */
"SETTINGS_CURRENT_SUBSCRIPTION" = "Predplatné";
"SETTINGS_CURRENT_SUBSCRIPTION" = "Prispievanie";
/* Label for the 'data' section of the app settings. */
"SETTINGS_DATA" = "Využitie dát";
@ -5267,7 +5267,7 @@
"SETTINGS_DISAPPEARING_MESSAGES" = "Miznúce správy";
/* Explanation for the 'disappearing messages' privacy settings. */
"SETTINGS_DISAPPEARING_MESSAGES_FOOTER" = "Nastavte predvolený časovač miznutia správ pre všetky nové správy ktoré ste poslali.";
"SETTINGS_DISAPPEARING_MESSAGES_FOOTER" = "Nastavte predvolený časovač miznutia správ pre všetky nové správy ktoré odošlete.";
/* Title for the 'donate to signal' link in settings. */
"SETTINGS_DONATE" = "Prispieť na Signal";
@ -6047,10 +6047,10 @@
"SUBSCRIBER_BADGES" = "Odznaky";
/* Title for the 'Manage Subscription' button in sustainer view. */
"SUBSCRIBER_MANAGE_SUBSCRIPTION" = "Spravovať predplatné";
"SUBSCRIBER_MANAGE_SUBSCRIPTION" = "Spravovať prispievanie";
/* Title for the 'Subscription FAQ' button in sustainer view. */
"SUBSCRIBER_SUBSCRIPTION_FAQ" = "Časté otázky o predplatnom";
"SUBSCRIBER_SUBSCRIPTION_FAQ" = "Časté otázky o prispievaní";
/* Action text for subscription megaphone */
"SUBSCRIPTION_MEGAPHONE_ACTION" = "Prispieť";
@ -6143,7 +6143,7 @@
"SUSTAINER_VIEW_BADGE_DESCRIPTION" = "Získajte %@ odznak";
/* Sustainer view Cancel Subscription button title */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION" = "Zrušiť predplatné";
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION" = "Zrušiť prispievanie";
/* Confirm Cancellation? Action sheet confirm button */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION_CONFIRMATION_CONFIRM" = "Potvrdiť";
@ -6203,7 +6203,7 @@
"SUSTAINER_VIEW_STILL_PROCESSING_BADGE_MESSAGE" = "Vaša platba sa stále spracováva. V závislosti od vášho pripojenia to môže trvať niekoľko minút.";
/* Toast indicating that the subscription has been cancelled */
"SUSTAINER_VIEW_SUBSCRIPTION_CANCELLED" = "Vaše predplatné bolo zrušené";
"SUSTAINER_VIEW_SUBSCRIPTION_CANCELLED" = "Vaše prispievanie bolo zrušené";
/* Sustainer view Not Now Action sheet button */
"SUSTAINER_VIEW_SUBSCRIPTION_CONFIRMATION_NOT_NOW" = "Teraz nie";
@ -6212,10 +6212,10 @@
"SUSTAINER_VIEW_TITLE" = "Signal používajú ľudia ako vy.";
/* Update Subscription? Action sheet message, embeds {{Price}} */
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_MESSAGE" = "Dnes vám bude účtovaná celá suma (%@) novej ceny predplatného. Vaše nové predplatné sa bude obnovovať mesačne.";
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_MESSAGE" = "Dnes vám bude účtovaná celá suma (%@) novej ceny príspevného. Vaše nové prispievanie sa bude obnovovať mesačne.";
/* Update Subscription? Action sheet title */
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_TITLE" = "Aktualizovať predplatné?";
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_TITLE" = "Aktualizovať prispievanie?";
/* Update Subscription? Action sheet confirm button */
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_UPDATE" = "Aktualizovať";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Jepini Sinjalit Pak Fuqizim";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Stema juaj si Përforcues ka skaduar dhe sështë më e dukshme në profilin tuaj.\n\nMund të vazhdoni të përdorni Signal-in, por që të përkrahni teknologjinë e krijuar për ju, ju lutemi, shihni mundësinë të bëheni një mbështetës i përmuajshëm.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Stema juaj si Përforcues ka skaduar dhe sështë më e dukshme në profilin tuaj.\n\nStemën tuaj si Përforcues mund ta riaktivizoni për 30 ditë të tjera përmes një kontributi një herësh.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Pajtimi juaj si Mbështetës u anulua automatikisht, ngaqë keni qenë jo aktiv për një kohë të gjatë. Stema juaj si %@ sështë më e dukshme te profili juaj.\n\nMund të vazhdoni ta përdorni Signal-in, por që të përkrahni aplikacionin dhe të riaktivizoni stemën tuaj, rinovojeni tani.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Bëhuni një Mbështetës";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Shtoni një Përforcim";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Stema Ka Skaduar";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Rinovoni Pajtim";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Pajtim i Anuluar";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Faleminderit për Fuqizimin!";

View File

@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Lägg till en Boost";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Märket har upphört att gälla";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Förnya prenumeration";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Prenumerationen uppsagd";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Tack för boosten!";
@ -1427,7 +1427,7 @@
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_BODY" = "Lägg till denna iPad som en ny länkad enhet utan att överföra meddelandehistorik";
/* The title for the device transfer 'choice' view 'register' option when linking a device */
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_TITLE" = "Lägg till som ny enhet";
"DEVICE_TRANSFER_CHOICE_REGISTER_LINKED_TITLE" = "Lägg till som en ny enhet";
/* The title for the device transfer 'choice' view 'register' option */
"DEVICE_TRANSFER_CHOICE_REGISTER_TITLE" = "Registrera dig utan att överföra";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Signal'i Arttırın";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Boost rozetinizin süresi doldu ve profilinizde artık görüntülenmiyor.\n\nSignal kullanmaya devam edebilirsiniz ama sizin için geliştirilmiş teknolojiyi desteklemek için, lütfen aylık Destekçimiz olmayı düşünün.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Boost rozetinizin süresi doldu ve profilinizde artık görüntülenmiyor.\n\nTek seferlik bir katkıyla Boost rozetinizi 30 günlüğüne yeniden etkinleştirebilirsiniz.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Destekçi aboneliğin otomatik olarak iptal edildi, çünkü uzun süredir aktif değilsin. %@ rozetin artık profilinde görüntülenmiyor.\n\nSignal kullanmaya devam edebilirsiniz ama uygulamayı desteklemek ve rozeti tekrar etkinleştirmek için aboneliğini şimdi yenile.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Destekçi Ol";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Boost Ekle";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Rozetin Süresi Doldu";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Aboneliği Yenile";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Abonelik İptal Edildi";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Arttırıcı için teşekkürler!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Надати Signal можливість розвитку";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Строк дії Емблеми розвитку сплив та вона більше не показуватиметься у вашому профілі.\n\nВи можете продовжувати використовувати Signal, але для підтримки технології, яку було створено для вас, будь ласка, подумайте про те, щоб стати підтримувачем на місяць.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Строк дії Емблеми розвитку сплив та вона більше не показуватиметься у вашому профілі.\n\nВи можете знов активувати свою емблему розвитку на 30 днів за допомогою одного внеску.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Вашу передплату підтримувача було автоматично скасовано, оскільки ви занадто довго були неактивні. Емблема %@ більше не показуватиметься у вашому профілі.\n\nВи можете продовжувати використовувати Signal, але для підтримки застосунку та відновлення емблеми потрібно поновити передплату зараз.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Стати підтримувачем";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Додати пришвидшення";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Строк дії емблеми сплив";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Поновити передплату";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Передплату скасовано";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Дякуємо за можливість розвиватись!";
@ -3206,7 +3206,7 @@
"MESSAGE_ACTION_DELETE_MESSAGE" = "Видалити це повідомлення";
/* accessibility label */
"MESSAGE_ACTION_DELETE_SELECTED_MESSAGES" = "Видалити Вибрані Повідомлення";
"MESSAGE_ACTION_DELETE_SELECTED_MESSAGES" = "Видалити вибрані повідомлення";
/* Action sheet button title */
"MESSAGE_ACTION_DETAILS" = "Детальніше";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Quyên góp cho Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Huy hiệu Boost của bạn đã hết hạn và không còn hiển thị trên hồ sơ của bạn.\n\nBạn có thể tiếp tục sử dụng Signal nhưng để hỗ trợ công nghệ được xây dựng cho bạn, vui lòng xem xét trở thành Người ủng hộ bền vững hàng tháng.";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Huy hiệu Boost của bạn đã hết hạn và không còn hiển thị trên hồ sơ của bạn nữa.\n\nBạn có thể kích hoạt lại huy hiệu Boost của mình trong 30 ngày nữa với khoản ủng hộ một lần.";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Đăng ký Ủng hộ của bạn đã tự động bị hủy vì bạn đã không hoạt động trong thời gian quá dài. Huy hiệu %@ của bạn không còn hiển thị trên hồ sơ của bạn nữa.\n\nBạn có thể tiếp tục sử dụng Signal nhưng để hỗ trợ ứng dụng và kích hoạt lại huy hiệu của bạn, hãy gia hạn ngay bây giờ.";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "Trở thành người quyên góp";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "Thêm quyên góp";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "Huy hiệu Đã hết hạn";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Gia hạn gói đăng ký";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Đăng ký đã bị Hủy";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "Cảm ơn bạn đã quyên góp";
@ -509,7 +509,7 @@
"BOOST_VIEW_BODY" = "Hãy cảm ơn và nhận huy hiệu đống góp trong 30 ngày.";
/* The body text for the donate to signal view, embeds {{Expiration}} */
"BOOST_VIEW_BODY_WITH_EXPIRATION_FORMAT" = "Your Boost badge will expire on %@.";
"BOOST_VIEW_BODY_WITH_EXPIRATION_FORMAT" = "Huy hiệu Boost của bạn sẽ hết hạn vào %@.";
/* Default text for the custom amount field of the boost view. */
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "Nhập vào Số tiền Tuỳ chọn";
@ -935,7 +935,7 @@
"CONTACT_SUPPORT_FILTER_SUSTAINERS" = "Người hổ trợ & Đóng góp cho Signal";
/* A brief localized representation of the 'Sustainers & Signal Boost' support filter. */
"CONTACT_SUPPORT_FILTER_SUSTAINERS_SHORT" = "Sustainers & Boost";
"CONTACT_SUPPORT_FILTER_SUSTAINERS_SHORT" = "Quyên góp & Thúc đẩy";
/* Alert body */
"CONTACT_SUPPORT_PROMPT_ERROR_ALERT_BODY" = "Signal không thể hoàn thành yêu cầu hỗ trợ của bạn. ";
@ -6122,13 +6122,13 @@
"SUPPORT_LOG_UPLOAD_IN_PROGRESS" = "Đang tải...";
/* First block of description text in read more sheet */
"SUSTAINER_READ_MORE_DESCRIPTION_BLOCK_ONE" = "Signal is a nonprofit with no advertisers or investors, sustained only by the people who use and value it. Make a recurring monthly contribution and receive a profile badge to share your support.";
"SUSTAINER_READ_MORE_DESCRIPTION_BLOCK_ONE" = "Signal là một tổ chức phi lợi nhuận không có nhà quảng cáo hoặc nhà đầu tư, chỉ được duy trì bởi những người sử dụng và đánh giá cao nó. Đóng góp định kỳ hàng tháng và nhận hồ sơ huy hiệu để chia sẻ sự ủng hộ của bạn.";
/* Second block of description text in read more sheet */
"SUSTAINER_READ_MORE_DESCRIPTION_BLOCK_TWO" = "Signal is committed to developing open source privacy technology that protects free expression and enables secure global communication.\n\nYour contribution fuels this cause and pays for the development and operations of an app used by millions for private communication. No ads. No trackers. No kidding.";
"SUSTAINER_READ_MORE_DESCRIPTION_BLOCK_TWO" = "Signal cam kết phát triển công nghệ bảo mật mã nguồn mở bảo vệ quyền tự do ngôn luận và cho phép giao tiếp toàn cầu an toàn. Đóng góp của bạn thúc đẩy điều này này và trả tiền cho sự phát triển và hoạt động của một ứng dụng được hàng triệu người sử dụng để liên lạc riêng tư. Không quảng cáo. Không có trình theo dõi. Không đùa đâu.";
/* Title for the signal sustainer read more view */
"SUSTAINER_READ_MORE_TITLE" = "Support technology that is built for you - not for your data - by joining the community that sustains it.";
"SUSTAINER_READ_MORE_TITLE" = "Hỗ trợ công nghệ được xây dựng cho bạn - không phải cho dữ liệu của bạn - bằng cách tham gia cộng đồng duy trì nó.";
/* Why Contribute title for the signal sustainer read more view */
"SUSTAINER_READ_MORE_WHY_CONTRIBUTE" = "Vì sao phải Quyên góp?";
@ -6170,13 +6170,13 @@
"SUSTAINER_VIEW_CURRENCY" = "Đặt kỳ hạn";
/* Action sheet title for Error Processing Payment sheet */
"SUSTAINER_VIEW_ERROR_PROCESSING_PAYMENT_TITLE" = "Error Processing Payment";
"SUSTAINER_VIEW_ERROR_PROCESSING_PAYMENT_TITLE" = "Lỗi khi xử lý Thanh toán";
/* Existing subscriber support header */
"SUSTAINER_VIEW_MY_SUPPORT" = "Hổ trợ của tôi";
/* Payment error occured text, embeds {{link to contact support}} */
"SUSTAINER_VIEW_PAYMENT_ERROR" = "Error processing payment. %@";
"SUSTAINER_VIEW_PAYMENT_ERROR" = "Lỗi khi xử lý thanh toán. %@";
/* Pricing text for sustainer view badges, embeds {{price}} */
"SUSTAINER_VIEW_PRICING" = "%@/tháng";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "Signal 賣旗籌款";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "您個集氣襟章已經褪色夠鐘換喇,因此已經喺您嘅個人資料度除返落嚟,唔會再睇到。\n\nSignal 一切如常運作,並讓您自由使用。如果您想力撐為您而設嘅科技,請考慮做我哋月供課金計劃嘅後援金主。";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "您個集氣襟章已經褪色夠鐘換喇,因此已經喺您嘅個人資料度除返落嚟,唔會再睇到。\n\n您可以單次捐款將您嘅「集氣」襟章重新掛上 30 日。";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "見您冇用好一排,您嘅後援課金計劃已經自動取消。您嘅「%@」襟章已經喺您嘅個人資料度除返落嚟,人哋唔會再睇到。\n\nSignal 一切如常運作,並讓您自由使用。若要繼續支持呢個 app 並掛返起您個襟章,請立即續期。";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "擔當後援";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "買多支旗";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "襟章已經褪色夠鐘換喇";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "為課金計劃續期";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "課金計劃已經取消";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "多謝您為我哋集氣!";

View File

@ -386,13 +386,13 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "齊集氣,為 Signal 加加油";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "您的集氣徽章已到時限,不再在您的個人資料中看見。\n\n您可如常使用 Signal沒有關係。假如您希望支持為您而設的科技請考慮成為月供力撐派。";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "您的集氣徽章已到時限,不再在您的個人資料中看見。\n\n您可憑單次捐款將您的「集氣」徽章再延續 30 天。";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "有見您已有好一段日子未曾使用,您的力撐派訂閱已自動取消。您的「%@」徽章不再在您的個人資料中讓別人看見。\n\n您可如常使用 Signal沒有關係。假如您希望支持此應用程式並延續您的徽章請立即續期。";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "成為力撐派";
@ -401,13 +401,13 @@
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "新增集氣";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "徽章已到時限";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "為訂閱續期";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "訂閱已取消";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "感謝您加油集氣!";

View File

@ -386,28 +386,28 @@
"BADGE_DETAILS_GIVE_A_BOOST" = "加油支持 Signal";
/* String explaing to the user that their boost badge has expired on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can continue using Signal but to support technology that is built for you, please consider becoming a monthly Sustainer.";
"BADGE_EXIPRED_BOOST_BODY_FORMAT" = "你的\"加油支持\"徽章已過期,不會再顯示於你的個人資料中。\n\n你可以繼續使用 Signal但為了支持專為你研發的技術請考慮成為每月的定期贊助人。";
/* String explaing to the user that their boost badge has expired while they are a current subscription sustainer on the badge expiry sheetsheet. */
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "Your Boost badge has expired, and is no longer visible on your profile.\n\nYou can reactivate your Boost badge for another 30 days with a one-time contribution.";
"BADGE_EXIPRED_BOOST_CURRENT_SUSTAINER_BODY_FORMAT" = "你的\"加油支持\"徽章已過期,不會再顯示於你的個人資料中。\n\n你可以透過一次性捐款將你的\"加油支持\"徽章再展示 30 天。";
/* String explaing to the user that their subscription badge has expired on the badge expiry sheetsheet. Embed {badge name}. */
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "Your Sustainer subscription was automatically cancelled because you were inactive for too long. Your %@ badge is no longer visible on your profile.\n\nYou can keep using Signal but to support the app and reactivate your badge, renew now.";
"BADGE_EXIPRED_SUBSCRIPTION_BODY_FORMAT" = "你的贊助人定期贊助已自動取消,因為你的非活動時間過長。你的 %@ 徽章在你的個人資料中無法顯示。\n\n你可以繼續使用 Signal但要支援該應用程式並重新展示你的徽章請立即更新。";
/* Button title for boost on the badge expiration sheet, used if the user is not already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON" = "成為贊助人";
/* Button title for boost on the badge expiration sheet, used if the user is already a sustainer. */
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "新增一次單次贊助";
"BADGE_EXPIRED_BOOST_RENEWAL_BUTTON_SUSTAINER" = "增加一次加油支持";
/* Title for boost on the badge expiration sheet. */
"BADGE_EXPIRED_BOOST_TITLE" = "Badge Expired";
"BADGE_EXPIRED_BOOST_TITLE" = "徽章已過期";
/* Button title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "Renew Subscription";
"BADGE_EXPIRED_SUBSCRIPTION_RENEWAL_BUTTON" = "更新定期贊助";
/* Title for subscription on the badge expiration sheet. */
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "Subscription Cancelled";
"BADGE_EXPIRED_SUBSCRIPTION_TITLE" = "定期贊助已取消";
/* Title for boost on the thank you sheet. */
"BADGE_THANKS_BOOST_TITLE" = "謝謝你的加油與支持!";
@ -506,10 +506,10 @@
"BOOST_VIEW_AMOUNT_LABEL" = "設定貨幣";
/* The body text for the donate to signal view */
"BOOST_VIEW_BODY" = "說聲謝謝!” 並獲得加油支持徽章 30 天 。";
"BOOST_VIEW_BODY" = "說聲謝謝!” 並獲得\"加油支持\"徽章 30 天 。";
/* The body text for the donate to signal view, embeds {{Expiration}} */
"BOOST_VIEW_BODY_WITH_EXPIRATION_FORMAT" = "你的加油支持徽章將於%@過期。";
"BOOST_VIEW_BODY_WITH_EXPIRATION_FORMAT" = "你的\"加油支持\"徽章將於%@過期。";
/* Default text for the custom amount field of the boost view. */
"BOOST_VIEW_CUSTOM_AMOUNT_PLACEHOLDER" = "輸入自定義金額";
@ -5201,7 +5201,7 @@
"SETTINGS_COPYRIGHT" = "版權Signal Messenger\n根據GPLv3版權";
/* Title for the 'Subscription' link in settings. */
"SETTINGS_CURRENT_SUBSCRIPTION" = "訂閱";
"SETTINGS_CURRENT_SUBSCRIPTION" = "定期贊助";
/* Label for the 'data' section of the app settings. */
"SETTINGS_DATA" = "數據使用量";
@ -6047,10 +6047,10 @@
"SUBSCRIBER_BADGES" = "徽章";
/* Title for the 'Manage Subscription' button in sustainer view. */
"SUBSCRIBER_MANAGE_SUBSCRIPTION" = "管理訂閱";
"SUBSCRIBER_MANAGE_SUBSCRIPTION" = "管理定期贊助";
/* Title for the 'Subscription FAQ' button in sustainer view. */
"SUBSCRIBER_SUBSCRIPTION_FAQ" = "訂閱 問與答";
"SUBSCRIBER_SUBSCRIPTION_FAQ" = "定期贊助 問與答";
/* Action text for subscription megaphone */
"SUBSCRIPTION_MEGAPHONE_ACTION" = "貢獻";
@ -6137,13 +6137,13 @@
"SUSTAINER_STILL_PROCESSING_BADGE_TITLE" = "仍在處理中";
/* Sustainer view Add Boost button title */
"SUSTAINER_VIEW_ADD_BOOST" = "增加 Signal 的加油支持次數";
"SUSTAINER_VIEW_ADD_BOOST" = "增加 Signal 的\"加油支持\"次數";
/* Description text for sustainer view badges, embeds {{localized badge name}} */
"SUSTAINER_VIEW_BADGE_DESCRIPTION" = "得到一個 %@ 徽章";
/* Sustainer view Cancel Subscription button title */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION" = "取消訂閱";
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION" = "取消定期贊助";
/* Confirm Cancellation? Action sheet confirm button */
"SUSTAINER_VIEW_CANCEL_SUBSCRIPTION_CONFIRMATION_CONFIRM" = "確認";
@ -6203,7 +6203,7 @@
"SUSTAINER_VIEW_STILL_PROCESSING_BADGE_MESSAGE" = "你的付款仍在處理中。 這可能需要幾分鐘時間,這將取決於你的網路連接。";
/* Toast indicating that the subscription has been cancelled */
"SUSTAINER_VIEW_SUBSCRIPTION_CANCELLED" = "你的訂閱已取消";
"SUSTAINER_VIEW_SUBSCRIPTION_CANCELLED" = "你的定期贊助已取消";
/* Sustainer view Not Now Action sheet button */
"SUSTAINER_VIEW_SUBSCRIPTION_CONFIRMATION_NOT_NOW" = "現在不要";
@ -6212,10 +6212,10 @@
"SUSTAINER_VIEW_TITLE" = "Signal 由像你這樣的人提供動力。";
/* Update Subscription? Action sheet message, embeds {{Price}} */
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_MESSAGE" = "今天將向你收取新訂閱價格的全額 (%@)。你的新訂閱將每月更新。";
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_MESSAGE" = "今天將向你收取新定期贊助價格的全額 (%@)。你的新定期贊助將每月更新。";
/* Update Subscription? Action sheet title */
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_TITLE" = "續約訂閱嗎?";
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_TITLE" = "更新定期贊助嗎?";
/* Update Subscription? Action sheet confirm button */
"SUSTAINER_VIEW_UPDATE_SUBSCRIPTION_CONFIRMATION_UPDATE" = "更新";

View File

@ -586,6 +586,8 @@ extension StorageServiceProtoAccountRecord: Dependencies {
builder.setE164(localPhoneNumber)
}
builder.setPreferredReactionEmoji(ReactionManager.emojiSet(transaction: transaction))
if let subscriberID = SubscriptionManager.getSubscriberID(transaction: transaction),
let subscriberCurrencyCode = SubscriptionManager.getSubscriberCurrencyCode(transaction: transaction) {
builder.setSubscriberID(subscriberID)
@ -754,6 +756,19 @@ extension StorageServiceProtoAccountRecord: Dependencies {
localConfiguration.applyToken(remoteExpireToken, transaction: transaction)
}
if !preferredReactionEmoji.isEmpty {
// Treat new preferred emoji as a full source of truth (if not empty).
// Any holes or invalid choices are filled in with the *default* reactions, not the previous local choices.
let reactionEmoji = ReactionManager.defaultEmojiSet.enumerated().map { (i, defaultEmoji) -> String in
if let newReaction = preferredReactionEmoji[safe: i], newReaction.isSingleEmoji {
return newReaction
} else {
return defaultEmoji
}
}
ReactionManager.setEmojiSet(reactionEmoji, transaction: transaction)
}
if let subscriberIDData = subscriberID, let subscriberCurrencyCode = subscriberCurrencyCode {
if subscriberIDData != SubscriptionManager.getSubscriberID(transaction: transaction) {
SubscriptionManager.setSubscriberID(subscriberIDData, transaction: transaction)

View File

@ -1,10 +1,10 @@
//
// Copyright (c) 2021 Open Whisper Systems. All rights reserved.
// Copyright (c) 2022 Open Whisper Systems. All rights reserved.
//
import Foundation
import PassKit
import ZKGroup
import SignalClient
import SignalServiceKit
public enum SubscriptionBadgeIds: String, CaseIterable {
@ -70,12 +70,13 @@ public class SubscriptionLevel: Comparable {
public struct Subscription {
public enum StripeSubscriptionStatus: String {
case unknown
case trialing = "trialing"
case active = "active"
case incomplete = "incomplete"
case incompleteExpired = "incomplete_expired"
case pastDue = "past_due"
case cancelled = "cancelled"
case canceled = "canceled"
case unpaid = "unpaid"
}
@ -98,7 +99,7 @@ public struct Subscription {
billingCycleAnchor = try params.required(key: "billingCycleAnchor")
active = try params.required(key: "active")
cancelAtEndOfPeriod = try params.required(key: "cancelAtPeriodEnd")
status = StripeSubscriptionStatus(rawValue: try params.required(key: "status"))!
status = StripeSubscriptionStatus(rawValue: try params.required(key: "status")) ?? .unknown
}
}
@ -623,7 +624,7 @@ public class SubscriptionManager: NSObject {
if let error = error as? OWSHTTPError {
let statusCode = error.responseStatusCode
if statusCode == 400 || statusCode == 402 || statusCode == 403 || statusCode == 404 || statusCode == 409 {
let failureReason = SubscriptionRedemptionFailureReason(rawValue: statusCode)!
let failureReason = SubscriptionRedemptionFailureReason(rawValue: statusCode) ?? .none
databaseStorage.write { transaction in
self.setLastReceiptRedemptionFailed(failureReason: failureReason, transaction: transaction)
}

View File

@ -3,7 +3,7 @@
//
import Foundation
import ZKGroup
import SignalClient
@objc(OWSSubscriptionReceiptCredentialJobQueue)
public class SubscriptionReceiptCredentialJobQueue: NSObject, JobQueue {

View File

@ -4,7 +4,7 @@
import Foundation
import SignalServiceKit
import ZKGroup
import SignalClient
public struct GroupV2Params {
let groupSecretParamsData: Data
@ -100,8 +100,7 @@ public extension GroupV2Params {
}
let clientZkGroupCipher = ClientZkGroupCipher(groupSecretParams: self.groupSecretParams)
let zkgUuid = try clientZkGroupCipher.decryptUuid(uuidCiphertext: uuidCiphertext)
let uuid = zkgUuid.asUUID()
let uuid = try clientZkGroupCipher.decryptUuid(uuidCiphertext: uuidCiphertext)
Self.decryptedUuidCache.setObject(uuid, forKey: cacheKey)
return uuid
@ -109,7 +108,7 @@ public extension GroupV2Params {
func userId(forUuid uuid: UUID) throws -> Data {
let clientZkGroupCipher = ClientZkGroupCipher(groupSecretParams: self.groupSecretParams)
let uuidCiphertext = try clientZkGroupCipher.encryptUuid(uuid: try uuid.asZKGUuid())
let uuidCiphertext = try clientZkGroupCipher.encryptUuid(uuid: uuid)
let userId = uuidCiphertext.serialize().asData
let cacheKey = (groupSecretParamsData + userId)
@ -122,16 +121,15 @@ public extension GroupV2Params {
func profileKey(forProfileKeyCiphertext profileKeyCiphertext: ProfileKeyCiphertext,
uuid: UUID) throws -> Data {
let zkgUuid = try uuid.asZKGUuid()
let cacheKey = (groupSecretParamsData + profileKeyCiphertext.serialize().asData + zkgUuid.serialize().asData)
let cacheKey = (groupSecretParamsData + profileKeyCiphertext.serialize().asData + uuid.data)
if let plaintext = Self.decryptedProfileKeyCache.object(forKey: cacheKey) {
return plaintext
}
let clientZkGroupCipher = ClientZkGroupCipher(groupSecretParams: self.groupSecretParams)
let profileKey = try clientZkGroupCipher.decryptProfileKey(profileKeyCiphertext: profileKeyCiphertext,
uuid: zkgUuid)
uuid: uuid)
let plaintext = profileKey.serialize().asData
Self.decryptedProfileKeyCache.setObject(plaintext, forKey: cacheKey)

View File

@ -4,7 +4,7 @@
import Foundation
import SignalServiceKit
import ZKGroup
import SignalClient
public struct GroupV2SnapshotImpl: GroupV2Snapshot {

View File

@ -4,7 +4,7 @@
import Foundation
import SignalServiceKit
import ZKGroup
import SignalClient
@objc
public class GroupV2UpdatesImpl: NSObject, GroupV2UpdatesSwift {

View File

@ -5,7 +5,7 @@
import Foundation
import SignalServiceKit
import SignalMetadataKit
import ZKGroup
import SignalClient
@objc
public class GroupsV2Impl: NSObject, GroupsV2Swift {
@ -1264,13 +1264,12 @@ public class GroupsV2Impl: NSObject, GroupsV2Swift {
throw OWSAssertionError("Missing or invalid JSON")
}
let temporalCredentials = try self.parseCredentialResponse(responseObject: json)
let localZKGUuid = try localUuid.asZKGUuid()
let serverPublicParams = try GroupsV2Protos.serverPublicParams()
let clientZkAuthOperations = ClientZkAuthOperations(serverPublicParams: serverPublicParams)
var credentialMap = AuthCredentialMap()
for temporalCredential in temporalCredentials {
// Verify the credentials.
let authCredential: AuthCredential = try clientZkAuthOperations.receiveAuthCredential(uuid: localZKGUuid,
let authCredential: AuthCredential = try clientZkAuthOperations.receiveAuthCredential(uuid: localUuid,
redemptionTime: temporalCredential.redemptionTime,
authCredentialResponse: temporalCredential.authCredentialResponse)
credentialMap[temporalCredential.redemptionTime] = authCredential

View File

@ -4,7 +4,7 @@
import Foundation
import SignalServiceKit
import ZKGroup
import SignalClient
public struct ChangedGroupModel {
public let oldGroupModel: TSGroupModelV2

View File

@ -3,7 +3,6 @@
//
import Foundation
import ZKGroup
import SignalClient
@objc

View File

@ -4,7 +4,7 @@
import Foundation
import SignalServiceKit
import ZKGroup
import SignalClient
// Represents a proposed set of changes to a group.
//

View File

@ -5,7 +5,7 @@
import Foundation
import SignalServiceKit
import SignalMetadataKit
import ZKGroup
import SignalClient
public class GroupsV2Protos {

View File

@ -5,23 +5,11 @@
import Foundation
import SignalServiceKit
import SignalMetadataKit
import ZKGroup
import SignalClient
public extension UUID {
func asZKGUuid() throws -> ZKGUuid {
return try withUnsafeBytes(of: self.uuid) { (buffer: UnsafeRawBufferPointer) in
try ZKGUuid(contents: [UInt8](buffer))
}
}
}
// MARK: -
public extension ZKGUuid {
func asUUID() -> UUID {
return serialize().asData.withUnsafeBytes {
UUID(uuid: $0.bindMemory(to: uuid_t.self).first!)
}
var data: Data {
return withUnsafeBytes(of: self.uuid, { Data($0) })
}
}

View File

@ -4,7 +4,7 @@
import Foundation
import SignalServiceKit
import ZKGroup
import SignalClient
public struct GroupsV2Request {
let urlString: String

View File

@ -5,7 +5,7 @@
import Foundation
import SignalServiceKit
import SignalMetadataKit
import ZKGroup
import SignalClient
public class VersionedProfileRequestImpl: NSObject, VersionedProfileRequest {
public let request: TSRequest
@ -57,8 +57,7 @@ public class VersionedProfilesImpl: NSObject, VersionedProfilesSwift {
return (localUuid, profileKey)
}.then(on: .global()) { (localUuid: UUID, profileKey: OWSAES256Key) -> Promise<HTTPResponse> in
let localProfileKey = try self.parseProfileKey(profileKey: profileKey)
let zkgUuid = try localUuid.asZKGUuid()
let commitment = try localProfileKey.getCommitment(uuid: zkgUuid)
let commitment = try localProfileKey.getCommitment(uuid: localUuid)
let commitmentData = commitment.serialize().asData
let hasAvatar = profileAvatarData != nil
@ -141,7 +140,7 @@ public class VersionedProfilesImpl: NSObject, VersionedProfilesSwift {
paddedLengths: [554],
validBase64Lengths: [776])
let profileKeyVersion = try localProfileKey.getProfileKeyVersion(uuid: zkgUuid)
let profileKeyVersion = try localProfileKey.getProfileKeyVersion(uuid: localUuid)
let profileKeyVersionString = try profileKeyVersion.asHexadecimalString()
let request = OWSRequestFactory.versionedProfileSetRequest(withName: nameValue,
bio: bioValue,
@ -194,7 +193,6 @@ public class VersionedProfilesImpl: NSObject, VersionedProfilesSwift {
let uuid: UUID = address.uuid else {
throw OWSAssertionError("Invalid address: \(address)")
}
let zkgUuid = try uuid.asZKGUuid()
var requestContext: ProfileKeyCredentialRequestContext?
var profileKeyVersionArg: String?
@ -208,14 +206,14 @@ public class VersionedProfilesImpl: NSObject, VersionedProfilesSwift {
}
profileKeyForRequest = profileKeyForAddress
let profileKey: ProfileKey = try self.parseProfileKey(profileKey: profileKeyForAddress)
let profileKeyVersion = try profileKey.getProfileKeyVersion(uuid: zkgUuid)
let profileKeyVersion = try profileKey.getProfileKeyVersion(uuid: uuid)
profileKeyVersionArg = try profileKeyVersion.asHexadecimalString()
// We need to request a credential if we don't have one already.
let credential = try self.profileKeyCredentialData(for: address, transaction: transaction)
if credential == nil {
let clientZkProfileOperations = try self.clientZkProfileOperations()
let context = try clientZkProfileOperations.createProfileKeyCredentialRequestContext(uuid: try uuid.asZKGUuid(),
let context = try clientZkProfileOperations.createProfileKeyCredentialRequestContext(uuid: uuid,
profileKey: profileKey)
requestContext = context
let credentialRequest = try context.getRequest()

View File

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>5.27.0</string>
<key>CFBundleVersion</key>
<string>73</string>
<string>75</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
@ -55,7 +55,7 @@
<string>$(PRODUCT_MODULE_NAME).NotificationService</string>
</dict>
<key>OWSBundleVersion4</key>
<string>5.27.0.73</string>
<string>5.27.0.75</string>
<key>UIAppFonts</key>
<array>
<string>Inter-Medium.otf</string>

View File

@ -153,6 +153,7 @@ message AccountRecord {
Payments payments = 16;
uint32 universalExpireTimer = 17;
string e164 = 19;
repeated string preferredReactionEmoji = 20;
bytes subscriberID = 21;
string subscriberCurrencyCode = 22;
bool displayBadgesOnProfile = 23;

View File

@ -186,18 +186,10 @@ static NSString *kSignalPreferNicknamesPreference = @"NSPersonNameDefaultShouldP
nameComponents.givenName = self.contactFirstName;
nameComponents.familyName = self.contactLastName;
} else if (self.contactFullName.length > 0) {
// If we don't have a first name or last name, but we *do* have a full name,
// try our best to create appropriate components to represent it.
NSArray<NSString *> *components = [self.contactFullName componentsSeparatedByString:@" "];
// If there are only two words separated by a space, this is probably a given
// and family name.
if (components.count <= 2) {
nameComponents.givenName = components.firstObject;
nameComponents.familyName = components.lastObject;
} else {
nameComponents.givenName = self.contactFullName;
}
// Originally we had a heuristic to try and guess which was the given and family name. It
// wasn't always correct. We're probably better off just sticking the entire name in the
// given name.
nameComponents.givenName = self.contactFullName;
}
nameComponents.nickname = self.contactNicknameIfAvailable;

View File

@ -7,7 +7,18 @@ import Foundation
@objc(OWSReactionManager)
public class ReactionManager: NSObject {
public static let localUserReacted = Notification.Name("localUserReacted")
public static let emojiSet = ["❤️", "👍", "👎", "😂", "😮", "😢"]
public static let defaultEmojiSet = ["❤️", "👍", "👎", "😂", "😮", "😢"]
private static let emojiSetKVS = SDSKeyValueStore(collection: "EmojiSetKVS")
private static let emojiSetKey = "EmojiSetKey"
public class func emojiSet(transaction: SDSAnyReadTransaction) -> [String] {
return emojiSetKVS.getObject(forKey: emojiSetKey, transaction: transaction) as? [String] ?? defaultEmojiSet
}
public class func setEmojiSet(_ emojis: [String], transaction: SDSAnyWriteTransaction) {
emojiSetKVS.setObject(emojis, key: emojiSetKey, transaction: transaction)
}
@discardableResult
public class func localUserReacted(

View File

@ -490,6 +490,11 @@ struct StorageServiceProtos_AccountRecord {
set {_uniqueStorage()._e164 = newValue}
}
var preferredReactionEmoji: [String] {
get {return _storage._preferredReactionEmoji}
set {_uniqueStorage()._preferredReactionEmoji = newValue}
}
var subscriberID: Data {
get {return _storage._subscriberID}
set {_uniqueStorage()._subscriberID = newValue}
@ -1301,6 +1306,7 @@ extension StorageServiceProtos_AccountRecord: SwiftProtobuf.Message, SwiftProtob
16: .same(proto: "payments"),
17: .same(proto: "universalExpireTimer"),
19: .same(proto: "e164"),
20: .same(proto: "preferredReactionEmoji"),
21: .same(proto: "subscriberID"),
22: .same(proto: "subscriberCurrencyCode"),
23: .same(proto: "displayBadgesOnProfile"),
@ -1326,6 +1332,7 @@ extension StorageServiceProtos_AccountRecord: SwiftProtobuf.Message, SwiftProtob
var _payments: StorageServiceProtos_AccountRecord.Payments?
var _universalExpireTimer: UInt32 = 0
var _e164: String = String()
var _preferredReactionEmoji: [String] = []
var _subscriberID: Data = Data()
var _subscriberCurrencyCode: String = String()
var _displayBadgesOnProfile: Bool = false
@ -1354,6 +1361,7 @@ extension StorageServiceProtos_AccountRecord: SwiftProtobuf.Message, SwiftProtob
_payments = source._payments
_universalExpireTimer = source._universalExpireTimer
_e164 = source._e164
_preferredReactionEmoji = source._preferredReactionEmoji
_subscriberID = source._subscriberID
_subscriberCurrencyCode = source._subscriberCurrencyCode
_displayBadgesOnProfile = source._displayBadgesOnProfile
@ -1394,6 +1402,7 @@ extension StorageServiceProtos_AccountRecord: SwiftProtobuf.Message, SwiftProtob
case 16: try { try decoder.decodeSingularMessageField(value: &_storage._payments) }()
case 17: try { try decoder.decodeSingularUInt32Field(value: &_storage._universalExpireTimer) }()
case 19: try { try decoder.decodeSingularStringField(value: &_storage._e164) }()
case 20: try { try decoder.decodeRepeatedStringField(value: &_storage._preferredReactionEmoji) }()
case 21: try { try decoder.decodeSingularBytesField(value: &_storage._subscriberID) }()
case 22: try { try decoder.decodeSingularStringField(value: &_storage._subscriberCurrencyCode) }()
case 23: try { try decoder.decodeSingularBoolField(value: &_storage._displayBadgesOnProfile) }()
@ -1464,6 +1473,9 @@ extension StorageServiceProtos_AccountRecord: SwiftProtobuf.Message, SwiftProtob
if !_storage._e164.isEmpty {
try visitor.visitSingularStringField(value: _storage._e164, fieldNumber: 19)
}
if !_storage._preferredReactionEmoji.isEmpty {
try visitor.visitRepeatedStringField(value: _storage._preferredReactionEmoji, fieldNumber: 20)
}
if !_storage._subscriberID.isEmpty {
try visitor.visitSingularBytesField(value: _storage._subscriberID, fieldNumber: 21)
}
@ -1503,6 +1515,7 @@ extension StorageServiceProtos_AccountRecord: SwiftProtobuf.Message, SwiftProtob
if _storage._payments != rhs_storage._payments {return false}
if _storage._universalExpireTimer != rhs_storage._universalExpireTimer {return false}
if _storage._e164 != rhs_storage._e164 {return false}
if _storage._preferredReactionEmoji != rhs_storage._preferredReactionEmoji {return false}
if _storage._subscriberID != rhs_storage._subscriberID {return false}
if _storage._subscriberCurrencyCode != rhs_storage._subscriberCurrencyCode {return false}
if _storage._displayBadgesOnProfile != rhs_storage._displayBadgesOnProfile {return false}

View File

@ -2559,6 +2559,7 @@ public struct StorageServiceProtoAccountRecord: Codable, CustomDebugStringConver
if let _value = e164 {
builder.setE164(_value)
}
builder.setPreferredReactionEmoji(preferredReactionEmoji)
if let _value = subscriberID {
builder.setSubscriberID(_value)
}
@ -2695,6 +2696,14 @@ public struct StorageServiceProtoAccountRecord: Codable, CustomDebugStringConver
proto.e164 = valueParam
}
public mutating func addPreferredReactionEmoji(_ valueParam: String) {
proto.preferredReactionEmoji.append(valueParam)
}
public mutating func setPreferredReactionEmoji(_ wrappedItems: [String]) {
proto.preferredReactionEmoji = wrappedItems
}
@available(swift, obsoleted: 1.0)
public mutating func setSubscriberID(_ valueParam: Data?) {
guard let valueParam = valueParam else { return }
@ -2880,6 +2889,10 @@ public struct StorageServiceProtoAccountRecord: Codable, CustomDebugStringConver
return !proto.e164.isEmpty
}
public var preferredReactionEmoji: [String] {
return proto.preferredReactionEmoji
}
public var subscriberID: Data? {
guard hasSubscriberID else {
return nil

View File

@ -212,7 +212,7 @@ private class TSConstantsProduction: TSConstantsProtocol {
// We need to discard all profile key credentials if these values ever change.
// See: GroupsV2Impl.verifyServerPublicParams(...)
public let serverPublicParamsBase64 = "AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X36nOoGPs54XsEGzPdEV+itQNGUFEjY6X9Uv+Acuks7NpyGvCoKxGwgKgE5XyJ+nNKlyHHOLb6N1NuHyBrZrgtY"
public let serverPublicParamsBase64 = "AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X36nOoGPs54XsEGzPdEV+itQNGUFEjY6X9Uv+Acuks7NpyGvCoKxGwgKgE5XyJ+nNKlyHHOLb6N1NuHyBrZrgtY/JYJHRooo5CEqYKBqdFnmbTVGEkCvJKxLnjwKWf+fEPoWeQFj5ObDjcKMZf2Jm2Ae69x+ikU5gBXsRmoF94GXQ=="
}
// MARK: -
@ -272,5 +272,5 @@ private class TSConstantsStaging: TSConstantsProtocol {
// We need to discard all profile key credentials if these values ever change.
// See: GroupsV2Impl.verifyServerPublicParams(...)
public let serverPublicParamsBase64 = "ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdlukrpzzsCIvEwjwQlJYVPOQPj4V0F4UXXBdHSLK05uoPBCQG8G9rYIGedYsClJXnbrgGYG3eMTG5hnx4X4ntARB"
public let serverPublicParamsBase64 = "ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdlukrpzzsCIvEwjwQlJYVPOQPj4V0F4UXXBdHSLK05uoPBCQG8G9rYIGedYsClJXnbrgGYG3eMTG5hnx4X4ntARBgELuMWWUEEfSK0mjXg+/2lPmWcTZWR9nkqgQQP0tbzuiPm74H2wMO4u1Wafe+UwyIlIT9L7KLS19Aw8r4sPrXQ=="
}

View File

@ -1,5 +1,5 @@
//
// Copyright (c) 2021 Open Whisper Systems. All rights reserved.
// Copyright (c) 2022 Open Whisper Systems. All rights reserved.
//
import Foundation

View File

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>5.27.0</string>
<key>CFBundleVersion</key>
<string>73</string>
<string>75</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>NSAppTransportSecurity</key>
@ -77,7 +77,7 @@
<string>com.apple.share-services</string>
</dict>
<key>OWSBundleVersion4</key>
<string>5.27.0.73</string>
<string>5.27.0.75</string>
<key>UIAppFonts</key>
<array>
<string>fontawesome-webfont.ttf</string>

View File

@ -135,6 +135,7 @@ public enum ThemeIcon: UInt {
case emojiSymbol
case emojiTravel
case emojiRecent
case emojiSettings
case sealedSenderIndicator
case accessoryCheckmark
@ -422,6 +423,8 @@ public extension Theme {
return "emoji-travel-\(isDarkThemeEnabled ? "solid" : "outline")-20"
case .emojiRecent:
return "recent-\(isDarkThemeEnabled ? "solid" : "outline")-20"
case .emojiSettings:
return "emoji-settings-\(isDarkThemeEnabled ? "solid" : "outline")-24"
case .sealedSenderIndicator:
return isDarkThemeEnabled ? "unidentified-delivery-solid-20" : "unidentified-delivery-outline-20"

2
ThirdParty/RingRTC vendored

@ -1 +1 @@
Subproject commit e5b6c25bf0cffce4ad88af69a54f5d1c39068aa0
Subproject commit e686f21aed73366fd5cf0a4d82b06275a86e8722

View File

@ -8,7 +8,7 @@
Pod::Spec.new do |s|
s.name = "SignalRingRTC"
s.version = "2.16.0"
s.version = "2.16.1"
s.summary = "A Swift & Objective-C library used by the Signal iOS app for WebRTC interactions."
s.description = <<-DESC

2
ThirdParty/WebRTC vendored

@ -1 +1 @@
Subproject commit 0c2bab0285b8e10879ee59daa3c048e503a89704
Subproject commit 132420bab6f207ab1951acf630ff1432f34bbb55