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> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>2.38.0.9</string> <string>2.38.0.11</string>
<key>ITSAppUsesNonExemptEncryption</key> <key>ITSAppUsesNonExemptEncryption</key>
<false/> <false/>
<key>LOGS_EMAIL</key> <key>LOGS_EMAIL</key>

View file

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

View file

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

View file

@ -708,10 +708,12 @@ NS_ASSUME_NONNULL_BEGIN
initWithString:text initWithString:text
attributes:@{ NSFontAttributeName : font, NSForegroundColorAttributeName : textColor }]; attributes:@{ NSFontAttributeName : font, NSForegroundColorAttributeName : textColor }];
if (searchText.length >= ConversationSearchController.kMinimumSearchTextLength) { if (searchText.length >= ConversationSearchController.kMinimumSearchTextLength) {
NSString *searchableText = [FullTextSearchFinder normalizeWithText:searchText];
NSError *error; NSError *error;
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:searchText NSRegularExpression *regex =
options:NSRegularExpressionCaseInsensitive [[NSRegularExpression alloc] initWithPattern:[NSRegularExpression escapedPatternForString:searchableText]
error:&error]; options:NSRegularExpressionCaseInsensitive
error:&error];
OWSAssertDebug(error == nil); OWSAssertDebug(error == nil);
for (NSTextCheckingResult *match in for (NSTextCheckingResult *match in
[regex matchesInString:text options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, text.length)]) { [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> #import <SignalMessaging/OWSViewController.h>
@ -25,6 +25,8 @@ typedef NS_ENUM(NSUInteger, ConversationViewAction) {
- (void)popKeyBoard; - (void)popKeyBoard;
- (void)scrollToFirstUnreadMessage:(BOOL)isAnimated;
#pragma mark 3D Touch Methods #pragma mark 3D Touch Methods
- (void)peekSetup; - (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. // We want to set the initial scroll state the first time we enter the view.
if (!self.viewHasEverAppeared) { if (!self.viewHasEverAppeared) {
[self scrollToDefaultPosition]; [self scrollToDefaultPosition:NO];
} else if (self.menuActionsViewController != nil) { } else if (self.menuActionsViewController != nil) {
[self scrollToMenuActionInteraction:NO]; [self scrollToMenuActionInteraction:NO];
} }
@ -806,7 +806,7 @@ typedef enum : NSUInteger {
return [NSIndexPath indexPathForRow:row inSection:0]; return [NSIndexPath indexPathForRow:row inSection:0];
} }
- (void)scrollToDefaultPosition - (void)scrollToDefaultPosition:(BOOL)isAnimated
{ {
if (self.isUserScrolling) { if (self.isUserScrolling) {
return; return;
@ -823,14 +823,14 @@ typedef enum : NSUInteger {
if (indexPath) { if (indexPath) {
if (indexPath.section == 0 && indexPath.row == 0) { if (indexPath.section == 0 && indexPath.row == 0) {
[self.collectionView setContentOffset:CGPointZero animated:NO]; [self.collectionView setContentOffset:CGPointZero animated:isAnimated];
} else { } else {
[self.collectionView scrollToItemAtIndexPath:indexPath [self.collectionView scrollToItemAtIndexPath:indexPath
atScrollPosition:UICollectionViewScrollPositionTop atScrollPosition:UICollectionViewScrollPositionTop
animated:NO]; animated:isAnimated];
} }
} else { } 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. // Adjust content offset to prevent the presented keyboard from obscuring content.
if (!self.viewHasEverAppeared) { if (!self.viewHasEverAppeared) {
[self scrollToDefaultPosition]; [self scrollToDefaultPosition:NO];
} else if (wasScrolledToBottom) { } else if (wasScrolledToBottom) {
// If we were scrolled to the bottom, don't do any fancy math. Just stay at the bottom. // If we were scrolled to the bottom, don't do any fancy math. Just stay at the bottom.
[self scrollToBottomAnimated:NO]; [self scrollToBottomAnimated:NO];
} else { } else if (self.isViewCompletelyAppeared) {
// If we were scrolled away from the bottom, shift the content in lockstep with the // If we were scrolled away from the bottom, shift the content in lockstep with the
// keyboard, up to the limits of the content bounds. // keyboard, up to the limits of the content bounds.
CGFloat insetChange = newInsets.bottom - oldInsets.bottom; CGFloat insetChange = newInsets.bottom - oldInsets.bottom;
@ -4011,6 +4011,11 @@ typedef enum : NSUInteger {
[self didScrollToBottom]; [self didScrollToBottom];
} }
- (void)scrollToFirstUnreadMessage:(BOOL)isAnimated
{
[self scrollToDefaultPosition:isAnimated];
}
#pragma mark - UIScrollViewDelegate #pragma mark - UIScrollViewDelegate
- (void)updateLastKnownDistanceFromBottom - (void)updateLastKnownDistanceFromBottom
@ -4190,7 +4195,16 @@ typedef enum : NSUInteger {
// restore first responder to VC // restore first responder to VC
[self becomeFirstResponder]; [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 #pragma mark ConversationSearchControllerDelegate

View file

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

View file

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

View file

@ -109,7 +109,7 @@ NS_ASSUME_NONNULL_BEGIN
DispatchMainThreadSafe(^{ DispatchMainThreadSafe(^{
UIViewController *frontmostVC = [[UIApplication sharedApplication] frontmostViewController]; UIViewController *frontmostVC = [[UIApplication sharedApplication] frontmostViewController];
if ([frontmostVC isKindOfClass:[ConversationViewController class]]) { if ([frontmostVC isKindOfClass:[ConversationViewController class]]) {
ConversationViewController *conversationVC = (ConversationViewController *)frontmostVC; ConversationViewController *conversationVC = (ConversationViewController *)frontmostVC;
if ([conversationVC.thread.uniqueId isEqualToString:thread.uniqueId]) { if ([conversationVC.thread.uniqueId isEqualToString:thread.uniqueId]) {
@ -117,11 +117,42 @@ NS_ASSUME_NONNULL_BEGIN
return; return;
} }
} }
[self.homeViewController presentThread:thread action:action focusMessageId:focusMessageId animated:isAnimated]; [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 - (void)didChangeCallLoggingPreference:(NSNotification *)notitication
{ {
[AppEnvironment.shared.callService createCallUIAdapter]; [AppEnvironment.shared.callService createCallUIAdapter];

View file

@ -38,8 +38,31 @@
self.axis = .horizontal self.axis = .horizontal
self.spacing = kDotMaxHSpacing self.spacing = kDotMaxHSpacing
self.alignment = .center 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 @objc
public override func sizeThatFits(_ size: CGSize) -> CGSize { public override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: TypingIndicatorView.kMaxRadiusPt * 3 + kDotMaxHSpacing * 2, height: TypingIndicatorView.kMaxRadiusPt) return CGSize(width: TypingIndicatorView.kMaxRadiusPt * 3 + kDotMaxHSpacing * 2, height: TypingIndicatorView.kMaxRadiusPt)
@ -49,8 +72,12 @@
return [dot1, dot2, dot3] return [dot1, dot2, dot3]
} }
private var isAnimating = false
@objc @objc
public func startAnimation() { public func startAnimation() {
isAnimating = true
for dot in dots() { for dot in dots() {
dot.startAnimation() dot.startAnimation()
} }
@ -58,6 +85,8 @@
@objc @objc
public func stopAnimation() { public func stopAnimation() {
isAnimating = false
for dot in dots() { for dot in dots() {
dot.stopAnimation() dot.stopAnimation()
} }

View file

@ -2250,7 +2250,7 @@
"SETTINGS_UNIDENTIFIED_DELIVERY_LEARN_MORE" = "Saznaj više"; "SETTINGS_UNIDENTIFIED_DELIVERY_LEARN_MORE" = "Saznaj više";
/* table section label */ /* table section label */
"SETTINGS_UNIDENTIFIED_DELIVERY_SECTION_TITLE" = "Sealed Sender"; "SETTINGS_UNIDENTIFIED_DELIVERY_SECTION_TITLE" = "Zapečaćeni pošiljalac";
/* switch label */ /* switch label */
"SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS" = "Display Indicators"; "SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS" = "Display Indicators";
@ -2262,7 +2262,7 @@
"SETTINGS_UNIDENTIFIED_DELIVERY_UNRESTRICTED_ACCESS" = "Allow from Anyone"; "SETTINGS_UNIDENTIFIED_DELIVERY_UNRESTRICTED_ACCESS" = "Allow from Anyone";
/* table section footer */ /* 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. */ /* No comment provided by engineer. */
"SETTINGS_VERSION" = "Verzija"; "SETTINGS_VERSION" = "Verzija";

View file

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Afegeix una descripció..."; "ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Afegeix una descripció...";
/* Title for 'caption' mode of the attachment approval view. */ /* 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 */ /* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Tipus de fitxer: %@"; "ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Tipus de fitxer: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Rebutja trucades"; "CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Rebutja trucades";
/* tooltip label when remote party has enabled their video */ /* 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 */ /* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Finalitza la trucada"; "CALL_VIEW_HANGUP_LABEL" = "Finalitza la trucada";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Esborrar conversa?"; "CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Esborrar conversa?";
/* keyboard toolbar label when no messages match the search string */ /* 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 */ /* 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}} */ /* 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 */ /* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "Configuració del xat"; "CONVERSATION_SETTINGS" = "Configuració del xat";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Crea un contacte nou"; "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 */ /* 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. */ /* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Toca per canviar"; "CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Toca per canviar";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Fax de la feina"; "PHONE_NUMBER_TYPE_WORK_FAX" = "Fax de la feina";
/* alert title, generic error preventing user from capturing a photo */ /* 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 */ /* 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 */ /* 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. */ /* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Àlbum sense nom"; "PHOTO_PICKER_UNNAMED_COLLECTION" = "Àlbum sense nom";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Telefonades de Vídeo Segures!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Telefonades de Vídeo Segures!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Actualitzeu l'iOS"; "UPGRADE_IOS_ALERT_TITLE" = "Actualitzeu l'iOS";

View file

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Hallo, sichere Videoanrufe!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Hallo, sichere Videoanrufe!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "iOS aktualisieren"; "UPGRADE_IOS_ALERT_TITLE" = "iOS aktualisieren";

View file

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "¡Saluda a las vídeollamadas seguras!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "¡Saluda a las vídeollamadas seguras!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Actualizar iOS"; "UPGRADE_IOS_ALERT_TITLE" = "Actualizar iOS";

View file

@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Refuser lappel entrant"; "CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Refuser lappel entrant";
/* tooltip label when remote party has enabled their video */ /* 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 */ /* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Raccrocher"; "CALL_VIEW_HANGUP_LABEL" = "Raccrocher";
@ -567,7 +567,7 @@
"CONVERSATION_SEARCH_NO_RESULTS" = "Aucune correspondance"; "CONVERSATION_SEARCH_NO_RESULTS" = "Aucune correspondance";
/* keyboard toolbar label when exactly 1 message matches the search string */ /* 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}} */ /* 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"; "CONVERSATION_SEARCH_RESULTS_FORMAT" = "%d sur %dcorrespondances";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Télécopieur travail"; "PHONE_NUMBER_TYPE_WORK_FAX" = "Télécopieur travail";
/* alert title, generic error preventing user from capturing a photo */ /* 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 */ /* alert title */
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Unable to capture image."; "PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Impossible de capturer limage.";
/* alert title */ /* 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. */ /* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Album sans nom"; "PHOTO_PICKER_UNNAMED_COLLECTION" = "Album sans nom";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Bienvenue aux appels vidéo sécurisés!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Bienvenue aux appels vidéo sécurisés!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Mettez iOS à niveau"; "UPGRADE_IOS_ALERT_TITLE" = "Mettez iOS à niveau";

View file

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "הוסף כיתוב..."; "ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "הוסף כיתוב...";
/* Title for 'caption' mode of the attachment approval view. */ /* 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 */ /* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "סוג קובץ: %@"; "ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "סוג קובץ: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "דחה שיחה נכנסת"; "CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "דחה שיחה נכנסת";
/* tooltip label when remote party has enabled their video */ /* 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 */ /* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "סיים שיחה"; "CALL_VIEW_HANGUP_LABEL" = "סיים שיחה";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "למחוק שיחה?"; "CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "למחוק שיחה?";
/* keyboard toolbar label when no messages match the search string */ /* 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 */ /* 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}} */ /* 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 */ /* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "הגדרות שיחה"; "CONVERSATION_SETTINGS" = "הגדרות שיחה";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "צור איש קשר חדש"; "CONVERSATION_SETTINGS_NEW_CONTACT" = "צור איש קשר חדש";
/* Table cell label in conversation settings which returns the user to the conversation with 'search mode' activated */ /* 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. */ /* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "הקש כדי לשנות"; "CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "הקש כדי לשנות";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "פקס עבודה"; "PHONE_NUMBER_TYPE_WORK_FAX" = "פקס עבודה";
/* alert title, generic error preventing user from capturing a photo */ /* alert title, generic error preventing user from capturing a photo */
"PHOTO_CAPTURE_GENERIC_ERROR" = "Unable to capture image."; "PHOTO_CAPTURE_GENERIC_ERROR" = "לא היה ניתן ללכוד תמונה.";
/* alert title */ /* alert title */
"PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "Unable to capture image."; "PHOTO_CAPTURE_UNABLE_TO_CAPTURE_IMAGE" = "לא היה ניתן ללכוד תמונה.";
/* alert title */ /* 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. */ /* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "אלבום ללא שם"; "PHOTO_PICKER_UNNAMED_COLLECTION" = "אלבום ללא שם";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "שלום שיחות וידיאו מאובטחות!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "שלום שיחות וידיאו מאובטחות!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "שדרג את 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)"; "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. */ /* 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. */ /* Label indicating that the phone number is invalid in the 'onboarding phone number' view. */
"ONBOARDING_PHONE_NUMBER_VALIDATION_WARNING" = "Nomor salah"; "ONBOARDING_PHONE_NUMBER_VALIDATION_WARNING" = "Nomor salah";
@ -1536,7 +1536,7 @@
"ONBOARDING_PROFILE_NAME_PLACEHOLDER" = "Your Name"; "ONBOARDING_PROFILE_NAME_PLACEHOLDER" = "Your Name";
/* Title of the 'onboarding profile' view. */ /* 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. */ /* Link to the 'terms and privacy policy' in the 'onboarding splash' view. */
"ONBOARDING_SPLASH_TERM_AND_PRIVACY_POLICY" = "Syarat & Kebijakan Privasi"; "ONBOARDING_SPLASH_TERM_AND_PRIVACY_POLICY" = "Syarat & Kebijakan Privasi";

View file

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Videochiamate sicure!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Videochiamate sicure!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Aggiornare iOS"; "UPGRADE_IOS_ALERT_TITLE" = "Aggiornare iOS";

View file

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Sveiki, saugūs vaizdo skambučiai!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Sveiki, saugūs vaizdo skambučiai!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Atnaujinkite iOS"; "UPGRADE_IOS_ALERT_TITLE" = "Atnaujinkite iOS";

View file

@ -2253,7 +2253,7 @@
"SETTINGS_UNIDENTIFIED_DELIVERY_SECTION_TITLE" = "Verzegelde afzender"; "SETTINGS_UNIDENTIFIED_DELIVERY_SECTION_TITLE" = "Verzegelde afzender";
/* switch label */ /* switch label */
"SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS" = "Indicator tonen"; "SETTINGS_UNIDENTIFIED_DELIVERY_SHOW_INDICATORS" = "Toon verzegelde afzender indicator";
/* table section footer */ /* 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."; "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!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Hallo, beveiligde videogesprekken!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Werk iOS bij"; "UPGRADE_IOS_ALERT_TITLE" = "Werk iOS bij";

View file

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Dodaj podpis..."; "ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Dodaj podpis...";
/* Title for 'caption' mode of the attachment approval view. */ /* 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 */ /* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Typ pliku: %@"; "ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Typ pliku: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Odrzuć połączenie przychodzące"; "CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Odrzuć połączenie przychodzące";
/* tooltip label when remote party has enabled their video */ /* 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 */ /* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Zakończ rozmowę "; "CALL_VIEW_HANGUP_LABEL" = "Zakończ rozmowę ";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Usunąć konwersację?"; "CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Usunąć konwersację?";
/* keyboard toolbar label when no messages match the search string */ /* 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 */ /* 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}} */ /* 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 */ /* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "Ustawienia konwersacji"; "CONVERSATION_SETTINGS" = "Ustawienia konwersacji";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Utwórz nowy kontakt"; "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 */ /* 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. */ /* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Dotknij, by zmienić"; "CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Dotknij, by zmienić";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Fax w pracy"; "PHONE_NUMBER_TYPE_WORK_FAX" = "Fax w pracy";
/* alert title, generic error preventing user from capturing a photo */ /* 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 */ /* 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 */ /* 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. */ /* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Album bez nazwy"; "PHOTO_PICKER_UNNAMED_COLLECTION" = "Album bez nazwy";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Szyfrowane wideo rozmowy witają!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Szyfrowane wideo rozmowy witają!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Uaktualnij iOS"; "UPGRADE_IOS_ALERT_TITLE" = "Uaktualnij iOS";

View file

@ -684,10 +684,10 @@
"DATABASE_VIEW_OVERLAY_TITLE" = "A optimizar a base de dados"; "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}}. */ /* 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}}. */ /* 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. */ /* The present; the current time. */
"DATE_NOW" = "Agora"; "DATE_NOW" = "Agora";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Olá videochamadas seguras!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Olá videochamadas seguras!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Atualizar iOS"; "UPGRADE_IOS_ALERT_TITLE" = "Atualizar iOS";

View file

@ -96,7 +96,7 @@
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Adaugă un titlu..."; "ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Adaugă un titlu...";
/* Title for 'caption' mode of the attachment approval view. */ /* 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 */ /* Format string for file extension label in call interstitial view */
"ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Tip fișier: %@"; "ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT" = "Tip fișier: %@";
@ -351,7 +351,7 @@
"CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Respingeți apelul de intrare"; "CALL_VIEW_DECLINE_INCOMING_CALL_LABEL" = "Respingeți apelul de intrare";
/* tooltip label when remote party has enabled their video */ /* 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 */ /* Accessibility label for hang up call */
"CALL_VIEW_HANGUP_LABEL" = "Închideți apelul"; "CALL_VIEW_HANGUP_LABEL" = "Închideți apelul";
@ -564,13 +564,13 @@
"CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Șterg conversația?"; "CONVERSATION_DELETE_CONFIRMATION_ALERT_TITLE" = "Șterg conversația?";
/* keyboard toolbar label when no messages match the search string */ /* 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 */ /* 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}} */ /* 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 */ /* title for conversation settings screen */
"CONVERSATION_SETTINGS" = "Setări conversație"; "CONVERSATION_SETTINGS" = "Setări conversație";
@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Creează contact nou"; "CONVERSATION_SETTINGS_NEW_CONTACT" = "Creează contact nou";
/* Table cell label in conversation settings which returns the user to the conversation with 'search mode' activated */ /* 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. */ /* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Apasă pentru a modifica"; "CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Apasă pentru a modifica";
@ -1641,13 +1641,13 @@
"PHONE_NUMBER_TYPE_WORK_FAX" = "Fax serviciu"; "PHONE_NUMBER_TYPE_WORK_FAX" = "Fax serviciu";
/* alert title, generic error preventing user from capturing a photo */ /* 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 */ /* 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 */ /* 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. */ /* label for system photo collections which have no name. */
"PHOTO_PICKER_UNNAMED_COLLECTION" = "Album fără nume"; "PHOTO_PICKER_UNNAMED_COLLECTION" = "Album fără nume";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Bun venit la apeluri video securizate!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Bun venit la apeluri video securizate!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Actualizează-ți iOS-ul"; "UPGRADE_IOS_ALERT_TITLE" = "Actualizează-ți iOS-ul";

View file

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

View file

@ -90,7 +90,7 @@
"ATTACHMENT" = "Bashkëngjitje"; "ATTACHMENT" = "Bashkëngjitje";
/* One-line label indicating the user can add no more text to the attachment caption. */ /* 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 */ /* placeholder text for an empty captioning field */
"ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Shtoni një përshkrim…"; "ATTACHMENT_APPROVAL_CAPTION_PLACEHOLDER" = "Shtoni një përshkrim…";
@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Tungjatjeta Thirrjeve Video të Sigurta!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Tungjatjeta Thirrjeve Video të Sigurta!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "Përmirësoni iOS-in"; "UPGRADE_IOS_ALERT_TITLE" = "Përmirësoni iOS-in";

View file

@ -624,7 +624,7 @@
"CONVERSATION_SETTINGS_NEW_CONTACT" = "Yeni Kişi Oluştur"; "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 */ /* 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. */ /* Label for button that opens conversation settings. */
"CONVERSATION_SETTINGS_TAP_TO_CHANGE" = "Değiştirmek için Dokunun"; "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!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "Merhaba Güvenli Görüntülü Aramalar!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "iOS'u Güncelle"; "UPGRADE_IOS_ALERT_TITLE" = "iOS'u Güncelle";

View file

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "现推出安全的视频通话!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "现推出安全的视频通话!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "升级 iOS"; "UPGRADE_IOS_ALERT_TITLE" = "升级 iOS";

View file

@ -2484,7 +2484,7 @@
"UPGRADE_EXPERIENCE_VIDEO_TITLE" = "現推出安全的視訊通話!"; "UPGRADE_EXPERIENCE_VIDEO_TITLE" = "現推出安全的視訊通話!";
/* Message for the alert indicating that user should upgrade iOS. */ /* 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. */ /* Title for the alert indicating that user should upgrade iOS. */
"UPGRADE_IOS_ALERT_TITLE" = "更新 iOS"; "UPGRADE_IOS_ALERT_TITLE" = "更新 iOS";

View file

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

View file

@ -193,7 +193,6 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
private func updateContents() { private func updateContents() {
updateNavigationBar() updateNavigationBar()
updateInputAccessory() updateInputAccessory()
updateControlVisibility()
touchInterceptorView.isHidden = !isEditingCaptions touchInterceptorView.isHidden = !isEditingCaptions
} }
@ -215,7 +214,16 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
currentPageViewController = pageViewControllers.first currentPageViewController = pageViewControllers.first
} }
let currentAttachmentItem: SignalAttachmentItem? = currentPageViewController?.attachmentItem 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? { public var messageText: String? {
@ -345,13 +353,6 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
return pageViewController.shouldHideControls return pageViewController.shouldHideControls
} }
private func updateControlVisibility() {
if !shouldHideControls, !isFirstResponder {
becomeFirstResponder()
}
bottomToolView.shouldHideControls = shouldHideControls
}
// MARK: - View Helpers // MARK: - View Helpers
func remove(attachmentItem: SignalAttachmentItem) { func remove(attachmentItem: SignalAttachmentItem) {
@ -428,8 +429,6 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
updateMediaRail() updateMediaRail()
} }
} }
updateContents()
} }
// MARK: - UIPageViewControllerDataSource // MARK: - UIPageViewControllerDataSource
@ -480,6 +479,18 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC
return super.viewControllers!.map { $0 as! AttachmentPrepViewController } 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! { var currentItem: SignalAttachmentItem! {
get { get {
return currentPageViewController.attachmentItem return currentPageViewController.attachmentItem
@ -703,7 +714,7 @@ extension AttachmentApprovalViewController: AttachmentPrepViewControllerDelegate
} }
func prepViewControllerUpdateControls() { func prepViewControllerUpdateControls() {
updateControlVisibility() updateInputAccessory()
} }
} }

View file

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

View file

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

View file

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

View file

@ -623,7 +623,16 @@ NSError *ContactDiscoveryServiceErrorMakeWithReason(NSInteger code, NSString *re
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
[dateFormatter setTimeZone:timeZone]; [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]; NSDate *timestampDate = [dateFormatter dateFromString:signatureBodyEntity.timestamp];
if (!timestampDate) { if (!timestampDate) {
OWSFailDebug(@"Could not parse signature body timestamp: %@", signatureBodyEntity.timestamp); 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. // TODO: This method contains view-specific logic and probably belongs in NotificationsManager, not in SSK.
- (NSString *)previewTextWithTransaction:(YapDatabaseReadTransaction *)transaction - (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; NSString *_Nullable bodyDescription = nil;
if (self.body.length > 0) { if (self.body.length > 0) {
bodyDescription = self.body; 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) { if (attachmentDescription.length > 0 && bodyDescription.length > 0) {
// Attachment with caption. // Attachment with caption.
if ([CurrentAppContext() isRTL]) { if ([CurrentAppContext() isRTL]) {

View file

@ -516,7 +516,7 @@ NS_ASSUME_NONNULL_BEGIN
} }
parameters = @{ @"reason": limitedReason }; 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]; return [TSRequest requestWithUrl:[NSURL URLWithString:path] method:@"PUT" parameters:parameters];
} }

View file

@ -146,8 +146,13 @@ extension SSKWebSocketImpl: WebSocketDelegate {
case let wsError as WSError: case let wsError as WSError:
websocketError = SSKWebSocketError(underlyingError: wsError) websocketError = SSKWebSocketError(underlyingError: wsError)
case let nsError as NSError: case let nsError as NSError:
let networkDownCode = 50 // Assert that error is either a Starscream.WSError or an OS level networking error
assert(nsError.domain == "NSPOSIXErrorDomain" && nsError.code == networkDownCode) if #available(iOS 10, *) {
let networkDownCode = 50
assert(nsError.domain == "NSPOSIXErrorDomain" && nsError.code == networkDownCode)
} else {
assert(nsError.domain == kCFErrorDomainCFNetwork as String)
}
websocketError = error websocketError = error
default: default:
assert(error == nil, "unexpected error type: \(String(describing: error))") 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. // This is a hot method, especially while running large migrations.
// Changes to it should go through a profiler to make sure large migrations // Changes to it should go through a profiler to make sure large migrations
// aren't adversely affected. // aren't adversely affected.
@objc
public class func normalize(text: String) -> String { public class func normalize(text: String) -> String {
// 1. Filter out invalid characters. // 1. Filter out invalid characters.
let filtered = text.removeCharacters(characterSet: charactersToRemove) let filtered = text.removeCharacters(characterSet: charactersToRemove)

View file

@ -9,6 +9,11 @@ import Foundation
@objc(SSKFeatureFlags) @objc(SSKFeatureFlags)
public class FeatureFlags: NSObject { 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 /// 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, /// 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 /// 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") let expectation = self.expectation(description: "link download and parsing")
OWSLinkPreview.tryToBuildPreviewInfo(previewUrl: "https://www.youtube.com/watch?v=tP-Ipsat90c") OWSLinkPreview.tryToBuildPreviewInfo(previewUrl: "https://www.youtube.com/watch?v=tP-Ipsat90c")
.done { (draft) in .done { (draft: OWSLinkPreviewDraft) in
XCTAssertNotNil(draft) XCTAssertNotNil(draft)
XCTAssertEqual(draft.title, "Randomness is Random - Numberphile") XCTAssertEqual(draft.title, "Randomness is Random - Numberphile")
XCTAssertNotNil(draft.imageFilePath) XCTAssertNotNil(draft.jpegImageData)
expectation.fulfill() expectation.fulfill()
}.catch { (error) in }.catch { (error) in

View file

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