Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adjust translation provider source #1380

Merged
merged 5 commits into from
Oct 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion NextcloudTalk/BaseChatViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -969,7 +969,8 @@
}

func didPressTranslate(for message: NCChatMessage) {
let translateMessageVC = MessageTranslationViewController(message: message.parsedMessage().string, availableTranslations: NCSettingsController.sharedInstance().availableTranslations())
let activeAccount = NCDatabaseManager.sharedInstance().activeAccount()
let translateMessageVC = MessageTranslationViewController(message: message.parsedMessage().string, availableTranslations: NCDatabaseManager.sharedInstance().availableTranslations(forAccountId: activeAccount.accountId))
self.presentWithNavigation(translateMessageVC, animated: true)
}

Expand Down Expand Up @@ -2354,7 +2355,7 @@
return super.numberOfSections(in: tableView)
}

// TODO: There should be a better place to do this

Check warning on line 2358 in NextcloudTalk/BaseChatViewController.swift

View workflow job for this annotation

GitHub Actions / SwiftLint

Todo Violation: TODOs should be resolved (There should be a better place...) (todo)
if tableView == self.tableView, !self.dateSections.isEmpty {
tableView.backgroundView = nil
} else {
Expand Down Expand Up @@ -2746,7 +2747,7 @@
let maxPreviewWidth = self.view.bounds.size.width - self.view.safeAreaInsets.left - self.view.safeAreaInsets.right
let maxPreviewHeight = self.view.bounds.size.height * 0.6

// TODO: Take padding into account

Check warning on line 2750 in NextcloudTalk/BaseChatViewController.swift

View workflow job for this annotation

GitHub Actions / SwiftLint

Todo Violation: TODOs should be resolved (Take padding into account) (todo)
let maxTextWidth = maxPreviewWidth - kChatCellAvatarHeight

// We need to get the height of the original cell to center the preview correctly (as the preview is always non-grouped)
Expand Down
4 changes: 2 additions & 2 deletions NextcloudTalk/ChatViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1467,6 +1467,7 @@ import UIKit
}

var actions: [UIMenuElement] = []
let activeAccount = NCDatabaseManager.sharedInstance().activeAccount()
let hasChatPermissions = !NCDatabaseManager.sharedInstance().serverHasTalkCapability(kCapabilityChatPermission) || (self.room.permissions & NCPermission.chat.rawValue) != 0

// Reply option
Expand All @@ -1477,7 +1478,6 @@ import UIKit
}

// Reply-privately option (only to other users and not in one-to-one)
let activeAccount = NCDatabaseManager.sharedInstance().activeAccount()
if self.isMessageReplyable(message: message), self.room.type != kNCRoomTypeOneToOne, message.actorType == "users", message.actorId != activeAccount.userId {
actions.append(UIAction(title: NSLocalizedString("Reply privately", comment: ""), image: .init(systemName: "person")) { _ in
self.didPressReplyPrivately(for: message)
Expand Down Expand Up @@ -1553,7 +1553,7 @@ import UIKit
})

// Translate
if !self.offlineMode, !NCSettingsController.sharedInstance().availableTranslations().isEmpty {
if !self.offlineMode, NCDatabaseManager.sharedInstance().hasAvailableTranslations(forAccountId: activeAccount.accountId) {
actions.append(UIAction(title: NSLocalizedString("Translate", comment: ""), image: .init(systemName: "character.book.closed")) { _ in
self.didPressTranslate(for: message)
})
Expand Down
24 changes: 21 additions & 3 deletions NextcloudTalk/MessageTranslationViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,31 @@ import UIKit

override func viewWillAppear(_ animated: Bool) {
if !didTriggerInitialTranslation {
self.setTranslatingUI()
self.didTriggerInitialTranslation = true
self.configureFromButton(title: NSLocalizedString("Detecting language", comment: ""), enabled: false)
self.configureToButton(title: initialToLanguage(), enabled: false, fromLanguageCode: "")

self.adjustOriginalTextViewSizeToViewSize(size: self.view.bounds.size)

self.didTriggerInitialTranslation = true
self.translateOriginalText(from: "", to: userLanguageCode ?? "")
if NCDatabaseManager.sharedInstance().hasTranslationProviders(forAccountId: activeAccount?.accountId ?? "") {
NCAPIController.sharedInstance().getAvailableTranslations(for: activeAccount) { languages, languageDetection, error, _ in
if let translations = languages as? [NCTranslation], error == nil {
self.availableTranslations = translations
if languageDetection {
self.translateOriginalText(from: "", to: self.userLanguageCode ?? "")
} else {
self.configureFromButton(title: nil, enabled: true)
self.configureToButton(title: nil, enabled: false, fromLanguageCode: "")
self.removeTranslatingUI()
}
} else {
self.showTranslationError(message: NSLocalizedString("Could not get available languages", comment: ""))
self.removeTranslatingUI()
}
}
} else {
self.translateOriginalText(from: "", to: userLanguageCode ?? "")
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions NextcloudTalk/NCAPIController.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ typedef void (^ClearChatHistoryCompletionBlock)(NSDictionary *messageDict, NSErr
typedef void (^GetSharedItemsOverviewCompletionBlock)(NSDictionary *sharedItemsOverview, NSError *error, NSInteger statusCode);
typedef void (^GetSharedItemsCompletionBlock)(NSArray *sharedItems, NSInteger lastKnownMessage, NSError *error, NSInteger statusCode);

typedef void (^GetTranslationsCompletionBlock)(NSArray *languages, BOOL languageDetection, NSError *error, NSInteger statusCode);
typedef void (^MessageTranslationCompletionBlock)(NSDictionary *translationDict, NSError *error, NSInteger statusCode);

typedef void (^MessageReactionCompletionBlock)(NSDictionary *reactionsDict, NSError *error, NSInteger statusCode);
Expand Down Expand Up @@ -225,6 +226,7 @@ extern NSInteger const kReceivedChatMessagesLimit;
- (NSURLSessionDataTask *)getSharedItemsOfType:(NSString *)objectType fromLastMessageId:(NSInteger)messageId withLimit:(NSInteger)limit inRoom:(NSString *)token forAccount:(TalkAccount *)account withCompletionBlock:(GetSharedItemsCompletionBlock)block;

// Translations
- (NSURLSessionDataTask *)getAvailableTranslationsForAccount:(TalkAccount *)account withCompletionBlock:(GetTranslationsCompletionBlock)block;
- (NSURLSessionDataTask *)translateMessage:(NSString *)message from:(NSString *)from to:(NSString *)to forAccount:(TalkAccount *)account withCompletionBlock:(MessageTranslationCompletionBlock)block;

// Reactions Controller
Expand Down
24 changes: 24 additions & 0 deletions NextcloudTalk/NCAPIController.m
Original file line number Diff line number Diff line change
Expand Up @@ -1638,6 +1638,30 @@ - (NSURLSessionDataTask *)getSharedItemsOfType:(NSString *)objectType fromLastMe

#pragma mark - Translations Controller

- (NSURLSessionDataTask *)getAvailableTranslationsForAccount:(TalkAccount *)account withCompletionBlock:(GetTranslationsCompletionBlock)block
{
NSString *URLString = [NSString stringWithFormat:@"%@/ocs/v2.php/translation/languages", account.server];
NCAPISessionManager *apiSessionManager = [_apiSessionManagers objectForKey:account.accountId];
NSURLSessionDataTask *task = [apiSessionManager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *translationDict = [[responseObject objectForKey:@"ocs"] objectForKey:@"data"];
if (block) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response;
NSArray *translations = [[NCDatabaseManager sharedInstance] translationsFromTranslationsArray:[translationDict objectForKey:@"languages"]];
BOOL languageDetection = [translationDict objectForKey:@"languageDetection"];
block(translations, languageDetection, nil, httpResponse.statusCode);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSInteger statusCode = [self getResponseStatusCode:task.response];
[self checkResponseStatusCode:statusCode forAccount:account];
NSDictionary *failureDict = [[[self getFailureResponseObjectFromError:error] objectForKey:@"ocs"] objectForKey:@"data"];
if (block) {
block(@[], NO, error, statusCode);
}
}];

return task;
}

- (NSURLSessionDataTask *)translateMessage:(NSString *)message from:(NSString *)from to:(NSString *)to forAccount:(TalkAccount *)account withCompletionBlock:(MessageTranslationCompletionBlock)block
{
NSString *URLString = [NSString stringWithFormat:@"%@/ocs/v2.php/translation/translate", account.server];
Expand Down
12 changes: 12 additions & 0 deletions NextcloudTalk/NCDatabaseManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,13 @@ extern NSString * const kNotificationsCapabilityExists;

extern NSString * const kMinimumRequiredTalkCapability;

@interface NCTranslation : NSObject
@property (nonatomic, copy) NSString *from;
@property (nonatomic, copy) NSString *fromLabel;
@property (nonatomic, copy) NSString *to;
@property (nonatomic, copy) NSString *toLabel;
@end

@interface NCDatabaseManager : NSObject

+ (instancetype)sharedInstance;
Expand Down Expand Up @@ -115,6 +122,11 @@ extern NSString * const kMinimumRequiredTalkCapability;
- (BOOL)serverHasNotificationsCapability:(NSString *)capability forAccountId:(NSString *)accountId;
- (void)setExternalSignalingServerVersion:(NSString *)version forAccountId:(NSString *)accountId;

- (BOOL)hasAvailableTranslationsForAccountId:(NSString *)accountId;
- (BOOL)hasTranslationProvidersForAccountId:(NSString *)accountId;
- (NSArray<NCTranslation *> *)availableTranslationsForAccountId:(NSString *)accountId;
- (NSArray *)translationsFromTranslationsArray:(NSArray *)translations;

@end

NS_ASSUME_NONNULL_END
61 changes: 60 additions & 1 deletion NextcloudTalk/NCDatabaseManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

NSString *const kTalkDatabaseFolder = @"Library/Application Support/Talk";
NSString *const kTalkDatabaseFileName = @"talk.realm";
uint64_t const kTalkDatabaseSchemaVersion = 54;
uint64_t const kTalkDatabaseSchemaVersion = 55;

NSString * const kCapabilitySystemMessages = @"system-messages";
NSString * const kCapabilityNotificationLevels = @"notification-levels";
Expand Down Expand Up @@ -88,6 +88,10 @@

NSString * const kMinimumRequiredTalkCapability = kCapabilitySystemMessages; // Talk 4.0 is the minimum required version

@implementation NCTranslation

@end

@implementation NCDatabaseManager

+ (NCDatabaseManager *)sharedInstance
Expand Down Expand Up @@ -385,6 +389,7 @@ - (void)setServerCapabilities:(NSDictionary *)serverCapabilities forAccountId:(N
capabilities.userStatus = [[userStatusCaps objectForKey:@"enabled"] boolValue];
capabilities.extendedSupport = [[version objectForKey:@"extendedSupport"] boolValue];
capabilities.talkCapabilities = [talkCaps objectForKey:@"features"];
capabilities.hasTranslationProviders = [[[[talkCaps objectForKey:@"config"] objectForKey:@"chat"] objectForKey:@"has-translation-providers"] boolValue];
capabilities.attachmentsAllowed = [[[[talkCaps objectForKey:@"config"] objectForKey:@"attachments"] objectForKey:@"allowed"] boolValue];
capabilities.attachmentsFolder = [[[talkCaps objectForKey:@"config"] objectForKey:@"attachments"] objectForKey:@"folder"];
capabilities.accountPropertyScopesVersion2 = [[provisioningAPICaps objectForKey:@"AccountPropertyScopesVersion"] integerValue] == 2;
Expand Down Expand Up @@ -502,4 +507,58 @@ - (void)setExternalSignalingServerVersion:(NSString *)version forAccountId:(NSSt
}];
}

- (BOOL)hasAvailableTranslationsForAccountId:(NSString *)accountId
{
return [self hasTranslationProvidersForAccountId:accountId] || [self availableTranslationsForAccountId:accountId].count > 0;
}

- (BOOL)hasTranslationProvidersForAccountId:(NSString *)accountId
{
ServerCapabilities *serverCapabilities = [self serverCapabilitiesForAccountId:accountId];

return serverCapabilities.hasTranslationProviders;
}

- (NSArray *)availableTranslationsForAccountId:(NSString *)accountId
{
ServerCapabilities *serverCapabilities = [self serverCapabilitiesForAccountId:accountId];
if (serverCapabilities) {
NSArray *translations = [self translationsArrayFromTranslationsJSONString:serverCapabilities.translations];
return [self translationsFromTranslationsArray:translations];
}
return @[];
}

- (NSArray *)translationsArrayFromTranslationsJSONString:(NSString *)translations
{
NSArray *translationsArray = @[];
NSData *data = [translations dataUsingEncoding:NSUTF8StringEncoding];
if (data) {
NSError* error;
NSArray* jsonData = [NSJSONSerialization JSONObjectWithData:data
options:0
error:&error];
if (jsonData) {
translationsArray = jsonData;
} else {
NSLog(@"Error retrieving translations JSON data: %@", error);
}
}
return translationsArray;
}

- (NSArray *)translationsFromTranslationsArray:(NSArray *)translations
{
NSMutableArray *availableTranslations = [NSMutableArray new];
for (NSDictionary *translationDict in translations) {
NCTranslation *translation = [[NCTranslation alloc] init];
translation.from = [translationDict objectForKey:@"from"];
translation.fromLabel = [translationDict objectForKey:@"fromLabel"];
translation.to = [translationDict objectForKey:@"to"];
translation.toLabel = [translationDict objectForKey:@"toLabel"];
[availableTranslations addObject:translation];
}
return availableTranslations;
}

@end
10 changes: 0 additions & 10 deletions NextcloudTalk/NCSettingsController.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,6 @@ typedef enum NCPreferredFileSorting {
NCModificationDateSorting
} NCPreferredFileSorting;

@interface NCTranslation : NSObject

@property (nonatomic, copy) NSString *from;
@property (nonatomic, copy) NSString *fromLabel;
@property (nonatomic, copy) NSString *to;
@property (nonatomic, copy) NSString *toLabel;

@end

@class NCExternalSignalingController;

@interface NCSettingsController : NSObject
Expand All @@ -90,7 +81,6 @@ typedef enum NCPreferredFileSorting {
- (void)disconnectAllExternalSignalingControllers;
- (void)subscribeForPushNotificationsForAccountId:(NSString *)accountId withCompletionBlock:(SubscribeForPushNotificationsCompletionBlock)block;
- (NSInteger)chatMaxLengthConfigCapability;
- (NSArray<NCTranslation *> *)availableTranslations;
- (BOOL)canCreateGroupAndPublicRooms;
- (BOOL)callsEnabledCapability;
- (BOOL)isGuestsAppEnabled;
Expand Down
42 changes: 0 additions & 42 deletions NextcloudTalk/NCSettingsController.m
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,6 @@ @implementation NCPushNotificationKeyPair

@end

@implementation NCTranslation

@end


@implementation NCSettingsController

Expand Down Expand Up @@ -650,44 +646,6 @@ - (NSInteger)chatMaxLengthConfigCapability
return kDefaultChatMaxLength;
}

- (NSArray<NCTranslation *> *)availableTranslations
{
TalkAccount *activeAccount = [[NCDatabaseManager sharedInstance] activeAccount];
ServerCapabilities *serverCapabilities = [[NCDatabaseManager sharedInstance] serverCapabilitiesForAccountId:activeAccount.accountId];
NSMutableArray *availableTranslations = [NSMutableArray new];
if (serverCapabilities) {
NSArray *translations = [self translationsArrayFromTranslations:serverCapabilities.translations];
for (NSDictionary *translationDict in translations) {
NCTranslation *translation = [[NCTranslation alloc] init];
translation.from = [translationDict objectForKey:@"from"];
translation.fromLabel = [translationDict objectForKey:@"fromLabel"];
translation.to = [translationDict objectForKey:@"to"];
translation.toLabel = [translationDict objectForKey:@"toLabel"];
[availableTranslations addObject:translation];
}
return availableTranslations;
}
return @[];
}

- (NSArray *)translationsArrayFromTranslations:(NSString *)translations
{
NSArray *translationsArray = @[];
NSData *data = [translations dataUsingEncoding:NSUTF8StringEncoding];
if (data) {
NSError* error;
NSArray* jsonData = [NSJSONSerialization JSONObjectWithData:data
options:0
error:&error];
if (jsonData) {
translationsArray = jsonData;
} else {
NSLog(@"Error retrieving reactions JSON data: %@", error);
}
}
return translationsArray;
}

- (BOOL)canCreateGroupAndPublicRooms
{
TalkAccount *activeAccount = [[NCDatabaseManager sharedInstance] activeAccount];
Expand Down
1 change: 1 addition & 0 deletions NextcloudTalk/ServerCapabilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ NS_ASSUME_NONNULL_BEGIN
@property RLMArray<RLMString> *talkCapabilities;
@property NSInteger chatMaxLength;
@property NSString *translations;
@property BOOL hasTranslationProviders;
@property BOOL canCreate;
@property BOOL attachmentsAllowed;
@property NSString *attachmentsFolder;
Expand Down
3 changes: 3 additions & 0 deletions NextcloudTalk/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,9 @@
/* No comment provided by engineer. */
"Could not delete conversation" = "Could not delete conversation";

/* No comment provided by engineer. */
"Could not get available languages" = "Could not get available languages";

/* No comment provided by engineer. */
"Could not join %@ call" = "Could not join %@ call";

Expand Down
Loading