diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 8bd14750f..20c21ea25 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -43,6 +43,15 @@ 32471CE21F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32471CE01F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib */; }; 325072141E8C0AC900A084B6 /* LaunchScreenLogo.png in Resources */ = {isa = PBXBuildFile; fileRef = 325072131E8C0AC900A084B6 /* LaunchScreenLogo.png */; }; 325E1C151E8D03950018D91E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 325E1C131E8D03950018D91E /* LaunchScreen.storyboard */; }; + 327382B51F276AD200356143 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382A81F276AD200356143 /* InfoPlist.strings */; }; + 327382B61F276AD200356143 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382AA1F276AD200356143 /* Localizable.strings */; }; + 327382B71F276AD200356143 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382AC1F276AD200356143 /* Vector.strings */; }; + 327382B81F276AD200356143 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382AF1F276AD200356143 /* InfoPlist.strings */; }; + 327382B91F276AD200356143 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382B11F276AD200356143 /* Localizable.strings */; }; + 327382BA1F276AD200356143 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382B31F276AD200356143 /* Vector.strings */; }; + 327382C21F276AED00356143 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382BC1F276AED00356143 /* InfoPlist.strings */; }; + 327382C31F276AED00356143 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382BE1F276AED00356143 /* Localizable.strings */; }; + 327382C41F276AED00356143 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382C01F276AED00356143 /* Vector.strings */; }; 32AE61E41F0A971B007255F4 /* RoomMembershipBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */; }; 32AE61E51F0A971B007255F4 /* RoomMembershipBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */; }; 32AE61E91F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E71F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m */; }; @@ -73,9 +82,6 @@ F075BEDC1EBB26F100A7B68A /* TableViewCellWithCollectionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = F075BEDA1EBB26F100A7B68A /* TableViewCellWithCollectionView.xib */; }; F083BD1D1E7009ED00A9B29C /* RageShakeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BB0B1E7009EC00A9B29C /* RageShakeManager.m */; }; F083BD1E1E7009ED00A9B29C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BB0D1E7009EC00A9B29C /* AppDelegate.m */; }; - F083BD1F1E7009ED00A9B29C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F083BB0F1E7009EC00A9B29C /* InfoPlist.strings */; }; - F083BD201E7009ED00A9B29C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F083BB111E7009EC00A9B29C /* Localizable.strings */; }; - F083BD211E7009ED00A9B29C /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = F083BB131E7009EC00A9B29C /* Vector.strings */; }; F083BD221E7009ED00A9B29C /* add_participant.png in Resources */ = {isa = PBXBuildFile; fileRef = F083BB161E7009EC00A9B29C /* add_participant.png */; }; F083BD231E7009ED00A9B29C /* add_participant@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = F083BB171E7009EC00A9B29C /* add_participant@2x.png */; }; F083BD241E7009ED00A9B29C /* add_participant@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = F083BB181E7009EC00A9B29C /* add_participant@3x.png */; }; @@ -568,6 +574,15 @@ 32471CE01F13AC1500BDF50A /* RoomMembershipExpandedWithPaginationTitleBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomMembershipExpandedWithPaginationTitleBubbleCell.xib; sourceTree = ""; }; 325072131E8C0AC900A084B6 /* LaunchScreenLogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = LaunchScreenLogo.png; path = Assets/Images/LaunchScreenLogo.png; sourceTree = ""; }; 325E1C141E8D03950018D91E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 327382A91F276AD200356143 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = InfoPlist.strings; sourceTree = ""; }; + 327382AB1F276AD200356143 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Localizable.strings; sourceTree = ""; }; + 327382AD1F276AD200356143 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Vector.strings; sourceTree = ""; }; + 327382B01F276AD200356143 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = InfoPlist.strings; sourceTree = ""; }; + 327382B21F276AD200356143 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = Localizable.strings; sourceTree = ""; }; + 327382B41F276AD200356143 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = Vector.strings; sourceTree = ""; }; + 327382BD1F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = InfoPlist.strings; sourceTree = ""; }; + 327382BF1F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Localizable.strings; sourceTree = ""; }; + 327382C11F276AED00356143 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Vector.strings; sourceTree = ""; }; 32AE61E11F0A971B007255F4 /* RoomMembershipBubbleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMembershipBubbleCell.h; sourceTree = ""; }; 32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomMembershipBubbleCell.m; sourceTree = ""; }; 32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomMembershipBubbleCell.xib; sourceTree = ""; }; @@ -616,9 +631,6 @@ F083BB0B1E7009EC00A9B29C /* RageShakeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RageShakeManager.m; sourceTree = ""; }; F083BB0C1E7009EC00A9B29C /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; F083BB0D1E7009EC00A9B29C /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - F083BB101E7009EC00A9B29C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - F083BB121E7009EC00A9B29C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - F083BB141E7009EC00A9B29C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Vector.strings; sourceTree = ""; }; F083BB161E7009EC00A9B29C /* add_participant.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add_participant.png; sourceTree = ""; }; F083BB171E7009EC00A9B29C /* add_participant@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_participant@2x.png"; sourceTree = ""; }; F083BB181E7009EC00A9B29C /* add_participant@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "add_participant@3x.png"; sourceTree = ""; }; @@ -1214,6 +1226,36 @@ path = Directory; sourceTree = ""; }; + 327382A71F276AD200356143 /* de.lproj */ = { + isa = PBXGroup; + children = ( + 327382A81F276AD200356143 /* InfoPlist.strings */, + 327382AA1F276AD200356143 /* Localizable.strings */, + 327382AC1F276AD200356143 /* Vector.strings */, + ); + path = de.lproj; + sourceTree = ""; + }; + 327382AE1F276AD200356143 /* fr.lproj */ = { + isa = PBXGroup; + children = ( + 327382AF1F276AD200356143 /* InfoPlist.strings */, + 327382B11F276AD200356143 /* Localizable.strings */, + 327382B31F276AD200356143 /* Vector.strings */, + ); + path = fr.lproj; + sourceTree = ""; + }; + 327382BB1F276AED00356143 /* en.lproj */ = { + isa = PBXGroup; + children = ( + 327382BC1F276AED00356143 /* InfoPlist.strings */, + 327382BE1F276AED00356143 /* Localizable.strings */, + 327382C01F276AED00356143 /* Vector.strings */, + ); + path = en.lproj; + sourceTree = ""; + }; 32AE61EB1F0D2183007255F4 /* nl.lproj */ = { isa = PBXGroup; children = ( @@ -1294,10 +1336,10 @@ F083BB0E1E7009EC00A9B29C /* Assets */ = { isa = PBXGroup; children = ( + 327382A71F276AD200356143 /* de.lproj */, + 327382BB1F276AED00356143 /* en.lproj */, + 327382AE1F276AD200356143 /* fr.lproj */, 32AE61EB1F0D2183007255F4 /* nl.lproj */, - F083BB0F1E7009EC00A9B29C /* InfoPlist.strings */, - F083BB111E7009EC00A9B29C /* Localizable.strings */, - F083BB131E7009EC00A9B29C /* Vector.strings */, F083BB151E7009EC00A9B29C /* Images */, F083BBDA1E7009EC00A9B29C /* Sounds */, ); @@ -2216,6 +2258,8 @@ en, Base, nl, + de, + fr, ); mainGroup = F094A9991B78D8F000B1FBBF; productRefGroup = F094A9A31B78D8F000B1FBBF /* Products */; @@ -2254,7 +2298,6 @@ F083BD781E7009ED00A9B29C /* e2e_warning@2x.png in Resources */, F083BD431E7009ED00A9B29C /* call_speaker_on_icon@2x.png in Resources */, F083BE1D1E7009ED00A9B29C /* RoomMemberDetailsViewController.xib in Resources */, - F083BD201E7009ED00A9B29C /* Localizable.strings in Resources */, F083BD5B1E7009ED00A9B29C /* chevron@3x.png in Resources */, F083BD8A1E7009ED00A9B29C /* file_music_icon@2x.png in Resources */, F083BE451E7009ED00A9B29C /* RoomIncomingEncryptedTextMsgWithoutSenderNameBubbleCell.xib in Resources */, @@ -2329,6 +2372,7 @@ F083BDA31E7009ED00A9B29C /* newmessages@3x.png in Resources */, F083BE591E7009ED00A9B29C /* RoomOutgoingEncryptedTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.xib in Resources */, F083BD821E7009ED00A9B29C /* favourite@3x.png in Resources */, + 327382B51F276AD200356143 /* InfoPlist.strings in Resources */, F083BD551E7009ED00A9B29C /* camera_switch@3x.png in Resources */, F083BE361E7009ED00A9B29C /* MediaAlbumTableCell.xib in Resources */, F083BD7B1E7009ED00A9B29C /* edit_icon@2x.png in Resources */, @@ -2373,6 +2417,8 @@ F083BD4B1E7009ED00A9B29C /* camera_capture.png in Resources */, F083BD841E7009ED00A9B29C /* favouriteOff@2x.png in Resources */, F083BE671E7009ED00A9B29C /* RoomIncomingTextMsgWithPaginationTitleBubbleCell.xib in Resources */, + 327382B91F276AD200356143 /* Localizable.strings in Resources */, + 327382C31F276AED00356143 /* Localizable.strings in Resources */, F083BDB21E7009ED00A9B29C /* priorityHigh@3x.png in Resources */, F083BDD71E7009ED00A9B29C /* start_chat.png in Resources */, F083BDE81E7009ED00A9B29C /* message.mp3 in Resources */, @@ -2386,6 +2432,7 @@ F0E05A311EA0F9EB004B83FB /* tab_favourites_selected@2x.png in Resources */, F083BD741E7009ED00A9B29C /* e2e_verified.png in Resources */, F083BD2A1E7009ED00A9B29C /* animatedLogo-2.png in Resources */, + 327382B71F276AD200356143 /* Vector.strings in Resources */, F0E05A471EA0F9EB004B83FB /* tab_rooms@3x.png in Resources */, F083BD8E1E7009ED00A9B29C /* file_photo_icon@3x.png in Resources */, F0E05A361EA0F9EB004B83FB /* tab_home_selected.png in Resources */, @@ -2406,6 +2453,7 @@ F083BD871E7009ED00A9B29C /* file_doc_icon@2x.png in Resources */, F083BDCF1E7009ED00A9B29C /* selection_untick@2x.png in Resources */, F083BDDF1E7009ED00A9B29C /* upload_icon@3x.png in Resources */, + 327382B61F276AD200356143 /* Localizable.strings in Resources */, F083BD6D1E7009ED00A9B29C /* disclosure_icon@3x.png in Resources */, 32AE61F31F0D2183007255F4 /* Localizable.strings in Resources */, F083BDE61E7009ED00A9B29C /* busy.mp3 in Resources */, @@ -2432,6 +2480,8 @@ F0614A0E1EDDCCE700F5DC9A /* jump_to_unread@2x.png in Resources */, F083BDC21E7009ED00A9B29C /* scrollup.png in Resources */, F083BD521E7009ED00A9B29C /* camera_stop@2x.png in Resources */, + 327382C21F276AED00356143 /* InfoPlist.strings in Resources */, + 327382B81F276AD200356143 /* InfoPlist.strings in Resources */, F0E05A381EA0F9EB004B83FB /* tab_home_selected@3x.png in Resources */, F083BDDA1E7009ED00A9B29C /* typing.png in Resources */, F083BE831E7009ED00A9B29C /* RecentTableViewCell.xib in Resources */, @@ -2521,11 +2571,9 @@ F083BE711E7009ED00A9B29C /* RoomOutgoingTextMsgBubbleCell.xib in Resources */, F083BD5E1E7009ED00A9B29C /* create_room@3x.png in Resources */, F083BE6B1E7009ED00A9B29C /* RoomOutgoingAttachmentBubbleCell.xib in Resources */, - F083BD1F1E7009ED00A9B29C /* InfoPlist.strings in Resources */, F083BD4C1E7009ED00A9B29C /* camera_capture@2x.png in Resources */, F083BD8F1E7009ED00A9B29C /* file_video_icon.png in Resources */, F083BE631E7009ED00A9B29C /* RoomIncomingTextMsgWithoutSenderInfoBubbleCell.xib in Resources */, - F083BD211E7009ED00A9B29C /* Vector.strings in Resources */, F083BE301E7009ED00A9B29C /* ContactTableViewCell.xib in Resources */, F083BE571E7009ED00A9B29C /* RoomOutgoingEncryptedTextMsgWithPaginationTitleBubbleCell.xib in Resources */, F083BE771E7009ED00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleBubbleCell.xib in Resources */, @@ -2558,6 +2606,8 @@ F083BDC61E7009ED00A9B29C /* search_bg@2x.png in Resources */, F083BD421E7009ED00A9B29C /* call_speaker_on_icon.png in Resources */, F083BD9A1E7009ED00A9B29C /* logo@3x.png in Resources */, + 327382BA1F276AD200356143 /* Vector.strings in Resources */, + 327382C41F276AED00356143 /* Vector.strings in Resources */, F083BDE51E7009ED00A9B29C /* voice_call_icon@3x.png in Resources */, 322806A11F0F64C4008C53D7 /* RoomMembershipExpandedBubbleCell.xib in Resources */, F083BE201E7009ED00A9B29C /* RoomParticipantsViewController.xib in Resources */, @@ -2863,6 +2913,78 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; + 327382A81F276AD200356143 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382A91F276AD200356143 /* de */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 327382AA1F276AD200356143 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382AB1F276AD200356143 /* de */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 327382AC1F276AD200356143 /* Vector.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382AD1F276AD200356143 /* de */, + ); + name = Vector.strings; + sourceTree = ""; + }; + 327382AF1F276AD200356143 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382B01F276AD200356143 /* fr */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 327382B11F276AD200356143 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382B21F276AD200356143 /* fr */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 327382B31F276AD200356143 /* Vector.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382B41F276AD200356143 /* fr */, + ); + name = Vector.strings; + sourceTree = ""; + }; + 327382BC1F276AED00356143 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382BD1F276AED00356143 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 327382BE1F276AED00356143 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382BF1F276AED00356143 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; + 327382C01F276AED00356143 /* Vector.strings */ = { + isa = PBXVariantGroup; + children = ( + 327382C11F276AED00356143 /* en */, + ); + name = Vector.strings; + sourceTree = ""; + }; 32AE61EC1F0D2183007255F4 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -2887,30 +3009,6 @@ name = Vector.strings; sourceTree = ""; }; - F083BB0F1E7009EC00A9B29C /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - F083BB101E7009EC00A9B29C /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - F083BB111E7009EC00A9B29C /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - F083BB121E7009EC00A9B29C /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - F083BB131E7009EC00A9B29C /* Vector.strings */ = { - isa = PBXVariantGroup; - children = ( - F083BB141E7009EC00A9B29C /* en */, - ); - name = Vector.strings; - sourceTree = ""; - }; F083BBE21E7009EC00A9B29C /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( diff --git a/Riot/AppDelegate.m b/Riot/AppDelegate.m index 82016dbf4..b29c573b3 100644 --- a/Riot/AppDelegate.m +++ b/Riot/AppDelegate.m @@ -1111,6 +1111,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN NSString *roomIdOrAlias; NSString *eventId; + NSString *userId; // Check permalink to room or event if ([pathParams[0] isEqualToString:@"room"] && pathParams.count >= 2) @@ -1128,6 +1129,19 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN roomIdOrAlias = pathParams[0]; eventId = (pathParams.count >= 2) ? pathParams[1] : nil; } + + // Check permalink to a user + else if ([pathParams[0] isEqualToString:@"user"] && pathParams.count == 2) + { + // The link is the form of "/user/userId" + userId = pathParams[1]; + } + else if ([pathParams[0] hasPrefix:@"@"] && pathParams.count == 1) + { + // The link is the form of "/#/[userId]" + // Such links come from matrix.to permalinks + userId = pathParams[0]; + } // Check the conditions to keep the room alias information of a pending fragment. if (universalLinkFragmentPendingRoomAlias) @@ -1295,6 +1309,33 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN }]; } } + else if (userId) + { + // Check there is an account that knows this user + MXUser *mxUser; + MXKAccount *account = [accountManager accountKnowingUserWithUserId:userId]; + if (account) + { + mxUser = [account.mxSession userWithUserId:userId]; + } + + // Prepare the display name of this user + NSString *displayName; + if (mxUser) + { + displayName = (mxUser.displayname.length > 0) ? mxUser.displayname : userId; + } + else + { + displayName = userId; + } + + // Create the contact related to this member + MXKContact *contact = [[MXKContact alloc] initMatrixContactWithDisplayName:displayName andMatrixID:userId]; + [self showContact:contact]; + + continueUserActivity = YES; + } else if ([pathParams[0] isEqualToString:@"register"]) { NSLog(@"[AppDelegate] Universal link with registration parameters"); @@ -2319,6 +2360,15 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN #pragma mark - Contacts handling +- (void)showContact:(MXKContact*)contact +{ + [self restoreInitialDisplay:^{ + + [self.masterTabBarController selectContact:contact]; + + }]; +} + - (void)refreshLocalContacts { // Check whether the application is allowed to access the local contacts. diff --git a/Riot/Assets/de.lproj/InfoPlist.strings b/Riot/Assets/de.lproj/InfoPlist.strings new file mode 100644 index 000000000..caec21584 --- /dev/null +++ b/Riot/Assets/de.lproj/InfoPlist.strings @@ -0,0 +1,5 @@ +// Permissions usage explanations +"NSCameraUsageDescription" = "Die Kamera wird verwendet um Fotos und Videos aufzunehmen sowie Video-Anrufe zu führen."; +"NSPhotoLibraryUsageDescription" = "Die Foto-Bibliothek wird verwendet um Fotos und Videos zu senden."; +"NSMicrophoneUsageDescription" = "Das Mikrofon wird verwendet um Videos aufzunehmen sowie Gespräche zu führen."; +"NSContactsUsageDescription" = "Das Adressbuch wird verwendet um nach Nutzern aufgrund ihrer E-Mail oder Telefon-Nummer zu suchen."; diff --git a/Riot/Assets/de.lproj/Localizable.strings b/Riot/Assets/de.lproj/Localizable.strings new file mode 100644 index 000000000..62113a966 --- /dev/null +++ b/Riot/Assets/de.lproj/Localizable.strings @@ -0,0 +1,48 @@ +/* New message from a specific person, not referencing a room */ +"MSG_FROM_USER" = "Nachricht von %@"; +/* New message from a specific person in a named room */ +"MSG_FROM_USER_IN_ROOM" = "%@ schrieb in %@"; +/* New message from a specific person, not referencing a room. Content included. */ +"MSG_FROM_USER_WITH_CONTENT" = "%@: %@"; +/* New message from a specific person in a named room. Content included. */ +"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ in %@: %@"; +/* New action message from a specific person, not referencing a room. */ +"ACTION_FROM_USER" = "* %@ %@"; +/* New action message from a specific person in a named room. */ +"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@"; +/* New action message from a specific person, not referencing a room. */ +"IMAGE_FROM_USER" = "%@ sandte dir ein Bild"; +/* New action message from a specific person in a named room. */ +"IMAGE_FROM_USER_IN_ROOM" = "%@ sandte ein Bild in %@"; +/* Multiple unread messages in a room */ +"UNREAD_IN_ROOM" = "%@ neue Nachrichten in %@"; +/* Multiple unread messages from a specific person, not referencing a room */ +"MSGS_FROM_USER" = "%@ neue Nachrichten in %@"; +/* Multiple unread messages from two people */ +"MSGS_FROM_TWO_USERS" = "%@ neue Nachrichten von %@ und %@"; +/* Multiple unread messages from three people */ +"MSGS_FROM_THREE_USERS" = "%@ neue Nachrichten von %@, %@ und %@"; +/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ +"MSGS_FROM_TWO_PLUS_USERS" = "%@ neue Nachrichten von %@, %@ und anderen"; +/* Multiple messages in two rooms */ +"MSGS_IN_TWO_ROOMS" = "%@ neue Nachrichten in %@ und %@"; +/* Look, stuff's happened, alright? Just open the app. */ +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ neue Nachrichten in %@, %@ und anderen"; +/* A user has invited you to a chat */ +"USER_INVITE_TO_CHAT" = "%@ hat dich zum chatten eingeladen"; +/* A user has invited you to an (unamed) group chat */ +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ hat dich in einen Gruppenchat eingeladen"; +/* A user has invited you to a named room */ +"USER_INVITE_TO_NAMED_ROOM" = "%@ hat dich in %@ eingeladen"; +/* Incoming one-to-one voice call */ +"VOICE_CALL_FROM_USER" = "Anruf von %@"; +/* Incoming one-to-one video call */ +"VIDEO_CALL_FROM_USER" = "Video-Anruf von %@"; +/* Incoming unnamed voice conference invite from a specific person */ +"VOICE_CONF_FROM_USER" = "Gruppen-Anruf von %@"; +/* Incoming unnamed video conference invite from a specific person */ +"VIDEO_CONF_FROM_USER" = "Video-Gruppen-Anruf von %@"; +/* Incoming named voice conference invite from a specific person */ +"VOICE_CONF_NAMED_FROM_USER" = "Gruppen-Anruf von %@: '%@'"; +/* Incoming named video conference invite from a specific person */ +"VIDEO_CONF_NAMED_FROM_USER" = "Video-Gruppen-Anruf von %@: '%@'"; diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings new file mode 100644 index 000000000..1b4e0bddb --- /dev/null +++ b/Riot/Assets/de.lproj/Vector.strings @@ -0,0 +1,422 @@ +"back" = "Zurück"; +"continue" = "Fortsetzen"; +"retry" = "Wiederholen"; +"cancel" = "Abbruch"; +"save" = "Speichern"; +"leave" = "Verlassen"; +// Actions +"view" = "Ansehen"; +"invite" = "Einladen"; +// Room Details +"room_details_title" = "Raum Details"; +"title_favourites" = "Favoriten"; +"title_people" = "Personen"; +"title_rooms" = "Räume"; +"warning" = "Warnung"; +"remove" = "Entferne"; +"start" = "Starte"; +"create" = "Erstelle"; +"on" = "An"; +"off" = "Aus"; +"join" = "Beitreten"; +"decline" = "Ablehnen"; +"accept" = "Akzeptieren"; +"preview" = "Vorschau"; +"camera" = "Kamera"; +"voice" = "Sprache"; +"video" = "Video"; +"active_call" = "Aktives Gespräch"; +"active_call_details" = "Aktives Gespräch (%@)"; +"later" = "Später"; +"rename" = "Umbenennen"; +// Authentication +"auth_login" = "Anmelden"; +"auth_register" = "Registrieren"; +"auth_submit" = "Bestätigen"; +"auth_skip" = "Überspringen"; +"auth_send_reset_email" = "Sende Rücksetz-E-Mail"; +"auth_return_to_login" = "Gehe zurück zum Anmeldefenster"; +"auth_user_id_placeholder" = "E-Mail oder Nutzername"; +"auth_password_placeholder" = "Passwort"; +"auth_new_password_placeholder" = "Neues Passwort"; +"auth_user_name_placeholder" = "Nutzername"; +"auth_optional_email_placeholder" = "E-Mail-Adresse (optional)"; +"auth_email_placeholder" = "E-Mail-Adresse"; +"auth_optional_phone_placeholder" = "Telefon-Nummer (optional)"; +"auth_phone_placeholder" = "Telefon-Nummer"; +"auth_repeat_password_placeholder" = "Wiederhole Passwort"; +"auth_repeat_new_password_placeholder" = "Bestätige dein neues Passwort"; +"auth_invalid_user_name" = "Nutzernamen dürfen nur Buchstaben, Nummern, Punkte, Binde- und Unterstriche enthalten"; +"auth_invalid_password" = "Passwort zu kurz (min. 6 Zeichen)"; +"auth_invalid_email" = "Dies sieht nicht nach eine validen E-Mail-Adresse aus"; +"auth_invalid_phone" = "Dies sieht nicht nach einer validen Telefon-Nummer aus"; +"auth_missing_password" = "Passwort fehlt"; +"auth_missing_email" = "Fehlende E-Mail-Adresse"; +"auth_missing_phone" = "Fehlende Telefon-Nummer"; +"auth_missing_email_or_phone" = "Fehlende E-Mail-Adresse oder Telefon-Nummer"; +"auth_password_dont_match" = "Passwörter stimmen nicht überein"; +"auth_username_in_use" = "Nutzername bereits verwendet"; +"auth_forgot_password" = "Passwort vergessen?"; +"auth_msisdn_validation_title" = "Verifizierung ausstehend"; +"auth_msisdn_validation_message" = "Wir sandten eine SMS mit einem Aktivierungs-Code. Bitte gebe den unten ein."; +"auth_msisdn_validation_error" = "Telefonnummer kann nicht verifiziert werden."; +"auth_reset_password_missing_password" = "Ein neues Passwort muss eingegeben werden."; +"auth_reset_password_next_step_button" = "Ich habe meine E-Mail-Adresse verifiziert"; +"auth_reset_password_email_validation_message" = "Eine E-Mail wurde an %@ gesendet. Wenn du dem Link dort gefolgt bist, klicke unten."; +// Chat creation +"room_creation_title" = "Neuer Chat"; +"room_creation_account" = "Konto"; +"room_creation_appearance" = "Aussehen"; +"room_creation_appearance_name" = "Name"; +"room_creation_appearance_picture" = "Avatar (optional)"; +"room_creation_privacy" = "Datenschutz"; +"room_creation_private_room" = "Dieser Chat ist privat"; +"room_creation_public_room" = "Dieser Chat ist öffentlich"; +"room_creation_make_public" = "Mache öffentlich"; +"room_creation_make_public_prompt_title" = "Diesen Chat öffentlich machen?"; +"room_creation_keep_private" = "Privat lassen"; +"room_creation_make_private" = "Mache privat"; +"room_creation_wait_for_creation" = "Ein wurde wurde bereits erstellt. Bitte warten."; +// Room recents +"room_recents_directory_section" = "RAUM VERZEICHNIS"; +"room_recents_directory_section_network" = "Netzwerk"; +"room_recents_favourites_section" = "FAVORITEN"; +"room_recents_people_section" = "PERSONEN"; +"room_recents_conversations_section" = "RÄUME"; +"room_recents_no_conversation" = "Keine Räume"; +"room_recents_low_priority_section" = "NIEDRIGE PRIORITÄT"; +"room_recents_invites_section" = "EINLADUNGEN"; +"room_recents_start_chat_with" = "Starte Chat"; +"room_recents_create_empty_room" = "Erstelle Raum"; +"room_recents_join_room" = "Trete Raum bei"; +"room_recents_join_room_title" = "Trete einem Raum bei"; +// People tab +"people_invites_section" = "EINLADUNGEN"; +"people_conversation_section" = "GESPRÄCHE"; +"people_no_conversation" = "Keine Gespräche"; +// Rooms tab +"room_directory_no_public_room" = "Keine öffentlichen Räume verfügbar"; +// Search +"search_rooms" = "Räume"; +"search_messages" = "Nachrichten"; +"search_people" = "Personen"; +"search_files" = "Dateien"; +"search_default_placeholder" = "Suche"; +"search_people_placeholder" = "Suche nach Nutzer-ID, Name oder E-Mail"; +"search_no_result" = "Keine Ergebnisse"; +// Directory +"directory_cell_title" = "Durchsuche Verzeichnis"; +"directory_search_results_title" = "Durchsuche Verzeichnis-Ergebnisse"; +"directory_searching_title" = "Durchsuche Verzeichnis…"; +"directory_search_fail" = "Daten konnten nicht geladen werden"; +// Contacts +"contacts_address_book_section" = "LOKALE KONTAKTE"; +"contacts_address_book_matrix_users_toggle" = "Nur Matrix-Nutzer"; +"contacts_address_book_no_contact" = "Keine lokalen Kontakte"; +"contacts_address_book_permission_required" = "Berechtigungen benötigt um auf lokale Kontakte zuzugreifen"; +// Chat participants +"room_participants_title" = "Teilnehmer"; +"room_participants_add_participant" = "Teilnehmer hinzufügen"; +"room_participants_one_participant" = "1 Teilnehmer"; +"room_participants_multi_participants" = "%d Teilnehmer"; +"room_participants_leave_prompt_title" = "Raum verlassen"; +"room_participants_leave_prompt_msg" = "Bist du sicher, dass du den Raum verlassen willst?"; +"room_participants_remove_prompt_title" = "Bestätigung"; +"room_participants_remove_prompt_msg" = "Bist du sicher, dass du %@ aus dem Chat entfernen möchtest?"; +"room_participants_invite_prompt_title" = "Bestätigung"; +"room_participants_invite_prompt_msg" = "Bist du sicher, dass du %@ in diesen Chat einladen möchtest?"; +"room_participants_filter_room_members" = "Filtere Raum-Mitglieder"; +"room_participants_invite_malformed_id_title" = "Fehler beim Einladen"; +"room_participants_invited_section" = "EINGELADEN"; +"room_participants_online" = "Online"; +"room_participants_offline" = "Offline"; +"room_participants_unknown" = "Unbekannt"; +"room_participants_now" = "jetzt"; +"room_participants_action_section_direct_chats" = "Direkte Chats"; +"room_participants_action_section_devices" = "Geräte"; +"room_participants_action_section_other" = "Anderes"; +"room_participants_action_invite" = "Einladen"; +"room_participants_action_leave" = "Diesen Raum verlassen"; +"room_participants_action_remove" = "Von diesem Raum entfernen"; +"room_participants_action_ban" = "Aus diesem Raum bannen"; +"room_participants_action_ignore" = "Alle Nachrichten von diesem Nutzer verbergen"; +"room_participants_action_unignore" = "Zeige alle Nachrichten von diesem Nutzer"; +"room_participants_action_set_moderator" = "Mache zu Moderator"; +"room_participants_action_set_admin" = "Mache zum Administrator"; +"room_participants_action_start_new_chat" = "Starte neuen Chat"; +"room_participants_action_start_video_call" = "Starte Video-Anruf"; +"room_participants_action_mention" = "Erwähnen"; +// Chat +"room_jump_to_first_unread" = "Springe zur ersten ungelesenen Nachricht"; +"room_new_message_notification" = "%d neue Nachricht"; +"room_new_messages_notification" = "%d neue Nachrichten"; +"room_one_user_is_typing" = "%@ tippt…"; +"room_two_users_are_typing" = "%@ & %@ tippen…"; +"room_many_users_are_typing" = "%@, %@ & andere tippen…"; +"room_message_placeholder" = "Sende eine Nachricht (unverschlüsselt)…"; +"encrypted_room_message_placeholder" = "Seine eine verschlüsselte Nachricht…"; +"room_message_short_placeholder" = "Sende eine Nachricht…"; +"room_offline_notification" = "Verbindung zum Server wurde unterbrochen."; +"room_unsent_messages_notification" = "Nachrichten wurden nicht gesendet. Jetzt %@ oder %@?"; +"room_unsent_messages_unknown_devices_notification" = "Nachrichten wurden nicht gesendet, da unbekannte Geräte anwesend waren. Jetzt %@ oder %@?"; +"room_prompt_resend" = "alle erneut senden"; +"room_prompt_cancel" = "alles abbrechen"; +"room_resend_unsent_messages" = "Ungesendete Nachrichten erneut senden"; +"room_delete_unsent_messages" = "Lösche ungesendete Nachrichten"; +"room_event_action_copy" = "Kopieren"; +"room_event_action_quote" = "Zitieren"; +"room_event_action_more" = "Mehr"; +"room_event_action_share" = "Teilen"; +"room_event_action_permalink" = "Permalink"; +"room_event_action_view_source" = "Zeige Quellcode"; +"room_event_action_report" = "Inhalt melden"; +"room_event_action_report_prompt_reason" = "Grund fürs Melden dieses Inhalts"; +"room_event_action_report_prompt_ignore_user" = "Möchtest du alle Nachrichten dieses Nutzers verbergen?"; +"room_event_action_save" = "Speichern"; +"room_event_action_resend" = "Erneut senden"; +"room_event_action_delete" = "Löschen"; +"room_event_action_cancel_upload" = "Hochladen abbrechen"; +"room_event_action_cancel_download" = "Herunterladen abbrechen"; +"room_event_action_view_encryption" = "Verschlüsselungs-Informationen"; +// Unknown devices +"unknown_devices_alert_title" = "Raum enthält unbekannte Geräte"; +"unknown_devices_send_anyway" = "Trotzdem senden"; +"unknown_devices_call_anyway" = "Trotzdem Anrufen"; +"unknown_devices_answer_anyway" = "Trotzdem beantworten"; +"unknown_devices_verify" = "Verifiziere…"; +"unknown_devices_title" = "Unbekannte Geräte"; +// Room Title +"room_title_new_room" = "Neuer Raum"; +"room_title_multiple_active_members" = "%@/%@ aktive Mitglieder"; +"room_title_one_active_member" = "%@/%@ aktive Mitglieder"; +"room_title_invite_members" = "Mitglieder einladen"; +"room_title_members" = "%@ Mitglieder"; +"room_title_one_member" = "1 Mitglied"; +// Room Preview +"room_preview_invitation_format" = "Du wurdest von %@ eingeladen diesem Raum beizutreten"; +"room_preview_subtitle" = "Dies ist eine Vorschau dieses Raums. Interaktionen mit dem Raum wurden deaktiviert."; +"room_preview_try_join_an_unknown_room_default" = "einem Raum"; +// Settings +"settings_title" = "Einstellungen"; +"account_logout_all" = "Von allen Konten abmelden"; +"settings_config_no_build_info" = "Keine Build-Informationen"; +"settings_mark_all_as_read" = "Markiere alle Nachrichten als gelesen"; +"settings_report_bug" = "Fehler melden"; +"settings_config_home_server" = "Heimserver ist %@"; +"settings_config_user_id" = "Als %@ angemeldet"; +"settings_user_settings" = "NUTZER-EINSTELLUNGEN"; +"settings_notifications_settings" = "BENACHRICHTIGUNGS-EINSTELLUNGEN"; +"settings_ignored_users" = "IGNORIERTE NUTZER"; +"settings_contacts" = "LOKALE KONTAKTE"; +"settings_advanced" = "ERWEITERT"; +"settings_other" = "ANDERES"; +"settings_devices" = "GERÄTE"; +"settings_cryptography" = "VERSCHLÜSSELUNG"; +"settings_sign_out" = "Abmelden"; +"settings_sign_out_confirmation" = "Bist du sicher?"; +"settings_display_name" = "Anzeigename"; +"settings_profile_picture" = "Profilbild"; +"settings_first_name" = "Vorname"; +"settings_surname" = "Nachname"; +"settings_remove_prompt_title" = "Bestätigung"; +"settings_remove_email_prompt_msg" = "Bist du sicher, dass du die E-Mail-Adresse %@ entfernen möchtest?"; +"settings_email_address" = "E-Mail"; +"settings_email_address_placeholder" = "Gebe deine E-Mail-Adresse ein"; +"settings_add_email_address" = "Füge E-Mail-Adresse hinzu"; +"settings_remove_phone_prompt_msg" = "Bist du sicher, dass du die Telefon-Nummer %@ entfernen möchtest?"; +"settings_night_mode" = "Nacht Modus"; +"settings_enable_push_notif" = "Benachrichtungen auf diesem Gerät"; +"settings_unignore_user" = "Alle Nachrichten von %@ anzeigen?"; +"settings_contacts_phonebook_country" = "Telefonbuch-Land"; +"settings_labs_e2e_encryption" = "Ende-zu-Ende-Verschlüsselung"; +"settings_version" = "Version %@"; +"settings_olm_version" = "Olm-Version %@"; +"settings_copyright" = "Kopierrecht"; +"settings_copyright_url" = "https://riot.im/copyright"; +"settings_term_conditions" = "Geschäftsbedingungen"; +"settings_privacy_policy" = "Datenschutzerklärung"; +"settings_privacy_policy_url" = "https://riot.im/privacy"; +"settings_term_conditions_url" = "https://riot.im/tac_apple"; +"settings_send_crash_report" = "Sende anonyme Absturz- & Nutzungsdaten"; +"settings_change_password" = "Passwort ändern"; +"settings_old_password" = "altes Passwort"; +"settings_new_password" = "neues Passwort"; +"settings_confirm_password" = "bestätige Passwort"; +"settings_password_updated" = "Dein Passwort wurde aktualisiert"; +"settings_crypto_device_name" = "Gerätename: "; +"settings_crypto_device_key" = "\nGeräte-Schlüssel: "; +"settings_crypto_export" = "Schlüssel exportieren"; +"room_details_settings" = "Einstellungen"; +"room_details_photo" = "Raum-Bild"; +"room_details_room_name" = "Raum-Name"; +"room_details_topic" = "Thema"; +"room_details_favourite_tag" = "Favorit"; +"room_details_low_priority_tag" = "Niedrige Priorität"; +"room_details_access_section" = "Wer kann auf diesen Raum zugreifen?"; +"room_details_access_section_invited_only" = "Nur Personen, die eingeladen wurden"; +"room_details_access_section_anyone_apart_from_guest" = "Jeder, der den Raum-Link kennt - außer Gäste"; +"room_details_access_section_anyone" = "Jeder, der den Raum-Link kennt - auch Gäste"; +"room_details_history_section" = "Wer kann die Historie lesen?"; +"room_details_history_section_anyone" = "Jeder"; +"room_details_history_section_members_only" = "Nur Teilnehmer (ab dem Selektieren dieser Option)"; +"room_details_history_section_members_only_since_invited" = "Nur Teilnehmer (seitdem sie eingeladen wurden)"; +"room_details_history_section_members_only_since_joined" = "Nur Teilnehmer (seitdem sie beigetreten sind)"; +"room_details_history_section_prompt_title" = "Datenschutz-Warnung"; +"room_details_addresses_section" = "Adressen"; +"room_details_no_local_addresses" = "Dieser Raum hat keine lokalen Adressen"; +"room_details_new_address" = "Füge neue Adresse hinzu"; +"room_details_new_address_placeholder" = "Füge neue Adresse hinzu (z.B. #foo%@)"; +"room_details_banned_users_section" = "Gebannte Nutzer"; +"room_details_advanced_section" = "Erweitert"; +"room_details_advanced_room_id" = "Raum-ID:"; +"room_details_advanced_enable_e2e_encryption" = "Aktivere Verschlüsselung (Warnung: Nicht deaktivierbar!)"; +"room_details_advanced_e2e_encryption_enabled" = "Verschlüsselung ist in diesem Raum aktiviert"; +"room_details_advanced_e2e_encryption_disabled" = "Verschlüsselung ist in diesem Raum nicht aktiviert."; +// Titles +"title_home" = "Start"; +"next" = "Weiter"; +"auth_invalid_login_param" = "Falscher Benutzername oder Passwort"; +"auth_add_email_message" = "Füge eine E-Mail-Adresse hinzu, damit dich andere Benutzer finden können, oder um das Passwort zurücksetzen zu können."; +"auth_add_phone_message" = "Füge eine Telefonnummer hinzu, damit dich andere Benutzer finden können."; +"auth_add_email_phone_message" = "Füge eine E-Mail-Adresse und/oder Telefonnummer hinzu, damit dich andere Benutzer finden können. Über die E-Mail-Adresse kannst du das Passwort zurücksetzen."; +"auth_add_email_and_phone_message" = "Füge eine E-Mail-Adresse und eine Telefonnummer hinzu, damit dich andere Benutzer finden können. Über die E-Mail-Adresse kannst du das Passwort zurücksetzen."; +"auth_use_server_options" = "Individuelle Server Optionen"; +"auth_email_validation_message" = "Prüfe dein E-Mail-Konto um mit der Registrierung fortzufahren"; +"auth_recaptcha_message" = "Dieser Home-Server will sicherstellen dass du kein Robot bist"; +"auth_reset_password_message" = "E-Mail-Adresse angeben, um das Passwort zurückzusetzen:"; +"auth_reset_password_missing_email" = "Die E-Mail-Adresse die mit dem Konto verbunden ist muss eingegeben werden."; +"auth_reset_password_error_unauthorized" = "Konnte E-Mail-Adresse nicht verifizieren. Klicke den Link in der Registrierungs-E-Mail"; +"auth_reset_password_error_not_found" = "Diese E-Mail-Adresse ist nicht mit einer Matrix-ID auf diesem Home-Server verknüpft."; +"auth_reset_password_success_message" = "Dein Passwort wurde zurückgesetzt.\n\nDu wurdest von allen Geräten abgemeldet, diese bekommen jetzt keine Push-Benachrichtigungen mehr. Um diese wiedereinzuschalten, melde dich auf den Geräten erneut an."; +"auth_add_email_and_phone_warning" = "Registrierung mit E-Mail und Telefonnummer zugleich ist noch nicht unterstützt. Nur die Telefonnummer wird berücksichtigt. Du kannst deine E-Mail-Adresse in deinem Profil ergänzen."; +"room_creation_make_public_prompt_msg" = "Sicher, dass du diesen Raum öffentlich machen willst? Jeder kann deine Nachrichten lesen und dem Raum beitreten."; +"room_creation_invite_another_user" = "Suchen/Einladen mittels Benutzer ID, Name oder E-Mail-Adresse"; +"room_recents_join_room_prompt" = "Gib eine Raum-ID oder einem Raum-Alias an"; +"directory_cell_description" = "%tu Räume"; +"directory_search_results" = "%tu Treffer gefunden für %@"; +"directory_search_results_more_than" = ">%tu Treffer gefunden für %@"; +"contacts_address_book_permission_denied" = "Riot fehlt die Berechtigung auf die lokalen Kontakte zuzugreifen"; +"room_participants_remove_third_party_invite_msg" = "Entfernen der Einladung von Dritten ist noch nicht unterstützt"; +"room_participants_invite_another_user" = "Suchen/Einladen mittels Benutzer ID, Name oder E-Mail-Adresse"; +"room_participants_invite_malformed_id" = "Ungültige ID. Sollte eine E-Mail-Adresse oder Matrix-ID wie \"@thomas:matrix.org' sein"; +"room_participants_idle" = "Untätig"; +"room_participants_ago" = "her"; +"room_participants_action_section_admin_tools" = "Admin Werkzeuge"; +"room_participants_action_unban" = "Entsperren"; +"room_participants_action_set_default_power_level" = "Zurück auf normale Berechtigung"; +"room_participants_action_start_voice_call" = "Starte Sprach-Anruf"; +"room_ongoing_conference_call" = "Laufender Konferenz-Anruf. Trete bei als %@ oder %@."; +"room_event_action_redact" = "Schwärzen"; +"room_warning_about_encryption" = "Ende-zu-Ende Verschlüsselung ist in Beta und ist evtl. nicht zuverlässig.\n\nMan sollte noch nicht darauf vertrauen, dass die Daten sicher sind.\n\nGeräte werden den Verlauf vor dem Beitritt des Raumes nicht entschlüsseln können.\n\nVerschlüsselte Nachrichten sind nicht lesbar auf Clients, die Verschlüsselung noch nicht implementiert haben."; +"unknown_devices_alert" = "Dieser Raum enthält unbekannte Geräte die nicht verifiziert wurden.\nDas bedeutet es gibt keine Garantie, dass sie dem User gehören, der angegeben ist.\nWir empfehlen eine Überprüfung für jedes Gerät bevor du weitermachst, aber du kannst die Nachricht erneut senden ohne Verifikation."; +"room_preview_unlinked_email_warning" = "Diese Einladung wurde an %@ gesendet, die Adresse ist nicht mit diesem Konto verbunden. Du kannst dich mit einem anderen Konto anmelden, oder diese E-Mail-Adresse deinem Konto hinzufügen."; +"room_preview_try_join_an_unknown_room" = "Du versuchst auf %@ zuzugreifen. Möchtest du dem Raum beitreten um teilzunehmen?"; +"settings_config_identity_server" = "Identitätsserver ist %@"; +"settings_labs" = "Labor"; +"settings_sign_out_e2e_warn" = "Du wirst die Ende-zu-Ende Schlüssel verlieren. Du kannst dann keine alten Nachrichten mehr in verschlüsselten Räumen auf diesem Gerät lesen."; +"settings_phone_number" = "Telefon"; +"settings_add_phone_number" = "Telefonnummer hinzufügen"; +"settings_fail_to_update_profile" = "Profilaktualisierung fehlgeschlagen"; +"settings_global_settings_info" = "Globale Benachrichtungseinstellungen sind verfügbar auf dem %@ Web Client"; +"settings_pin_rooms_with_missed_notif" = "Pinnen von Räumen mit vepassten Benachrichtigungen"; +"settings_pin_rooms_with_unread" = "Pinnen von Räumen mit ungelesenen Nachrichten"; +"settings_on_denied_notification" = "Benachrichtigungen verboten für %@, bitte in den Geräte-Einstellungen erlauben"; +"settings_contacts_discover_matrix_users" = "Entdecke andere Benutzer mittels E-Mail-Adressen oder Telefonnummern"; +"settings_labs_e2e_encryption_prompt_message" = "Zum Fertigstellen der Verschlüsselung bitte neu anmelden."; +"settings_third_party_notices" = "Anmerkungen von Dritten"; +"settings_clear_cache" = "Cache löschen"; +"settings_fail_to_update_password" = "Passwortänderung fehlgeschlagen"; +"settings_crypto_device_id" = "\nGeräte ID: "; +"settings_crypto_blacklist_unverified_devices" = "Verschlüssele nur zu verifzierten Geräten"; +"room_details_people" = "Mitglieder"; +"room_details_files" = "Dateien"; +"room_details_mute_notifs" = "Benachrichtigungen stummschalten"; +"room_details_access_section_no_address_warning" = "Um einen Raum zu betreten, muss er eine Adresse haben"; +"room_details_access_section_directory_toggle" = "Zeige alle Räume in diesem Verzeichnis"; +"room_details_history_section_prompt_msg" = "Änderungen an der Leseberechtigung des Verlaufs wird nur auf zukünftige Nachrichten dieses Raums angewandt. Die Sichtbarkeit des existierenden Verlaufs wird nicht verändert."; +"room_details_addresses_invalid_address_prompt_title" = "Ungültiges Alias-Format"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ ist kein gültiges Format für einen Alias"; +"room_details_addresses_disable_main_address_prompt_title" = "Hauptadresse Warnung"; +"room_details_addresses_disable_main_address_prompt_msg" = "Du hast keine Hauptadresse angegeben. Die Hauptadresse für diesem Raum wird zufällig gewählt"; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Verschlüssele nur zu verifizierten Geräten"; +"room_details_advanced_e2e_encryption_prompt_message" = "Ende-zu-Ende Verschlüsselung ist experimentell und möglicherweise nicht zuverlässig.\n\nDu solltest noch nicht darauf vertrauen, dass die Daten sicher sind.\n\nGeräte können keine Nachrichten von vor dem Beitritt des Raumes entschlüsseln.\n\nWenn die Verschlüsselung aktiviert wurde, kann sie derzeit nicht wieder abgeschaltet werden.\n\nVerschlüsselte Nachrichten werden nicht auf Geräten angezeigt, die keine Verschüsselung unterstützen."; +"room_details_fail_to_update_avatar" = "Aktualisierung des Raum-Bildes fehlgeschlagen"; +"room_details_fail_to_update_room_name" = "Aktualisierung des Raumnamens fehlgeschlagen"; +"room_details_fail_to_update_topic" = "Aktualisieren des Themas fehlgeschlagen"; +"room_details_fail_to_update_room_guest_access" = "Aktualisierung des Gäste-Zugangs fehlgeschlagen"; +"room_details_fail_to_update_room_join_rule" = "Aktualisierung des Beitrittsregel fehlgeschlagen"; +"room_details_fail_to_update_room_directory_visibility" = "Aktualisierung der Raumlisten-Sichtbarkeit fehlgeschlagen"; +"room_details_fail_to_update_history_visibility" = "Aktualisierung der Verlaufs-Sichtbarkeit fehlgeschlagen"; +"room_details_fail_to_add_room_aliases" = "Hinzufügen der neuen Raum-Adresse fehlgeschlagen"; +"room_details_fail_to_remove_room_aliases" = "Entfernen der Raum-Adresse fehlgeschlagen"; +"room_details_fail_to_update_room_canonical_alias" = "Aktualisierung der Haupt-Adresse fehlgeschlagen"; +"room_details_fail_to_enable_encryption" = "Aktivieren der Verschlüsselung für diesen Raum fehlgeschlagen"; +"room_details_save_changes_prompt" = "Änderungen abspeichern?"; +"room_details_set_main_address" = "Als Haupt-Adresse setzen"; +"room_details_unset_main_address" = "Als Haupt-Adresse entfernen"; +"room_details_copy_room_id" = "Kopiere Raum-ID"; +"room_details_copy_room_address" = "Kopiere Raum-Adresse"; +"room_details_copy_room_url" = "Kopiere Raum-URL"; +// Read Receipts +"read_receipts_list" = "Lesebestätigungs-Liste"; +"receipt_status_read" = "Gelesen: "; +// Media picker +"media_picker_library" = "Bibliothek"; +"media_picker_select" = "Wähle"; +// Directory +"directory_title" = "Verzeichnis"; +"directory_server_picker_title" = "Wähle ein Verzeichnis"; +"directory_server_all_rooms" = "Alle Räume auf %@ Server"; +"directory_server_all_native_rooms" = "Alle nativen Matrix-Räume"; +"directory_server_type_homeserver" = "Gib einen Home-Server ein, um davon öffentliche Räume zu listen"; +"directory_server_placeholder" = "matrix.org"; +// Others +"or" = "oder"; +"you" = "Du"; +"today" = "Heute"; +"yesterday" = "Gestern"; +"network_offline_prompt" = "Keine Verbindung zum Internet."; +"public_room_section_title" = "Öffentliche Räume (at %@):"; +"bug_report_prompt" = "Die Applikation ist letztes Mal abgestürzt. Möchtest du einen Crash Report senden?"; +"rage_shake_prompt" = "Du scheinst das Gerät frustriert zu schütteln. Möchtest du einen Bug Report senden?"; +"camera_access_not_granted" = "%@ hat keine Berechtigung die Kamera zu nutzen, bitte berechtigen"; +"large_badge_value_k_format" = "%.1fK"; +// room display name +"room_displayname_invite_from" = "Einladung von %@"; +"room_displayname_room_invite" = "Raum-Einladung"; +"room_displayname_two_members" = "%@ und %@"; +"room_displayname_more_than_two_members" = "%@ und %u andere"; +"room_displayname_no_title" = "Leerer Raum"; +// Call +"call_incoming_voice_prompt" = "Eingehender Sprach-Anruf von %@"; +"call_incoming_video_prompt" = "Eingehender Video-Anruf von %@"; +// No VoIP support +"no_voip_title" = "Eingehener Anruf"; +"no_voip" = "%@ ruft dich an, aber %@ unterstützt derzeit keine Anrufe.\nDu kannst diese Benachrichtung ignorieren und den Anruf von einem anderen Gerät annehmen oder ihn abweisen."; +// Crash report +"google_analytics_use_prompt" = "Möchtest du helfen %@ zu verbessern, indem du anonyme Crash Reports und Daten über die Verwendung sendest?"; +// Crypto +"e2e_enabling_on_app_update" = "Riot unterstützt nun Ende-zu-Ende Verschlüsselung, um es zu aktivieren musst du dich erneut anmelden.\n\nDu kannst es nun machen oder später in den Einstellungen."; +"e2e_need_log_in_again" = "Du musst dich erneut anmelden um Ende-zu-Ende Schlüssel für dieses Gerät zu erstellen und zum Server zu senden.\nDies ist nur einmal notwendig."; +// Bug report +"bug_report_title" = "Bug Report"; +"bug_report_description" = "Beschreibe den Fehler. Was hast du gemacht? Was hast du erwartet? Was ist tatsächlich passiert?"; +"bug_crash_report_title" = "Crash Report"; +"bug_crash_report_description" = "Bitte beschreibe was du vor dem Absturz gemacht hast:"; +"bug_report_logs_description" = "Um Probleme analysieren zu können werden Log-Daten dieses Clients mit dem Bug Report gesendet. Wenn du nur den Text oben senden willst, bitte abwählen:"; +"bug_report_send_logs" = "Sende Log-Daten"; +"bug_report_send_screenshot" = "Sende Bildschirmfoto"; +"bug_report_progress_zipping" = "Sammele Log-Daten"; +"bug_report_progress_uploading" = "Report hochladen"; +"bug_report_send" = "Gesendet"; +"collapse" = "zusammenklappen"; +"auth_email_in_use" = "Diese E-Mail-Adresse wird bereits verwendet"; +"auth_phone_in_use" = "Diese Telefonnummer wird bereits verwendet"; +"auth_untrusted_id_server" = "Dem Identitätsserver wird nicht vertraut"; +"auth_email_not_found" = "Fehler beim Senden der E-Mail: Die E-Mail-Adresse wurde nicht gefunden"; +"settings_user_interface" = "BENUTZEROBERFLÄCHE"; +"settings_ui_language" = "Sprache"; +"settings_ui_light_theme" = "Helles Design"; +"settings_ui_dark_theme" = "Dunkles Design"; +// Events formatter +"event_formatter_member_updates" = "%tu Änderungen der Mitgliedschaft"; diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index b420c72aa..7b900ed35 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -169,7 +169,8 @@ "contacts_address_book_no_contact" = "No local contacts"; "contacts_address_book_permission_required" = "Permission required to access local contacts"; "contacts_address_book_permission_denied" = "You didn't allow Riot to access your local contacts"; -"contacts_matrix_users_section" = "KNOWN CONTACTS"; +"contacts_user_directory_section" = "USER DIRECTORY"; +"contacts_user_directory_offline_section" = "USER DIRECTORY (offline)"; // Chat participants "room_participants_title" = "Participants"; diff --git a/Riot/Assets/es.lproj/Vector.strings b/Riot/Assets/es.lproj/Vector.strings new file mode 100644 index 000000000..20cb49b36 --- /dev/null +++ b/Riot/Assets/es.lproj/Vector.strings @@ -0,0 +1,4 @@ +// Titles +"title_home" = "Inicio"; +"title_favourites" = "Favoritos"; +"title_people" = "Contactos"; diff --git a/Riot/Assets/fr.lproj/InfoPlist.strings b/Riot/Assets/fr.lproj/InfoPlist.strings new file mode 100644 index 000000000..40b0482af --- /dev/null +++ b/Riot/Assets/fr.lproj/InfoPlist.strings @@ -0,0 +1,5 @@ +// Permissions usage explanations +"NSCameraUsageDescription" = "La caméra est utilisée pour prendre des photos, des vidéos et passer des appels vidéo."; +"NSPhotoLibraryUsageDescription" = "La bibliothèque photo est utilisée pour envoyer des photos et des vidéos."; +"NSMicrophoneUsageDescription" = "Le microphone est utilisé pour prendre des vidéos et passer des appels."; +"NSContactsUsageDescription" = "Le carnet d'adresses est utilisé pour rechercher des utilisateurs par e-mail et numéro de téléphone sur Riot."; diff --git a/Riot/Assets/fr.lproj/Localizable.strings b/Riot/Assets/fr.lproj/Localizable.strings new file mode 100644 index 000000000..0a11151b3 --- /dev/null +++ b/Riot/Assets/fr.lproj/Localizable.strings @@ -0,0 +1,48 @@ +/* New message from a specific person, not referencing a room */ +"MSG_FROM_USER" = "Message de %@"; +/* New message from a specific person in a named room */ +"MSG_FROM_USER_IN_ROOM" = "%@ a posté dans %@"; +/* New message from a specific person, not referencing a room. Content included. */ +"MSG_FROM_USER_WITH_CONTENT" = "%@ : %@"; +/* New message from a specific person in a named room. Content included. */ +"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ dans %@ : %@"; +/* New action message from a specific person, not referencing a room. */ +"ACTION_FROM_USER" = "* %@ %@"; +/* New action message from a specific person in a named room. */ +"ACTION_FROM_USER_IN_ROOM" = "%@ : * %@ %@"; +/* New action message from a specific person, not referencing a room. */ +"IMAGE_FROM_USER" = "%@ vous a envoyé une image"; +/* New action message from a specific person in a named room. */ +"IMAGE_FROM_USER_IN_ROOM" = "%@ a posté une image dans %@"; +/* Multiple unread messages in a room */ +"UNREAD_IN_ROOM" = "%@ nouveaux messages dans %@"; +/* Multiple unread messages from a specific person, not referencing a room */ +"MSGS_FROM_USER" = "%@ nouveaux messages de %@"; +/* Multiple unread messages from two people */ +"MSGS_FROM_TWO_USERS" = "%@ nouveaux messages de %@ et %@"; +/* Multiple unread messages from three people */ +"MSGS_FROM_THREE_USERS" = "%@ nouveaux messages de %@, %@ et %@"; +/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ +"MSGS_FROM_TWO_PLUS_USERS" = "%@ nouveaux messages de %@, %@ et d'autres"; +/* Multiple messages in two rooms */ +"MSGS_IN_TWO_ROOMS" = "%@ nouveaux messages dans %@ et %@"; +/* Look, stuff's happened, alright? Just open the app. */ +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ nouveaux messages dans %@, %@ et d'autres"; +/* A user has invited you to a chat */ +"USER_INVITE_TO_CHAT" = "%@ vous a invité"; +/* A user has invited you to an (unamed) group chat */ +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ vous a invité dans un salon"; +/* A user has invited you to a named room */ +"USER_INVITE_TO_NAMED_ROOM" = "%@ vous a invité dans %@"; +/* Incoming one-to-one voice call */ +"VOICE_CALL_FROM_USER" = "Appel de %@"; +/* Incoming one-to-one video call */ +"VIDEO_CALL_FROM_USER" = "Appel vidéo de %@"; +/* Incoming unnamed voice conference invite from a specific person */ +"VOICE_CONF_FROM_USER" = "Appel groupé depuis %@"; +/* Incoming unnamed video conference invite from a specific person */ +"VIDEO_CONF_FROM_USER" = "Appel vidéo groupé depuis %@"; +/* Incoming named voice conference invite from a specific person */ +"VOICE_CONF_NAMED_FROM_USER" = "Appel groupé de %@ : '%@'"; +/* Incoming named video conference invite from a specific person */ +"VIDEO_CONF_NAMED_FROM_USER" = "Appel vidéo groupé de %@ : '%@'"; diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings new file mode 100644 index 000000000..b556df7a2 --- /dev/null +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -0,0 +1,424 @@ +// Titles +"title_home" = "Accueil"; +"title_favourites" = "Favoris"; +"title_people" = "Personnes"; +"title_rooms" = "Salons"; +"warning" = "Attention"; +// Actions +"view" = "Voir"; +"next" = "Suivant"; +"back" = "Retour"; +"continue" = "Continuer"; +"create" = "Créer"; +"leave" = "Quitter"; +"remove" = "Supprimer"; +"invite" = "Inviter"; +"retry" = "Réessayer"; +"cancel" = "Annuler"; +"save" = "Enregistrer"; +"join" = "Rejoindre"; +"decline" = "Refuser"; +"accept" = "Accepter"; +"preview" = "Aperçu"; +"camera" = "Caméra"; +"voice" = "Voix"; +"video" = "Vidéo"; +"active_call" = "Appel en cours"; +"active_call_details" = "Appel en cours (%@)"; +"later" = "Plus tard"; +"rename" = "Renommer"; +// Authentication +"auth_login" = "Identification"; +"auth_register" = "Inscription"; +"auth_submit" = "Valider"; +"auth_skip" = "Ignorer"; +"auth_send_reset_email" = "Envoyer un e-mail de réinitialisation"; +"auth_return_to_login" = "Retour à l'identification"; +"auth_user_id_placeholder" = "E-mail ou nom d'utilisateur"; +"auth_password_placeholder" = "Mot de passe"; +"auth_new_password_placeholder" = "Nouveau mot de passe"; +"auth_user_name_placeholder" = "Nom d'utilisateur"; +"auth_optional_email_placeholder" = "Adresse e-mail (facultatif)"; +"auth_email_placeholder" = "Adresse e-mail"; +"auth_optional_phone_placeholder" = "Numéro de téléphone (facultatif)"; +"auth_phone_placeholder" = "Numéro de téléphone"; +"auth_repeat_password_placeholder" = "Recopier le mot de passe"; +"auth_repeat_new_password_placeholder" = "Confirmer le nouveau mot de passe"; +"auth_invalid_login_param" = "Nom d'utilisateur ou mot de passe incorrect"; +"auth_invalid_user_name" = "Les noms d'utilisateur ne peuvent contenir que des lettres, chiffres, points, tirets haut ou bas"; +"auth_invalid_password" = "Mot de passe trop court (min 6)"; +"auth_invalid_email" = "L'adresse e-mail ne semble pas valide"; +"auth_invalid_phone" = "Le numéro de téléphone ne semble pas valide"; +"auth_missing_password" = "Mot de passe manquant"; +"auth_add_email_message" = "Ajouter une adresse e-mail au compte pour que les utilisateurs vous retrouvent, et pour récupérer votre mot de passe."; +"auth_add_phone_message" = "Ajouter un numéro de téléphone pour que les utilisateurs vous retrouvent."; +"auth_add_email_phone_message" = "Ajouter une adresse e-mail et/ou un numéro de téléphone à votre compte pour que les utilisateurs vous retrouvent. L'adresse e-mail permettra également de réinitialiser votre mot de passe."; +"auth_add_email_and_phone_message" = "Ajouter une adresse e-mail et un numéro de téléphone à votre compte pour que les utilisateurs vous retrouvent. L'adresse e-mail permettra également de réinitialiser votre mot de passe."; +"auth_missing_email" = "Adresse e-mail manquante"; +"auth_missing_phone" = "Numéro de téléphone manquant"; +"auth_missing_email_or_phone" = "Adresse e-mail ou numéro de téléphone manquant"; +"auth_password_dont_match" = "Les mots de passe ne correspondent pas"; +"auth_username_in_use" = "L'identifiant est déjà utilisé"; +"auth_forgot_password" = "Mot de passe oublié ?"; +"auth_use_server_options" = "Utiliser un serveur spécifique (avancé)"; +"auth_email_validation_message" = "Merci de vérifier vos e-mails pour continuer l'inscription"; +"auth_msisdn_validation_title" = "Vérification en cours"; +"auth_msisdn_validation_message" = "Nous vous avons envoyé un SMS avec un code d'activation. Merci de le recopier ci-dessous."; +"auth_msisdn_validation_error" = "Impossible de vérifier votre numéro de téléphone."; +"auth_reset_password_message" = "Pour réinitialiser votre mot de passe, saisissez l'adresse e-mail liée à votre compte :"; +"auth_reset_password_missing_email" = "Vous devez saisir l'adresse e-mail liée à votre compte."; +"auth_reset_password_missing_password" = "Vous devez spécifier un nouveau mot de passe."; +"auth_reset_password_email_validation_message" = "Un e-mail a été envoyé à %@. Cliquez d'abord sur le lien dans l'e-mail, puis ci-dessous."; +"auth_reset_password_next_step_button" = "J'ai vérifié mon adresse e-mail"; +"auth_reset_password_error_unauthorized" = "Impossible de vérifier l'adresse e-mail : assurez-vous de cliquer sur le lien dans l'e-mail"; +"auth_reset_password_error_not_found" = "Votre adresse e-mail ne semble pas associée à un identificant Matrix sur ce serveur."; +"auth_reset_password_success_message" = "Votre mot de passe a été réinitialisé.\n\nVous avez été déconnecté de tous vos appareils et ne recevrez plus les notifications. Pour réactiver les notifications, identifiez-vous à nouveau sur chaque appareil."; +"auth_add_email_and_phone_warning" = "Enregistrer un e-mail et un numéro de téléphone en une seule fois n'est pas supporté tant que l'api n'existe pas. Seul votre numéro de téléphone sera pris en compte. Vous pourrez ajouter l'adresse e-mail dans vos options de profil."; +// Chat creation +"room_creation_title" = "Nouvelle discussion"; +"room_creation_account" = "Compte"; +"room_creation_appearance" = "Apparence"; +"room_creation_appearance_name" = "Nom"; +"room_creation_appearance_picture" = "Vignette (facultatif)"; +"room_creation_private_room" = "Cette discussion est privée"; +"room_creation_public_room" = "Cette discussion est publique"; +"room_creation_make_public" = "Rendre publique"; +"room_creation_make_public_prompt_title" = "Voulez-vous rendre cette discussion publique ?"; +"room_creation_make_public_prompt_msg" = "Êtes-vous sûr de vouloir rendre cette discussion publique ? Tout le monde pourra lire vos messages et rejoindre la discussion."; +"room_creation_keep_private" = "Garder privée"; +"room_creation_make_private" = "Rendre privée"; +"room_creation_wait_for_creation" = "Un salon est déjà créé, merci de patienter."; +"room_creation_invite_another_user" = "Rechercher / inviter par identifiant, nom ou e-mail"; +// Room recents +"room_recents_directory_section" = "RÉPERTOIRE DES SALONS"; +"room_recents_directory_section_network" = "Réseau"; +"room_recents_favourites_section" = "FAVORIS"; +"room_recents_people_section" = "PERSONNES"; +"room_recents_conversations_section" = "SALONS"; +"room_recents_no_conversation" = "Aucun salon"; +"room_recents_low_priority_section" = "PRIORITÉ BASSE"; +"room_recents_invites_section" = "INVITATIONS"; +"room_recents_start_chat_with" = "Nouvelle discussion"; +"room_recents_create_empty_room" = "Créer un salon"; +"room_recents_join_room" = "Rejoindre le salon"; +"room_recents_join_room_title" = "Rejoindre un salon"; +"room_recents_join_room_prompt" = "Saisir un identifiant ou une adresse de salon"; +// People tab +"people_invites_section" = "INVITATIONS"; +"people_conversation_section" = "DISCUSSIONS"; +"people_no_conversation" = "Aucune discussion"; +// Rooms tab +"room_directory_no_public_room" = "Aucun salon public disponible"; +// Search +"search_rooms" = "Salons"; +"search_messages" = "Messages"; +"search_people" = "Personnes"; +"search_files" = "Fichiers"; +"search_default_placeholder" = "Recherche"; +"search_people_placeholder" = "Rechercher par identifiant, nom ou e-mail"; +"search_no_result" = "Aucun résultat"; +// Directory +"directory_cell_title" = "Parcourir le répertoire"; +"directory_cell_description" = "%tu salons"; +"directory_search_results_title" = "Résultats dans le répertoire"; +"directory_search_results" = "%tu résultats trouvés pour %@"; +"directory_search_results_more_than" = "> %tu résultats trouvés pour %@"; +"directory_searching_title" = "Recherche dans le répertoire…"; +"directory_search_fail" = "Impossible de récupérer les données"; +// Contacts +"contacts_address_book_section" = "CONTACTS LOCAUX"; +"contacts_address_book_matrix_users_toggle" = "Utilisateurs Matrix uniquement"; +"contacts_address_book_no_contact" = "Aucun contact local"; +"contacts_address_book_permission_required" = "Permissions requises pour accéder aux contacts locaux"; +"contacts_address_book_permission_denied" = "Vous n'avez pas autorisé Riot à accéder à vos contacts locaux"; +"contacts_user_directory_section" = "RÉPERTOIRE UTILISATEURS"; +"contacts_user_directory_offline_section" = "RÉPERTOIRE UTILISATEURS (hors-ligne)"; +// Chat participants +"room_participants_title" = "Membres"; +"room_participants_add_participant" = "Ajouter un membre"; +"room_participants_one_participant" = "1 membre"; +"room_participants_multi_participants" = "%d membres"; +"room_participants_leave_prompt_title" = "Quitter le salon"; +"room_participants_leave_prompt_msg" = "Êtes-vous sûr de vouloir quitter le salon ?"; +"room_participants_remove_prompt_title" = "Confirmation"; +"room_participants_remove_prompt_msg" = "Êtes-vous sûr de vouloir exclure %@ du ce salon ?"; +"room_participants_invite_prompt_title" = "Confirmation"; +"room_participants_invite_prompt_msg" = "Êtes-vous sûr de vouloir inviter %@ sur ce salon ?"; +"room_participants_filter_room_members" = "Filtrer les membres"; +"room_participants_invite_another_user" = "Rechercher / inviter par identifiant, nom ou e-mail"; +"room_participants_invite_malformed_id_title" = "Erreur lors de l'invitation"; +"start" = "Démarrer"; +"on" = "Activé"; +"off" = "Désactivé"; +"auth_recaptcha_message" = "Ce homeserver voudrait s'assurer que vous n'êtes pas un robot"; +"room_creation_privacy" = "Visibilité"; +"room_participants_remove_third_party_invite_msg" = "Supprimer une invitation de tiers n'est pas encore supporter tant que l'api n'existe pas"; +"room_participants_invite_malformed_id" = "Identifiant au mauvais format. Une adresse e-mail ou un identifiant Matrix au format '@utilisateur:domaine' est attendu"; +"room_participants_invited_section" = "INVITÉS"; +"room_participants_online" = "En ligne"; +"room_participants_offline" = "Hors ligne"; +"room_participants_unknown" = "Inconnu"; +"room_participants_idle" = "Inactif"; +"room_participants_now" = "maintenant"; +"room_participants_ago" = "d'inactivité"; +"room_participants_action_section_admin_tools" = "Outils d'administration"; +"room_participants_action_section_direct_chats" = "Discussions directes"; +"room_participants_action_section_devices" = "Appareils"; +"room_participants_action_section_other" = "Autres"; +"room_participants_action_invite" = "Inviter"; +"room_participants_action_leave" = "Quitter ce salon"; +"room_participants_action_remove" = "Exclure de ce salon"; +"room_participants_action_ban" = "Bannir de ce salon"; +"room_participants_action_unban" = "Amnistier"; +"room_participants_action_ignore" = "Masquer tous les messages de cet utilisateur"; +"room_participants_action_unignore" = "Afficher tous les messages de cet utilisateur"; +"room_participants_action_set_default_power_level" = "Réinitialiser au niveau normal"; +"room_participants_action_set_moderator" = "Promouvoir modérateur"; +"room_participants_action_set_admin" = "Promouvoir administrateur"; +"room_participants_action_start_new_chat" = "Nouvelle discussion"; +"room_participants_action_start_voice_call" = "Nouvel appel vocal"; +"room_participants_action_start_video_call" = "Nouvel appel vidéo"; +"room_participants_action_mention" = "Mentionner"; +// Chat +"room_jump_to_first_unread" = "Aller directement au premier message non lu"; +"room_new_message_notification" = "%d nouveau message"; +"room_new_messages_notification" = "%d nouveaux messages"; +"room_one_user_is_typing" = "%@ est en train d'écrire…"; +"room_two_users_are_typing" = "%@ et %@ sont en train d'écrire…"; +"room_many_users_are_typing" = "%@, %@ et d'autres sont en train d'écrire…"; +"room_message_placeholder" = "Envoyer un message (non chiffré)…"; +"encrypted_room_message_placeholder" = "Envoyer un message chiffré…"; +"room_message_short_placeholder" = "Envoyer un message…"; +"room_offline_notification" = "La connectivité au serveur a été perdue."; +"room_unsent_messages_notification" = "Messages non envoyés. %@ ou %@ maintenant ?"; +"room_unsent_messages_unknown_devices_notification" = "Message non envoyé car des appareils inconnus sont présents. %@ ou %@ maintenant ?"; +"room_ongoing_conference_call" = "Conférence en cours. Rejoindre en %@ ou %@."; +"room_prompt_resend" = "Tout renvoyer"; +"room_prompt_cancel" = "Tout annuler"; +"room_resend_unsent_messages" = "Renvoyer les messages non envoyés"; +"room_delete_unsent_messages" = "Supprimer les messages non envoyés"; +"room_event_action_copy" = "Copier"; +"room_event_action_quote" = "Citer"; +"room_event_action_redact" = "Effacer"; +"room_event_action_more" = "Plus"; +"room_event_action_share" = "Partager"; +"room_event_action_permalink" = "Permalien"; +"room_event_action_view_source" = "Voir la source"; +"room_event_action_report" = "Signaler le contenu"; +"room_event_action_report_prompt_reason" = "Raison pour signaler le contenu"; +"room_event_action_report_prompt_ignore_user" = "Voulez-vous masquer tous les messages de cet utilisateur ?"; +"room_event_action_save" = "Enregistrer"; +"room_event_action_resend" = "Renvoyer"; +"room_event_action_delete" = "Supprimer"; +"room_event_action_cancel_upload" = "Annuler le téléchargement"; +"room_event_action_cancel_download" = "Annuler le téléchargement"; +"room_event_action_view_encryption" = "Informations sur le chiffrement"; +"room_warning_about_encryption" = "Le chiffrement de bout en bout est en bêta et peut ne pas être fiable.\n\nIl ne devrait pas être considéré comme de confiance pour sécuriser les données.\n\nLes appareils ne pourront pas encore déchiffrer l'historique avant leur adhésion au salon.\n\nLes messages chiffrés ne pourront pas être lus pas les clients qui n'implémentent pas le chiffrement."; +// Unknown devices +"unknown_devices_alert_title" = "Le salon contient des appareils inconnus"; +"unknown_devices_alert" = "Ce salon contient des appareils inconnus qui n'ont pas été vérifiés.\nCela signifie qu'il n'y a pas de garantie que ces appareils appartiennent aux utilisateurs déclarés.\nNous recommendons d'effectuer le processus de vérification pour chaque appareil avant de continuer, mais vous pouvez renvoyer les message sans vérifier si vous préférez."; +"unknown_devices_send_anyway" = "Envoyer quand même"; +"unknown_devices_call_anyway" = "Appeler quand même"; +"unknown_devices_answer_anyway" = "Répondre quand même"; +"unknown_devices_verify" = "Vérifier…"; +"unknown_devices_title" = "Appareils inconnus"; +// Room Title +"room_title_new_room" = "Nouveau salon"; +"room_title_multiple_active_members" = "%@/%@ membres actifs"; +"room_title_one_active_member" = "%@/%@ membre actif"; +"room_title_invite_members" = "Inviter des membres"; +"room_title_members" = "%@ membres"; +"room_title_one_member" = "1 membre"; +// Room Preview +"room_preview_invitation_format" = "Vous avez été invité à rejoindre ce salon par %@"; +"room_preview_subtitle" = "Ceci est un aperçu du salon. Les interactions avec le salon sont désactivées."; +"room_preview_unlinked_email_warning" = "Cette invitation a été envoyée à %@, qui n'est pas associé avec ce compte. Vous pouvez vous identifier avec un compte différent ou ajouter cette adresse e-mail à ce compte."; +"room_preview_try_join_an_unknown_room" = "Vous essayez d'accéder à %@. Voulez-vous rejoindre afin de participer à la discussion ?"; +"room_preview_try_join_an_unknown_room_default" = "un salon"; +// Settings +"settings_title" = "Paramètres"; +"account_logout_all" = "Déconnecter tous les comptes"; +"settings_config_no_build_info" = "Aucune information sur le build"; +"settings_mark_all_as_read" = "Marquer tous les messages comme lus"; +"settings_report_bug" = "Signaler une erreur"; +"settings_config_home_server" = "Le homeserver est %@"; +"settings_config_identity_server" = "Le serveur d'identité est %@"; +"settings_config_user_id" = "Identifié en tant que %@"; +"settings_user_settings" = "PRÉFÉRENCES UTILISATEUR"; +"settings_notifications_settings" = "PRÉFÉRENCES DE NOTIFICATIONS"; +"settings_ignored_users" = "UTILISATEURS IGNORÉS"; +"settings_contacts" = "CONTACT LOCAUX"; +"settings_advanced" = "AVANCÉ"; +"settings_other" = "AUTRES"; +"settings_labs" = "LABORATOIRE"; +"settings_devices" = "APPAREILS"; +"settings_cryptography" = "CHIFFREMENT"; +"settings_sign_out" = "Se déconnecter"; +"settings_sign_out_confirmation" = "Êtes-vous sûr ?"; +"settings_sign_out_e2e_warn" = "Vous perdrez vos clés de chiffrement de bout en bout. Cela signifie que vous ne pourrez plus lire les enciens messages sur les salons chiffrés depuis cet appreil."; +"settings_profile_picture" = "Image de profil"; +"settings_display_name" = "Nom d'affichage"; +"settings_first_name" = "Prénom"; +"settings_surname" = "Nom de famille"; +"settings_remove_prompt_title" = "Confirmation"; +"settings_remove_email_prompt_msg" = "Êtes-vous sûr de vouloir supprimer l'adresse e-mail %@ ?"; +"settings_remove_phone_prompt_msg" = "Êtes-vous sûr de vouloir supprimer le numéro de téléphone %@ ?"; +"settings_email_address" = "E-mail"; +"settings_email_address_placeholder" = "Entrer votre adresse e-mail"; +"settings_add_email_address" = "Ajouter une adresse e-mail"; +"settings_phone_number" = "Téléphone"; +"settings_add_phone_number" = "Ajouter un numéro de téléphone"; +"settings_night_mode" = "Mode nuit"; +"settings_fail_to_update_profile" = "Impossible de mettre à jour le profil"; +"settings_enable_push_notif" = "Notifications sur cet appareil"; +"settings_global_settings_info" = "Les paramètres de notification globaux sont disponibles sur votre %@ client web"; +"settings_pin_rooms_with_missed_notif" = "Épingler les salons avec des notifications non lues"; +"settings_pin_rooms_with_unread" = "Épingler les salons avec des messages non lus"; +"settings_on_denied_notification" = "Les notifications sont refusées pour %@, merci de les autoriser dans les préférences de votre appareil"; +"settings_unignore_user" = "Afficher tous les messages de %@ ?"; +"settings_contacts_discover_matrix_users" = "Utiliser un e-mail ou un numéro de téléphone pour retrouver des utilisateurs"; +"settings_contacts_phonebook_country" = "Pays pour le répertoire téléphonique"; +"settings_labs_e2e_encryption" = "Chiffrement de bout en bout"; +"settings_labs_e2e_encryption_prompt_message" = "Pour terminer la configuration du chiffrement, vous devez vous reconnecter."; +"settings_version" = "Version %@"; +"settings_olm_version" = "Version de olm %@"; +"settings_copyright" = "Droits d'auteur"; +"settings_copyright_url" = "https://riot.im/copyright"; +"settings_term_conditions" = "Termes et conditions"; +"settings_term_conditions_url" = "https://riot.im/tac_apple"; +"settings_privacy_policy" = "Politique de confidentialité"; +"settings_privacy_policy_url" = "https://riot.im/privacy"; +"settings_third_party_notices" = "Licences tierces"; +"settings_send_crash_report" = "Envoyer des rapports d'erreur anonymes et des statistiques d'utilisation"; +"settings_clear_cache" = "Vider le cache"; +"settings_change_password" = "Changer de mot de passe"; +"settings_old_password" = "ancien mot de passe"; +"settings_new_password" = "nouveau mot de passe"; +"settings_confirm_password" = "confirmer le mot de passe"; +"settings_fail_to_update_password" = "Impossible de changer le mot de passe"; +"settings_password_updated" = "Votre mot de passe a été changé"; +"settings_crypto_device_name" = "Nom d'appareil : "; +"settings_crypto_device_id" = "\nIdentifiant d'appareil : "; +"settings_crypto_device_key" = "\nClé d'appareil : "; +"settings_crypto_export" = "Exporter les clés"; +"settings_crypto_blacklist_unverified_devices" = "Chiffrer vers les appareils vérifiés uniquement"; +// Room Details +"room_details_title" = "Détails du salon"; +"room_details_people" = "Membres"; +"room_details_files" = "Fichiers"; +"room_details_settings" = "Paramètres"; +"room_details_photo" = "Image du salon"; +"room_details_room_name" = "Nom du salon"; +"room_details_topic" = "Sujet"; +"room_details_favourite_tag" = "Favoris"; +"room_details_low_priority_tag" = "Priorité basse"; +"room_details_mute_notifs" = "Désactiver les notifications"; +"room_details_access_section" = "Qui peut accéder à ce salon ?"; +"room_details_access_section_invited_only" = "Seulement les personnes qui ont été invitées"; +"room_details_access_section_anyone_apart_from_guest" = "N'importe qui ayant un lien vers le salon, hormis les visiteurs"; +"room_details_access_section_anyone" = "N'importe qui ayant un lien vers le salon, y compris les invités"; +"room_details_access_section_no_address_warning" = "Pour référencer le salon, il doit avoir une adresse"; +"room_details_access_section_directory_toggle" = "Lister ce salon dans le répertoire des salons"; +"room_details_history_section" = "Qui peut lire l'historique ?"; +"room_details_history_section_anyone" = "N'importe qui"; +"room_details_history_section_members_only" = "Les membres uniquements (depuis le moment où cette option est sélectionnée)"; +"room_details_history_section_members_only_since_invited" = "Les membres uniquement (depuis qu'ils ont été invité)"; +"room_details_history_section_members_only_since_joined" = "Les membres uniquement (depuis qu'ils ont rejoint)"; +"room_details_history_section_prompt_title" = "Alerte de confidentialité"; +"room_details_history_section_prompt_msg" = "Les changements d'accès à l'historique ne s'appliqueront qu'aux futurs messages. La visibilité de l'historique actuel demeurera inchangée."; +"room_details_addresses_section" = "Adresses"; +"room_details_no_local_addresses" = "Ce salon n'a pas d'adresse locale"; +"room_details_new_address" = "Ajouter une adresse"; +"room_details_new_address_placeholder" = "Ajouter une adresse (par ex. #foo%@)"; +"room_details_addresses_invalid_address_prompt_title" = "Format d'alias invalide"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ n'est pas un format valide pour un alias"; +"room_details_addresses_disable_main_address_prompt_title" = "Alerte sur l'adresse principale"; +"room_details_addresses_disable_main_address_prompt_msg" = "Vous n'aurez aucune adresse principale spécifiée. L'adresse principale par défaut de ce salon sera choisie aléatoirement"; +"room_details_banned_users_section" = "Utilisateurs bannis"; +"room_details_advanced_section" = "Avancé"; +"room_details_advanced_room_id" = "Identifiant de salon :"; +"room_details_advanced_enable_e2e_encryption" = "Activer le chiffrement (attention : ne peut plus être désactivé !)"; +"room_details_advanced_e2e_encryption_enabled" = "Le chiffrement est activé sur ce salon"; +"room_details_advanced_e2e_encryption_disabled" = "Le chiffrement est désactivé sur ce salon."; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Chiffrer vers les appareils vérifiés uniquement"; +"room_details_advanced_e2e_encryption_prompt_message" = "Le chiffrement de bout en bout est en bêta et peut ne pas être fiable.\n\nIl ne devrait pas être considéré comme de confiance pour sécuriser les données.\n\nLes appareils ne pourront pas encore déchiffrer l'historique avant leur adhésion au salon.\n\nUne fois le chiffrement activé pour un salon, il ne peut plus être désactivé (pour l'instant).\n\nLes messages chiffrés ne pourront pas être lus pas les clients qui n'implémentent pas le chiffrement."; +"room_details_fail_to_update_avatar" = "Impossible de modifier l'image du salon"; +"room_details_fail_to_update_room_name" = "Impossible de modifier le nom du salon"; +"room_details_fail_to_update_topic" = "Impossible de modifier le sujet"; +"room_details_fail_to_update_room_guest_access" = "Impossible de modifier les accès visiteur pour le salon"; +"room_details_fail_to_update_room_join_rule" = "Impossible de modifier les règles pour rejoindre"; +"room_details_fail_to_update_room_directory_visibility" = "Impossible de modifier la visibilité du salon dans le répertoire"; +"room_details_fail_to_update_history_visibility" = "Impossible de modifier la visibilité de l'historique"; +"room_details_fail_to_add_room_aliases" = "Impossible d'ajouter les nouvelles adresses au salon"; +"room_details_fail_to_remove_room_aliases" = "Impossible de supprimer les adresses du salon"; +"room_details_fail_to_update_room_canonical_alias" = "Impossible de modifier l'adresse principale"; +"room_details_fail_to_enable_encryption" = "Impossible d'activer le chiffrement sur ce salon"; +"room_details_save_changes_prompt" = "Voulez-vous enregistrer les changements ?"; +"room_details_set_main_address" = "Configurer comme adresse principale"; +"room_details_unset_main_address" = "Désactiver comme adresse principale"; +"room_details_copy_room_id" = "Copier l'identifiant du salon"; +"room_details_copy_room_address" = "Copier l'adresse du salon"; +"room_details_copy_room_url" = "Copier l'URL du salon"; +// Read Receipts +"read_receipts_list" = "Liste des accusés de lecture"; +"receipt_status_read" = "Lu : "; +// Media picker +"media_picker_library" = "Bibliothèque"; +"media_picker_select" = "Sélectionner"; +// Directory +"directory_title" = "Répertoire"; +"directory_server_picker_title" = "Sélectionner un répertoire"; +"directory_server_all_rooms" = "Tous les salons sur le serveur %@"; +"directory_server_all_native_rooms" = "Tous les salons Matrix natifs"; +"directory_server_type_homeserver" = "Saisir un homeserver pour lister ses salons publics"; +"directory_server_placeholder" = "matrix.org"; +// Others +"or" = "ou"; +"you" = "Vous"; +"today" = "Aujourd'hui"; +"yesterday" = "Hier"; +"network_offline_prompt" = "La connection Internet semble hors-ligne."; +"public_room_section_title" = "Salons publics (sur %@) :"; +"bug_report_prompt" = "L'application a terminé en erreur la dernière fois. Voulez-vous envoyer un rapport d'erreur ?"; +"rage_shake_prompt" = "Vous semblez secouer le téléphone avec frustration. Souhaitez-vous soumettre un rapport d'erreur ?"; +"camera_access_not_granted" = "%@ n'a pas les permissions pour utiliser la caméra, merci de modifier les options de vie privée"; +"large_badge_value_k_format" = "%.1fK"; +// room display name +"room_displayname_invite_from" = "Invitation de %@"; +"room_displayname_room_invite" = "Invitation sur un salon"; +"room_displayname_two_members" = "%@ et %@"; +"room_displayname_more_than_two_members" = "%@ et %u autres"; +"room_displayname_no_title" = "Salon vide"; +// Call +"call_incoming_voice_prompt" = "Appel audio entrant de %@"; +"call_incoming_video_prompt" = "Appel vidéo entrant de %@"; +// No VoIP support +"no_voip_title" = "Appel entrant"; +"no_voip" = "%@ vous appel mais %@ ne supporte pas encore les appels.\nVous pouvez ignorer cette notification et répondre à l'appel depuis un autre appareil, ou bien le rejeter."; +// Crash report +"google_analytics_use_prompt" = "Souhaitez-vous aider à améliorer %@ en envoyer automatiquement des rapports d'erreur et des statistiques d'utilisation ?"; +// Crypto +"e2e_enabling_on_app_update" = "Riot supporte maintenant le chiffrement de bout en bout mais vous devez vous identifier à nouveau pour l'activer.\n\nVous pouvez le faire maintenant ou depuis les paramètres de l'application."; +"e2e_need_log_in_again" = "Vous devez vous reconnecter pour générer les clés de chiffrement de bout en bout pour cet appareil et les envoyer vers votre homeserver.\nIl s'agit d'un défaut exceptionnel ; désolé pour le désagrément."; +// Bug report +"bug_report_title" = "Rapport d'erreur"; +"bug_report_description" = "Merci de décrire l'erreur. Qu'avez-vous fait ? Quel était le comportement attendu ? Que s'est-il passé ?"; +"bug_crash_report_title" = "Rapport d'erreur"; +"bug_crash_report_description" = "Merci de décrire ce que vous faisiez avant l'arrêt de l'application :"; +"bug_report_logs_description" = "Afin de diagnostiquer les problèmes, les traces de ce client seront envoyés avec le rapport d'erreur. Si vous préférez envoyer uniquement le texte ci-dessus, merci de décocher :"; +"bug_report_send_logs" = "Envoyer les traces"; +"bug_report_send_screenshot" = "Envoyer une capture d'écran"; +"bug_report_progress_zipping" = "Collecte des traces"; +"bug_report_progress_uploading" = "Envoi du rapport"; +"bug_report_send" = "Envoyer"; +"auth_email_in_use" = "Cette adresse e-mail est déjà utilisée"; +"auth_phone_in_use" = "Ce numéro de téléphone est déjà utilisé"; +"auth_email_not_found" = "Échec lors de l'envoi de l'e-mail : Cette adresse e-mail n'a pas pu être trouvée"; +"settings_ui_language" = "Langue"; +"settings_ui_light_theme" = "Thème clair"; +"settings_ui_dark_theme" = "Thème sombre"; +"collapse" = "réduire"; +"auth_untrusted_id_server" = "Le serveur d'identité n'est pas fiable"; +"settings_user_interface" = "INTERFACE UTILISATEUR"; +// Events formatter +"event_formatter_member_updates" = "%tu changements dans les membres"; diff --git a/Riot/Assets/lv.lproj/InfoPlist.strings b/Riot/Assets/lv.lproj/InfoPlist.strings new file mode 100644 index 000000000..a1cc84b8d --- /dev/null +++ b/Riot/Assets/lv.lproj/InfoPlist.strings @@ -0,0 +1,5 @@ +// Permissions usage explanations +"NSCameraUsageDescription" = "Kamera tiek izmantota, lai uzņemtu foto un video, kā arī veiktu video zvanus."; +"NSPhotoLibraryUsageDescription" = "Foto bibliotēka tiek izmantota, lai nosūtītu fotoattēlus un video."; +"NSMicrophoneUsageDescription" = "Mikrofons tiek izmantots, lai uzņemtu video un veiktu zvanus."; +"NSContactsUsageDescription" = "Kontaktu grāmata tiek izmantota, lai meklētu lietotājus pēc epasta adreses vai telefona numura Riot aplikācijā."; diff --git a/Riot/Assets/lv.lproj/Localizable.strings b/Riot/Assets/lv.lproj/Localizable.strings new file mode 100644 index 000000000..6046b88c7 --- /dev/null +++ b/Riot/Assets/lv.lproj/Localizable.strings @@ -0,0 +1,48 @@ +/* New message from a specific person, not referencing a room */ +"MSG_FROM_USER" = "Ziņa no %@"; +/* New message from a specific person in a named room */ +"MSG_FROM_USER_IN_ROOM" = "%@ pievienoja ziņu %@"; +/* New message from a specific person, not referencing a room. Content included. */ +"MSG_FROM_USER_WITH_CONTENT" = "%@: %@"; +/* New message from a specific person in a named room. Content included. */ +"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ iekš %@: %@"; +/* New action message from a specific person, not referencing a room. */ +"ACTION_FROM_USER" = "* %@ %@"; +/* New action message from a specific person in a named room. */ +"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@"; +/* New action message from a specific person, not referencing a room. */ +"IMAGE_FROM_USER" = "%@ nosūtīja Tev attēlu"; +/* New action message from a specific person in a named room. */ +"IMAGE_FROM_USER_IN_ROOM" = "%@ publicēja attēlu %@"; +/* Multiple unread messages in a room */ +"UNREAD_IN_ROOM" = "%@ jaunas ziņas %@"; +/* Multiple unread messages from a specific person, not referencing a room */ +"MSGS_FROM_USER" = "%@ jaunas ziņas %@"; +/* Multiple unread messages from two people */ +"MSGS_FROM_TWO_USERS" = "%@ jaunas ziņas no %@ un %@"; +/* Multiple unread messages from three people */ +"MSGS_FROM_THREE_USERS" = "%@ jaunas ziņas no %@, %@ un %@"; +/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ +"MSGS_FROM_TWO_PLUS_USERS" = "%@ jaunas ziņas no %@, %@ un citiem"; +/* Multiple messages in two rooms */ +"MSGS_IN_TWO_ROOMS" = "%@ jaunas ziņas %@ un %@"; +/* Look, stuff's happened, alright? Just open the app. */ +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ jaunas ziņas %@, %@ un citiem"; +/* A user has invited you to a chat */ +"USER_INVITE_TO_CHAT" = "%@ uzaicināja Tevi uz čatu"; +/* A user has invited you to an (unamed) group chat */ +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ uzaicināja Tevi uz grupas čatu"; +/* A user has invited you to a named room */ +"USER_INVITE_TO_NAMED_ROOM" = "%@ uzaicināja Tevi uz %@"; +/* Incoming one-to-one voice call */ +"VOICE_CALL_FROM_USER" = "Zvans no %@"; +/* Incoming one-to-one video call */ +"VIDEO_CALL_FROM_USER" = "Video zvans no %@"; +/* Incoming unnamed voice conference invite from a specific person */ +"VOICE_CONF_FROM_USER" = "Grupas zvans no %@"; +/* Incoming unnamed video conference invite from a specific person */ +"VIDEO_CONF_FROM_USER" = "Grupas video zvans no %@"; +/* Incoming named voice conference invite from a specific person */ +"VOICE_CONF_NAMED_FROM_USER" = "Grupas zvans no %@: '%@'"; +/* Incoming named video conference invite from a specific person */ +"VIDEO_CONF_NAMED_FROM_USER" = "Grupas video zvans no %@: '%@'"; diff --git a/Riot/Assets/lv.lproj/Vector.strings b/Riot/Assets/lv.lproj/Vector.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/lv.lproj/Vector.strings @@ -0,0 +1 @@ + diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index 3f6001a41..06c777f1f 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -161,7 +161,6 @@ "contacts_address_book_no_contact" = "Geen lokale contacten"; "contacts_address_book_permission_required" = "Permissie vereist voor toegang tot de lokale contacten"; "contacts_address_book_permission_denied" = "Je hebt Riot geen toegang tot je lokale contacten toegestaan"; -"contacts_matrix_users_section" = "BEKENDE CONTACTEN"; // Chat participants "room_participants_title" = "Deelnemers"; diff --git a/Riot/Assets/ru.lproj/Localizable.strings b/Riot/Assets/ru.lproj/Localizable.strings new file mode 100644 index 000000000..58a1eb684 --- /dev/null +++ b/Riot/Assets/ru.lproj/Localizable.strings @@ -0,0 +1,48 @@ +/* New message from a specific person, not referencing a room */ +"MSG_FROM_USER" = "Сообщение от %@"; +/* New message from a specific person in a named room */ +"MSG_FROM_USER_IN_ROOM" = "%@ написал в %@"; +/* New message from a specific person, not referencing a room. Content included. */ +"MSG_FROM_USER_WITH_CONTENT" = "%@: %@"; +/* New message from a specific person in a named room. Content included. */ +"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ в %@: %@"; +/* New action message from a specific person, not referencing a room. */ +"ACTION_FROM_USER" = "%@ %@"; +/* New action message from a specific person in a named room. */ +"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@"; +/* New action message from a specific person, not referencing a room. */ +"IMAGE_FROM_USER" = "%@ отправил Вам фото"; +/* New action message from a specific person in a named room. */ +"IMAGE_FROM_USER_IN_ROOM" = "%@ отправил фото в %@"; +/* Multiple unread messages in a room */ +"UNREAD_IN_ROOM" = "%@ новых сообщений в %@"; +/* Multiple unread messages from a specific person, not referencing a room */ +"MSGS_FROM_USER" = "%@ сообщений от %@"; +/* Multiple unread messages from two people */ +"MSGS_FROM_TWO_USERS" = "%@ новых сообщений от %@ и %@"; +/* Multiple unread messages from three people */ +"MSGS_FROM_THREE_USERS" = "%@ новых сообщений от %@, %@ и %@"; +/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ +"MSGS_FROM_TWO_PLUS_USERS" = "%@ новых сообщений %@, %@ и других"; +/* Multiple messages in two rooms */ +"MSGS_IN_TWO_ROOMS" = "%@ новых сообщений в %@ и %@"; +/* Look, stuff's happened, alright? Just open the app. */ +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ новых сообщений в %@, %@ и других"; +/* A user has invited you to a chat */ +"USER_INVITE_TO_CHAT" = "%@ пригласил Вас в чат"; +/* A user has invited you to an (unamed) group chat */ +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ пригласил Вас в групповой чат"; +/* A user has invited you to a named room */ +"USER_INVITE_TO_NAMED_ROOM" = "%@ пригласил Вас в %@"; +/* Incoming one-to-one voice call */ +"VOICE_CALL_FROM_USER" = "Звонок от %@"; +/* Incoming one-to-one video call */ +"VIDEO_CALL_FROM_USER" = "Видеозвонок от %@"; +/* Incoming unnamed voice conference invite from a specific person */ +"VOICE_CONF_FROM_USER" = "Групповой звонок от %@"; +/* Incoming unnamed video conference invite from a specific person */ +"VIDEO_CONF_FROM_USER" = "Видеоконференция %@"; +/* Incoming named voice conference invite from a specific person */ +"VOICE_CONF_NAMED_FROM_USER" = "Групповой звонок от %@: '%@'"; +/* Incoming named video conference invite from a specific person */ +"VIDEO_CONF_NAMED_FROM_USER" = "Групповой видео звонок от %@: '%@'"; diff --git a/Riot/Assets/ru.lproj/Vector.strings b/Riot/Assets/ru.lproj/Vector.strings new file mode 100644 index 000000000..b15616c73 --- /dev/null +++ b/Riot/Assets/ru.lproj/Vector.strings @@ -0,0 +1,8 @@ +// Titles +"title_home" = "Главная"; +"title_favourites" = "Избранное"; +"title_people" = "Люди"; +"title_rooms" = "Чаты"; +"warning" = "Внимание"; +// Actions +"view" = "Просмотр"; diff --git a/Riot/Assets/zh_Hans.lproj/InfoPlist.strings b/Riot/Assets/zh_Hans.lproj/InfoPlist.strings new file mode 100644 index 000000000..4b43ea74d --- /dev/null +++ b/Riot/Assets/zh_Hans.lproj/InfoPlist.strings @@ -0,0 +1,5 @@ +// Permissions usage explanations +"NSCameraUsageDescription" = "用来拍照、拍视频和视频聊天的摄像头。"; +"NSPhotoLibraryUsageDescription" = "用来发送图片和视频的图片文件夹。"; +"NSMicrophoneUsageDescription" = "用来拍视频和通话的麦克风。"; +"NSContactsUsageDescription" = "在 Riot 里通过电子邮件或电话搜索用户的通讯录。"; diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings new file mode 100644 index 000000000..304310339 --- /dev/null +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -0,0 +1,423 @@ +// Titles +"title_home" = "主页"; +"title_favourites" = "收藏夹"; +"title_people" = "联系人"; +"title_rooms" = "聊天室"; +"warning" = "警告"; +// Actions +"view" = "视图"; +"next" = "下一个"; +"back" = "上一个"; +"continue" = "继续"; +"create" = "新建"; +"start" = "开始"; +"leave" = "离开"; +"remove" = "移除"; +"invite" = "邀请"; +"retry" = "重试"; +"on" = "打开"; +"off" = "关闭"; +"cancel" = "取消"; +"save" = "保存"; +"join" = "加入"; +"decline" = "取消"; +"accept" = "接受"; +"preview" = "预览"; +"camera" = "摄像头"; +"voice" = "语音"; +"video" = "视频"; +"active_call" = "激活的通话"; +"active_call_details" = "激活的通话 (%@)"; +"later" = "之后"; +"rename" = "重命名"; +// Authentication +"auth_login" = "登录"; +"auth_register" = "注册"; +"auth_submit" = "提交"; +"auth_skip" = "跳过"; +"auth_send_reset_email" = "发送重置邮件"; +"auth_return_to_login" = "返回登录屏幕"; +"auth_user_id_placeholder" = "电子邮件或名字"; +"auth_password_placeholder" = "密码"; +"auth_new_password_placeholder" = "新密码"; +"auth_user_name_placeholder" = "用户名"; +"auth_optional_email_placeholder" = "电子邮件地址(可选)"; +"auth_email_placeholder" = "电子邮件地址"; +"auth_optional_phone_placeholder" = "电话号码(可选)"; +"auth_phone_placeholder" = "电话号码"; +"auth_repeat_password_placeholder" = "重复密码"; +"auth_repeat_new_password_placeholder" = "确认您的新密码"; +"auth_invalid_login_param" = "无效的用户名和/或密码"; +"auth_invalid_user_name" = "用户名只能包含字母、数字、短横(-)和下划线(_)"; +"auth_invalid_password" = "密码太短(最少 6 位)"; +"auth_invalid_email" = "这看起来不像一个有效的电子邮件地址"; +"auth_invalid_phone" = "这看起来不像一个有效的电话号码"; +"auth_missing_password" = "缺少密码"; +"auth_add_email_message" = "添加一个电子邮件地址这样可以其他用户用户发现你,并让你可以重置密码。"; +"auth_add_phone_message" = "添加一个电话号码让其他用户能够发现你。"; +"auth_add_email_phone_message" = "添加一个电子邮件地址和/或一个电话号码这样可以其他用户用户发现你,并让你可以利用电子邮件重置密码。"; +"auth_add_email_and_phone_message" = "添加一个电子邮件地址和一个电话号码这样可以其他用户用户发现你,并让你可以利用电子邮件重置密码。"; +"auth_missing_email" = "缺少电子邮件"; +"auth_missing_phone" = "缺少电话号码"; +"auth_missing_email_or_phone" = "缺少电子邮件或电话号码"; +"auth_password_dont_match" = "密码不匹配"; +"auth_username_in_use" = "用户名已被占用"; +"auth_forgot_password" = "忘记密码?"; +"auth_use_server_options" = "使用自定义服务器选项(高级)"; +"auth_email_validation_message" = "请检查您的电子有见以便继续注册"; +"auth_msisdn_validation_title" = "等待验证中"; +"auth_msisdn_validation_message" = "我们通过短信发送了一个激活麻,请在下面输入这个激活码。"; +"auth_msisdn_validation_error" = "不能验证电子邮件。"; +"auth_recaptcha_message" = "此主服务器要求确认您不是一个机器人"; +"auth_reset_password_message" = "要重置您的密码,输入与您帐号关联的电子邮件地址:"; +"auth_reset_password_missing_email" = "必须输入您账户关联的电子邮件地址。"; +"auth_reset_password_missing_password" = "必须输入新的密码。"; +"auth_reset_password_email_validation_message" = "一封邮件已经发送到了 %@。当您已经按照其中的链接操作以后,请点下面。"; +"auth_reset_password_next_step_button" = "我已经验证了我的电子邮件地址"; +"auth_reset_password_error_unauthorized" = "验证电子邮件地址失败:请确认您已经点击了邮件里的链接"; +"auth_reset_password_error_not_found" = "您的电子邮件貌似并不是此主服务器上关联的 Matrix ID。"; +"auth_reset_password_success_message" = "您的密码已经重置。\n\n您的所有设备都会登出并且不会收到推送通知。要重新启用通知,请在每个设备上重新登录。"; +"auth_add_email_and_phone_warning" = "在 API 实现以前还不支持使用电子邮件和电话号码一次性注册。只会在帐号里加入电话号码。您可以在您的设置里加入电子邮件地址。"; +// Chat creation +"room_creation_title" = "新的聊天"; +"room_creation_account" = "账户"; +"room_creation_appearance" = "外观"; +"room_creation_appearance_name" = "名字"; +"room_creation_appearance_picture" = "聊天图片(可选)"; +"room_creation_privacy" = "因此"; +"room_creation_private_room" = "此聊天是私密的"; +"room_creation_public_room" = "此聊天是公开的"; +"room_creation_make_public" = "使其公开"; +"room_creation_make_public_prompt_title" = "要让此聊天公开吗?"; +"room_creation_make_public_prompt_msg" = "你确认要让此聊天公开吗?任何人都可以读到您的消息并加入此聊天。"; +"room_creation_keep_private" = "保持私密"; +"room_creation_make_private" = "使其变成私密"; +"room_creation_wait_for_creation" = "已经创建了一个聊天室。请等待。"; +"room_creation_invite_another_user" = "通过用户 ID、名字或电子邮件搜索 / 邀请"; +// Room recents +"room_recents_directory_section" = "聊天室目录"; +"room_recents_directory_section_network" = "网络"; +"room_recents_favourites_section" = "收藏夹"; +"room_recents_people_section" = "联系人"; +"room_recents_conversations_section" = "聊天室"; +"room_recents_no_conversation" = "没有聊天室"; +"room_recents_low_priority_section" = "低优先级"; +"room_recents_invites_section" = "邀请"; +"room_recents_start_chat_with" = "开始聊天"; +"room_recents_create_empty_room" = "创建聊天室"; +"room_recents_join_room" = "加入聊天室"; +"room_recents_join_room_title" = "加入一个聊天室"; +"room_recents_join_room_prompt" = "输入房间 ID 或者房间别名"; +// People tab +"people_invites_section" = "邀请"; +"people_conversation_section" = "对话"; +"people_no_conversation" = "没有对话"; +// Rooms tab +"room_directory_no_public_room" = "没有可用的公共的聊天室"; +// Search +"search_rooms" = "聊天室"; +"search_messages" = "消息"; +"search_people" = "联系人"; +"search_files" = "文件"; +"search_default_placeholder" = "搜索"; +"search_people_placeholder" = "通过用户 ID、名字或电子邮件搜索"; +"search_no_result" = "没有结果"; +// Directory +"directory_cell_title" = "浏览目录"; +"directory_cell_description" = "%tu 个聊天室"; +"directory_search_results_title" = "浏览目录结果"; +"directory_search_results" = "为 %@ 找到 %tu 个结果"; +"directory_search_results_more_than" = "> 为 %@ 找到 %tu 个结果"; +"directory_searching_title" = "正在搜索目录…"; +"directory_search_fail" = "获取数据失败"; +// Contacts +"contacts_address_book_section" = "本地联系人"; +"contacts_address_book_matrix_users_toggle" = "只有 Matrix 用户"; +"contacts_address_book_no_contact" = "没有本地联系人"; +"contacts_address_book_permission_required" = "需要权限以便访问本地联系人"; +"contacts_address_book_permission_denied" = "你没有允许 Riot 访问本地联系人"; +"contacts_matrix_users_section" = "已知联系人"; +// Chat participants +"room_participants_title" = "参加者"; +"room_participants_add_participant" = "添加参加者"; +"room_participants_one_participant" = "1 个参加者"; +"room_participants_multi_participants" = "%d 个参加者"; +"room_participants_leave_prompt_title" = "离开聊天室"; +"room_participants_leave_prompt_msg" = "您确定要离开此聊天室吗?"; +"room_participants_remove_prompt_title" = "确认"; +"room_participants_remove_prompt_msg" = "您确定要将 %@ 从此聊天室里移除?"; +"room_participants_remove_third_party_invite_msg" = "在 API 实现之前还不支持移除第三方邀请"; +"room_participants_invite_prompt_title" = "确认"; +"room_participants_invite_prompt_msg" = "确定要邀请 %@ 加入此聊天?"; +"room_participants_filter_room_members" = "筛选聊天室成员"; +"room_participants_invite_another_user" = "通过用户 ID、名字或电子邮件搜索 / 邀请"; +"room_participants_invite_malformed_id_title" = "邀请错误"; +"room_participants_invite_malformed_id" = "ID 格式错误。必须是一个电子邮件或者 Matrix ID 类似“@本地部分:域名”"; +"room_participants_invited_section" = "已邀请"; +"room_participants_online" = "在线"; +"room_participants_offline" = "离线"; +"room_participants_unknown" = "未知"; +"room_participants_idle" = "空闲"; +"room_participants_now" = "现在"; +"room_participants_ago" = "之前"; +"room_participants_action_section_admin_tools" = "管理工具"; +"room_participants_action_section_direct_chats" = "私聊"; +"room_participants_action_section_devices" = "设备"; +"room_participants_action_section_other" = "其他"; +"room_participants_action_invite" = "邀请"; +"room_participants_action_leave" = "离开此聊天室"; +"room_participants_action_remove" = "从此聊天室移除"; +"room_participants_action_ban" = "从此聊天室封禁"; +"room_participants_action_unban" = "解封"; +"room_participants_action_ignore" = "隐藏此用户的所有信息"; +"room_participants_action_unignore" = "显示此用户的所有信息"; +"room_participants_action_set_default_power_level" = "重置到正常用户"; +"room_participants_action_set_moderator" = "使其成为主持人"; +"room_participants_action_set_admin" = "使其成为管理员"; +"room_participants_action_start_new_chat" = "开始新聊天"; +"room_participants_action_start_voice_call" = "开始语音通话"; +"room_participants_action_start_video_call" = "开始视频通话"; +"room_participants_action_mention" = "提及"; +// Chat +"room_jump_to_first_unread" = "跳到第一条未读信息"; +"room_new_message_notification" = "%d 条新消息"; +"room_new_messages_notification" = "%d 条新消息"; +"room_one_user_is_typing" = "%@ 正在打字…"; +"room_two_users_are_typing" = "%@ 和 %@ 正在打字…"; +"room_many_users_are_typing" = "%@、%@ 和 %@ 正在打字…"; +"room_message_placeholder" = "发送一条消息(非加密)…"; +"encrypted_room_message_placeholder" = "发送一条加密消息…"; +"room_message_short_placeholder" = "发送一条消息…"; +"room_offline_notification" = "到服务器的连接已经丢失。"; +"room_unsent_messages_notification" = "消息没有发送。现在 %@ 或 %@ ?"; +"room_unsent_messages_unknown_devices_notification" = "由于未知设备在线所以消息没有发送。现在 %@ 或 %@?"; +"room_ongoing_conference_call" = "收到会议通话。以 %@ 或 %@ 加入。"; +"room_prompt_resend" = "全部重新发送"; +"room_prompt_cancel" = "全部取消"; +"room_resend_unsent_messages" = "重发未发送消息"; +"room_delete_unsent_messages" = "删除未发送消息"; +"room_event_action_copy" = "复制"; +"room_event_action_quote" = "引入"; +"room_event_action_redact" = "筹集"; +"room_event_action_more" = "移动"; +"room_event_action_share" = "分享"; +"room_event_action_permalink" = "永久链接"; +"room_event_action_view_source" = "查看源"; +"room_event_action_report" = "报告内容"; +"room_event_action_report_prompt_reason" = "报告内容的原因"; +"room_event_action_report_prompt_ignore_user" = "你想隐藏所有来自此用户的消息吗?"; +"room_event_action_save" = "保存"; +"room_event_action_resend" = "重新发送"; +"room_event_action_delete" = "删除"; +"room_event_action_cancel_upload" = "取消上传"; +"room_event_action_cancel_download" = "取消下载"; +"room_event_action_view_encryption" = "加密信息"; +"room_warning_about_encryption" = "端对端加密依然在测试阶段,可能不可靠。\n\n你不应该相信它来保护你的数据。\n\n还将无法解密设备加入聊天室之前的历史记录。\n\n加密消息对还没有实现加密的客户端将会不可见。"; +// Unknown devices +"unknown_devices_alert_title" = "聊天室包含未知设备"; +"unknown_devices_alert" = "这个聊天室包含未经验证的未知设备。\n这意味着设备不能保证属于他们声称的用户。\n我们建议您在继续操作之前,先验证每个设备,如果你愿意也可以重新发送消息而不验证。"; +"unknown_devices_send_anyway" = "总是发送"; +"unknown_devices_call_anyway" = "总是通话"; +"unknown_devices_answer_anyway" = "总是接听"; +"unknown_devices_verify" = "验证…"; +"unknown_devices_title" = "未知设备"; +// Room Title +"room_title_new_room" = "新聊天室"; +"room_title_multiple_active_members" = "%@/%@ 活跃成员"; +"room_title_one_active_member" = "%@/%@ 活跃成员"; +"room_title_invite_members" = "邀请成员"; +"room_title_members" = "%@ 个成员"; +"room_title_one_member" = "1 个成员"; +// Room Preview +"room_preview_invitation_format" = "您已经通过 %@ 的邀请而加入此聊天室"; +"room_preview_subtitle" = "这是此聊天室的一个预览。聊天室交互已禁用。"; +"room_preview_unlinked_email_warning" = "此邀请已发送至 %@,但没和这个账户关联。你可能希望用一个不同的账户登录,或者把这个电子邮箱加入到这个账户。"; +"room_preview_try_join_an_unknown_room" = "你正在尝试访问 %@。你要加入以参与讨论吗?"; +"room_preview_try_join_an_unknown_room_default" = "一间聊天室"; +// Settings +"settings_title" = "设置"; +"account_logout_all" = "登出所有帐号"; +"settings_config_no_build_info" = "没有编译信息"; +"settings_mark_all_as_read" = "将所有信息标记为已读"; +"settings_report_bug" = "报告 bug"; +"settings_config_home_server" = "主服务器是 %@"; +"settings_config_identity_server" = "身份服务器是 %@"; +"settings_config_user_id" = "以 %@ 登录"; +"settings_user_settings" = "用户设置"; +"settings_notifications_settings" = "通知设置"; +"settings_ignored_users" = "已忽略用户"; +"settings_contacts" = "本地联系人"; +"settings_advanced" = "高级"; +"settings_other" = "其他"; +"settings_labs" = "实验室"; +"settings_devices" = "设备"; +"settings_cryptography" = "加密"; +"settings_sign_out" = "注销"; +"settings_sign_out_confirmation" = "你确定?"; +"settings_sign_out_e2e_warn" = "您将丢失所有端对端加密密钥。这就意味着在您的设备上将无法阅读已加密的消息。"; +"settings_profile_picture" = "档案图片"; +"settings_display_name" = "显示名"; +"settings_first_name" = "名字"; +"settings_surname" = "姓氏"; +"settings_remove_prompt_title" = "确认"; +"settings_remove_email_prompt_msg" = "你确定要移除电子邮件地址 %@?"; +"settings_remove_phone_prompt_msg" = "你确定要移除电话号码地址 %@?"; +"settings_email_address" = "电子邮件"; +"settings_email_address_placeholder" = "输入您的电子邮件地址"; +"settings_add_email_address" = "添加电子邮件地址"; +"settings_phone_number" = "电话"; +"settings_add_phone_number" = "添加电话号码"; +"settings_night_mode" = "午夜模式"; +"settings_fail_to_update_profile" = "更新档案失败"; +"settings_enable_push_notif" = "在此设备上通知"; +"settings_global_settings_info" = "全局通知设置在您的 %@ 网页客户端"; +"settings_pin_rooms_with_missed_notif" = "按错失的消息固定聊天室"; +"settings_pin_rooms_with_unread" = "按未读的消息固定聊天室"; +"settings_on_denied_notification" = "给 %@ 的通知已被拒绝,请在设备设置里允许"; +"settings_unignore_user" = "显示所有来自 %@ 的消息?"; +"settings_contacts_discover_matrix_users" = "使用电子邮件和电话号码来发现用户"; +"settings_contacts_phonebook_country" = "电话本国家"; +"settings_labs_e2e_encryption" = "端对端加密"; +"settings_labs_e2e_encryption_prompt_message" = "要完成加密设置您须重新登录。"; +"settings_version" = "版本 %@"; +"settings_olm_version" = "Olm 版本 %@"; +"settings_copyright" = "版权"; +"settings_copyright_url" = "https://riot.im/copyright"; +"settings_term_conditions" = "条款和条件"; +"settings_privacy_policy" = "隐私政策"; +"settings_term_conditions_url" = "https://riot.im/tac_apple"; +"settings_privacy_policy_url" = "https://riot.im/privacy"; +"settings_third_party_notices" = "第三方通知"; +"settings_send_crash_report" = "发送崩溃和使用数据"; +"settings_clear_cache" = "清空缓存"; +"settings_change_password" = "修改密码"; +"settings_old_password" = "旧密码"; +"settings_new_password" = "新密码"; +"settings_confirm_password" = "确认密码"; +"settings_fail_to_update_password" = "更新密码失败"; +"settings_password_updated" = "您的密码已经更新"; +"settings_crypto_device_name" = "设备名字: "; +"settings_crypto_device_id" = "\n设备 ID: "; +"settings_crypto_device_key" = "\n设备密钥: "; +"settings_crypto_export" = "导出密钥"; +"settings_crypto_blacklist_unverified_devices" = "只导出到已验证的设备"; +// Room Details +"room_details_title" = "聊天室详情"; +"room_details_people" = "成员"; +"room_details_files" = "文件"; +"room_details_settings" = "设置"; +"room_details_photo" = "聊天室图片"; +"room_details_room_name" = "聊天室名字"; +"room_details_topic" = "话题"; +"room_details_favourite_tag" = "收藏夹"; +"room_details_low_priority_tag" = "低优先级"; +"room_details_mute_notifs" = "静音通知"; +"room_details_access_section" = "谁能访问此聊天室?"; +"room_details_access_section_invited_only" = "只有邀请的人"; +"room_details_access_section_anyone_apart_from_guest" = "任何知道此聊天室链接的人,除了访客"; +"room_details_access_section_anyone" = "任何知道此聊天室链接的人,包括访客"; +"room_details_access_section_no_address_warning" = "要链接一个聊天室必须设置地址"; +"room_details_access_section_directory_toggle" = "将此聊天室列入聊天室目录"; +"room_details_history_section" = "谁可以阅读历史?"; +"room_details_history_section_anyone" = "任何人"; +"room_details_history_section_members_only" = "只有成员(从选择这个选项的时间开始)"; +"room_details_history_section_members_only_since_invited" = "只有成员(从他们被邀请开始)"; +"room_details_history_section_members_only_since_joined" = "只有成员(从他们加入开始)"; +"room_details_history_section_prompt_title" = "隐私警告"; +"room_details_addresses_section" = "地址"; +"room_details_no_local_addresses" = "此聊天室没有本地地址"; +"room_details_history_section_prompt_msg" = "改成谁都可以阅读历史只会应用于此聊天室未来的消息。已经存在的历史消息的可见性将不会改变。"; +"room_details_new_address" = "添加新地址"; +"room_details_new_address_placeholder" = "添加新地址(例如 #foo%@)"; +"room_details_addresses_invalid_address_prompt_title" = "无效的别名格式"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ 不是一个有效的别名格式"; +"room_details_addresses_disable_main_address_prompt_title" = "主地址警告"; +"room_details_addresses_disable_main_address_prompt_msg" = "您没有指定主地址。此聊天室的默认主地址会随机选取"; +"room_details_banned_users_section" = "封禁的用户"; +"room_details_advanced_section" = "高级"; +"room_details_advanced_room_id" = "聊天室 ID:"; +"room_details_advanced_enable_e2e_encryption" = "启用加密(警告:启用后不能禁用)"; +"room_details_advanced_e2e_encryption_enabled" = "此聊天室已经启用加密"; +"room_details_advanced_e2e_encryption_disabled" = "此聊天室未启用加密。"; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "只加密到已验证的设备"; +"room_details_advanced_e2e_encryption_prompt_message" = "端对端加密依然在测试阶段,可能不可靠。\n\n你不应该相信它来保护你的数据。\n\n将无法解密设备加入聊天室之前的历史记录。\n\n一旦加密对一个聊天室启用了,它不能再关闭(对于现在来说)。\n\n加密消息对还没有实现加密的客户端将会不可见。"; +"room_details_fail_to_update_avatar" = "更新聊天室图片失败"; +"room_details_fail_to_update_room_name" = "更新聊天室名字失败"; +"room_details_fail_to_update_topic" = "更新话题失败"; +"room_details_fail_to_update_room_guest_access" = "更新聊天室访客访问失败"; +"room_details_fail_to_update_room_join_rule" = "更新加入规则失败"; +"room_details_fail_to_update_room_directory_visibility" = "更新聊天室目录可见性失败"; +"room_details_fail_to_update_history_visibility" = "更新历史可见性失败"; +"room_details_fail_to_add_room_aliases" = "添加新的聊天室地址失败"; +"room_details_fail_to_remove_room_aliases" = "移除聊天室地址失败"; +"room_details_fail_to_update_room_canonical_alias" = "更新主地址失败"; +"room_details_fail_to_enable_encryption" = "为此聊天室启用加密失败"; +"room_details_save_changes_prompt" = "您要保存更改吗?"; +"room_details_set_main_address" = "设置为主地址"; +"room_details_unset_main_address" = "取消设置主地址"; +"room_details_copy_room_id" = "复制聊天室 ID"; +"room_details_copy_room_address" = "复制聊天室地址"; +"room_details_copy_room_url" = "复制聊天室 URL"; +// Read Receipts +"read_receipts_list" = "读取收件人列表"; +"receipt_status_read" = "读取: "; +// Media picker +"media_picker_library" = "库"; +"media_picker_select" = "选择"; +// Directory +"directory_title" = "目录"; +"directory_server_picker_title" = "选择一个目录"; +"directory_server_all_rooms" = "%@ 服务器上的所有聊天室"; +"directory_server_all_native_rooms" = "所有本地 Matrix 聊天室"; +"directory_server_type_homeserver" = "输入一个主服务器来列出公共聊天室"; +"directory_server_placeholder" = "matrix.org"; +// Others +"or" = "或"; +"you" = "您"; +"today" = "今天"; +"yesterday" = "昨天"; +"network_offline_prompt" = "貌似互联网连接已经离线。"; +"public_room_section_title" = "公共聊天室(在 %@):"; +"bug_report_prompt" = "上一次应用程序崩溃了。您是否要提交一份崩溃报告?"; +"bug_report_send" = "发送"; +"rage_shake_prompt" = "你似乎在沮丧地摇晃手机。您要提交 bug 报告吗?"; +"camera_access_not_granted" = "%@ 没有使用摄像头的权限,请修改隐私设置"; +"large_badge_value_k_format" = "%.1fK"; +// room display name +"room_displayname_invite_from" = "从 %@ 邀请"; +"room_displayname_room_invite" = "聊天室邀请"; +"room_displayname_two_members" = "%@ 和 %@"; +"room_displayname_more_than_two_members" = "%@ 和 %u 个其他人"; +"room_displayname_no_title" = "空聊天室"; +// Call +"call_incoming_voice_prompt" = "来自 %@ 的语音通话"; +"call_incoming_video_prompt" = "来自 %@ 的视频通话"; +// No VoIP support +"no_voip_title" = "来电"; +"no_voip" = "%@ 正在请求与您通话然而 %@ 尚不支持通话。\n您可以忽略此通知并通过其他设备接听,或者您可以拒绝接听。"; +// Crash report +"google_analytics_use_prompt" = "您打算通过自动报告匿名的崩溃报告和使用数据来帮助提升 %@ 吗?"; +// Crypto +"e2e_enabling_on_app_update" = "Riot 目前支持端对端加密但是您需要重新登录来启用。\n\n您可以现在重新登录也可以之后从应用程序设置里选择。"; +"e2e_need_log_in_again" = "您需要登录回来以便为此设备生成端对端加密密钥并提交公钥到您的主服务器。\n这只需要做一次;很抱歉造成打扰。"; +// Bug report +"bug_report_title" = "Bug 报告"; +"bug_report_description" = "请描述此 bug。您做了什么?您期待发生什么?以及实际发生了什么?"; +"bug_crash_report_title" = "崩溃报告"; +"bug_crash_report_description" = "请描述崩溃前发生了什么:"; +"bug_report_logs_description" = "为了诊断问题,这个客户端的日志会随这个 bug 报告发送。如果你只想发送上面的文字,请取消选择:"; +"bug_report_send_logs" = "发送日志"; +"bug_report_send_screenshot" = "发送截图"; +"bug_report_progress_zipping" = "正在收集日志"; +"bug_report_progress_uploading" = "正在上传报告"; +"collapse" = "折叠"; +"auth_email_in_use" = "此电子邮件地址已被占用"; +"auth_phone_in_use" = "此电话号码已被使用"; +"auth_untrusted_id_server" = "此身份服务器不可信"; +"auth_email_not_found" = "发送邮件失败。找不到此邮件地址"; +"settings_user_interface" = "用户界面"; +"settings_ui_language" = "语言"; +"settings_ui_light_theme" = "浅色主题"; +"settings_ui_dark_theme" = "暗色主题"; +// Events formatter +"event_formatter_member_updates" = "%tu 的成员身份变化"; diff --git a/Riot/Model/Contact/ContactsDataSource.h b/Riot/Model/Contact/ContactsDataSource.h index b63f74514..4e8005f0c 100644 --- a/Riot/Model/Contact/ContactsDataSource.h +++ b/Riot/Model/Contact/ContactsDataSource.h @@ -16,6 +16,20 @@ #import +/** + The state of the users search from the homeserver user directory. + */ +typedef enum : NSUInteger +{ + ContactsDataSourceUserDirectoryStateLoading, + ContactsDataSourceUserDirectoryStateLoadedButLimited, + ContactsDataSourceUserDirectoryStateLoaded, + // The search is based on local known matrix contacts + ContactsDataSourceUserDirectoryStateOfflineLoading, + ContactsDataSourceUserDirectoryStateOfflineLoaded +} ContactsDataSourceUserDirectoryState; + + /** 'ContactsDataSource' is a base class to handle contacts in Riot. */ @@ -145,4 +159,9 @@ */ @property (nonatomic, readonly) MXKContact *searchInputContact; +/** + The state of the users search from the homeserver user directory. + */ +@property (nonatomic, readonly) ContactsDataSourceUserDirectoryState userDirectoryState; + @end diff --git a/Riot/Model/Contact/ContactsDataSource.m b/Riot/Model/Contact/ContactsDataSource.m index 5c880b241..c5980080e 100644 --- a/Riot/Model/Contact/ContactsDataSource.m +++ b/Riot/Model/Contact/ContactsDataSource.m @@ -20,7 +20,7 @@ #import "RiotDesignValues.h" #define CONTACTSDATASOURCE_LOCALCONTACTS_BITWISE 0x01 -#define CONTACTSDATASOURCE_KNOWNCONTACTS_BITWISE 0x02 +#define CONTACTSDATASOURCE_USERDIRECTORY_BITWISE 0x02 #define CONTACTSDATASOURCE_DEFAULT_SECTION_HEADER_HEIGHT 30.0 #define CONTACTSDATASOURCE_LOCALCONTACTS_SECTION_HEADER_HEIGHT 65.0 @@ -33,6 +33,9 @@ NSString *searchProcessingText; NSMutableArray *searchProcessingLocalContacts; NSMutableArray *searchProcessingMatrixContacts; + + // The current request to the homeserver user directory + MXHTTPOperation *hsUserDirectoryOperation; BOOL forceSearchResultRefresh; @@ -115,6 +118,9 @@ localContactsCheckboxContainer = nil; localContactsCheckbox = nil; + + [hsUserDirectoryOperation cancel]; + hsUserDirectoryOperation = nil; [super destroy]; } @@ -145,6 +151,13 @@ } - (void)searchWithPattern:(NSString *)searchText forceReset:(BOOL)forceRefresh +{ + // If possible, always start a new search by asking the homeserver user directory + BOOL hsUserDirectory = (self.mxSession.state != MXSessionStateHomeserverNotReachable); + [self searchWithPattern:searchText forceReset:forceRefresh hsUserDirectory:hsUserDirectory]; +} + +- (void)searchWithPattern:(NSString *)searchText forceReset:(BOOL)forceRefresh hsUserDirectory:(BOOL)hsUserDirectory { // Update search results. searchText = [searchText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; @@ -161,11 +174,59 @@ shrinkedSectionsBitMask = 0; } } - else if (forceRefresh || !searchProcessingText.length || [searchText hasPrefix:searchProcessingText] == NO) + else if (forceRefresh || ![searchText isEqualToString:searchProcessingText]) { // Prepare on the main thread the arrays used to initialize the search on the processing queue. unfilteredLocalContacts = [self unfilteredLocalContactsArray]; - unfilteredMatrixContacts = [self unfilteredMatrixContactsArray]; + if (!hsUserDirectory) + { + _userDirectoryState = ContactsDataSourceUserDirectoryStateOfflineLoading; + unfilteredMatrixContacts = [self unfilteredMatrixContactsArray]; + } + else if (![searchText isEqualToString:searchProcessingText]) + { + _userDirectoryState = ContactsDataSourceUserDirectoryStateLoading; + + // Make a search on the homeserver user directory + [filteredMatrixContacts removeAllObjects]; + filteredMatrixContacts = nil; + + // Cancel previous operation + if (hsUserDirectoryOperation) + { + [hsUserDirectoryOperation cancel]; + hsUserDirectoryOperation = nil; + } + + hsUserDirectoryOperation = [self.mxSession.matrixRestClient searchUsers:searchText limit:50 success:^(MXUserSearchResponse *userSearchResponse) { + + filteredMatrixContacts = [NSMutableArray arrayWithCapacity:userSearchResponse.results.count]; + + // Keep the response order as the hs ordered users by relevance + for (MXUser *mxUser in userSearchResponse.results) + { + MXKContact *contact = [[MXKContact alloc] initMatrixContactWithDisplayName:mxUser.displayname andMatrixID:mxUser.userId]; + [filteredMatrixContacts addObject:contact]; + } + + hsUserDirectoryOperation = nil; + + _userDirectoryState = userSearchResponse.limited ? ContactsDataSourceUserDirectoryStateLoadedButLimited : ContactsDataSourceUserDirectoryStateLoaded; + + // And inform the delegate about the update + [self.delegate dataSource:self didCellChange:nil]; + + } failure:^(NSError *error) { + + // Ignore connection cancellation error + if ((![error.domain isEqualToString:NSURLErrorDomain] || error.code != NSURLErrorCancelled)) + { + // But for other errors, launch a local search + NSLog(@"[ContactsDataSource] [MXRestClient searchUsers] returns an error. Do a search on local known contacts"); + [self searchWithPattern:searchText forceReset:forceRefresh hsUserDirectory:NO]; + } + }]; + } // Disclose the sections shrinkedSectionsBitMask = 0; @@ -239,7 +300,12 @@ // Update the filtered contacts. currentSearchText = searchProcessingText; filteredLocalContacts = searchProcessingLocalContacts; - filteredMatrixContacts = searchProcessingMatrixContacts; + + if (!hsUserDirectory) + { + filteredMatrixContacts = searchProcessingMatrixContacts; + _userDirectoryState = ContactsDataSourceUserDirectoryStateOfflineLoaded; + } if (!self.forceMatrixIdInDisplayName) { @@ -435,7 +501,7 @@ // Display a default cell when no local contacts is available. count = filteredLocalContacts.count ? filteredLocalContacts.count : 1; } - else if (section == filteredMatrixContactsSection && !(shrinkedSectionsBitMask & CONTACTSDATASOURCE_KNOWNCONTACTS_BITWISE)) + else if (section == filteredMatrixContactsSection && !(shrinkedSectionsBitMask & CONTACTSDATASOURCE_USERDIRECTORY_BITWISE)) { // Display a default cell when no contacts is available. count = filteredMatrixContacts.count ? filteredMatrixContacts.count : 1; @@ -534,7 +600,15 @@ // Check whether a search session is in progress if (currentSearchText.length) { - tableViewCell.textLabel.text = NSLocalizedStringFromTable(@"search_no_result", @"Vector", nil); + if (indexPath.section == filteredMatrixContactsSection && + (_userDirectoryState == ContactsDataSourceUserDirectoryStateLoading || _userDirectoryState == ContactsDataSourceUserDirectoryStateOfflineLoading)) + { + tableViewCell.textLabel.text = [NSBundle mxk_localizedStringForKey:@"search_searching"]; + } + else + { + tableViewCell.textLabel.text = NSLocalizedStringFromTable(@"search_no_result", @"Vector", nil); + } } else if (indexPath.section == filteredLocalContactsSection) { @@ -643,7 +717,17 @@ } else //if (section == filteredMatrixContactsSection) { - title = NSLocalizedStringFromTable(@"contacts_matrix_users_section", @"Vector", nil); + switch (_userDirectoryState) + { + case ContactsDataSourceUserDirectoryStateOfflineLoading: + case ContactsDataSourceUserDirectoryStateOfflineLoaded: + title = NSLocalizedStringFromTable(@"contacts_user_directory_offline_section", @"Vector", nil); + break; + + default: + title = NSLocalizedStringFromTable(@"contacts_user_directory_section", @"Vector", nil); + break; + } if (currentSearchText.length) { @@ -653,7 +737,8 @@ if (count) { - NSString *roomCount = [NSString stringWithFormat:@" %tu", count]; + NSString *roomCountFormat = (_userDirectoryState == ContactsDataSourceUserDirectoryStateLoadedButLimited) ? @" > %tu" : @" %tu"; + NSString *roomCount = [NSString stringWithFormat:roomCountFormat, count]; NSMutableAttributedString *mutableSectionTitle = [[NSMutableAttributedString alloc] initWithString:title attributes:@{NSForegroundColorAttributeName : kRiotTextColorBlack, @@ -705,7 +790,7 @@ // This section is collapsable only if it is not empty if (filteredMatrixContacts.count) { - sectionBitwise = CONTACTSDATASOURCE_KNOWNCONTACTS_BITWISE; + sectionBitwise = CONTACTSDATASOURCE_USERDIRECTORY_BITWISE; } } } @@ -928,7 +1013,7 @@ { // Return the section header used when the section is shrinked NSInteger savedShrinkedSectionsBitMask = shrinkedSectionsBitMask; - shrinkedSectionsBitMask = CONTACTSDATASOURCE_LOCALCONTACTS_BITWISE | CONTACTSDATASOURCE_KNOWNCONTACTS_BITWISE; + shrinkedSectionsBitMask = CONTACTSDATASOURCE_LOCALCONTACTS_BITWISE | CONTACTSDATASOURCE_USERDIRECTORY_BITWISE; UIView *stickyHeader = [self viewForHeaderInSection:section withFrame:frame]; diff --git a/Riot/ViewController/ContactsTableViewController.m b/Riot/ViewController/ContactsTableViewController.m index 921094c8e..352f83ac9 100644 --- a/Riot/ViewController/ContactsTableViewController.m +++ b/Riot/ViewController/ContactsTableViewController.m @@ -22,7 +22,7 @@ #import "AppDelegate.h" #define CONTACTS_TABLEVC_LOCALCONTACTS_BITWISE 0x01 -#define CONTACTS_TABLEVC_KNOWNCONTACTS_BITWISE 0x02 +#define CONTACTS_TABLEVC_USERDIRECTORY_BITWISE 0x02 #define CONTACTS_TABLEVC_DEFAULT_SECTION_HEADER_HEIGHT 30.0 #define CONTACTS_TABLEVC_LOCALCONTACTS_SECTION_HEADER_HEIGHT 65.0 diff --git a/Riot/ViewController/PeopleViewController.m b/Riot/ViewController/PeopleViewController.m index 52ba8fb49..9dfa3502b 100644 --- a/Riot/ViewController/PeopleViewController.m +++ b/Riot/ViewController/PeopleViewController.m @@ -50,11 +50,6 @@ contactsSectionNumber = 0; self.screenName = @"People"; - - // Prepare its contacts data source - contactsDataSource = [[ContactsDataSource alloc] init]; - contactsDataSource.contactCellAccessoryType = UITableViewCellAccessoryDisclosureIndicator; - contactsDataSource.delegate = self; } - (void)viewDidLoad @@ -151,6 +146,13 @@ recentsDataSource = (RecentsDataSource*)listDataSource; } + if (!contactsDataSource) + { + // Prepare its contacts data source + contactsDataSource = [[ContactsDataSource alloc] initWithMatrixSession:listDataSource.mxSession]; + contactsDataSource.contactCellAccessoryType = UITableViewCellAccessoryDisclosureIndicator; + contactsDataSource.delegate = self; + } } #pragma mark - MXKDataSourceDelegate diff --git a/Riot/ViewController/RoomParticipantsViewController.m b/Riot/ViewController/RoomParticipantsViewController.m index 88ebc5d00..843d3fbb4 100644 --- a/Riot/ViewController/RoomParticipantsViewController.m +++ b/Riot/ViewController/RoomParticipantsViewController.m @@ -615,7 +615,7 @@ contactsPickerViewController.contactsTableViewControllerDelegate = self; // Prepare its data source - ContactsDataSource *contactsDataSource = [[ContactsDataSource alloc] init]; + ContactsDataSource *contactsDataSource = [[ContactsDataSource alloc] initWithMatrixSession:self.mxRoom.mxSession]; contactsDataSource.areSectionsShrinkable = YES; contactsDataSource.displaySearchInputInContactsList = YES; contactsDataSource.forceMatrixIdInDisplayName = YES; diff --git a/Riot/ViewController/RoomViewController.m b/Riot/ViewController/RoomViewController.m index c8aed8166..cd1c3fa0e 100644 --- a/Riot/ViewController/RoomViewController.m +++ b/Riot/ViewController/RoomViewController.m @@ -2576,7 +2576,7 @@ contactsPickerViewController.contactsTableViewControllerDelegate = self; // Prepare its data source - ContactsDataSource *contactsDataSource = [[ContactsDataSource alloc] init]; + ContactsDataSource *contactsDataSource = [[ContactsDataSource alloc] initWithMatrixSession:self.roomDataSource.mxSession]; contactsDataSource.areSectionsShrinkable = YES; contactsDataSource.displaySearchInputInContactsList = YES; contactsDataSource.forceMatrixIdInDisplayName = YES; diff --git a/Riot/ViewController/SettingsViewController.m b/Riot/ViewController/SettingsViewController.m index 6906fa211..c2a2b7cad 100644 --- a/Riot/ViewController/SettingsViewController.m +++ b/Riot/ViewController/SettingsViewController.m @@ -187,6 +187,9 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)(); // UIAlertController *resetPwdAlertController; + // The view used to export e2e keys + MXKEncryptionKeysExportView *exportView; + // The document interaction Controller used to export e2e keys UIDocumentInteractionController *documentInteractionController; NSURL *keyExportsFile; @@ -1610,7 +1613,15 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)(); } NSString *language = [NSBundle mxk_language]; - NSString *languageDescription = language ? [MXKLanguagePickerViewController languageDescription:language] : [MXKLanguagePickerViewController languageDescription:[MXKLanguagePickerViewController defaultLanguage]]; + if (!language) + { + language = [MXKLanguagePickerViewController defaultLanguage]; + } + NSString *languageDescription = [MXKLanguagePickerViewController languageDescription:language]; + + // Capitalise the description in the language locale + NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:language]; + languageDescription = [languageDescription capitalizedStringWithLocale:locale]; cell.textLabel.textColor = kRiotTextColorBlack; @@ -3178,7 +3189,7 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)(); { [currentAlert dismissViewControllerAnimated:NO completion:nil]; - MXKEncryptionKeysExportView *exportView = [[MXKEncryptionKeysExportView alloc] initWithMatrixSession:self.mainSession]; + exportView = [[MXKEncryptionKeysExportView alloc] initWithMatrixSession:self.mainSession]; currentAlert = exportView.alertController; // Use a temporary file for the export @@ -3191,27 +3202,31 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)(); __weak typeof(self) weakSelf = self; [exportView showInViewController:self toExportKeysToFile:keyExportsFile onComplete:^(BOOL success) { - if (weakSelf && success) + if (weakSelf) { typeof(self) self = weakSelf; self->currentAlert = nil; + self->exportView = nil; - // Let another app handling this file - self->documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:keyExportsFile]; - [self->documentInteractionController setDelegate:self]; + if (success) + { + // Let another app handling this file + self->documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:keyExportsFile]; + [self->documentInteractionController setDelegate:self]; - if ([self->documentInteractionController presentOptionsMenuFromRect:self.view.frame inView:self.view animated:YES]) - { - // We want to delete the temp keys file after it has been processed by the other app. - // We use [UIDocumentInteractionControllerDelegate didEndSendingToApplication] for that - // but it is not reliable for all cases (see http://stackoverflow.com/a/21867096). - // So, arm a timer to auto delete the file after 10mins. - keyExportsFileDeletionTimer = [NSTimer scheduledTimerWithTimeInterval:600 target:self selector:@selector(deleteKeyExportFile) userInfo:self repeats:NO]; - } - else - { - self->documentInteractionController = nil; - [self deleteKeyExportFile]; + if ([self->documentInteractionController presentOptionsMenuFromRect:self.view.frame inView:self.view animated:YES]) + { + // We want to delete the temp keys file after it has been processed by the other app. + // We use [UIDocumentInteractionControllerDelegate didEndSendingToApplication] for that + // but it is not reliable for all cases (see http://stackoverflow.com/a/21867096). + // So, arm a timer to auto delete the file after 10mins. + keyExportsFileDeletionTimer = [NSTimer scheduledTimerWithTimeInterval:600 target:self selector:@selector(deleteKeyExportFile) userInfo:self repeats:NO]; + } + else + { + self->documentInteractionController = nil; + [self deleteKeyExportFile]; + } } } }]; @@ -3562,7 +3577,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)(); [[NSUserDefaults standardUserDefaults] setObject:language forKey:@"appLanguage"]; [[NSUserDefaults standardUserDefaults] synchronize]; - // Do a full sync to recompute matrix data (rooms data sources and summaries) + // Do a reload in order to recompute strings in the new language + // Note that "reloadMatrixSessions:NO" will reset room summaries [self startActivityIndicator]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ diff --git a/Riot/ViewController/StartChatViewController.m b/Riot/ViewController/StartChatViewController.m index 47f82c85d..ca31abd3d 100644 --- a/Riot/ViewController/StartChatViewController.m +++ b/Riot/ViewController/StartChatViewController.m @@ -74,17 +74,6 @@ // Assign itself as delegate self.contactsTableViewControllerDelegate = self; - - // Prepare its data source - ContactsDataSource *dataSource = [[ContactsDataSource alloc] init]; - dataSource.areSectionsShrinkable = YES; - dataSource.displaySearchInputInContactsList = YES; - dataSource.forceMatrixIdInDisplayName = YES; - // Add a plus icon to the contact cell when a search session is in progress, - // in order to make it more understandable for the end user. - dataSource.contactCellAccessoryImage = [UIImage imageNamed:@"plus_icon"]; - - [self displayList:dataSource]; } - (void)viewDidLoad @@ -121,7 +110,18 @@ { [self addMatrixSession:mxSession]; } - + + // Prepare its data source + ContactsDataSource *dataSource = [[ContactsDataSource alloc] initWithMatrixSession:self.mainSession]; // TO TEST + dataSource.areSectionsShrinkable = YES; + dataSource.displaySearchInputInContactsList = YES; + dataSource.forceMatrixIdInDisplayName = YES; + // Add a plus icon to the contact cell when a search session is in progress, + // in order to make it more understandable for the end user. + dataSource.contactCellAccessoryImage = [UIImage imageNamed:@"plus_icon"]; + + [self displayList:dataSource]; + cancelBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(onButtonPressed:)]; self.navigationItem.leftBarButtonItem = cancelBarButtonItem; diff --git a/Riot/ViewController/UnifiedSearchViewController.m b/Riot/ViewController/UnifiedSearchViewController.m index ca992808d..9947fff5c 100644 --- a/Riot/ViewController/UnifiedSearchViewController.m +++ b/Riot/ViewController/UnifiedSearchViewController.m @@ -211,7 +211,7 @@ [filesSearchViewController displaySearch:filesSearchDataSource]; // Init the search for people - peopleSearchDataSource = [[ContactsDataSource alloc] init]; + peopleSearchDataSource = [[ContactsDataSource alloc] initWithMatrixSession:mainSession]; peopleSearchDataSource.areSectionsShrinkable = YES; peopleSearchDataSource.displaySearchInputInContactsList = YES; peopleSearchDataSource.contactCellAccessoryType = UITableViewCellAccessoryDisclosureIndicator; diff --git a/Riot/Views/RoomInputToolbar/RoomInputToolbarView.xib b/Riot/Views/RoomInputToolbar/RoomInputToolbarView.xib index d16da8f7b..37d645cbf 100644 --- a/Riot/Views/RoomInputToolbar/RoomInputToolbarView.xib +++ b/Riot/Views/RoomInputToolbar/RoomInputToolbarView.xib @@ -1,11 +1,11 @@ - - + + - + @@ -64,8 +64,7 @@ - - +