Merge tag '2.38.0.11'

This commit is contained in:
Michael Kirk 2019-04-01 14:04:43 -06:00
commit 07e88009e4
41 changed files with 304 additions and 166 deletions

View File

@ -47,7 +47,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>2.38.0.9</string>
<string>2.38.0.11</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LOGS_EMAIL</key>

View File

@ -82,11 +82,12 @@ extension ConversationSearchController: UISearchResultsUpdating {
public func updateSearchResults(for searchController: UISearchController) {
Logger.verbose("searchBar.text: \( searchController.searchBar.text ?? "<blank>")")
guard let searchText = searchController.searchBar.text?.stripped else {
guard let rawSearchText = searchController.searchBar.text?.stripped else {
self.resultsBar.updateResults(resultSet: nil)
self.delegate?.conversationSearchController(self, didUpdateSearchResults: nil)
return
}
let searchText = FullTextSearchFinder.normalize(text: rawSearchText)
BenchManager.startEvent(title: "Conversation Search", eventId: searchText)
guard searchText.count >= ConversationSearchController.kMinimumSearchTextLength else {

View File

@ -137,8 +137,7 @@ public class NotificationPresenter: NSObject, NotificationsProtocol {
@objc
public override init() {
let userNotificationsFeatureEnabled = true
if userNotificationsFeatureEnabled, #available(iOS 10, *) {
if #available(iOS 10, *) {
self.adaptee = UserNotificationPresenterAdaptee()
} else {
self.adaptee = LegacyNotificationPresenterAdaptee()
@ -648,7 +647,7 @@ class NotificationActionHandler {
// can be visible to the user immediately upon opening the app, rather than having to watch
// it animate in from the homescreen.
let shouldAnimate = UIApplication.shared.applicationState == .active
signalApp.presentConversation(forThreadId: threadId, animated: shouldAnimate)
signalApp.presentConversationAndScrollToFirstUnreadMessage(forThreadId: threadId, animated: shouldAnimate)
return Promise.value(())
}

View File

@ -708,10 +708,12 @@ NS_ASSUME_NONNULL_BEGIN
initWithString:text
attributes:@{ NSFontAttributeName : font, NSForegroundColorAttributeName : textColor }];
if (searchText.length >= ConversationSearchController.kMinimumSearchTextLength) {
NSString *searchableText = [FullTextSearchFinder normalizeWithText:searchText];
NSError *error;
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:searchText
options:NSRegularExpressionCaseInsensitive
error:&error];
NSRegularExpression *regex =
[[NSRegularExpression alloc] initWithPattern:[NSRegularExpression escapedPatternForString:searchableText]
options:NSRegularExpressionCaseInsensitive
error:&error];
OWSAssertDebug(error == nil);
for (NSTextCheckingResult *match in
[regex matchesInString:text options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, text.length)]) {

View File

@ -1,5 +1,5 @@
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
//
#import <SignalMessaging/OWSViewController.h>
@ -25,6 +25,8 @@ typedef NS_ENUM(NSUInteger, ConversationViewAction) {
- (void)popKeyBoard;
- (void)scrollToFirstUnreadMessage:(BOOL)isAnimated;
#pragma mark 3D Touch Methods
- (void)peekSetup;

View File

@ -751,7 +751,7 @@ typedef enum : NSUInteger {
// We want to set the initial scroll state the first time we enter the view.
if (!self.viewHasEverAppeared) {
[self scrollToDefaultPosition];
[self scrollToDefaultPosition:NO];
} else if (self.menuActionsViewController != nil) {
[self scrollToMenuActionInteraction:NO];
}
@ -806,7 +806,7 @@ typedef enum : NSUInteger {
return [NSIndexPath indexPathForRow:row inSection:0];
}
- (void)scrollToDefaultPosition
- (void)scrollToDefaultPosition:(BOOL)isAnimated
{
if (self.isUserScrolling) {
return;
@ -823,14 +823,14 @@ typedef enum : NSUInteger {
if (indexPath) {
if (indexPath.section == 0 && indexPath.row == 0) {
[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView setContentOffset:CGPointZero animated:isAnimated];
} else {
[self.collectionView scrollToItemAtIndexPath:indexPath
atScrollPosition:UICollectionViewScrollPositionTop
animated:NO];
animated:isAnimated];
}
} else {
[self scrollToBottomAnimated:NO];
[self scrollToBottomAnimated:isAnimated];
}
}
@ -3875,11 +3875,11 @@ typedef enum : NSUInteger {
// Adjust content offset to prevent the presented keyboard from obscuring content.
if (!self.viewHasEverAppeared) {
[self scrollToDefaultPosition];
[self scrollToDefaultPosition:NO];
} else if (wasScrolledToBottom) {
// If we were scrolled to the bottom, don't do any fancy math. Just stay at the bottom.
[self scrollToBottomAnimated:NO];
} else {
} else if (self.isViewCompletelyAppeared) {
// If we were scrolled away from the bottom, shift the content in lockstep with the
// keyboard, up to the limits of the content bounds.
CGFloat insetChange = newInsets.bottom - oldInsets.bottom;
@ -4011,6 +4011,11 @@ typedef enum : NSUInteger {
[self didScrollToBottom];
}
- (void)scrollToFirstUnreadMessage:(BOOL)isAnimated
{
[self scrollToDefaultPosition:isAnimated];
}
#pragma mark - UIScrollViewDelegate
- (void)updateLastKnownDistanceFromBottom
@ -4190,7 +4195,16 @@ typedef enum : NSUInteger {
// restore first responder to VC
[self becomeFirstResponder];
[self reloadInputViews];
if (@available(iOS 10, *)) {
[self reloadInputViews];
} else {
// We want to change the inputAccessoryView from SearchResults -> MessageInput
// reloading too soon on an old iOS9 device caused the inputAccessoryView to go from
// SearchResults -> MessageInput -> SearchResults
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self reloadInputViews];
});
}
}
#pragma mark ConversationSearchControllerDelegate

View File

@ -371,21 +371,22 @@ const CGFloat kIconViewLength = 24;
[weakSelf showMediaGallery];
}]];
// TODO icon
[mainSection addItem:[OWSTableItem
itemWithCustomCellBlock:^{
NSString *title = NSLocalizedString(@"CONVERSATION_SETTINGS_SEARCH",
@"Table cell label in conversation settings which returns the user to the "
@"conversation with 'search mode' activated");
return [weakSelf
disclosureCellWithName:title
iconName:@"conversation_settings_search"
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(
OWSConversationSettingsViewController, @"search")];
}
actionBlock:^{
[weakSelf tappedConversationSearch];
}]];
if (SSKFeatureFlags.conversationSearch) {
[mainSection addItem:[OWSTableItem
itemWithCustomCellBlock:^{
NSString *title = NSLocalizedString(@"CONVERSATION_SETTINGS_SEARCH",
@"Table cell label in conversation settings which returns the user to the "
@"conversation with 'search mode' activated");
return [weakSelf
disclosureCellWithName:title
iconName:@"conversation_settings_search"
accessibilityIdentifier:ACCESSIBILITY_IDENTIFIER_WITH_NAME(
OWSConversationSettingsViewController, @"search")];
}
actionBlock:^{
[weakSelf tappedConversationSearch];
}]];
}
if (!isNoteToSelf && !self.isGroupThread && self.thread.hasSafetyNumbers) {
[mainSection

View File

@ -46,6 +46,8 @@ NS_ASSUME_NONNULL_BEGIN
focusMessageId:(nullable NSString *)focusMessageId
animated:(BOOL)isAnimated;
- (void)presentConversationAndScrollToFirstUnreadMessageForThreadId:(NSString *)threadId animated:(BOOL)isAnimated;
#pragma mark - Methods
+ (void)resetAppData;

View File

@ -109,7 +109,7 @@ NS_ASSUME_NONNULL_BEGIN
DispatchMainThreadSafe(^{
UIViewController *frontmostVC = [[UIApplication sharedApplication] frontmostViewController];
if ([frontmostVC isKindOfClass:[ConversationViewController class]]) {
ConversationViewController *conversationVC = (ConversationViewController *)frontmostVC;
if ([conversationVC.thread.uniqueId isEqualToString:thread.uniqueId]) {
@ -117,11 +117,42 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
}
[self.homeViewController presentThread:thread action:action focusMessageId:focusMessageId animated:isAnimated];
});
}
- (void)presentConversationAndScrollToFirstUnreadMessageForThreadId:(NSString *)threadId animated:(BOOL)isAnimated
{
OWSAssertIsOnMainThread();
OWSAssertDebug(threadId.length > 0);
OWSLogInfo(@"");
TSThread *thread = [TSThread fetchObjectWithUniqueID:threadId];
if (thread == nil) {
OWSFailDebug(@"unable to find thread with id: %@", threadId);
return;
}
DispatchMainThreadSafe(^{
UIViewController *frontmostVC = [[UIApplication sharedApplication] frontmostViewController];
if ([frontmostVC isKindOfClass:[ConversationViewController class]]) {
ConversationViewController *conversationVC = (ConversationViewController *)frontmostVC;
if ([conversationVC.thread.uniqueId isEqualToString:thread.uniqueId]) {
[conversationVC scrollToFirstUnreadMessage:isAnimated];
return;
}
}
[self.homeViewController presentThread:thread
action:ConversationViewActionNone
focusMessageId:nil
animated:isAnimated];
});
}
- (void)didChangeCallLoggingPreference:(NSNotification *)notitication
{
[AppEnvironment.shared.callService createCallUIAdapter];

View File

@ -38,8 +38,31 @@
self.axis = .horizontal
self.spacing = kDotMaxHSpacing
self.alignment = .center
NotificationCenter.default.addObserver(self,
selector: #selector(didBecomeActive),
name: NSNotification.Name.OWSApplicationDidBecomeActive,
object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
// MARK: - Notifications
@objc func didBecomeActive() {
AssertIsOnMainThread()
// CoreAnimation animations are stopped in the background, so ensure
// animations are restored if necessary.
if isAnimating {
startAnimation()
}
}
// MARK: -
@objc
public override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: TypingIndicatorView.kMaxRadiusPt * 3 + kDotMaxHSpacing * 2, height: TypingIndicatorView.kMaxRadiusPt)
@ -49,8 +72,12 @@
return [dot1, dot2, dot3]
}
private var isAnimating = false
@objc
public func startAnimation() {
isAnimating = true
for dot in dots() {
dot.startAnimation()
}
@ -58,6 +85,8 @@
@objc
public func stopAnimation() {
isAnimating = false
for dot in dots() {
dot.stopAnimation()
}

View File

@ -2250,7 +2250,7 @@
"SETTINGS_UNIDENTIFIED_DELIVERY_LEARN_MORE" = "Saznaj više";
/* table section label */
"SETTINGS_UNIDENTIFIED_DELIVERY_SECTION_TITLE" = "Sealed Sender";
"SETTINGS_UNIDENTIFIED_DELIVERY_SECTION_TITLE" = "Zapečaćeni pošiljalac";
/* switch label */
"SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS" = "Display Indicators";
@ -2262,7 +2262,7 @@
"SETTINGS_UNIDENTIFIED_DELIVERY_UNRESTRICTED_ACCESS" = "Allow from Anyone";
/* table section footer */
"SETTINGS_UNIDENTIFIED_DELIVERY_UNRESTRICTED_ACCESS_FOOTER" = "Enable sealed sender for incoming messages from non-contacts and people with whom you have not shared your profile.";
"SETTINGS_UNIDENTIFIED_DELIVERY_UNRESTRICTED_ACCESS_FOOTER" = "Aktiviraj opciju zapečaćenog pošiljaoca za poruke koje dolaze od osoba koje nisu među Vašim kontaktima i s kojima niste razmijenili profile.";
/* No comment provided by engineer. */
"SETTINGS_VERSION" = "Verzija";

View File

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Afegeix una descripció...";
/* Title for 'caption' mode of the attachment approval view. */
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "Caption";
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "Títol";
/* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Tipus de fitxer: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Rebutja trucades";
/* tooltip label when remote party has enabled their video */
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Tap here to turn on your video";
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Toqueu aquí per activar el vídeo";
/* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Finalitza la trucada";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Esborrar conversa?";
/* keyboard toolbar label when no messages match the search string */
"CONVERSATION_SEARCH_NO_RESULTS" = "No matches";
"CONVERSATION_SEARCH_NO_RESULTS" = "Sense coincidències";
/* keyboard toolbar label when exactly 1 message matches the search string */
"CONVERSATION_SEARCH_ONE_RESULT" = "1 match";
"CONVERSATION_SEARCH_ONE_RESULT" = "1 coincidència";
/* keyboard toolbar label when more than 1 message matches the search string. Embeds {{number/position of the 'currently viewed' result}} and the {{total number of results}} */
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d of %d matches";
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d de %d coincidències";
/* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "Configuració del xat";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Crea un contacte nou";
/* Table cell label in conversation settings which returns the user to the conversation with 'search mode' activated */
"CONVERSATION_SETTINGS_SEARCH" = "Search Conversation";
"CONVERSATION_SETTINGS_SEARCH" = "Cerca la conversa";
/* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Toca per canviar";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Fax de la feina";
/* alert title, generic error preventing user from capturing a photo */
"PHOTO_CAPTURE_GENERIC_ERROR" = "Unable to capture image.";
"PHOTO_CAPTURE_GENERIC_ERROR" = "No s'ha pogut capturar la imatge.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Unable to capture image.";
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "No s'ha pogut capturar la imatge.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Failed to configure camera.";
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Ha fallat configurar la càmera.";
/* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Àlbum sense nom";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Telefonades de Vídeo Segures!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "El Signal necessitarà aviat l'iOS 10 o posterior. Actualitzeu-lo a la Configuració del sistema >> General >> Actualitzacions.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Actualitzeu l'iOS";

View File

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Hallo, sichere Videoanrufe!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal wird bald iOS 10 oder neuer erfordern. Bitte aktualisieren über die iOS-Einstellungen: Einstellungen >> Allgemein >> Softwareaktualisierung.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "iOS aktualisieren";

View File

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "¡Saluda a las vídeollamadas seguras!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal próximamente solo funcionará en iOS 10 o versiones posteriores. Actualiza en Ajustes >> General >> Actualización de software.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Actualizar iOS";

View File

@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Refuser lappel entrant";
/* tooltip label when remote party has enabled their video */
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Tap here to turn on your video";
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Touchez ici pour activer votre caméra";
/* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Raccrocher";
@ -567,7 +567,7 @@
"CONVERSATION_SEARCH_NO_RESULTS" = "Aucune correspondance";
/* keyboard toolbar label when exactly 1 message matches the search string */
"CONVERSATION_SEARCH_ONE_RESULT" = "1 match";
"CONVERSATION_SEARCH_ONE_RESULT" = "1 correspondance";
/* keyboard toolbar label when more than 1 message matches the search string. Embeds {{number/position of the 'currently viewed' result}} and the {{total number of results}} */
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d sur %dcorrespondances";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Télécopieur travail";
/* alert title, generic error preventing user from capturing a photo */
"PHOTO_CAPTURE_GENERIC_ERROR" = "Unable to capture image.";
"PHOTO_CAPTURE_GENERIC_ERROR" = "Impossible de capturer limage.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Unable to capture image.";
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Impossible de capturer limage.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Failed to configure camera.";
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Échec de configuration de lappareil photo";
/* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Album sans nom";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Bienvenue aux appels vidéo sécurisés!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Bientôt, Signal exigera iOS 10 ou ultérieure. Veuillez effectuer une mise à niveau dans lappli Réglage >> Général >> Mise à jour logicielle";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Mettez iOS à niveau";

View File

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "הוסף כיתוב...";
/* Title for 'caption' mode of the attachment approval view. */
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "Caption";
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "כיתוב";
/* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "סוג קובץ: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "דחה שיחה נכנסת";
/* tooltip label when remote party has enabled their video */
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Tap here to turn on your video";
"CALL_VIEW_ENABLE_VIDEO_HINT" = "הקש כאן כדי להפעיל את הוידיאו שלך";
/* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "סיים שיחה";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "למחוק שיחה?";
/* keyboard toolbar label when no messages match the search string */
"CONVERSATION_SEARCH_NO_RESULTS" = "No matches";
"CONVERSATION_SEARCH_NO_RESULTS" = "אין התאמות";
/* keyboard toolbar label when exactly 1 message matches the search string */
"CONVERSATION_SEARCH_ONE_RESULT" = "1 match";
"CONVERSATION_SEARCH_ONE_RESULT" = "התאמה 1";
/* keyboard toolbar label when more than 1 message matches the search string. Embeds {{number/position of the 'currently viewed' result}} and the {{total number of results}} */
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d of %d matches";
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d מתוך %d התאמות";
/* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "הגדרות שיחה";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "צור איש קשר חדש";
/* Table cell label in conversation settings which returns the user to the conversation with 'search mode' activated */
"CONVERSATION_SETTINGS_SEARCH" = "Search Conversation";
"CONVERSATION_SETTINGS_SEARCH" = "חפש שיחה";
/* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "הקש כדי לשנות";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "פקס עבודה";
/* alert title, generic error preventing user from capturing a photo */
"PHOTO_CAPTURE_GENERIC_ERROR" = "Unable to capture image.";
"PHOTO_CAPTURE_GENERIC_ERROR" = "לא היה ניתן ללכוד תמונה.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Unable to capture image.";
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "לא היה ניתן ללכוד תמונה.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Failed to configure camera.";
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "נכשל בתיצור מצלמה.";
/* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "אלבום ללא שם";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "שלום שיחות וידיאו מאובטחות!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal ידרוש בקרוב iOS 10 ומעלה. אנא שדרג דרך יישום הגדרות >> כללי >> עדכוני תוכנה.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "שדרג את iOS";

View File

@ -1524,7 +1524,7 @@
"ONBOARDING_PERMISSIONS_TITLE" = "Signal can let you know when you get a message (and who it is from)";
/* Title of the 'onboarding phone number' view. */
"ONBOARDING_PHONE_NUMBER_TITLE" = "Enter your phone number to get started";
"ONBOARDING_PHONE_NUMBER_TITLE" = "masukkan nomor telepon untuk memulai";
/* Label indicating that the phone number is invalid in the 'onboarding phone number' view. */
"ONBOARDING_PHONE_NUMBER_VALIDATION_WARNING" = "Nomor salah";
@ -1536,7 +1536,7 @@
"ONBOARDING_PROFILE_NAME_PLACEHOLDER" = "Your Name";
/* Title of the 'onboarding profile' view. */
"ONBOARDING_PROFILE_TITLE" = "Set up your profile";
"ONBOARDING_PROFILE_TITLE" = "Siapkan profil Anda";
/* Link to the 'terms and privacy policy' in the 'onboarding splash' view. */
"ONBOARDING_SPLASH_TERM_AND_PRIVACY_POLICY" = "Syarat & Kebijakan Privasi";

View File

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Videochiamate sicure!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal presto richiederà iOS 10 o successivo. Ti preghiamo di aggiornare andando nelle Impostazioni >> Generali >> Aggiornamento software.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Aggiornare iOS";

View File

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Sveiki, saugūs vaizdo skambučiai!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal greitu metu reikalaus iOS 10 ar naujesnės. Atsinaujinkite Nustatymų (angl. Settings) programėlėje >> Bendra (angl. General) >> Programinės įrangos atnaujinimas (angl. Software Update).";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Atnaujinkite iOS";

View File

@ -2253,7 +2253,7 @@
"SETTINGS_UNIDENTIFIED_DELIVERY_SECTION_TITLE" = "Verzegelde afzender";
/* switch label */
"SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS" = "Indicator tonen";
"SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS" = "Toon verzegelde afzender indicator";
/* table section footer */
"SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS_FOOTER" = "Laat een statuspictogram zien wanneer je drukt op Meer informatie bij berichten die zijn afgeleverd met een verzegelde afzender.";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Hallo, beveiligde videogesprekken!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Binnenkort vereist Signal dat je iOS 10 of een latere versie gebruikt. Werk je besturingssysteem bij in Instellingen >> Algemeen >> Software-update.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Werk iOS bij";

View File

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Dodaj podpis...";
/* Title for 'caption' mode of the attachment approval view. */
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "Caption";
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "Podpis";
/* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Typ pliku: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Odrzuć połączenie przychodzące";
/* tooltip label when remote party has enabled their video */
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Tap here to turn on your video";
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Dotknij tutaj, aby włączyć wideo";
/* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Zakończ rozmowę ";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Usunąć konwersację?";
/* keyboard toolbar label when no messages match the search string */
"CONVERSATION_SEARCH_NO_RESULTS" = "No matches";
"CONVERSATION_SEARCH_NO_RESULTS" = "Brak wyników";
/* keyboard toolbar label when exactly 1 message matches the search string */
"CONVERSATION_SEARCH_ONE_RESULT" = "1 match";
"CONVERSATION_SEARCH_ONE_RESULT" = "1 wynik";
/* keyboard toolbar label when more than 1 message matches the search string. Embeds {{number/position of the 'currently viewed' result}} and the {{total number of results}} */
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d of %d matches";
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d z %d wyników";
/* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "Ustawienia konwersacji";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Utwórz nowy kontakt";
/* Table cell label in conversation settings which returns the user to the conversation with 'search mode' activated */
"CONVERSATION_SETTINGS_SEARCH" = "Search Conversation";
"CONVERSATION_SETTINGS_SEARCH" = "Szukaj w konwersacji";
/* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Dotknij, by zmienić";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Fax w pracy";
/* alert title, generic error preventing user from capturing a photo */
"PHOTO_CAPTURE_GENERIC_ERROR" = "Unable to capture image.";
"PHOTO_CAPTURE_GENERIC_ERROR" = "Nie można wykonać zdjęcia.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Unable to capture image.";
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Nie można wykonać zdjęcia.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Failed to configure camera.";
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Nie można skonfigurować kamery.";
/* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Album bez nazwy";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Szyfrowane wideo rozmowy witają!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal wkrótce będzie wymagał systemu iOS 10 lub nowszego. Zaktualizuj system przechodząc do Ustawienia >> Ogólne >> Aktualizacja oprogramowania.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Uaktualnij iOS";

View File

@ -684,10 +684,10 @@
"DATABASE_VIEW_OVERLAY_TITLE" = "A optimizar a base de dados";
/* Format string for a relative time, expressed as a certain number of hours in the past. Embeds {{The number of hours}}. */
"DATE_HOURS_AGO_FORMAT" = " Há %@h atrás";
"DATE_HOURS_AGO_FORMAT" = " Há %@h";
/* Format string for a relative time, expressed as a certain number of minutes in the past. Embeds {{The number of minutes}}. */
"DATE_MINUTES_AGO_FORMAT" = "Há %@min atrás";
"DATE_MINUTES_AGO_FORMAT" = "Há %@min";
/* The present; the current time. */
"DATE_NOW" = "Agora";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Olá videochamadas seguras!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "O Signal brevemente irá requerer o iOS 10 ou superior. Por favor atualize em Definições >> Geral >> Atualização de Software.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Atualizar iOS";

View File

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Adaugă un titlu...";
/* Title for 'caption' mode of the attachment approval view. */
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "Caption";
"ATTACHMENT_APPROVAL_CAPTION_TITLE" = "Titlu";
/* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Tip fișier: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Respingeți apelul de intrare";
/* tooltip label when remote party has enabled their video */
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Tap here to turn on your video";
"CALL_VIEW_ENABLE_VIDEO_HINT" = "Apăsați aici pentru a porni video-ul tău";
/* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Închideți apelul";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Șterg conversația?";
/* keyboard toolbar label when no messages match the search string */
"CONVERSATION_SEARCH_NO_RESULTS" = "No matches";
"CONVERSATION_SEARCH_NO_RESULTS" = "Nici o potrivire";
/* keyboard toolbar label when exactly 1 message matches the search string */
"CONVERSATION_SEARCH_ONE_RESULT" = "1 match";
"CONVERSATION_SEARCH_ONE_RESULT" = "1 potrivire";
/* keyboard toolbar label when more than 1 message matches the search string. Embeds {{number/position of the 'currently viewed' result}} and the {{total number of results}} */
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d of %d matches";
"CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d din %d potriviri";
/* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "Setări conversație";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Creează contact nou";
/* Table cell label in conversation settings which returns the user to the conversation with 'search mode' activated */
"CONVERSATION_SETTINGS_SEARCH" = "Search Conversation";
"CONVERSATION_SETTINGS_SEARCH" = "Caută conversație";
/* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Apasă pentru a modifica";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Fax serviciu";
/* alert title, generic error preventing user from capturing a photo */
"PHOTO_CAPTURE_GENERIC_ERROR" = "Unable to capture image.";
"PHOTO_CAPTURE_GENERIC_ERROR" = "Imaginea nu a putut fi capturată.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Unable to capture image.";
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Imaginea nu a putut fi capturată.";
/* alert title */
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Failed to configure camera.";
"PHOTO_CAPTURE_UNABLE_TO_INITIALIZE_CAMERA" = "Eroare la configurarea camerei.";
/* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Album fără nume";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Bun venit la apeluri video securizate!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal va necesita în curând iOS 10 sau o versiune mai nouă. Vă rugăm să actualizați din aplicația Setări >> General >> Actualizări Software.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Actualizează-ți iOS-ul";

View File

@ -459,7 +459,7 @@
"CONFIRM_LINK_NEW_DEVICE_ACTION" = "Привязать устройство";
/* Action sheet body presented when a user's SN has recently changed. Embeds {{contact's name or phone number}} */
"CONFIRM_SENDING_TO_CHANGED_IDENTITY_BODY_FORMAT" = "%@ мог переустановить Signal или сменить устройство. Сверьте ваши коды безопасности для того, чтобы убедиться в конфиденциальности общения.";
"CONFIRM_SENDING_TO_CHANGED_IDENTITY_BODY_FORMAT" = "%@ мог(-ла) переустановить Signal или сменить устройство. Сверьте ваши коды безопасности для того, чтобы убедиться в конфиденциальности общения.";
/* Action sheet title presented when a user's SN has recently changed. Embeds {{contact's name or phone number}} */
"CONFIRM_SENDING_TO_CHANGED_IDENTITY_TITLE_FORMAT" = "Код безопасности с %@ изменился";
@ -940,7 +940,7 @@
"ERROR_MESSAGE_UNKNOWN_ERROR" = "Неизвестная ошибка.";
/* No comment provided by engineer. */
"ERROR_MESSAGE_WRONG_TRUSTED_IDENTITY_KEY" = "Код безопасности изменился";
"ERROR_MESSAGE_WRONG_TRUSTED_IDENTITY_KEY" = "Код безопасности изменился.";
/* Format string for 'unregistered user' error. Embeds {{the unregistered user's name or signal id}}. */
"ERROR_UNREGISTERED_USER_FORMAT" = "Незарегистрированный пользователь: %@";
@ -1674,7 +1674,7 @@
"PRIVACY_UNVERIFY_BUTTON" = "Сбросить проверку";
/* Alert body when verifying with {{contact name}} */
"PRIVACY_VERIFICATION_FAILED_I_HAVE_WRONG_KEY_FOR_THEM" = "Это не код безопасности для %@. Убедитесь, что подтверждаете соединение с верным пользователем.";
"PRIVACY_VERIFICATION_FAILED_I_HAVE_WRONG_KEY_FOR_THEM" = "Это не код безопасности для %@. Убедитесь, что вы подтверждаете верного пользователя.";
/* Alert body */
"PRIVACY_VERIFICATION_FAILED_MISMATCHED_SAFETY_NUMBERS_IN_CLIPBOARD" = "Содержимое буфера обмена не является кодом безопасности для данного собеседника.";
@ -1908,10 +1908,10 @@
"SAFETY_NUMBER_CHANGED_CONFIRM_SEND_ACTION" = "Отправить в любом случае";
/* Snippet to share {{safety number}} with a friend. sent e.g. via SMS */
"SAFETY_NUMBER_SHARE_FORMAT" = "Наш код безопасности:\n%@";
"SAFETY_NUMBER_SHARE_FORMAT" = "Наш код безопасности Signal:\n%@";
/* Action sheet heading */
"SAFETY_NUMBERS_ACTIONSHEET_TITLE" = "Код безопасности с пользователем %@ изменился. Возможно, вы хотите его подтвердить.";
"SAFETY_NUMBERS_ACTIONSHEET_TITLE" = "Код безопасности с %@ изменился. Возможно, вы хотите его подтвердить.";
/* label presented once scanning (camera) view is visible. */
"SCAN_CODE_INSTRUCTIONS" = "Отсканируйте QR-код на устройстве пользователя.";
@ -2325,7 +2325,7 @@
"SUCCESSFUL_VERIFICATION_TITLE" = "Коды безопасности совпадают!";
/* Label for button to verify a user's safety number. */
"SYSTEM_MESSAGE_ACTION_VERIFY_SAFETY_NUMBER" = "Верифицировать код безопасности";
"SYSTEM_MESSAGE_ACTION_VERIFY_SAFETY_NUMBER" = "Подтвердить код безопасности";
/* {{number of days}} embedded in strings, e.g. 'Alice updated disappearing messages expiration to {{5 days}}'. See other *_TIME_AMOUNT strings */
"TIME_AMOUNT_DAYS" = "%@ дней";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Добро пожаловать в видеозвонки!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "В скором времени Signal будет работать только на iOS 10 и выше. Пожалуйста, обновите iOS, перейдя в приложение Настройки >> Основные >> Обновление ПО.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Обновите IOS";
@ -2505,10 +2505,10 @@
"VERIFICATION_STATE_CHANGE_GENERIC" = "Состояние проверки изменено.";
/* Label for button or row which allows users to verify the safety number of another user. */
"VERIFY_PRIVACY" = "Посмотреть номер безопасности";
"VERIFY_PRIVACY" = "Просмотреть код безопасности";
/* Label for button or row which allows users to verify the safety numbers of multiple users. */
"VERIFY_PRIVACY_MULTIPLE" = "Просмотр кодов безопасности";
"VERIFY_PRIVACY_MULTIPLE" = "Проверить коды безопасности";
/* Indicates how to cancel a voice message. */
"VOICE_MESSAGE_CANCEL_INSTRUCTIONS" = "Проведите для отмены";

View File

@ -90,7 +90,7 @@
"ATTACHMENT" = "Bashkëngjitje";
/* One-line label indicating the user can add no more text to the attachment caption. */
"ATTACHMENT_APPROVAL_CAPTION_LENGTH_LIMIT_REACHED" = "U mbërrrit në kufi përshkrimes.";
"ATTACHMENT_APPROVAL_CAPTION_LENGTH_LIMIT_REACHED" = "U mbërrrit në kufi përshkrimesh.";
/* placeholder text for an empty captioning field */
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Shtoni një përshkrim…";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Tungjatjeta Thirrjeve Video të Sigurta!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal-i së shpejti do të dojë iOS 10 ose të mëvonshëm. Ju lutemi, përmirësojeni që nga aplikacioni Rregullime >> Të përgjithshme >> Përditësim Software-i.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Përmirësoni iOS-in";

View File

@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Yeni Kişi Oluştur";
/* Table cell label in conversation settings which returns the user to the conversation with 'search mode' activated */
"CONVERSATION_SETTINGS_SEARCH" = "Sohbeti Araştır";
"CONVERSATION_SETTINGS_SEARCH" = "Sohbette Ara";
/* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Değiştirmek için Dokunun";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Merhaba Güvenli Görüntülü Aramalar!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal yakında iOS 10 ve sonrasına gereksinim duyacaktır. Lütfen Ayarlar >> Genel >> Yazılım Güncelleme bölümünden yükseltin.";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "iOS'u Güncelle";

View File

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "现推出安全的视频通话!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal 即将仅支持 iOS 10 或更新的系统版本。请到 设置 >> 通用 >> 软件更新 升级 iOS。";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "升级 iOS";

View File

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "現推出安全的視訊通話!";
/* Message for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal will soon require iOS 10 or later. Please upgrade in Settings app >> General >> Software Update.";
"UPGRADE_IOS_ALERT_MESSAGE" = "Signal 將要求 iOS 10 以上才能使用。請在 \"設定\" >> \"一般\" >> \"軟體更新\" 中升級。";
/* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "更新 iOS";

View File

@ -101,11 +101,7 @@ class AttachmentApprovalInputAccessoryView: UIView {
// MARK:
public var shouldHideControls = false {
didSet {
updateContents()
}
}
private var shouldHideControls = false
private func updateContents() {
var hasCurrentCaption = false
@ -124,6 +120,12 @@ class AttachmentApprovalInputAccessoryView: UIView {
currentCaptionWrapper.isHidden = isEditingCaptions || !hasCurrentCaption
attachmentTextToolbar.isHidden = isEditingCaptions
updateFirstResponder()
layoutSubviews()
}
private func updateFirstResponder() {
if (shouldHideControls) {
if attachmentCaptionToolbar.textView.isFirstResponder {
attachmentCaptionToolbar.textView.resignFirstResponder()
@ -135,17 +137,30 @@ class AttachmentApprovalInputAccessoryView: UIView {
if !attachmentCaptionToolbar.textView.isFirstResponder {
attachmentCaptionToolbar.textView.becomeFirstResponder()
}
} else {
if attachmentCaptionToolbar.textView.isFirstResponder {
attachmentCaptionToolbar.textView.resignFirstResponder()
}
}
// NOTE: We don't automatically make attachmentTextToolbar.textView
// first responder;
layoutSubviews()
}
public func update(isEditingCaptions: Bool,
currentAttachmentItem: SignalAttachmentItem?) {
currentAttachmentItem: SignalAttachmentItem?,
shouldHideControls: Bool) {
// De-bounce
guard self.isEditingCaptions != isEditingCaptions ||
self.currentAttachmentItem != currentAttachmentItem ||
self.shouldHideControls != shouldHideControls else {
updateFirstResponder()
return
}
self.isEditingCaptions = isEditingCaptions
self.currentAttachmentItem = currentAttachmentItem
self.shouldHideControls = shouldHideControls
updateContents()
}
@ -159,6 +174,12 @@ class AttachmentApprovalInputAccessoryView: UIView {
return CGSize.zero
}
}
public var hasFirstResponder: Bool {
return (isFirstResponder ||
attachmentCaptionToolbar.textView.isFirstResponder ||
attachmentTextToolbar.textView.isFirstResponder)
}
}
// MARK: -

View File

@ -193,7 +193,6 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
private func updateContents() {
updateNavigationBar()
updateInputAccessory()
updateControlVisibility()
touchInterceptorView.isHidden = !isEditingCaptions
}
@ -215,7 +214,16 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
currentPageViewController = pageViewControllers.first
}
let currentAttachmentItem: SignalAttachmentItem? = currentPageViewController?.attachmentItem
bottomToolView.update(isEditingCaptions: isEditingCaptions, currentAttachmentItem: currentAttachmentItem)
let hasPresentedView = self.presentedViewController != nil
let isToolbarFirstResponder = bottomToolView.hasFirstResponder
if !shouldHideControls, !isFirstResponder, !hasPresentedView, !isToolbarFirstResponder {
becomeFirstResponder()
}
bottomToolView.update(isEditingCaptions: isEditingCaptions,
currentAttachmentItem: currentAttachmentItem,
shouldHideControls: shouldHideControls)
}
public var messageText: String? {
@ -345,13 +353,6 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
return pageViewController.shouldHideControls
}
private func updateControlVisibility() {
if !shouldHideControls, !isFirstResponder {
becomeFirstResponder()
}
bottomToolView.shouldHideControls = shouldHideControls
}
// MARK: - View Helpers
func remove(attachmentItem: SignalAttachmentItem) {
@ -428,8 +429,6 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
updateMediaRail()
}
}
updateContents()
}
// MARK: - UIPageViewControllerDataSource
@ -480,6 +479,18 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
return super.viewControllers!.map { $0 as! AttachmentPrepViewController }
}
@objc
public override func setViewControllers(_ viewControllers: [UIViewController]?, direction: UIPageViewController.NavigationDirection, animated: Bool, completion: ((Bool) -> Void)? = nil) {
super.setViewControllers(viewControllers,
direction: direction,
animated: animated) { [weak self] (finished) in
if let completion = completion {
completion(finished)
}
self?.updateContents()
}
}
var currentItem: SignalAttachmentItem! {
get {
return currentPageViewController.attachmentItem
@ -703,7 +714,7 @@ extension AttachmentApprovalViewController: AttachmentPrepViewControllerDelegate
}
func prepViewControllerUpdateControls() {
updateControlVisibility()
updateInputAccessory()
}
}

View File

@ -119,6 +119,11 @@ public class ImageEditorBrushViewController: OWSViewController {
return true
}
@objc
override public var canBecomeFirstResponder: Bool {
return true
}
// MARK: - Actions
@objc func didTapUndo(sender: UIButton) {

View File

@ -242,6 +242,11 @@ class ImageEditorCropViewController: OWSViewController {
return true
}
@objc
override public var canBecomeFirstResponder: Bool {
return true
}
private static let desiredCornerSize: CGFloat = 24
private static let minCropSize: CGFloat = desiredCornerSize * 2
private var cornerSize = CGSize.zero
@ -407,10 +412,6 @@ class ImageEditorCropViewController: OWSViewController {
panGestureRecognizer.shouldBeRequiredToFail(by: pinchGestureRecognizer)
}
override public var canBecomeFirstResponder: Bool {
return true
}
// MARK: - Gestures
private class func unitTranslation(oldLocationView: CGPoint,

View File

@ -239,6 +239,11 @@ public class ImageEditorTextViewController: OWSViewController, VAlignTextViewDel
return true
}
@objc
override public var canBecomeFirstResponder: Bool {
return true
}
// MARK: - Pinch Gesture
private var pinchFontStart: UIFont?

View File

@ -623,7 +623,16 @@ NSError *ContactDiscoveryServiceErrorMakeWithReason(NSInteger code, NSString *re
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
[dateFormatter setTimeZone:timeZone];
[dateFormatter setDateFormat:@"yyy-MM-dd'T'HH:mm:ss.SSSSSS"];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSSSS"];
// Specify parsing locale
// from: https://developer.apple.com/library/archive/qa/qa1480/_index.html
// Q: I'm using NSDateFormatter to parse an Internet-style date, but this fails for some users in some regions.
// I've set a specific date format string; shouldn't that force NSDateFormatter to work independently of the user's
// region settings? A: No. While setting a date format string will appear to work for most users, it's not the right
// solution to this problem. There are many places where format strings behave in unexpected ways. [...]
NSLocale *enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:enUSPOSIXLocale];
NSDate *timestampDate = [dateFormatter dateFromString:signatureBodyEntity.timestamp];
if (!timestampDate) {
OWSFailDebug(@"Could not parse signature body timestamp: %@", signatureBodyEntity.timestamp);

View File

@ -315,38 +315,32 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
// TODO: This method contains view-specific logic and probably belongs in NotificationsManager, not in SSK.
- (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction
{
NSString *_Nullable attachmentDescription = nil;
if ([self hasAttachments]) {
NSString *attachmentId = self.attachmentIds[0];
TSAttachment *attachment = [TSAttachment fetchObjectWithUniqueID:attachmentId transaction:transaction];
if ([OWSMimeTypeOversizeTextMessage isEqualToString:attachment.contentType]) {
// Handle oversize text attachments.
if ([attachment isKindOfClass:[TSAttachmentStream class]]) {
TSAttachmentStream *attachmentStream = (TSAttachmentStream *)attachment;
NSData *_Nullable data = [NSData dataWithContentsOfFile:attachmentStream.originalFilePath];
if (data) {
NSString *_Nullable text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (text) {
return text.filterStringForDisplay;
}
}
}
return @"";
} else if (attachment) {
attachmentDescription = attachment.description;
} else {
attachmentDescription = NSLocalizedString(@"UNKNOWN_ATTACHMENT_LABEL",
@"In Inbox view, last message label for thread with corrupted attachment.");
}
}
{
NSString *_Nullable bodyDescription = nil;
if (self.body.length > 0) {
bodyDescription = self.body;
}
if (bodyDescription == nil) {
TSAttachment *_Nullable oversizeTextAttachment = [self oversizeTextAttachmentWithTransaction:transaction];
if ([oversizeTextAttachment isKindOfClass:[TSAttachmentStream class]]) {
TSAttachmentStream *oversizeTextAttachmentStream = (TSAttachmentStream *)oversizeTextAttachment;
NSData *_Nullable data = [NSData dataWithContentsOfFile:oversizeTextAttachmentStream.originalFilePath];
if (data) {
NSString *_Nullable text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (text) {
bodyDescription = text.filterStringForDisplay;
}
}
}
}
NSString *_Nullable attachmentDescription = nil;
TSAttachment *_Nullable mediaAttachment = [self mediaAttachmentsWithTransaction:transaction].firstObject;
if (mediaAttachment != nil) {
attachmentDescription = mediaAttachment.description;
}
if (attachmentDescription.length > 0 && bodyDescription.length > 0) {
// Attachment with caption.
if ([CurrentAppContext() isRTL]) {

View File

@ -516,7 +516,7 @@ NS_ASSUME_NONNULL_BEGIN
}
parameters = @{ @"reason": limitedReason };
}
NSString *path = [NSString stringWithFormat:@"/v1/directory/feedback-v2/%@", status];
NSString *path = [NSString stringWithFormat:@"/v1/directory/feedback-v3/%@", status];
return [TSRequest requestWithUrl:[NSURL URLWithString:path] method:@"PUT" parameters:parameters];
}

View File

@ -146,8 +146,13 @@ extension SSKWebSocketImpl: WebSocketDelegate {
case let wsError as WSError:
websocketError = SSKWebSocketError(underlyingError: wsError)
case let nsError as NSError:
let networkDownCode = 50
assert(nsError.domain == "NSPOSIXErrorDomain" && nsError.code == networkDownCode)
// Assert that error is either a Starscream.WSError or an OS level networking error
if #available(iOS 10, *) {
let networkDownCode = 50
assert(nsError.domain == "NSPOSIXErrorDomain" && nsError.code == networkDownCode)
} else {
assert(nsError.domain == kCFErrorDomainCFNetwork as String)
}
websocketError = error
default:
assert(error == nil, "unexpected error type: \(String(describing: error))")

View File

@ -138,6 +138,7 @@ public class FullTextSearchFinder: NSObject {
// This is a hot method, especially while running large migrations.
// Changes to it should go through a profiler to make sure large migrations
// aren't adversely affected.
@objc
public class func normalize(text: String) -> String {
// 1. Filter out invalid characters.
let filtered = text.removeCharacters(characterSet: charactersToRemove)

View File

@ -9,6 +9,11 @@ import Foundation
@objc(SSKFeatureFlags)
public class FeatureFlags: NSObject {
@objc
public static var conversationSearch: Bool {
return false
}
/// iOS has long supported sending oversized text as a sidecar attachment. The other clients
/// simply displayed it as a text attachment. As part of the new cross-client long-text feature,
/// we want to be able to display long text with attachments as well. Existing iOS clients

View File

@ -213,11 +213,11 @@ class OWSLinkPreviewTest: SSKBaseTestSwift {
let expectation = self.expectation(description: "link download and parsing")
OWSLinkPreview.tryToBuildPreviewInfo(previewUrl: "https://www.youtube.com/watch?v=tP-Ipsat90c")
.done { (draft) in
.done { (draft: OWSLinkPreviewDraft) in
XCTAssertNotNil(draft)
XCTAssertEqual(draft.title, "Randomness is Random - Numberphile")
XCTAssertNotNil(draft.imageFilePath)
XCTAssertNotNil(draft.jpegImageData)
expectation.fulfill()
}.catch { (error) in

View File

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>2.38.0</string>
<key>CFBundleVersion</key>
<string>2.38.0.9</string>
<string>2.38.0.11</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>NSAppTransportSecurity</key>