From cc7bc0536df53e6aacd9452642585758049a9eeb Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Fri, 16 May 2025 21:11:21 +0100 Subject: [PATCH 01/14] 6.4-beta.0: ios 278, android 290, desktop 102 --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 56 +++++++++++----------- apps/multiplatform/gradle.properties | 8 ++-- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 77b4ef39a8..0a0d5b4458 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -179,8 +179,8 @@ 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; }; 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; }; - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a */; }; - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a */; }; + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a */; }; + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a */; }; 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; 64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; }; @@ -543,8 +543,8 @@ 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a"; sourceTree = ""; }; - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a"; sourceTree = ""; }; + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a"; sourceTree = ""; }; + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a"; sourceTree = ""; }; 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; }; @@ -702,8 +702,8 @@ 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */, 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */, 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */, - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a in Frameworks */, - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a in Frameworks */, + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a in Frameworks */, + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -788,8 +788,8 @@ 64C829992D54AEEE006B9E89 /* libffi.a */, 64C829982D54AEED006B9E89 /* libgmp.a */, 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */, - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh-ghc9.6.3.a */, - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.0-Adp18CY8iMhDelg0G0VSjh.a */, + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7-ghc9.6.3.a */, + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.1-7Y3Lr8U6bNmEaeIx88dGf7.a */, ); path = Libraries; sourceTree = ""; @@ -1991,7 +1991,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2016,7 +2016,7 @@ "@executable_path/Frameworks", ); LLVM_LTO = YES_THIN; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; OTHER_LDFLAGS = "-Wl,-stack_size,0x1000000"; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; @@ -2041,7 +2041,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2066,7 +2066,7 @@ "@executable_path/Frameworks", ); LLVM_LTO = YES; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; OTHER_LDFLAGS = "-Wl,-stack_size,0x1000000"; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; @@ -2083,11 +2083,11 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -2103,11 +2103,11 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.Tests-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -2128,7 +2128,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GCC_OPTIMIZATION_LEVEL = s; @@ -2143,7 +2143,7 @@ "@executable_path/../../Frameworks", ); LLVM_LTO = YES; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2165,7 +2165,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; @@ -2180,7 +2180,7 @@ "@executable_path/../../Frameworks", ); LLVM_LTO = YES; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2202,7 +2202,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2228,7 +2228,7 @@ "$(PROJECT_DIR)/Libraries/sim", ); LLVM_LTO = YES; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; @@ -2253,7 +2253,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2279,7 +2279,7 @@ "$(PROJECT_DIR)/Libraries/sim", ); LLVM_LTO = YES; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; @@ -2304,7 +2304,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2319,7 +2319,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -2338,7 +2338,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 277; + CURRENT_PROJECT_VERSION = 278; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2353,7 +2353,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 6.3.4; + MARKETING_VERSION = 6.4; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-SE"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index 18add58bcf..4623752b32 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -24,11 +24,11 @@ android.nonTransitiveRClass=true kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.jvm.target=11 -android.version_name=6.3.4 -android.version_code=288 +android.version_name=6.4-beta.0 +android.version_code=290 -desktop.version_name=6.3.4 -desktop.version_code=101 +desktop.version_name=6.4-beta.0 +desktop.version_code=102 kotlin.version=1.9.23 gradle.plugin.version=8.2.0 From 98f35a38e84543acb9527035f9abe0c4298b0516 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Mon, 19 May 2025 09:08:28 +0000 Subject: [PATCH 02/14] core: fix member introduction when inviting admin accepts member; fix order of items for accepted member (#5924) --- src/Simplex/Chat/Library/Commands.hs | 3 +++ src/Simplex/Chat/Library/Subscriber.hs | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index f1ef1f369f..950eef7704 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -2079,6 +2079,9 @@ processChatCommand' vr = \case forM_ (memberConn m) $ \mConn -> do let msg2 = XMsgNew $ MCSimple $ extMsgContent (MCText acceptedToGroupMessage) Nothing void $ sendDirectMemberMessage mConn msg2 groupId + when (memberCategory m == GCInviteeMember) $ do + introduceToRemaining vr user gInfo m {memberRole = role} + when (groupFeatureAllowed SGFHistory gInfo) $ sendHistory user gInfo m (m', gInfo') <- withFastStore' $ \db -> do m' <- updateGroupMemberAccepted db user m newMemberStatus role gInfo' <- updateGroupMembersRequireAttention db user gInfo m m' diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 12e6263ba0..0ecb151120 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -2123,14 +2123,14 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = membership' <- withStore' $ \db -> updateGroupMemberAccepted db user membership GSMemConnected role -- create item in both scopes let gInfo' = gInfo {membership = membership'} - createInternalChatItem user (CDGroupRcv gInfo' Nothing m) (CIRcvGroupEvent RGEUserAccepted) Nothing - let scopeInfo = Just $ GCSIMemberSupport {groupMember_ = Nothing} - createInternalChatItem user (CDGroupRcv gInfo' scopeInfo m) (CIRcvGroupEvent RGEUserAccepted) Nothing - toView $ CEvtUserJoinedGroup user gInfo' m - let cd = CDGroupRcv gInfo' Nothing m + cd = CDGroupRcv gInfo' Nothing m createInternalChatItem user cd (CIRcvGroupE2EEInfo E2EInfo {pqEnabled = PQEncOff}) Nothing createGroupFeatureItems user cd CIRcvGroupFeature gInfo' maybeCreateGroupDescrLocal gInfo' m + createInternalChatItem user cd (CIRcvGroupEvent RGEUserAccepted) Nothing + let scopeInfo = Just $ GCSIMemberSupport {groupMember_ = Nothing} + createInternalChatItem user (CDGroupRcv gInfo' scopeInfo m) (CIRcvGroupEvent RGEUserAccepted) Nothing + toView $ CEvtUserJoinedGroup user gInfo' m GAPendingReview -> do membership' <- withStore' $ \db -> updateGroupMemberAccepted db user membership GSMemPendingReview role let gInfo' = gInfo {membership = membership'} From a2577c3df3a411f539db29daafbcfa7a27fe3983 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 19 May 2025 11:14:43 +0100 Subject: [PATCH 03/14] core: support observers send messages to admins, CLI commands (#5921) * core: allow observers send messages to admins * improve parser, CLI command to approve members --- src/Simplex/Chat/Controller.hs | 3 +- src/Simplex/Chat/Library/Commands.hs | 66 +++++++++++++++++--------- src/Simplex/Chat/Library/Subscriber.hs | 29 ++++++----- src/Simplex/Chat/Messages.hs | 10 ++++ src/Simplex/Chat/Protocol.hs | 19 +++++--- src/Simplex/Chat/View.hs | 2 +- tests/ChatTests/Groups.hs | 24 +++++++++- tests/ProtocolTests.hs | 4 +- 8 files changed, 112 insertions(+), 45 deletions(-) diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 7653322c8d..36d6b0aa4a 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -469,7 +469,7 @@ data ChatCommand | ForwardMessage {toChatName :: ChatName, fromContactName :: ContactName, forwardedMsg :: Text} | ForwardGroupMessage {toChatName :: ChatName, fromGroupName :: GroupName, fromMemberName_ :: Maybe ContactName, forwardedMsg :: Text} | ForwardLocalMessage {toChatName :: ChatName, forwardedMsg :: Text} - | SendMessage ChatName Text + | SendMessage SendName Text | SendMemberContactMessage GroupName ContactName Text | SendLiveMessage ChatName Text | SendMessageQuote {contactName :: ContactName, msgDir :: AMsgDirection, quotedMsg :: Text, message :: Text} @@ -483,6 +483,7 @@ data ChatCommand | NewGroup IncognitoEnabled GroupProfile | AddMember GroupName ContactName GroupMemberRole | JoinGroup {groupName :: GroupName, enableNtfs :: MsgFilter} + | AcceptMember GroupName ContactName GroupMemberRole | MemberRole GroupName ContactName GroupMemberRole | BlockForAll GroupName ContactName Bool | RemoveMembers {groupName :: GroupName, members :: Set ContactName, withMessages :: Bool} diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 950eef7704..7e0ff3b4c7 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -27,6 +27,7 @@ import Control.Monad.Reader import qualified Data.Aeson as J import Data.Attoparsec.ByteString.Char8 (Parser) import qualified Data.Attoparsec.ByteString.Char8 as A +import qualified Data.Attoparsec.Combinator as A import qualified Data.ByteString.Base64 as B64 import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as B @@ -1848,10 +1849,10 @@ processChatCommand' vr = \case forwardedItemId <- withFastStore $ \db -> getLocalChatItemIdByText' db user folderId forwardedMsg toChatRef <- getChatRef user toChatName processChatCommand $ APIForwardChatItems toChatRef (ChatRef CTLocal folderId Nothing) (forwardedItemId :| []) Nothing - SendMessage (ChatName cType name) msg -> withUser $ \user -> do + SendMessage sendName msg -> withUser $ \user -> do let mc = MCText msg - case cType of - CTDirect -> + case sendName of + SNDirect name -> withFastStore' (\db -> runExceptT $ getContactIdByName db user name) >>= \case Right ctId -> do let sendRef = SRDirect ctId @@ -1866,18 +1867,18 @@ processChatCommand' vr = \case throwChatError $ CEContactNotFound name (Just suspectedMember) _ -> throwChatError $ CEContactNotFound name Nothing - CTGroup -> do - (gId, mentions) <- withFastStore $ \db -> do + SNGroup name scope_ -> do + (gId, cScope_, mentions) <- withFastStore $ \db -> do gId <- getGroupIdByName db user name - (gId,) <$> liftIO (getMessageMentions db user gId msg) - let sendRef = SRGroup gId Nothing + cScope_ <- + forM scope_ $ \(GSNMemberSupport mName_) -> + GCSMemberSupport <$> mapM (getGroupMemberIdByName db user gId) mName_ + (gId,cScope_,) <$> liftIO (getMessageMentions db user gId msg) + let sendRef = SRGroup gId cScope_ processChatCommand $ APISendMessages sendRef False Nothing [ComposedMessage Nothing Nothing mc mentions] - CTLocal - | name == "" -> do - folderId <- withFastStore (`getUserNoteFolderId` user) - processChatCommand $ APICreateChatItems folderId [composedMessage Nothing mc] - | otherwise -> throwCmdError "not supported" - _ -> throwCmdError "not supported" + SNLocal -> do + folderId <- withFastStore (`getUserNoteFolderId` user) + processChatCommand $ APICreateChatItems folderId [composedMessage Nothing mc] SendMemberContactMessage gName mName msg -> withUser $ \user -> do (gId, mId) <- getGroupAndMemberId user gName mName m <- withFastStore $ \db -> getGroupMember db vr user gId mId @@ -2331,6 +2332,7 @@ processChatCommand' vr = \case JoinGroup gName enableNtfs -> withUser $ \user -> do groupId <- withFastStore $ \db -> getGroupIdByName db user gName processChatCommand $ APIJoinGroup groupId enableNtfs + AcceptMember gName gMemberName memRole -> withMemberName gName gMemberName $ \gId gMemberId -> APIAcceptMember gId gMemberId memRole MemberRole gName gMemberName memRole -> withMemberName gName gMemberName $ \gId gMemberId -> APIMembersRole gId [gMemberId] memRole BlockForAll gName gMemberName blocked -> withMemberName gName gMemberName $ \gId gMemberId -> APIBlockMembersForAll gId [gMemberId] blocked RemoveMembers gName gMemberNames withMessages -> withUser $ \user -> do @@ -2421,7 +2423,8 @@ processChatCommand' vr = \case when (contactGrpInvSent ct) $ throwCmdError "x.grp.direct.inv already sent" case memberConn m of Just mConn -> do - let msg = XGrpDirectInv cReq msgContent_ + -- TODO [knocking] send in correct scope - modiy API + let msg = XGrpDirectInv cReq msgContent_ Nothing (sndMsg, _, _) <- sendDirectMemberMessage mConn msg groupId withFastStore' $ \db -> setContactGrpInvSent db ct True let ct' = ct {contactGrpInvSent = True} @@ -3372,7 +3375,7 @@ processChatCommand' vr = \case Nothing -> Just GRAuthor Just (GCSMemberSupport Nothing) | memberPending membership -> Nothing - | otherwise -> Just GRAuthor + | otherwise -> Just GRObserver Just (GCSMemberSupport (Just _gmId)) -> Just GRModerator assertGroupContentAllowed :: CM () assertGroupContentAllowed = @@ -4190,6 +4193,7 @@ chatCommandP = "/_group " *> (APINewGroup <$> A.decimal <*> incognitoOnOffP <* A.space <*> jsonP), ("/add " <|> "/a ") *> char_ '#' *> (AddMember <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <*> (memberRole <|> pure GRMember)), ("/join " <|> "/j ") *> char_ '#' *> (JoinGroup <$> displayNameP <*> (" mute" $> MFNone <|> pure MFAll)), + "/accept member " *> char_ '#' *> (AcceptMember <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <*> (memberRole <|> pure GRMember)), ("/member role " <|> "/mr ") *> char_ '#' *> (MemberRole <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <*> memberRole), "/block for all #" *> (BlockForAll <$> displayNameP <* A.space <*> (char_ '@' *> displayNameP) <*> pure True), "/unblock for all #" *> (BlockForAll <$> displayNameP <* A.space <*> (char_ '@' *> displayNameP) <*> pure False), @@ -4236,8 +4240,7 @@ chatCommandP = ForwardGroupMessage <$> chatNameP <* " <- #" <*> displayNameP <* A.space <* A.char '@' <*> (Just <$> displayNameP) <* A.space <*> msgTextP, ForwardGroupMessage <$> chatNameP <* " <- #" <*> displayNameP <*> pure Nothing <* A.space <*> msgTextP, ForwardLocalMessage <$> chatNameP <* " <- * " <*> msgTextP, - SendMessage <$> chatNameP <* A.space <*> msgTextP, - "/* " *> (SendMessage (ChatName CTLocal "") <$> msgTextP), + SendMessage <$> sendNameP <* A.space <*> msgTextP, "@#" *> (SendMemberContactMessage <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <* A.space <*> msgTextP), "/live " *> (SendLiveMessage <$> chatNameP <*> (A.space *> msgTextP <|> pure "")), (">@" <|> "> @") *> sendMsgQuote (AMsgDirection SMDRcv), @@ -4440,14 +4443,27 @@ chatCommandP = chatNameP' = ChatName <$> (chatTypeP <|> pure CTDirect) <*> displayNameP chatRefP = do chatTypeP >>= \case - CTGroup -> ChatRef CTGroup <$> A.decimal <*> (Just <$> gcScopeP <|> pure Nothing) + CTGroup -> ChatRef CTGroup <$> A.decimal <*> optional gcScopeP cType -> (\chatId -> ChatRef cType chatId Nothing) <$> A.decimal sendRefP = (A.char '@' $> SRDirect <*> A.decimal) - <|> (A.char '#' $> SRGroup <*> A.decimal <*> (Just <$> gcScopeP <|> pure Nothing)) - gcScopeP = - ("(_support:" *> (GCSMemberSupport . Just <$> A.decimal) <* ")") - <|> ("(_support)" $> (GCSMemberSupport Nothing)) + <|> (A.char '#' $> SRGroup <*> A.decimal <*> optional gcScopeP) + gcScopeP = "(_support" *> (GCSMemberSupport <$> optional (A.char ':' *> A.decimal)) <* A.char ')' + sendNameP = + (A.char '@' $> SNDirect <*> displayNameP) + <|> (A.char '#' $> SNGroup <*> displayNameP <*> gScopeNameP) + <|> ("/*" $> SNLocal) + gScopeNameP = + (supportPfx *> (Just . GSNMemberSupport <$> optional supportMember) <* A.char ')') + -- this branch fails on "(support" followed by incorrect syntax, + -- to avoid sending message to the whole group as `optional gScopeNameP` would do + <|> (optional supportPfx >>= mapM (\_ -> fail "bad chat scope")) + where + supportPfx = A.takeWhile isSpace *> "(support" + supportMember = safeDecodeUtf8 <$> (A.char ':' *> A.takeWhile isSpace *> (A.take . lengthTillLastParen =<< A.lookAhead displayNameP_)) + lengthTillLastParen s = case B.unsnoc s of + Just (_, ')') -> B.length s - 1 + _ -> B.length s msgCountP = A.space *> A.decimal <|> pure 10 ciTTLDecimal = ("default" $> Nothing) <|> (Just <$> A.decimal) ciTTL = @@ -4513,7 +4529,11 @@ chatCommandP = char_ = optional . A.char displayNameP :: Parser Text -displayNameP = safeDecodeUtf8 <$> (quoted '\'' <|> takeNameTill (\c -> isSpace c || c == ',')) +displayNameP = safeDecodeUtf8 <$> displayNameP_ +{-# INLINE displayNameP #-} + +displayNameP_ :: Parser ByteString +displayNameP_ = quoted '\'' <|> takeNameTill (\c -> isSpace c || c == ',') where takeNameTill p = A.peekChar' >>= \c -> diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 0ecb151120..e554ed4424 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -871,9 +871,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = logInfo $ "group msg=" <> tshow tag <> " " <> eInfo (m'', conn', msg@RcvMessage {chatMsgEvent = ACME _ event}) <- saveGroupRcvMsg user groupId m' conn msgMeta msgBody chatMsg case event of - XMsgNew mc -> memberCanSend m'' $ newGroupContentMessage gInfo' m'' mc msg brokerTs False - XMsgFileDescr sharedMsgId fileDescr -> memberCanSend m'' $ groupMessageFileDescription gInfo' m'' sharedMsgId fileDescr - XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend m'' $ groupMessageUpdate gInfo' m'' sharedMsgId mContent mentions msgScope msg brokerTs ttl live + XMsgNew mc -> memberCanSend m'' scope $ newGroupContentMessage gInfo' m'' mc msg brokerTs False + where ExtMsgContent {scope} = mcExtMsgContent mc + -- file description is always allowed, to allow sending files to support scope + XMsgFileDescr sharedMsgId fileDescr -> groupMessageFileDescription gInfo' m'' sharedMsgId fileDescr + XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend m'' msgScope $ groupMessageUpdate gInfo' m'' sharedMsgId mContent mentions msgScope msg brokerTs ttl live XMsgDel sharedMsgId memberId -> groupMessageDelete gInfo' m'' sharedMsgId memberId msg brokerTs XMsgReact sharedMsgId (Just memberId) reaction add -> groupMsgReaction gInfo' m'' sharedMsgId memberId reaction add msg brokerTs -- TODO discontinue XFile @@ -895,7 +897,8 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = XGrpDel -> xGrpDel gInfo' m'' msg brokerTs XGrpInfo p' -> xGrpInfo gInfo' m'' p' msg brokerTs XGrpPrefs ps' -> xGrpPrefs gInfo' m'' ps' - XGrpDirectInv connReq mContent_ -> memberCanSend m'' $ xGrpDirectInv gInfo' m'' conn' connReq mContent_ msg brokerTs + -- TODO [knocking] why don't we forward these messages? + XGrpDirectInv connReq mContent_ msgScope -> memberCanSend m'' msgScope $ xGrpDirectInv gInfo' m'' conn' connReq mContent_ msg brokerTs XGrpMsgForward memberId msg' msgTs -> xGrpMsgForward gInfo' m'' memberId msg' msgTs XInfoProbe probe -> xInfoProbe (COMGroupMember m'') probe XInfoProbeCheck probeHash -> xInfoProbeCheck (COMGroupMember m'') probeHash @@ -1252,10 +1255,12 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = toViewTE $ TERejectingGroupJoinRequestMember user gInfo mem rjctReason _ -> toView $ CEvtReceivedContactRequest user cReq - memberCanSend :: GroupMember -> CM () -> CM () - memberCanSend m@GroupMember {memberRole} a - | memberRole > GRObserver || memberPending m = a - | otherwise = messageError "member is not allowed to send messages" + memberCanSend :: GroupMember -> Maybe MsgScope -> CM () -> CM () + memberCanSend m@GroupMember {memberRole} msgScope a = case msgScope of + Just MSMember {} -> a + Nothing + | memberRole > GRObserver || memberPending m -> a + | otherwise -> messageError "member is not allowed to send messages" processConnMERR :: ConnectionEntity -> Connection -> AgentErrorType -> CM () processConnMERR connEntity conn err = do @@ -2839,9 +2844,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = let body = LB.toStrict $ J.encode msg rcvMsg@RcvMessage {chatMsgEvent = ACME _ event} <- saveGroupFwdRcvMsg user groupId m author body chatMsg case event of - XMsgNew mc -> memberCanSend author $ newGroupContentMessage gInfo author mc rcvMsg msgTs True - XMsgFileDescr sharedMsgId fileDescr -> memberCanSend author $ groupMessageFileDescription gInfo author sharedMsgId fileDescr - XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend author $ groupMessageUpdate gInfo author sharedMsgId mContent mentions msgScope rcvMsg msgTs ttl live + XMsgNew mc -> memberCanSend author scope $ newGroupContentMessage gInfo author mc rcvMsg msgTs True + where ExtMsgContent {scope} = mcExtMsgContent mc + -- file description is always allowed, to allow sending files to support scope + XMsgFileDescr sharedMsgId fileDescr -> groupMessageFileDescription gInfo author sharedMsgId fileDescr + XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend author msgScope $ groupMessageUpdate gInfo author sharedMsgId mContent mentions msgScope rcvMsg msgTs ttl live XMsgDel sharedMsgId memId -> groupMessageDelete gInfo author sharedMsgId memId rcvMsg msgTs XMsgReact sharedMsgId (Just memId) reaction add -> groupMsgReaction gInfo author sharedMsgId memId reaction add rcvMsg msgTs XFileCancel sharedMsgId -> xFileCancelGroup gInfo author sharedMsgId diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs index 00dd999139..9a8dc786cd 100644 --- a/src/Simplex/Chat/Messages.hs +++ b/src/Simplex/Chat/Messages.hs @@ -83,6 +83,16 @@ instance TextEncoding GroupChatScopeTag where data ChatName = ChatName {chatType :: ChatType, chatName :: Text} deriving (Show) +data SendName + = SNDirect ContactName + | SNGroup GroupName (Maybe GroupScopeName) + | SNLocal + deriving (Show) + +data GroupScopeName + = GSNMemberSupport (Maybe ContactName) + deriving (Show) + chatTypeStr :: ChatType -> Text chatTypeStr = \case CTDirect -> "@" diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index 57383e7b11..151b1b0d27 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -361,7 +361,7 @@ data ChatMsgEvent (e :: MsgEncoding) where XGrpDel :: ChatMsgEvent 'Json XGrpInfo :: GroupProfile -> ChatMsgEvent 'Json XGrpPrefs :: GroupPreferences -> ChatMsgEvent 'Json - XGrpDirectInv :: ConnReqInvitation -> Maybe MsgContent -> ChatMsgEvent 'Json + XGrpDirectInv :: ConnReqInvitation -> Maybe MsgContent -> Maybe MsgScope -> ChatMsgEvent 'Json XGrpMsgForward :: MemberId -> ChatMessage 'Json -> UTCTime -> ChatMsgEvent 'Json XInfoProbe :: Probe -> ChatMsgEvent 'Json XInfoProbeCheck :: ProbeHash -> ChatMsgEvent 'Json @@ -1011,7 +1011,7 @@ toCMEventTag msg = case msg of XGrpDel -> XGrpDel_ XGrpInfo _ -> XGrpInfo_ XGrpPrefs _ -> XGrpPrefs_ - XGrpDirectInv _ _ -> XGrpDirectInv_ + XGrpDirectInv {} -> XGrpDirectInv_ XGrpMsgForward {} -> XGrpMsgForward_ XInfoProbe _ -> XInfoProbe_ XInfoProbeCheck _ -> XInfoProbeCheck_ @@ -1083,7 +1083,14 @@ appJsonToCM AppMessageJson {v, msgId, event, params} = do msg = \case XMsgNew_ -> XMsgNew <$> JT.parseEither parseMsgContainer params XMsgFileDescr_ -> XMsgFileDescr <$> p "msgId" <*> p "fileDescr" - XMsgUpdate_ -> XMsgUpdate <$> p "msgId" <*> p "content" <*> (fromMaybe M.empty <$> opt "mentions") <*> opt "ttl" <*> opt "live" <*> opt "scope" + XMsgUpdate_ -> do + msgId' <- p "msgId" + content <- p "content" + mentions <- fromMaybe M.empty <$> opt "mentions" + ttl <- opt "ttl" + live <- opt "live" + scope <- opt "scope" + pure XMsgUpdate {msgId = msgId', content, mentions, ttl, live, scope} XMsgDel_ -> XMsgDel <$> p "msgId" <*> opt "memberId" XMsgDeleted_ -> pure XMsgDeleted XMsgReact_ -> XMsgReact <$> p "msgId" <*> opt "memberId" <*> p "reaction" <*> p "add" @@ -1114,7 +1121,7 @@ appJsonToCM AppMessageJson {v, msgId, event, params} = do XGrpDel_ -> pure XGrpDel XGrpInfo_ -> XGrpInfo <$> p "groupProfile" XGrpPrefs_ -> XGrpPrefs <$> p "groupPreferences" - XGrpDirectInv_ -> XGrpDirectInv <$> p "connReq" <*> opt "content" + XGrpDirectInv_ -> XGrpDirectInv <$> p "connReq" <*> opt "content" <*> opt "scope" XGrpMsgForward_ -> XGrpMsgForward <$> p "memberId" <*> p "msg" <*> p "msgTs" XInfoProbe_ -> XInfoProbe <$> p "probe" XInfoProbeCheck_ -> XInfoProbeCheck <$> p "probeHash" @@ -1147,7 +1154,7 @@ chatToAppMessage ChatMessage {chatVRange, msgId, chatMsgEvent} = case encoding @ params = \case XMsgNew container -> msgContainerJSON container XMsgFileDescr msgId' fileDescr -> o ["msgId" .= msgId', "fileDescr" .= fileDescr] - XMsgUpdate msgId' content mentions ttl live scope -> o $ ("ttl" .=? ttl) $ ("live" .=? live) $ ("scope" .=? scope) $ ("mentions" .=? nonEmptyMap mentions) ["msgId" .= msgId', "content" .= content] + XMsgUpdate {msgId = msgId', content, mentions, ttl, live, scope} -> o $ ("ttl" .=? ttl) $ ("live" .=? live) $ ("scope" .=? scope) $ ("mentions" .=? nonEmptyMap mentions) ["msgId" .= msgId', "content" .= content] XMsgDel msgId' memberId -> o $ ("memberId" .=? memberId) ["msgId" .= msgId'] XMsgDeleted -> JM.empty XMsgReact msgId' memberId reaction add -> o $ ("memberId" .=? memberId) ["msgId" .= msgId', "reaction" .= reaction, "add" .= add] @@ -1178,7 +1185,7 @@ chatToAppMessage ChatMessage {chatVRange, msgId, chatMsgEvent} = case encoding @ XGrpDel -> JM.empty XGrpInfo p -> o ["groupProfile" .= p] XGrpPrefs p -> o ["groupPreferences" .= p] - XGrpDirectInv connReq content -> o $ ("content" .=? content) ["connReq" .= connReq] + XGrpDirectInv connReq content scope -> o $ ("content" .=? content) $ ("scope" .=? scope) ["connReq" .= connReq] XGrpMsgForward memberId msg msgTs -> o ["memberId" .= memberId, "msg" .= msg, "msgTs" .= msgTs] XInfoProbe probe -> o ["probe" .= probe] XInfoProbeCheck probeHash -> o ["probeHash" .= probeHash] diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index 2e08afeaef..c11df38dba 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -192,7 +192,7 @@ chatResponseToView hu cfg@ChatConfig {logLevel, showReactions, testView} liveIte CRSentConfirmation u _ -> ttyUser u ["confirmation sent!"] CRSentInvitation u _ customUserProfile -> ttyUser u $ viewSentInvitation customUserProfile testView CRSentInvitationToContact u _c customUserProfile -> ttyUser u $ viewSentInvitation customUserProfile testView - CRItemsReadForChat u chatId -> ttyUser u ["items read for chat"] + CRItemsReadForChat u _chatId -> ttyUser u ["items read for chat"] CRContactDeleted u c -> ttyUser u [ttyContact' c <> ": contact is deleted"] CRChatCleared u chatInfo -> ttyUser u $ viewChatCleared chatInfo CRAcceptingContactRequest u c -> ttyUser u $ viewAcceptingContactRequest c diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index ea83a10cba..591a8fb311 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -195,6 +195,7 @@ chatGroupTests = do describe "group scoped messages" $ do it "should send scoped messages to support (single moderator)" testScopedSupportSingleModerator it "should send scoped messages to support (many moderators)" testScopedSupportManyModerators + it "should send messages to admins and members" testSupportCLISendCommand it "should correctly maintain unread stats for support chats" testScopedSupportUnreadStats testGroupCheckMessages :: HasCallStack => TestParams -> IO () @@ -3009,7 +3010,7 @@ testGLinkApproveMember = alice <# "#team (support: cath) cath> proofs" -- accept member - alice ##> "/_accept member #1 3 member" + alice ##> "/accept member #team cath" concurrentlyN_ [ alice <## "#team: cath accepted", cath @@ -6980,6 +6981,27 @@ testScopedSupportManyModerators = cath ##> "/member support chats #team" cath <## "bob (Bob) (id 3): unread: 0, require attention: 0, mentions: 0" +testSupportCLISendCommand :: HasCallStack => TestParams -> IO () +testSupportCLISendCommand = + testChat2 aliceProfile bobProfile $ \alice bob -> do + createGroup2' "team" alice (bob, GRObserver) True + + alice #> "#team 1" + bob <# "#team alice> 1" + + bob ##> "#team 2" + bob <## "#team: you don't have permission to send messages" + (alice "#team (support: bob) 3" + bob <# "#team (support) alice> 3" + + bob #> "#team (support) 4" + alice <# "#team (support: bob) bob> 4" + + bob ##> "#team (support 4" + bob <## "bad chat command: Failed reading: empty" + testScopedSupportUnreadStats :: HasCallStack => TestParams -> IO () testScopedSupportUnreadStats = testChatOpts4 opts aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do diff --git a/tests/ProtocolTests.hs b/tests/ProtocolTests.hs index a54a9dd36e..61e75d116b 100644 --- a/tests/ProtocolTests.hs +++ b/tests/ProtocolTests.hs @@ -292,10 +292,10 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do ==# XGrpDel it "x.grp.direct.inv" $ "{\"v\":\"1\",\"event\":\"x.grp.direct.inv\",\"params\":{\"connReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-4%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\", \"content\":{\"text\":\"hello\",\"type\":\"text\"}}}" - #==# XGrpDirectInv testConnReq (Just $ MCText "hello") + #==# XGrpDirectInv testConnReq (Just $ MCText "hello") Nothing it "x.grp.direct.inv without content" $ "{\"v\":\"1\",\"event\":\"x.grp.direct.inv\",\"params\":{\"connReq\":\"simplex:/invitation#/?v=1&smp=smp%3A%2F%2F1234-w%3D%3D%40smp.simplex.im%3A5223%2F3456-w%3D%3D%23%2F%3Fv%3D1-4%26dh%3DMCowBQYDK2VuAyEAjiswwI3O_NlS8Fk3HJUW870EY2bAwmttMBsvRB9eV3o%253D&e2e=v%3D2-3%26x3dh%3DMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D%2CMEIwBQYDK2VvAzkAmKuSYeQ_m0SixPDS8Wq8VBaTS1cW-Lp0n0h4Diu-kUpR-qXx4SDJ32YGEFoGFGSbGPry5Ychr6U%3D\"}}" - #==# XGrpDirectInv testConnReq Nothing + #==# XGrpDirectInv testConnReq Nothing Nothing -- it "x.grp.msg.forward" -- $ "{\"v\":\"1\",\"event\":\"x.grp.msg.forward\",\"params\":{\"msgForward\":{\"memberId\":\"AQIDBA==\",\"msg\":\"{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}\",\"msgTs\":\"1970-01-01T00:00:01.000000001Z\"}}}" -- #==# XGrpMsgForward From fa81df24eeb5e39c1cff1d21b031a800e957bbfb Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Mon, 19 May 2025 11:31:10 +0000 Subject: [PATCH 04/14] core, ui: allow files and links in support scope (#5925) --- .../Chat/ComposeMessage/ComposeView.swift | 7 +- .../simplex/common/views/chat/ComposeView.kt | 9 ++- src/Simplex/Chat/Library/Commands.hs | 2 +- src/Simplex/Chat/Library/Internal.hs | 10 +-- src/Simplex/Chat/Library/Subscriber.hs | 80 +++++++++---------- 5 files changed, 55 insertions(+), 53 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index 7111524118..7814d962eb 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -380,8 +380,8 @@ struct ComposeView: View { Divider() } // preference checks should match checks in forwarding list - let simplexLinkProhibited = hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks) - let fileProhibited = composeState.attachmentPreview && !chat.groupFeatureEnabled(.files) + let simplexLinkProhibited = im.secondaryIMFilter == nil && hasSimplexLink && !chat.groupFeatureEnabled(.simplexLinks) + let fileProhibited = im.secondaryIMFilter == nil && composeState.attachmentPreview && !chat.groupFeatureEnabled(.files) let voiceProhibited = composeState.voicePreview && !chat.chatInfo.featureEnabled(.voice) if simplexLinkProhibited { msgNotAllowedView("SimpleX links not allowed", icon: "link") @@ -411,7 +411,8 @@ struct ComposeView: View { .padding(.bottom, 16) .padding(.leading, 12) .tint(theme.colors.primary) - if case let .group(g, _) = chat.chatInfo, + if im.secondaryIMFilter == nil, + case let .group(g, _) = chat.chatInfo, !g.fullGroupPreferences.files.on(for: g.membership) { b.disabled(true).onTapGesture { AlertManager.shared.showAlertMsg( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index f377540a95..d3bc7bb824 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -1039,8 +1039,8 @@ fun ComposeView( if (ctx is ComposeContextItem.ReportedItem) { ReportReasonView(ctx.reason) } - val simplexLinkProhibited = hasSimplexLink.value && !chat.groupFeatureEnabled(GroupFeature.SimplexLinks) - val fileProhibited = composeState.value.attachmentPreview && !chat.groupFeatureEnabled(GroupFeature.Files) + val simplexLinkProhibited = chatsCtx.secondaryContextFilter == null && hasSimplexLink.value && !chat.groupFeatureEnabled(GroupFeature.SimplexLinks) + val fileProhibited = chatsCtx.secondaryContextFilter == null && composeState.value.attachmentPreview && !chat.groupFeatureEnabled(GroupFeature.Files) val voiceProhibited = composeState.value.preview is ComposePreview.VoicePreview && !chat.chatInfo.featureEnabled(ChatFeature.Voice) if (composeState.value.preview !is ComposePreview.VoicePreview || composeState.value.editing) { if (simplexLinkProhibited) { @@ -1069,7 +1069,10 @@ fun ComposeView( Surface(color = MaterialTheme.colors.background, contentColor = MaterialTheme.colors.onBackground) { Divider() Row(Modifier.padding(end = 8.dp), verticalAlignment = Alignment.Bottom) { - val isGroupAndProhibitedFiles = chat.chatInfo is ChatInfo.Group && !chat.chatInfo.groupInfo.fullGroupPreferences.files.on(chat.chatInfo.groupInfo.membership) + val isGroupAndProhibitedFiles = + chatsCtx.secondaryContextFilter == null + && chat.chatInfo is ChatInfo.Group + && !chat.chatInfo.groupInfo.fullGroupPreferences.files.on(chat.chatInfo.groupInfo.membership) val attachmentClicked = if (isGroupAndProhibitedFiles) { { AlertManager.shared.showAlertMsg( diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 7e0ff3b4c7..9c1b31efb3 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -3386,7 +3386,7 @@ processChatCommand' vr = \case findProhibited :: [ComposedMessageReq] -> Maybe GroupFeature findProhibited = foldr' - (\(ComposedMessage {fileSource, msgContent = mc}, _, (_, ft), _) acc -> prohibitedGroupContent gInfo membership mc ft fileSource True <|> acc) + (\(ComposedMessage {fileSource, msgContent = mc}, _, (_, ft), _) acc -> prohibitedGroupContent gInfo membership chatScopeInfo mc ft fileSource True <|> acc) Nothing processComposedMessages :: CM ChatResponse processComposedMessages = do diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 6200fb2435..d3a0e6e59f 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -323,12 +323,12 @@ quoteContent mc qmc ciFile_ qFileName = maybe qText (T.pack . getFileName) ciFile_ qTextOrFile = if T.null qText then qFileName else qText -prohibitedGroupContent :: GroupInfo -> GroupMember -> MsgContent -> Maybe MarkdownList -> Maybe f -> Bool -> Maybe GroupFeature -prohibitedGroupContent gInfo@GroupInfo {membership = GroupMember {memberRole = userRole}} m mc ft file_ sent +prohibitedGroupContent :: GroupInfo -> GroupMember -> Maybe GroupChatScopeInfo -> MsgContent -> Maybe MarkdownList -> Maybe f -> Bool -> Maybe GroupFeature +prohibitedGroupContent gInfo@GroupInfo {membership = GroupMember {memberRole = userRole}} m scopeInfo mc ft file_ sent | isVoice mc && not (groupFeatureMemberAllowed SGFVoice m gInfo) = Just GFVoice - | not (isVoice mc) && isJust file_ && not (groupFeatureMemberAllowed SGFFiles m gInfo) = Just GFFiles - | isReport mc && (badReportUser || not (groupFeatureAllowed SGFReports gInfo)) = Just GFReports - | prohibitedSimplexLinks gInfo m ft = Just GFSimplexLinks + | isNothing scopeInfo && not (isVoice mc) && isJust file_ && not (groupFeatureMemberAllowed SGFFiles m gInfo) = Just GFFiles + | isNothing scopeInfo && isReport mc && (badReportUser || not (groupFeatureAllowed SGFReports gInfo)) = Just GFReports + | isNothing scopeInfo && prohibitedSimplexLinks gInfo m ft = Just GFSimplexLinks | otherwise = Nothing where -- admins cannot send reports, non-admins cannot receive reports diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index e554ed4424..80e287f414 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -1648,62 +1648,60 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = e -> throwError e newGroupContentMessage :: GroupInfo -> GroupMember -> MsgContainer -> RcvMessage -> UTCTime -> Bool -> CM () - newGroupContentMessage gInfo m@GroupMember {memberId, memberRole} mc msg@RcvMessage {sharedMsgId_} brokerTs forwarded - | blockedByAdmin m = createBlockedByAdmin - | otherwise = case prohibitedGroupContent gInfo m content ft_ fInv_ False of - Just f -> rejected f - Nothing -> - withStore' (\db -> getCIModeration db vr user gInfo memberId sharedMsgId_) >>= \case - Just ciModeration -> do - applyModeration ciModeration - withStore' $ \db -> deleteCIModeration db gInfo memberId sharedMsgId_ - Nothing -> createContentItem + newGroupContentMessage gInfo m@GroupMember {memberId, memberRole} mc msg@RcvMessage {sharedMsgId_} brokerTs forwarded = do + (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_ + if blockedByAdmin m' + then createBlockedByAdmin gInfo' m' scopeInfo + else + case prohibitedGroupContent gInfo' m' scopeInfo content ft_ fInv_ False of + Just f -> rejected gInfo' m' scopeInfo f + Nothing -> + withStore' (\db -> getCIModeration db vr user gInfo' memberId sharedMsgId_) >>= \case + Just ciModeration -> do + applyModeration gInfo' m' scopeInfo ciModeration + withStore' $ \db -> deleteCIModeration db gInfo' memberId sharedMsgId_ + Nothing -> createContentItem gInfo' m' scopeInfo where - rejected f = newChatItem (ciContentNoParse $ CIRcvGroupFeatureRejected f) Nothing Nothing False - timed' = if forwarded then rcvCITimed_ (Just Nothing) itemTTL else rcvGroupCITimed gInfo itemTTL + rejected gInfo' m' scopeInfo f = newChatItem gInfo' m' scopeInfo (ciContentNoParse $ CIRcvGroupFeatureRejected f) Nothing Nothing False + timed' gInfo' = if forwarded then rcvCITimed_ (Just Nothing) itemTTL else rcvGroupCITimed gInfo' itemTTL live' = fromMaybe False live_ ExtMsgContent content mentions fInv_ itemTTL live_ msgScope_ = mcExtMsgContent mc ts@(_, ft_) = msgContentTexts content - saveRcvCI gInfo' scopeInfo m' = saveRcvChatItem' user (CDGroupRcv gInfo' scopeInfo m') msg sharedMsgId_ brokerTs - createBlockedByAdmin - | groupFeatureAllowed SGFFullDelete gInfo = do - (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_ + saveRcvCI gInfo' m' scopeInfo = saveRcvChatItem' user (CDGroupRcv gInfo' scopeInfo m') msg sharedMsgId_ brokerTs + createBlockedByAdmin gInfo' m' scopeInfo + | groupFeatureAllowed SGFFullDelete gInfo' = do -- ignores member role when blocked by admin - (ci, cInfo) <- saveRcvCI gInfo' scopeInfo m' (ciContentNoParse CIRcvBlocked) Nothing timed' False M.empty + (ci, cInfo) <- saveRcvCI gInfo' m' scopeInfo (ciContentNoParse CIRcvBlocked) Nothing (timed' gInfo') False M.empty ci' <- withStore' $ \db -> updateGroupCIBlockedByAdmin db user gInfo' ci brokerTs groupMsgToView cInfo ci' | otherwise = do - file_ <- processFileInv - (ci, cInfo) <- createNonLive file_ - ci' <- withStore' $ \db -> markGroupCIBlockedByAdmin db user gInfo ci + file_ <- processFileInv m' + (ci, cInfo) <- createNonLive gInfo' m' scopeInfo file_ + ci' <- withStore' $ \db -> markGroupCIBlockedByAdmin db user gInfo' ci groupMsgToView cInfo ci' - applyModeration CIModeration {moderatorMember = moderator@GroupMember {memberRole = moderatorRole}, moderatedAt} + applyModeration gInfo' m' scopeInfo CIModeration {moderatorMember = moderator@GroupMember {memberRole = moderatorRole}, moderatedAt} | moderatorRole < GRModerator || moderatorRole < memberRole = - createContentItem - | groupFeatureMemberAllowed SGFFullDelete moderator gInfo = do - (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_ - (ci, cInfo) <- saveRcvCI gInfo' scopeInfo m' (ciContentNoParse CIRcvModerated) Nothing timed' False M.empty + createContentItem gInfo' m' scopeInfo + | groupFeatureMemberAllowed SGFFullDelete moderator gInfo' = do + (ci, cInfo) <- saveRcvCI gInfo' m' scopeInfo (ciContentNoParse CIRcvModerated) Nothing (timed' gInfo') False M.empty ci' <- withStore' $ \db -> updateGroupChatItemModerated db user gInfo' ci moderator moderatedAt groupMsgToView cInfo ci' | otherwise = do - (gInfo', _m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_ - file_ <- processFileInv - (ci, _cInfo) <- createNonLive file_ + file_ <- processFileInv m' + (ci, _cInfo) <- createNonLive gInfo' m' scopeInfo file_ deletions <- markGroupCIsDeleted user gInfo' scopeInfo [CChatItem SMDRcv ci] (Just moderator) moderatedAt toView $ CEvtChatItemsDeleted user deletions False False - createNonLive file_ = do - (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_ - saveRcvCI gInfo' scopeInfo m' (CIRcvMsgContent content, ts) (snd <$> file_) timed' False mentions - createContentItem = do - file_ <- processFileInv - newChatItem (CIRcvMsgContent content, ts) (snd <$> file_) timed' live' - when (showMessages $ memberSettings m) $ autoAcceptFile file_ - processFileInv = - processFileInvitation fInv_ content $ \db -> createRcvGroupFileTransfer db userId m - newChatItem ciContent ciFile_ timed_ live = do - let mentions' = if showMessages (memberSettings m) then mentions else [] - (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_ - (ci, cInfo) <- saveRcvCI gInfo' scopeInfo m' ciContent ciFile_ timed_ live mentions' + createNonLive gInfo' m' scopeInfo file_ = do + saveRcvCI gInfo' m' scopeInfo (CIRcvMsgContent content, ts) (snd <$> file_) (timed' gInfo') False mentions + createContentItem gInfo' m' scopeInfo = do + file_ <- processFileInv m' + newChatItem gInfo' m' scopeInfo (CIRcvMsgContent content, ts) (snd <$> file_) (timed' gInfo') live' + when (showMessages $ memberSettings m') $ autoAcceptFile file_ + processFileInv m' = + processFileInvitation fInv_ content $ \db -> createRcvGroupFileTransfer db userId m' + newChatItem gInfo' m' scopeInfo ciContent ciFile_ timed_ live = do + let mentions' = if showMessages (memberSettings m') then mentions else [] + (ci, cInfo) <- saveRcvCI gInfo' m' scopeInfo ciContent ciFile_ timed_ live mentions' ci' <- blockedMember m' ci $ withStore' $ \db -> markGroupChatItemBlocked db user gInfo' ci reactions <- maybe (pure []) (\sharedMsgId -> withStore' $ \db -> getGroupCIReactions db gInfo' memberId sharedMsgId) sharedMsgId_ groupMsgToView cInfo ci' {reactions} From 7b362ff655959a790815931e4db44ced52a9212c Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 19 May 2025 15:50:33 +0100 Subject: [PATCH 05/14] ui: label in compose when user cannot send messages (#5922) * ui: label in compose when user cannot send messages * gray buttons when user cannot send messages * improve * kotlin * fix order * fix alert --------- Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> --- apps/ios/Shared/Model/ChatModel.swift | 21 ------- apps/ios/Shared/Views/Chat/ChatView.swift | 12 +++- .../Chat/ComposeMessage/ComposeView.swift | 19 +++--- .../Chat/ComposeMessage/SendMessageView.swift | 8 ++- apps/ios/SimpleXChat/ChatTypes.swift | 50 ++++++++++++--- .../platform/PlatformTextField.android.kt | 13 ++-- .../chat/simplex/common/model/ChatModel.kt | 62 ++++++++++++------- .../common/platform/PlatformTextField.kt | 2 +- .../chat/simplex/common/views/TerminalView.kt | 3 +- .../simplex/common/views/chat/ChatView.kt | 2 +- .../simplex/common/views/chat/ComposeView.kt | 11 ++-- .../simplex/common/views/chat/SendMsgView.kt | 62 +++++++++---------- .../commonMain/resources/MR/base/strings.xml | 15 ++++- .../platform/PlatformTextField.desktop.kt | 12 ++-- 14 files changed, 164 insertions(+), 128 deletions(-) diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 63d8b38e3c..9b9fda0397 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -1152,27 +1152,6 @@ final class Chat: ObservableObject, Identifiable, ChatLike { ) } - var userCanSend: Bool { - switch chatInfo { - case .direct: return true - case let .group(groupInfo): - let m = groupInfo.membership - return m.memberActive && m.memberRole >= .member - case .local: - return true - default: return false - } - } - - var userIsObserver: Bool { - switch chatInfo { - case let .group(groupInfo): - let m = groupInfo.membership - return m.memberActive && m.memberRole == .observer - default: return false - } - } - var unreadTag: Bool { switch chatInfo.chatSettings?.enableNtfs { case .all: chatStats.unreadChat || chatStats.unreadCount > 0 diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 9e648ef98c..c136ebc01b 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -98,14 +98,24 @@ struct ChatView: View { } connectingText() if selectedChatItems == nil { + let reason = chat.chatInfo.userCantSendReason ComposeView( chat: chat, composeState: $composeState, keyboardVisible: $keyboardVisible, keyboardHiddenDate: $keyboardHiddenDate, - selectedRange: $selectedRange + selectedRange: $selectedRange, + disabledText: reason?.composeLabel ) .disabled(!cInfo.sendMsgEnabled) + .if(!cInfo.sendMsgEnabled) { v in + v.disabled(true).onTapGesture { + AlertManager.shared.showAlertMsg( + title: "You can't send messages!", + message: reason?.alertMessage + ) + } + } } else { SelectedItemsBottomToolbar( chatItems: ItemsModel.shared.reversedChatItems, diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index 3e9c340266..8993de886f 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -327,6 +327,7 @@ struct ComposeView: View { @Binding var keyboardVisible: Bool @Binding var keyboardHiddenDate: Date @Binding var selectedRange: NSRange + var disabledText: LocalizedStringKey? = nil @State var linkUrl: URL? = nil @State var hasSimplexLink: Bool = false @@ -391,7 +392,7 @@ struct ComposeView: View { Image(systemName: "paperclip") .resizable() } - .disabled(composeState.attachmentDisabled || !chat.userCanSend || (chat.chatInfo.contact?.nextSendGrpInv ?? false)) + .disabled(composeState.attachmentDisabled || !chat.chatInfo.sendMsgEnabled || (chat.chatInfo.contact?.nextSendGrpInv ?? false)) .frame(width: 25, height: 25) .padding(.bottom, 16) .padding(.leading, 12) @@ -441,19 +442,13 @@ struct ComposeView: View { : theme.colors.primary ) .padding(.trailing, 12) - .disabled(!chat.userCanSend) + .disabled(!chat.chatInfo.sendMsgEnabled) - if chat.userIsObserver { - Text("you are observer") + if let disabledText { + Text(disabledText) .italic() .foregroundColor(theme.colors.secondary) .padding(.horizontal, 12) - .onTapGesture { - AlertManager.shared.showAlertMsg( - title: "You can't send messages!", - message: "Please contact group admin." - ) - } } } } @@ -479,8 +474,8 @@ struct ComposeView: View { hasSimplexLink = false } } - .onChange(of: chat.userCanSend) { canSend in - if !canSend { + .onChange(of: chat.chatInfo.sendMsgEnabled) { sendEnabled in + if !sendEnabled { cancelCurrentVoiceRecording() clearCurrentDraft() clearState() diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift index d7b29a0ecb..e7b02c9aea 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift @@ -15,6 +15,7 @@ struct SendMessageView: View { @Binding var composeState: ComposeState @Binding var selectedRange: NSRange @EnvironmentObject var theme: AppTheme + @Environment(\.isEnabled) var isEnabled var sendMessage: (Int?) -> Void var sendLiveMessage: (() async -> Void)? = nil var updateLiveMessage: (() async -> Void)? = nil @@ -255,6 +256,7 @@ struct SendMessageView: View { } private struct RecordVoiceMessageButton: View { + @Environment(\.isEnabled) var isEnabled @EnvironmentObject var theme: AppTheme var startVoiceMessageRecording: (() -> Void)? var finishVoiceMessageRecording: (() -> Void)? @@ -263,11 +265,11 @@ struct SendMessageView: View { @State private var pressed: TimeInterval? = nil var body: some View { - Image(systemName: "mic.fill") + Image(systemName: isEnabled ? "mic.fill" : "mic") .resizable() .scaledToFit() .frame(width: 20, height: 20) - .foregroundColor(theme.colors.primary) + .foregroundColor(isEnabled ? theme.colors.primary : theme.colors.secondary) .opacity(holdingVMR ? 0.7 : 1) .disabled(disabled) .frame(width: 31, height: 31) @@ -352,7 +354,7 @@ struct SendMessageView: View { Image(systemName: "bolt.fill") .resizable() .scaledToFit() - .foregroundColor(theme.colors.primary) + .foregroundColor(isEnabled ? theme.colors.primary : theme.colors.secondary) .frame(width: 20, height: 20) } .frame(width: 29, height: 29) diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 960fdd466d..88246465e1 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -1333,6 +1333,19 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { } } + public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { + get { + switch self { + case let .direct(contact): return contact.userCantSendReason + case let .group(groupInfo): return groupInfo.userCantSendReason + case let .local(noteFolder): return noteFolder.userCantSendReason + case let .contactRequest(contactRequest): return contactRequest.userCantSendReason + case let .contactConnection(contactConnection): return contactConnection.userCantSendReason + case .invalidJSON: return ("can't send messages", nil) + } + } + } + public var sendMsgEnabled: Bool { get { switch self { @@ -1642,15 +1655,16 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable { public var ready: Bool { get { activeConn?.connStatus == .ready } } public var sndReady: Bool { get { ready || activeConn?.connStatus == .sndReady } } public var active: Bool { get { contactStatus == .active } } - public var sendMsgEnabled: Bool { get { - ( - sndReady - && active - && !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false) - && !(activeConn?.connDisabled ?? true) - ) - || nextSendGrpInv - } } + public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { + // TODO [short links] this will have additional statuses for pending contact requests before they are accepted + if nextSendGrpInv { return nil } + if !active { return ("contact deleted", nil) } + if !sndReady { return ("contact not ready", nil) } + if activeConn?.connectionStats?.ratchetSyncSendProhibited ?? false { return ("not synchronized", nil) } + if activeConn?.connDisabled ?? true { return ("contact disabled", nil) } + return nil + } + public var sendMsgEnabled: Bool { userCantSendReason == nil } public var nextSendGrpInv: Bool { get { contactGroupMemberId != nil && !contactGrpInvSent } } public var displayName: String { localAlias == "" ? profile.displayName : localAlias } public var fullName: String { get { profile.fullName } } @@ -1829,6 +1843,7 @@ public struct UserContactRequest: Decodable, NamedChat, Hashable { public var id: ChatId { get { "<@\(contactRequestId)" } } public var apiId: Int64 { get { contactRequestId } } var ready: Bool { get { true } } + public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { ("can't send messages", nil) } public var sendMsgEnabled: Bool { get { false } } public var displayName: String { get { profile.displayName } } public var fullName: String { get { profile.fullName } } @@ -1861,6 +1876,7 @@ public struct PendingContactConnection: Decodable, NamedChat, Hashable { public var id: ChatId { get { ":\(pccConnId)" } } public var apiId: Int64 { get { pccConnId } } var ready: Bool { get { false } } + public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { ("can't send messages", nil) } public var sendMsgEnabled: Bool { get { false } } var localDisplayName: String { get { String.localizedStringWithFormat(NSLocalizedString("connection:%@", comment: "connection information"), pccConnId) } @@ -1990,7 +2006,20 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat, Hashable { public var id: ChatId { get { "#\(groupId)" } } public var apiId: Int64 { get { groupId } } public var ready: Bool { get { true } } - public var sendMsgEnabled: Bool { get { membership.memberActive } } + public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { + return if membership.memberActive { + membership.memberRole == .observer ? ("you are observer", "Please contact group admin.") : nil + } else { + switch membership.memberStatus { + case .memRejected: ("request to join rejected", nil) + case .memGroupDeleted: ("group is deleted", nil) + case .memRemoved: ("removed from group", nil) + case .memLeft: ("you left", nil) + default: ("can't send messages", nil) + } + } + } + public var sendMsgEnabled: Bool { userCantSendReason == nil } public var displayName: String { localAlias == "" ? groupProfile.displayName : localAlias } public var fullName: String { get { groupProfile.fullName } } public var image: String? { get { groupProfile.image } } @@ -2357,6 +2386,7 @@ public struct NoteFolder: Identifiable, Decodable, NamedChat, Hashable { public var id: ChatId { get { "*\(noteFolderId)" } } public var apiId: Int64 { get { noteFolderId } } public var ready: Bool { get { true } } + public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { nil } public var sendMsgEnabled: Bool { get { true } } public var displayName: String { get { ChatInfo.privateNotesChatName } } public var fullName: String { get { "" } } diff --git a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt index 54e437afb1..4f48ccca52 100644 --- a/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt +++ b/apps/multiplatform/common/src/androidMain/kotlin/chat/simplex/common/platform/PlatformTextField.android.kt @@ -42,7 +42,6 @@ import chat.simplex.common.views.helpers.* import chat.simplex.res.MR import dev.icerock.moko.resources.StringResource import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.filter import java.lang.reflect.Field import java.net.URI @@ -51,10 +50,10 @@ import java.net.URI actual fun PlatformTextField( composeState: MutableState, sendMsgEnabled: Boolean, + disabledText: String?, sendMsgButtonDisabled: Boolean, textStyle: MutableState, showDeleteTextButton: MutableState, - userIsObserver: Boolean, placeholder: String, showVoiceButton: Boolean, onMessageChange: (ComposeMessage) -> Unit, @@ -197,16 +196,16 @@ actual fun PlatformTextField( showDeleteTextButton.value = it.lineCount >= 4 && !cs.inProgress } if (composeState.value.preview is ComposePreview.VoicePreview) { - ComposeOverlay(MR.strings.voice_message_send_text, textStyle, padding) - } else if (userIsObserver) { - ComposeOverlay(MR.strings.you_are_observer, textStyle, padding) + ComposeOverlay(generalGetString(MR.strings.voice_message_send_text), textStyle, padding) + } else if (disabledText != null) { + ComposeOverlay(disabledText, textStyle, padding) } } @Composable -private fun ComposeOverlay(textId: StringResource, textStyle: MutableState, padding: PaddingValues) { +private fun ComposeOverlay(text: String, textStyle: MutableState, padding: PaddingValues) { Text( - generalGetString(textId), + text, Modifier.padding(padding), color = MaterialTheme.colors.secondary, style = textStyle.value.copy(fontStyle = FontStyle.Italic) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 6ee609020a..61c20587bf 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -1204,6 +1204,7 @@ interface SomeChat { val apiId: Long val ready: Boolean val chatDeleted: Boolean + val userCantSendReason: Pair? val sendMsgEnabled: Boolean val incognito: Boolean fun featureEnabled(feature: ChatFeature): Boolean @@ -1228,14 +1229,6 @@ data class Chat( else -> false } - val userIsObserver: Boolean get() = when(chatInfo) { - is ChatInfo.Group -> { - val m = chatInfo.groupInfo.membership - m.memberActive && m.memberRole == GroupMemberRole.Observer - } - else -> false - } - val unreadTag: Boolean get() = when (chatInfo.chatSettings?.enableNtfs) { All -> chatStats.unreadChat || chatStats.unreadCount > 0 Mentions -> chatStats.unreadChat || chatStats.unreadMentions > 0 @@ -1282,6 +1275,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val apiId get() = contact.apiId override val ready get() = contact.ready override val chatDeleted get() = contact.chatDeleted + override val userCantSendReason get() = contact.userCantSendReason override val sendMsgEnabled get() = contact.sendMsgEnabled override val incognito get() = contact.incognito override fun featureEnabled(feature: ChatFeature) = contact.featureEnabled(feature) @@ -1307,6 +1301,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val apiId get() = groupInfo.apiId override val ready get() = groupInfo.ready override val chatDeleted get() = groupInfo.chatDeleted + override val userCantSendReason get() = groupInfo.userCantSendReason override val sendMsgEnabled get() = groupInfo.sendMsgEnabled override val incognito get() = groupInfo.incognito override fun featureEnabled(feature: ChatFeature) = groupInfo.featureEnabled(feature) @@ -1331,6 +1326,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val apiId get() = noteFolder.apiId override val ready get() = noteFolder.ready override val chatDeleted get() = noteFolder.chatDeleted + override val userCantSendReason get() = noteFolder.userCantSendReason override val sendMsgEnabled get() = noteFolder.sendMsgEnabled override val incognito get() = noteFolder.incognito override fun featureEnabled(feature: ChatFeature) = noteFolder.featureEnabled(feature) @@ -1355,6 +1351,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val apiId get() = contactRequest.apiId override val ready get() = contactRequest.ready override val chatDeleted get() = contactRequest.chatDeleted + override val userCantSendReason get() = contactRequest.userCantSendReason override val sendMsgEnabled get() = contactRequest.sendMsgEnabled override val incognito get() = contactRequest.incognito override fun featureEnabled(feature: ChatFeature) = contactRequest.featureEnabled(feature) @@ -1379,6 +1376,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val apiId get() = contactConnection.apiId override val ready get() = contactConnection.ready override val chatDeleted get() = contactConnection.chatDeleted + override val userCantSendReason get() = contactConnection.userCantSendReason override val sendMsgEnabled get() = contactConnection.sendMsgEnabled override val incognito get() = contactConnection.incognito override fun featureEnabled(feature: ChatFeature) = contactConnection.featureEnabled(feature) @@ -1408,6 +1406,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val id get() = "?$apiId" override val ready get() = false override val chatDeleted get() = false + override val userCantSendReason get() = generalGetString(MR.strings.cant_send_message_generic) to null override val sendMsgEnabled get() = false override val incognito get() = false override fun featureEnabled(feature: ChatFeature) = false @@ -1450,14 +1449,6 @@ sealed class ChatInfo: SomeChat, NamedChat { is InvalidJSON -> updatedAt } - val userCanSend: Boolean - get() = when (this) { - is ChatInfo.Direct -> true - is ChatInfo.Group -> groupInfo.membership.memberRole >= GroupMemberRole.Member - is ChatInfo.Local -> true - else -> false - } - val chatTags: List? get() = when (this) { is Direct -> contact.chatTags @@ -1528,13 +1519,17 @@ data class Contact( override val ready get() = activeConn?.connStatus == ConnStatus.Ready val sndReady get() = ready || activeConn?.connStatus == ConnStatus.SndReady val active get() = contactStatus == ContactStatus.Active - override val sendMsgEnabled get() = ( - sndReady - && active - && !(activeConn?.connectionStats?.ratchetSyncSendProhibited ?: false) - && !(activeConn?.connDisabled ?: true) - ) - || nextSendGrpInv + override val userCantSendReason: Pair? + get() { + // TODO [short links] this will have additional statuses for pending contact requests before they are accepted + if (nextSendGrpInv) return null + if (!active) return generalGetString(MR.strings.cant_send_message_contact_deleted) to null + if (!sndReady) return generalGetString(MR.strings.cant_send_message_contact_not_ready) to null + if (activeConn?.connectionStats?.ratchetSyncSendProhibited == true) return generalGetString(MR.strings.cant_send_message_contact_not_synchronized) to null + if (activeConn?.connDisabled == true) return generalGetString(MR.strings.cant_send_message_contact_disabled) to null + return null + } + override val sendMsgEnabled get() = userCantSendReason == null val nextSendGrpInv get() = contactGroupMemberId != null && !contactGrpInvSent override val incognito get() = contactConnIncognito override fun featureEnabled(feature: ChatFeature) = when (feature) { @@ -1768,7 +1763,23 @@ data class GroupInfo ( override val apiId get() = groupId override val ready get() = membership.memberActive override val chatDeleted get() = false - override val sendMsgEnabled get() = membership.memberActive + override val userCantSendReason: Pair? get() = + if (membership.memberActive) { + if (membership.memberRole == GroupMemberRole.Observer) { + generalGetString(MR.strings.observer_cant_send_message_title) to generalGetString(MR.strings.observer_cant_send_message_desc) + } else { + null + } + } else { + when (membership.memberStatus) { + GroupMemberStatus.MemRejected -> generalGetString(MR.strings.cant_send_message_rejected) to null + GroupMemberStatus.MemGroupDeleted -> generalGetString(MR.strings.cant_send_message_group_deleted) to null + GroupMemberStatus.MemRemoved -> generalGetString(MR.strings.cant_send_message_mem_removed) to null + GroupMemberStatus.MemLeft -> generalGetString(MR.strings.cant_send_message_you_left) to null + else -> generalGetString(MR.strings.cant_send_message_generic) to null + } + } + override val sendMsgEnabled get() = userCantSendReason == null override val incognito get() = membership.memberIncognito override fun featureEnabled(feature: ChatFeature) = when (feature) { ChatFeature.TimedMessages -> fullGroupPreferences.timedMessages.on @@ -2144,6 +2155,7 @@ class NoteFolder( override val apiId get() = noteFolderId override val chatDeleted get() = false override val ready get() = true + override val userCantSendReason: Pair? = null override val sendMsgEnabled get() = true override val incognito get() = false override fun featureEnabled(feature: ChatFeature) = feature == ChatFeature.Voice @@ -2180,6 +2192,7 @@ class UserContactRequest ( override val apiId get() = contactRequestId override val chatDeleted get() = false override val ready get() = true + override val userCantSendReason = generalGetString(MR.strings.cant_send_message_generic) to null override val sendMsgEnabled get() = false override val incognito get() = false override fun featureEnabled(feature: ChatFeature) = false @@ -2219,6 +2232,7 @@ class PendingContactConnection( override val apiId get() = pccConnId override val chatDeleted get() = false override val ready get() = false + override val userCantSendReason = generalGetString(MR.strings.cant_send_message_generic) to null override val sendMsgEnabled get() = false override val incognito get() = customUserProfileId != null override fun featureEnabled(feature: ChatFeature) = false diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt index 1daf5a7ba7..6b301b9df4 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/PlatformTextField.kt @@ -12,10 +12,10 @@ import java.net.URI expect fun PlatformTextField( composeState: MutableState, sendMsgEnabled: Boolean, + disabledText: String?, sendMsgButtonDisabled: Boolean, textStyle: MutableState, showDeleteTextButton: MutableState, - userIsObserver: Boolean, placeholder: String, showVoiceButton: Boolean, onMessageChange: (ComposeMessage) -> Unit, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt index ca4d4fc0da..37aa7fc1d1 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/TerminalView.kt @@ -99,12 +99,11 @@ fun TerminalLayout( isDirectChat = false, liveMessageAlertShown = SharedPreference(get = { false }, set = {}), sendMsgEnabled = true, + userCantSendReason = null, sendButtonEnabled = true, nextSendGrpInv = false, needToAllowVoiceToContact = false, allowedVoiceByPrefs = false, - userIsObserver = false, - userCanSend = true, allowVoiceToContact = {}, placeholder = "", sendMessage = { sendCommand() }, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index b3fdcf79c0..6d7cdcdebe 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -723,7 +723,7 @@ fun ChatLayout( Modifier .fillMaxWidth() .desktopOnExternalDrag( - enabled = remember(attachmentDisabled.value, chatInfo.value?.userCanSend) { mutableStateOf(!attachmentDisabled.value && chatInfo.value?.userCanSend == true) }.value, + enabled = remember(attachmentDisabled.value, chatInfo.value?.sendMsgEnabled) { mutableStateOf(!attachmentDisabled.value && chatInfo.value?.sendMsgEnabled == true) }.value, onFiles = { paths -> composeState.onFilesAttached(paths.map { it.toURI() }) }, onImage = { file -> CoroutineScope(Dispatchers.IO).launch { composeState.processPickedMedia(listOf(file.toURI()), null) } }, onText = { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index de9fc26905..894bcf3b37 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -999,9 +999,8 @@ fun ComposeView( chatModel.sharedContent.value = null } - val userCanSend = rememberUpdatedState(chat.chatInfo.userCanSend) val sendMsgEnabled = rememberUpdatedState(chat.chatInfo.sendMsgEnabled) - val userIsObserver = rememberUpdatedState(chat.userIsObserver) + val userCantSendReason = rememberUpdatedState(chat.chatInfo.userCantSendReason) val nextSendGrpInv = rememberUpdatedState(chat.nextSendGrpInv) Column { @@ -1056,7 +1055,6 @@ fun ComposeView( val attachmentEnabled = !composeState.value.attachmentDisabled && sendMsgEnabled.value - && userCanSend.value && !isGroupAndProhibitedFiles && !nextSendGrpInv.value IconButton( @@ -1102,8 +1100,8 @@ fun ComposeView( } } - LaunchedEffect(rememberUpdatedState(chat.chatInfo.userCanSend).value) { - if (!chat.chatInfo.userCanSend) { + LaunchedEffect(rememberUpdatedState(chat.chatInfo.sendMsgEnabled).value) { + if (!chat.chatInfo.sendMsgEnabled) { clearCurrentDraft() clearState() } @@ -1159,13 +1157,12 @@ fun ComposeView( chat.chatInfo is ChatInfo.Direct, liveMessageAlertShown = chatModel.controller.appPrefs.liveMessageAlertShown, sendMsgEnabled = sendMsgEnabled.value, + userCantSendReason = userCantSendReason.value, sendButtonEnabled = sendMsgEnabled.value && !(simplexLinkProhibited || fileProhibited || voiceProhibited), nextSendGrpInv = nextSendGrpInv.value, needToAllowVoiceToContact, allowedVoiceByPrefs, allowVoiceToContact = ::allowVoiceToContact, - userIsObserver = userIsObserver.value, - userCanSend = userCanSend.value, sendButtonColor = sendButtonColor, timedMessageAllowed = timedMessageAllowed, customDisappearingMessageTimePref = chatModel.controller.appPrefs.customDisappearingMessageTime, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt index 5524eff655..5710f09ed5 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt @@ -15,9 +15,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.graphics.* import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.semantics.Role -import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.* import chat.simplex.common.model.* @@ -41,12 +39,11 @@ fun SendMsgView( isDirectChat: Boolean, liveMessageAlertShown: SharedPreference, sendMsgEnabled: Boolean, + userCantSendReason: Pair?, sendButtonEnabled: Boolean, nextSendGrpInv: Boolean, needToAllowVoiceToContact: Boolean, allowedVoiceByPrefs: Boolean, - userIsObserver: Boolean, - userCanSend: Boolean, sendButtonColor: Color = MaterialTheme.colors.primary, allowVoiceToContact: () -> Unit, timedMessageAllowed: Boolean = false, @@ -82,14 +79,14 @@ fun SendMsgView( (!allowedVoiceByPrefs && cs.preview is ComposePreview.VoicePreview) || cs.endLiveDisabled || !sendButtonEnabled - val clicksOnTextFieldDisabled = !sendMsgEnabled || cs.preview is ComposePreview.VoicePreview || !userCanSend || cs.inProgress + val clicksOnTextFieldDisabled = !sendMsgEnabled || cs.preview is ComposePreview.VoicePreview || cs.inProgress PlatformTextField( composeState, sendMsgEnabled, + disabledText = userCantSendReason?.first, sendMsgButtonDisabled, textStyle, showDeleteTextButton, - userIsObserver, if (clicksOnTextFieldDisabled) "" else placeholder, showVoiceButton, onMessageChange, @@ -102,16 +99,23 @@ fun SendMsgView( } } if (clicksOnTextFieldDisabled) { - Box( - Modifier - .matchParentSize() - .clickable(enabled = !userCanSend, indication = null, interactionSource = remember { MutableInteractionSource() }, onClick = { - AlertManager.shared.showAlertMsg( - title = generalGetString(MR.strings.observer_cant_send_message_title), - text = generalGetString(MR.strings.observer_cant_send_message_desc) - ) - }) - ) + if (userCantSendReason != null) { + Box( + Modifier + .matchParentSize() + .clickable(indication = null, interactionSource = remember { MutableInteractionSource() }, onClick = { + AlertManager.shared.showAlertMsg( + title = generalGetString(MR.strings.cant_send_message_alert_title), + text = userCantSendReason.second + ) + }) + ) + } else { + Box( + Modifier + .matchParentSize() + ) + } } if (showDeleteTextButton.value) { DeleteTextButton(composeState) @@ -135,11 +139,11 @@ fun SendMsgView( Row(verticalAlignment = Alignment.CenterVertically) { val stopRecOnNextClick = remember { mutableStateOf(false) } when { - needToAllowVoiceToContact || !allowedVoiceByPrefs || !userCanSend -> { - DisallowedVoiceButton(userCanSend) { + needToAllowVoiceToContact || !allowedVoiceByPrefs -> { + DisallowedVoiceButton { if (needToAllowVoiceToContact) { showNeedToAllowVoiceAlert(allowVoiceToContact) - } else if (!allowedVoiceByPrefs) { + } else { showDisabledVoiceAlert(isDirectChat) } } @@ -155,7 +159,7 @@ fun SendMsgView( && cs.contextItem is ComposeContextItem.NoContextItem ) { Spacer(Modifier.width(12.dp)) - StartLiveMessageButton(userCanSend) { + StartLiveMessageButton { if (composeState.value.preview is ComposePreview.NoPreview) { startLiveMessage(scope, sendLiveMessage, updateLiveMessage, sendButtonSize, sendButtonAlpha, composeState, liveMessageAlertShown) } @@ -343,8 +347,8 @@ private fun RecordVoiceView(recState: MutableState, stopRecOnNex } @Composable -private fun DisallowedVoiceButton(enabled: Boolean, onClick: () -> Unit) { - IconButton(onClick, Modifier.size(36.dp), enabled = enabled) { +private fun DisallowedVoiceButton(onClick: () -> Unit) { + IconButton(onClick, Modifier.size(36.dp)) { Icon( painterResource(MR.images.ic_keyboard_voice), stringResource(MR.strings.icon_descr_record_voice_message), @@ -460,14 +464,13 @@ private fun SendMsgButton( } @Composable -private fun StartLiveMessageButton(enabled: Boolean, onClick: () -> Unit) { +private fun StartLiveMessageButton(onClick: () -> Unit) { val interactionSource = remember { MutableInteractionSource() } val ripple = remember { ripple(bounded = false, radius = 24.dp) } Box( modifier = Modifier.requiredSize(36.dp) .clickable( onClick = onClick, - enabled = enabled, role = Role.Button, interactionSource = interactionSource, indication = ripple @@ -477,7 +480,7 @@ private fun StartLiveMessageButton(enabled: Boolean, onClick: () -> Unit) { Icon( BoltFilled, stringResource(MR.strings.icon_descr_send_message), - tint = if (enabled) MaterialTheme.colors.primary else MaterialTheme.colors.secondary, + tint = MaterialTheme.colors.primary, modifier = Modifier .size(36.dp) .padding(4.dp) @@ -576,12 +579,11 @@ fun PreviewSendMsgView() { isDirectChat = true, liveMessageAlertShown = SharedPreference(get = { true }, set = { }), sendMsgEnabled = true, + userCantSendReason = null, sendButtonEnabled = true, nextSendGrpInv = false, needToAllowVoiceToContact = false, allowedVoiceByPrefs = true, - userIsObserver = false, - userCanSend = true, allowVoiceToContact = {}, timedMessageAllowed = false, placeholder = "", @@ -612,12 +614,11 @@ fun PreviewSendMsgViewEditing() { isDirectChat = true, liveMessageAlertShown = SharedPreference(get = { true }, set = { }), sendMsgEnabled = true, + userCantSendReason = null, sendButtonEnabled = true, nextSendGrpInv = false, needToAllowVoiceToContact = false, allowedVoiceByPrefs = true, - userIsObserver = false, - userCanSend = true, allowVoiceToContact = {}, timedMessageAllowed = false, placeholder = "", @@ -648,12 +649,11 @@ fun PreviewSendMsgViewInProgress() { isDirectChat = true, liveMessageAlertShown = SharedPreference(get = { true }, set = { }), sendMsgEnabled = true, + userCantSendReason = null, sendButtonEnabled = true, nextSendGrpInv = false, needToAllowVoiceToContact = false, allowedVoiceByPrefs = true, - userIsObserver = false, - userCanSend = true, allowVoiceToContact = {}, timedMessageAllowed = false, placeholder = "", diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 1bea4c18d4..6726009a5f 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -487,8 +487,6 @@ The image cannot be decoded. Please, try a different image or contact developers. The video cannot be decoded. Please, try a different video or contact developers. you are observer - You can\'t send messages! - Please contact group admin. Files and media prohibited! Only group owners can enable files and media. Send direct message to connect @@ -508,6 +506,19 @@ Report content: only group moderators will see it. Report other: only group moderators will see it. + You can\'t send messages! + contact not ready + contact deleted + not synchronized + contact disabled + you are observer + Please contact group admin. + request to join rejected + group is deleted + removed from group + you left + can\'t send messages + Image Waiting for image diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt index d0d4fb5e92..41964b7d18 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/platform/PlatformTextField.desktop.kt @@ -44,10 +44,10 @@ import kotlin.text.substring actual fun PlatformTextField( composeState: MutableState, sendMsgEnabled: Boolean, + disabledText: String?, sendMsgButtonDisabled: Boolean, textStyle: MutableState, showDeleteTextButton: MutableState, - userIsObserver: Boolean, placeholder: String, showVoiceButton: Boolean, onMessageChange: (ComposeMessage) -> Unit, @@ -203,16 +203,16 @@ actual fun PlatformTextField( ) showDeleteTextButton.value = cs.message.text.split("\n").size >= 4 && !cs.inProgress if (composeState.value.preview is ComposePreview.VoicePreview) { - ComposeOverlay(MR.strings.voice_message_send_text, textStyle, padding) - } else if (userIsObserver) { - ComposeOverlay(MR.strings.you_are_observer, textStyle, padding) + ComposeOverlay(generalGetString(MR.strings.voice_message_send_text), textStyle, padding) + } else if (disabledText != null) { + ComposeOverlay(disabledText, textStyle, padding) } } @Composable -private fun ComposeOverlay(textId: StringResource, textStyle: MutableState, padding: PaddingValues) { +private fun ComposeOverlay(text: String, textStyle: MutableState, padding: PaddingValues) { Text( - generalGetString(textId), + text, Modifier.padding(padding), color = MaterialTheme.colors.secondary, style = textStyle.value.copy(fontStyle = FontStyle.Italic) From ca9f6267e4b41c0e2db829b36d54f5863c0b2871 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Mon, 19 May 2025 17:05:07 +0000 Subject: [PATCH 06/14] ui: check member supports support chat (#5926) --- apps/ios/SimpleXChat/ChatTypes.swift | 15 ++++++-- .../chat/simplex/common/model/ChatModel.kt | 36 ++++++++++++++----- .../chat/simplex/common/model/SimpleXAPI.kt | 3 ++ .../commonMain/resources/MR/base/strings.xml | 1 + 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index e066e1fba0..9a82c912dd 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -15,6 +15,9 @@ public let CREATE_MEMBER_CONTACT_VERSION = 2 // version to receive reports (MCReport) public let REPORTS_VERSION = 12 +// support group knocking (MsgScope) +public let GROUP_KNOCKING_VERSION = 15 + public let contentModerationPostLink = URL(string: "https://simplex.chat/blog/20250114-simplex-network-large-groups-privacy-preserving-content-moderation.html#preventing-server-abuse-without-compromising-e2e-encryption")! public struct User: Identifiable, Decodable, UserLike, NamedChat, Hashable { @@ -1346,11 +1349,19 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { return nil case let .group(groupInfo, groupChatScope): if groupInfo.membership.memberActive { - if groupChatScope == nil { + switch(groupChatScope) { + case .none: if groupInfo.membership.memberPending { return ("reviewed by admins", "Please contact group admin.") } if groupInfo.membership.memberRole == .observer { return ("you are observer", "Please contact group admin.") } + return nil + case let .some(.memberSupport(groupMember_: .some(supportMember))): + if supportMember.versionRange.maxVersion < GROUP_KNOCKING_VERSION && !supportMember.memberPending { + return ("member has old version", nil) + } + return nil + case .some(.memberSupport(groupMember_: .none)): + return nil } - return nil } else { switch groupInfo.membership.memberStatus { case .memRejected: return ("request to join rejected", nil) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 7bd9a1844a..270b3a73b2 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -1500,15 +1500,29 @@ sealed class ChatInfo: SomeChat, NamedChat { } is Group -> { if (groupInfo.membership.memberActive) { - if (groupChatScope == null) { - if (groupInfo.membership.memberPending) { - return generalGetString(MR.strings.reviewed_by_admins) to generalGetString(MR.strings.observer_cant_send_message_desc) - } - if (groupInfo.membership.memberRole == GroupMemberRole.Observer) { - return generalGetString(MR.strings.observer_cant_send_message_title) to generalGetString(MR.strings.observer_cant_send_message_desc) + when (groupChatScope) { + null -> { + if (groupInfo.membership.memberPending) { + return generalGetString(MR.strings.reviewed_by_admins) to generalGetString(MR.strings.observer_cant_send_message_desc) + } + if (groupInfo.membership.memberRole == GroupMemberRole.Observer) { + return generalGetString(MR.strings.observer_cant_send_message_title) to generalGetString(MR.strings.observer_cant_send_message_desc) + } + return null } + is GroupChatScopeInfo.MemberSupport -> + if (groupChatScope.groupMember_ != null) { + if ( + groupChatScope.groupMember_.versionRange.maxVersion < GROUP_KNOCKING_VERSION + && !groupChatScope.groupMember_.memberPending + ) { + return generalGetString(MR.strings.cant_send_message_member_has_old_version) to null + } + return null + } else { + return null + } } - return null } else { return when (groupInfo.membership.memberStatus) { GroupMemberStatus.MemRejected -> generalGetString(MR.strings.cant_send_message_rejected) to null @@ -2005,7 +2019,8 @@ data class GroupMember ( val memberContactId: Long? = null, val memberContactProfileId: Long, var activeConn: Connection? = null, - val supportChat: GroupSupportChat? = null + val supportChat: GroupSupportChat? = null, + val memberChatVRange: VersionRange ): NamedChat { val id: String get() = "#$groupId @$groupMemberId" val ready get() = activeConn?.connStatus == ConnStatus.Ready @@ -2119,6 +2134,8 @@ data class GroupMember ( && userRole >= GroupMemberRole.Moderator && userRole >= memberRole && groupInfo.membership.memberActive } + val versionRange: VersionRange = activeConn?.peerChatVRange ?: memberChatVRange + val memberIncognito = memberProfile.profileId != memberContactProfileId companion object { @@ -2136,7 +2153,8 @@ data class GroupMember ( memberProfile = LocalProfile.sampleData, memberContactId = 1, memberContactProfileId = 1L, - activeConn = Connection.sampleData + activeConn = Connection.sampleData, + memberChatVRange = VersionRange(minVersion = 1, maxVersion = 15) ) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 12c93888ee..8378b6fa3b 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -58,6 +58,9 @@ typealias ChatCtrl = Long // version range that supports establishing direct connection with a group member (xGrpDirectInvVRange in core) val CREATE_MEMBER_CONTACT_VERSION = 2 +// support group knocking (MsgScope) +val GROUP_KNOCKING_VERSION = 15 + enum class CallOnLockScreen { DISABLE, SHOW, diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 6198207991..b130970467 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -526,6 +526,7 @@ can\'t send messages you are observer reviewed by admins + member has old version Image From 1a80ecfc2951059cbc3ea89fe51ccc83b975e702 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Tue, 20 May 2025 09:07:44 +0000 Subject: [PATCH 07/14] core, ui: allow to delete member support chat; rename reject action (#5927) --- apps/ios/Shared/Model/AppAPITypes.swift | 6 +++ apps/ios/Shared/Model/SimpleXAPI.swift | 6 +++ .../ContextPendingMemberActionsView.swift | 15 +++++-- .../Views/Chat/Group/MemberSupportView.swift | 44 ++++++++++++++----- .../chat/simplex/common/model/SimpleXAPI.kt | 13 ++++++ .../ComposeContextPendingMemberActionsView.kt | 21 ++++++--- .../views/chat/group/GroupMemberInfoView.kt | 35 +++++++-------- .../views/chat/group/MemberSupportView.kt | 38 ++++++++++++---- .../commonMain/resources/MR/base/strings.xml | 6 ++- src/Simplex/Chat/Controller.hs | 2 + src/Simplex/Chat/Library/Commands.hs | 7 +++ src/Simplex/Chat/Store/Groups.hs | 31 +++++++++++++ .../SQLite/Migrations/chat_query_plans.txt | 28 ++++++++++++ src/Simplex/Chat/View.hs | 1 + tests/ChatTests/Groups.hs | 7 +++ 15 files changed, 212 insertions(+), 48 deletions(-) diff --git a/apps/ios/Shared/Model/AppAPITypes.swift b/apps/ios/Shared/Model/AppAPITypes.swift index e93814ef84..2ddaf1d2af 100644 --- a/apps/ios/Shared/Model/AppAPITypes.swift +++ b/apps/ios/Shared/Model/AppAPITypes.swift @@ -69,6 +69,7 @@ enum ChatCommand: ChatCmdProtocol { case apiAddMember(groupId: Int64, contactId: Int64, memberRole: GroupMemberRole) case apiJoinGroup(groupId: Int64) case apiAcceptMember(groupId: Int64, groupMemberId: Int64, memberRole: GroupMemberRole) + case apiDeleteMemberSupportChat(groupId: Int64, groupMemberId: Int64) case apiMembersRole(groupId: Int64, memberIds: [Int64], memberRole: GroupMemberRole) case apiBlockMembersForAll(groupId: Int64, memberIds: [Int64], blocked: Bool) case apiRemoveMembers(groupId: Int64, memberIds: [Int64], withMessages: Bool) @@ -250,6 +251,7 @@ enum ChatCommand: ChatCmdProtocol { case let .apiAddMember(groupId, contactId, memberRole): return "/_add #\(groupId) \(contactId) \(memberRole)" case let .apiJoinGroup(groupId): return "/_join #\(groupId)" case let .apiAcceptMember(groupId, groupMemberId, memberRole): return "/_accept member #\(groupId) \(groupMemberId) \(memberRole.rawValue)" + case let .apiDeleteMemberSupportChat(groupId, groupMemberId): return "/_delete member chat #\(groupId) \(groupMemberId)" case let .apiMembersRole(groupId, memberIds, memberRole): return "/_member role #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) \(memberRole.rawValue)" case let .apiBlockMembersForAll(groupId, memberIds, blocked): return "/_block #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) blocked=\(onOff(blocked))" case let .apiRemoveMembers(groupId, memberIds, withMessages): return "/_remove #\(groupId) \(memberIds.map({ "\($0)" }).joined(separator: ",")) messages=\(onOff(withMessages))" @@ -425,6 +427,7 @@ enum ChatCommand: ChatCmdProtocol { case .apiAddMember: return "apiAddMember" case .apiJoinGroup: return "apiJoinGroup" case .apiAcceptMember: return "apiAcceptMember" + case .apiDeleteMemberSupportChat: return "apiDeleteMemberSupportChat" case .apiMembersRole: return "apiMembersRole" case .apiBlockMembersForAll: return "apiBlockMembersForAll" case .apiRemoveMembers: return "apiRemoveMembers" @@ -851,6 +854,7 @@ enum ChatResponse2: Decodable, ChatAPIResult { case leftMemberUser(user: UserRef, groupInfo: GroupInfo) case groupMembers(user: UserRef, group: SimpleXChat.Group) case memberAccepted(user: UserRef, groupInfo: GroupInfo, member: GroupMember) + case memberSupportChatDeleted(user: UserRef, groupInfo: GroupInfo, member: GroupMember) case membersRoleUser(user: UserRef, groupInfo: GroupInfo, members: [GroupMember], toRole: GroupMemberRole) case membersBlockedForAllUser(user: UserRef, groupInfo: GroupInfo, members: [GroupMember], blocked: Bool) case groupUpdated(user: UserRef, toGroup: GroupInfo) @@ -900,6 +904,7 @@ enum ChatResponse2: Decodable, ChatAPIResult { case .leftMemberUser: "leftMemberUser" case .groupMembers: "groupMembers" case .memberAccepted: "memberAccepted" + case .memberSupportChatDeleted: "memberSupportChatDeleted" case .membersRoleUser: "membersRoleUser" case .membersBlockedForAllUser: "membersBlockedForAllUser" case .groupUpdated: "groupUpdated" @@ -945,6 +950,7 @@ enum ChatResponse2: Decodable, ChatAPIResult { case let .leftMemberUser(u, groupInfo): return withUser(u, String(describing: groupInfo)) case let .groupMembers(u, group): return withUser(u, String(describing: group)) case let .memberAccepted(u, groupInfo, member): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(member)") + case let .memberSupportChatDeleted(u, groupInfo, member): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(member)") case let .membersRoleUser(u, groupInfo, members, toRole): return withUser(u, "groupInfo: \(groupInfo)\nmembers: \(members)\ntoRole: \(toRole)") case let .membersBlockedForAllUser(u, groupInfo, members, blocked): return withUser(u, "groupInfo: \(groupInfo)\nmember: \(members)\nblocked: \(blocked)") case let .groupUpdated(u, toGroup): return withUser(u, String(describing: toGroup)) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 3363bf184a..8621baaade 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -1646,6 +1646,12 @@ func apiAcceptMember(_ groupId: Int64, _ groupMemberId: Int64, _ memberRole: Gro throw r.unexpected } +func apiDeleteMemberSupportChat(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (GroupInfo, GroupMember) { + let r: ChatResponse2 = try await chatSendCmd(.apiDeleteMemberSupportChat(groupId: groupId, groupMemberId: groupMemberId)) + if case let .memberSupportChatDeleted(_, groupInfo, member) = r { return (groupInfo, member) } + throw r.unexpected +} + func apiRemoveMembers(_ groupId: Int64, _ memberIds: [Int64], _ withMessages: Bool = false) async throws -> (GroupInfo, [GroupMember]) { let r: ChatResponse2 = try await chatSendCmd(.apiRemoveMembers(groupId: groupId, memberIds: memberIds, withMessages: withMessages), bgTask: false) if case let .userDeletedMembers(_, updatedGroupInfo, members, _withMessages) = r { return (updatedGroupInfo, members) } diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift index 5f78581360..96915b342f 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextPendingMemberActionsView.swift @@ -18,13 +18,13 @@ struct ContextPendingMemberActionsView: View { var body: some View { HStack(spacing: 0) { ZStack { - Text("Remove") + Text("Reject") .foregroundColor(.red) } .frame(maxWidth: .infinity) .contentShape(Rectangle()) .onTapGesture { - showRemoveMemberAlert(groupInfo, member, dismiss: dismiss) + showRejectMemberAlert(groupInfo, member, dismiss: dismiss) } ZStack { @@ -43,6 +43,15 @@ struct ContextPendingMemberActionsView: View { } } +func showRejectMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) { + showAlert( + title: NSLocalizedString("Reject member?", comment: "alert title"), + buttonTitle: "Reject", + buttonAction: { removeMember(groupInfo, member, dismiss: dismiss) }, + cancelButton: true + ) +} + func showAcceptMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) { showAlert( NSLocalizedString("Accept member", comment: "alert title"), @@ -75,7 +84,7 @@ func acceptMember(_ groupInfo: GroupInfo, _ member: GroupMember, _ role: GroupMe do { let (gInfo, acceptedMember) = try await apiAcceptMember(groupInfo.groupId, member.groupMemberId, role) await MainActor.run { - _ = ChatModel.shared.upsertGroupMember(groupInfo, acceptedMember) + _ = ChatModel.shared.upsertGroupMember(gInfo, acceptedMember) ChatModel.shared.updateGroup(gInfo) dismiss?() } diff --git a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift index cd053cc9c8..0bcf09aabd 100644 --- a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift +++ b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift @@ -100,14 +100,14 @@ struct MemberSupportView: View { Label("Accept", systemImage: "checkmark") } .tint(theme.colors.primary) + } else { + Button { + showDeleteMemberSupportChatAlert(groupInfo, memberWithChat.wrapped) + } label: { + Label("Delete", systemImage: "trash") + } + .tint(.red) } - - Button { - showRemoveMemberAlert(groupInfo, memberWithChat.wrapped) - } label: { - Label("Remove", systemImage: "trash") - } - .tint(.red) } } } @@ -248,15 +248,37 @@ struct MemberSupportView: View { } } -func showRemoveMemberAlert(_ groupInfo: GroupInfo, _ member: GroupMember, dismiss: DismissAction? = nil) { +func showDeleteMemberSupportChatAlert(_ groupInfo: GroupInfo, _ member: GroupMember) { showAlert( - title: NSLocalizedString("Remove member?", comment: "alert title"), - buttonTitle: "Remove", - buttonAction: { removeMember(groupInfo, member, dismiss: dismiss) }, + title: NSLocalizedString("Delete chat with member?", comment: "alert title"), + buttonTitle: "Delete", + buttonAction: { deleteMemberSupportChat(groupInfo, member) }, cancelButton: true ) } +func deleteMemberSupportChat(_ groupInfo: GroupInfo, _ member: GroupMember) { + Task { + do { + let (gInfo, updatedMember) = try await apiDeleteMemberSupportChat(groupInfo.groupId, member.groupMemberId) + await MainActor.run { + _ = ChatModel.shared.upsertGroupMember(gInfo, updatedMember) + ChatModel.shared.updateGroup(gInfo) + } + // TODO member row doesn't get removed from list (upsertGroupMember correctly sets supportChat to nil) - this repopulates list to fix it + await ChatModel.shared.loadGroupMembers(gInfo) + } catch let error { + logger.error("apiDeleteMemberSupportChat error: \(responseError(error))") + await MainActor.run { + showAlert( + NSLocalizedString("Error deleting member support chat", comment: "alert title"), + message: responseError(error) + ) + } + } + } +} + #Preview { MemberSupportView( groupInfo: GroupInfo.sampleData, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 8378b6fa3b..c3b681dbc7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -1914,6 +1914,13 @@ object ChatController { return null } + suspend fun apiDeleteMemberSupportChat(rh: Long?, groupId: Long, groupMemberId: Long): Pair? { + val r = sendCmd(rh, CC.ApiDeleteMemberSupportChat(groupId, groupMemberId)) + if (r is API.Result && r.res is CR.MemberSupportChatDeleted) return r.res.groupInfo to r.res.member + apiErrorAlert("apiDeleteMemberSupportChat", generalGetString(MR.strings.error_deleting_member_support_chat), r) + return null + } + suspend fun apiRemoveMembers(rh: Long?, groupId: Long, memberIds: List, withMessages: Boolean = false): Pair>? { val r = sendCmd(rh, CC.ApiRemoveMembers(groupId, memberIds, withMessages)) if (r is API.Result && r.res is CR.UserDeletedMembers) return r.res.groupInfo to r.res.members @@ -3345,6 +3352,7 @@ sealed class CC { class ApiAddMember(val groupId: Long, val contactId: Long, val memberRole: GroupMemberRole): CC() class ApiJoinGroup(val groupId: Long): CC() class ApiAcceptMember(val groupId: Long, val groupMemberId: Long, val memberRole: GroupMemberRole): CC() + class ApiDeleteMemberSupportChat(val groupId: Long, val groupMemberId: Long): CC() class ApiMembersRole(val groupId: Long, val memberIds: List, val memberRole: GroupMemberRole): CC() class ApiBlockMembersForAll(val groupId: Long, val memberIds: List, val blocked: Boolean): CC() class ApiRemoveMembers(val groupId: Long, val memberIds: List, val withMessages: Boolean): CC() @@ -3531,6 +3539,7 @@ sealed class CC { is ApiAddMember -> "/_add #$groupId $contactId ${memberRole.memberRole}" is ApiJoinGroup -> "/_join #$groupId" is ApiAcceptMember -> "/_accept member #$groupId $groupMemberId ${memberRole.memberRole}" + is ApiDeleteMemberSupportChat -> "/_delete member chat #$groupId $groupMemberId" is ApiMembersRole -> "/_member role #$groupId ${memberIds.joinToString(",")} ${memberRole.memberRole}" is ApiBlockMembersForAll -> "/_block #$groupId ${memberIds.joinToString(",")} blocked=${onOff(blocked)}" is ApiRemoveMembers -> "/_remove #$groupId ${memberIds.joinToString(",")} messages=${onOff(withMessages)}" @@ -3695,6 +3704,7 @@ sealed class CC { is ApiAddMember -> "apiAddMember" is ApiJoinGroup -> "apiJoinGroup" is ApiAcceptMember -> "apiAcceptMember" + is ApiDeleteMemberSupportChat -> "apiDeleteMemberSupportChat" is ApiMembersRole -> "apiMembersRole" is ApiBlockMembersForAll -> "apiBlockMembersForAll" is ApiRemoveMembers -> "apiRemoveMembers" @@ -5849,6 +5859,7 @@ sealed class CR { @Serializable @SerialName("groupDeletedUser") class GroupDeletedUser(val user: UserRef, val groupInfo: GroupInfo): CR() @Serializable @SerialName("joinedGroupMemberConnecting") class JoinedGroupMemberConnecting(val user: UserRef, val groupInfo: GroupInfo, val hostMember: GroupMember, val member: GroupMember): CR() @Serializable @SerialName("memberAccepted") class MemberAccepted(val user: UserRef, val groupInfo: GroupInfo, val member: GroupMember): CR() + @Serializable @SerialName("memberSupportChatDeleted") class MemberSupportChatDeleted(val user: UserRef, val groupInfo: GroupInfo, val member: GroupMember): CR() @Serializable @SerialName("memberAcceptedByOther") class MemberAcceptedByOther(val user: UserRef, val groupInfo: GroupInfo, val acceptingMember: GroupMember, val member: GroupMember): CR() @Serializable @SerialName("memberRole") class MemberRole(val user: UserRef, val groupInfo: GroupInfo, val byMember: GroupMember, val member: GroupMember, val fromRole: GroupMemberRole, val toRole: GroupMemberRole): CR() @Serializable @SerialName("membersRoleUser") class MembersRoleUser(val user: UserRef, val groupInfo: GroupInfo, val members: List, val toRole: GroupMemberRole): CR() @@ -6027,6 +6038,7 @@ sealed class CR { is GroupDeletedUser -> "groupDeletedUser" is JoinedGroupMemberConnecting -> "joinedGroupMemberConnecting" is MemberAccepted -> "memberAccepted" + is MemberSupportChatDeleted -> "memberSupportChatDeleted" is MemberAcceptedByOther -> "memberAcceptedByOther" is MemberRole -> "memberRole" is MembersRoleUser -> "membersRoleUser" @@ -6198,6 +6210,7 @@ sealed class CR { is GroupDeletedUser -> withUser(user, json.encodeToString(groupInfo)) is JoinedGroupMemberConnecting -> withUser(user, "groupInfo: $groupInfo\nhostMember: $hostMember\nmember: $member") is MemberAccepted -> withUser(user, "groupInfo: $groupInfo\nmember: $member") + is MemberSupportChatDeleted -> withUser(user, "groupInfo: $groupInfo\nmember: $member") is MemberAcceptedByOther -> withUser(user, "groupInfo: $groupInfo\nacceptingMember: $acceptingMember\nmember: $member") is MemberRole -> withUser(user, "groupInfo: $groupInfo\nbyMember: $byMember\nmember: $member\nfromRole: $fromRole\ntoRole: $toRole") is MembersRoleUser -> withUser(user, "groupInfo: $groupInfo\nmembers: $members\ntoRole: $toRole") diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt index 401509a171..3c3f99ad94 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextPendingMemberActionsView.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import chat.simplex.common.model.* import chat.simplex.common.platform.chatModel +import chat.simplex.common.views.chat.group.removeMember import chat.simplex.common.views.chat.group.removeMemberDialog import chat.simplex.common.views.helpers.* import chat.simplex.res.MR @@ -44,12 +45,12 @@ fun ComposeContextPendingMemberActionsView( .fillMaxHeight() .weight(1F) .clickable { - removeMemberDialog(rhId, groupInfo, member, chatModel, close = { ModalManager.end.closeModal() }) + rejectMemberDialog(rhId, member, chatModel, close = { ModalManager.end.closeModal() }) }, verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { - Text(stringResource(MR.strings.remove_pending_member_button), color = Color.Red) + Text(stringResource(MR.strings.reject_pending_member_button), color = Color.Red) } Column( @@ -69,6 +70,17 @@ fun ComposeContextPendingMemberActionsView( } } +fun rejectMemberDialog(rhId: Long?, member: GroupMember, chatModel: ChatModel, close: (() -> Unit)? = null) { + AlertManager.shared.showAlertDialog( + title = generalGetString(MR.strings.reject_pending_member_alert_title), + confirmText = generalGetString(MR.strings.reject_pending_member_button), + onConfirm = { + removeMember(rhId, member, chatModel, close) + }, + destructive = true, + ) +} + fun acceptMemberDialog(rhId: Long?, groupInfo: GroupInfo, member: GroupMember, close: (() -> Unit)? = null) { AlertManager.shared.showAlertDialogButtonsColumn( title = generalGetString(MR.strings.accept_pending_member_alert_title), @@ -105,12 +117,9 @@ private fun acceptMember(rhId: Long?, groupInfo: GroupInfo, member: GroupMember, val r = chatModel.controller.apiAcceptMember(rhId, groupInfo.groupId, member.groupMemberId, role) if (r != null) { withContext(Dispatchers.Main) { - chatModel.chatsContext.upsertGroupMember(rhId, groupInfo, r.second) + chatModel.chatsContext.upsertGroupMember(rhId, r.first, r.second) chatModel.chatsContext.updateGroup(rhId, r.first) } - withContext(Dispatchers.Main) { - chatModel.secondaryChatsContext.value?.upsertGroupMember(rhId, groupInfo, r.second) - } } close?.invoke() } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt index 0ce0f8fa3c..e56bc36562 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt @@ -245,29 +245,28 @@ fun removeMemberDialog(rhId: Long?, groupInfo: GroupInfo, member: GroupMember, c text = generalGetString(messageId), confirmText = generalGetString(MR.strings.remove_member_confirmation), onConfirm = { - withBGApi { - val r = chatModel.controller.apiRemoveMembers(rhId, member.groupId, listOf(member.groupMemberId)) - if (r != null) { - val (updatedGroupInfo, removedMembers) = r - withContext(Dispatchers.Main) { - chatModel.chatsContext.updateGroup(rhId, updatedGroupInfo) - removedMembers.forEach { removedMember -> - chatModel.chatsContext.upsertGroupMember(rhId, updatedGroupInfo, removedMember) - } - } - withContext(Dispatchers.Main) { - removedMembers.forEach { removedMember -> - chatModel.secondaryChatsContext.value?.upsertGroupMember(rhId, updatedGroupInfo, removedMember) - } - } - } - close?.invoke() - } + removeMember(rhId, member, chatModel, close) }, destructive = true, ) } +fun removeMember(rhId: Long?, member: GroupMember, chatModel: ChatModel, close: (() -> Unit)? = null) { + withBGApi { + val r = chatModel.controller.apiRemoveMembers(rhId, member.groupId, listOf(member.groupMemberId)) + if (r != null) { + val (updatedGroupInfo, removedMembers) = r + withContext(Dispatchers.Main) { + chatModel.chatsContext.updateGroup(rhId, updatedGroupInfo) + removedMembers.forEach { removedMember -> + chatModel.chatsContext.upsertGroupMember(rhId, updatedGroupInfo, removedMember) + } + } + } + close?.invoke() + } +} + @Composable fun GroupMemberInfoLayout( rhId: Long?, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt index 0ef63a2a11..298a545c8c 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberSupportView.kt @@ -28,7 +28,7 @@ import chat.simplex.common.views.chat.item.ItemAction import chat.simplex.common.views.chatlist.* import chat.simplex.res.MR import dev.icerock.moko.resources.compose.painterResource -import kotlinx.coroutines.launch +import kotlinx.coroutines.* @Composable fun ModalData.MemberSupportView( @@ -269,14 +269,34 @@ private fun DropDownMenuForSupportChat(rhId: Long?, member: GroupMember, groupIn acceptMemberDialog(rhId, groupInfo, member) showMenu.value = false }) + } else { + ItemAction(stringResource(MR.strings.delete_member_support_chat_button), painterResource(MR.images.ic_delete), color = MaterialTheme.colors.error, onClick = { + deleteMemberSupportChatDialog(rhId, groupInfo, member) + showMenu.value = false + }) + } + } +} + +fun deleteMemberSupportChatDialog(rhId: Long?, groupInfo: GroupInfo, member: GroupMember) { + AlertManager.shared.showAlertDialog( + title = generalGetString(MR.strings.delete_member_support_chat_alert_title), + confirmText = generalGetString(MR.strings.delete_member_support_chat_button), + onConfirm = { + deleteMemberSupportChat(rhId, groupInfo, member) + }, + destructive = true, + ) +} + +private fun deleteMemberSupportChat(rhId: Long?, groupInfo: GroupInfo, member: GroupMember) { + withBGApi { + val r = chatModel.controller.apiDeleteMemberSupportChat(rhId, groupInfo.groupId, member.groupMemberId) + if (r != null) { + withContext(Dispatchers.Main) { + chatModel.chatsContext.upsertGroupMember(rhId, r.first, r.second) + chatModel.chatsContext.updateGroup(rhId, r.first) + } } - ItemAction(stringResource(MR.strings.remove_pending_member_button), painterResource(MR.images.ic_delete), color = MaterialTheme.colors.error, onClick = { - removeMemberDialog(rhId, groupInfo, member, chatModel) - showMenu.value = false - }) - // TODO [knocking] mark read, mark unread - // ItemAction(stringResource(MR.strings.mark_unread), painterResource(MR.images.ic_mark_chat_unread), onClick = { - // showMenu.value = false - // }) } } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index b130970467..7bb6562a3f 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -159,6 +159,7 @@ Error adding member(s) Error joining group Error accepting member + Error deleting member support chat Cannot receive file Sender cancelled file transfer. Unknown servers! @@ -2188,10 +2189,13 @@ Chats with members No chats with members + Delete chat + Delete chat with member? Chat with admins - Remove + Reject + Reject member? Accept Accept member Member will join the group, accept member? diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 36d6b0aa4a..753e4543d6 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -360,6 +360,7 @@ data ChatCommand | APIAddMember GroupId ContactId GroupMemberRole | APIJoinGroup {groupId :: GroupId, enableNtfs :: MsgFilter} | APIAcceptMember GroupId GroupMemberId GroupMemberRole + | APIDeleteMemberSupportChat GroupId GroupMemberId | APIMembersRole GroupId (NonEmpty GroupMemberId) GroupMemberRole | APIBlockMembersForAll GroupId (NonEmpty GroupMemberId) Bool | APIRemoveMembers {groupId :: GroupId, groupMemberIds :: Set GroupMemberId, withMessages :: Bool} @@ -704,6 +705,7 @@ data ChatResponse | CRNetworkStatuses {user_ :: Maybe User, networkStatuses :: [ConnNetworkStatus]} | CRJoinedGroupMember {user :: User, groupInfo :: GroupInfo, member :: GroupMember} | CRMemberAccepted {user :: User, groupInfo :: GroupInfo, member :: GroupMember} + | CRMemberSupportChatDeleted {user :: User, groupInfo :: GroupInfo, member :: GroupMember} | CRMembersRoleUser {user :: User, groupInfo :: GroupInfo, members :: [GroupMember], toRole :: GroupMemberRole} | CRMembersBlockedForAllUser {user :: User, groupInfo :: GroupInfo, members :: [GroupMember], blocked :: Bool} | CRGroupUpdated {user :: User, fromGroup :: GroupInfo, toGroup :: GroupInfo, member_ :: Maybe GroupMember} diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 9c1b31efb3..79714af0ec 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -2098,6 +2098,12 @@ processChatCommand' vr = \case Just c | connReady c -> GSMemConnected _ -> GSMemAnnounced _ -> throwCmdError "member should be pending approval and invitee, or pending review and not invitee" + APIDeleteMemberSupportChat groupId gmId -> withUser $ \user -> do + (gInfo, m) <- withFastStore $ \db -> (,) <$> getGroupInfo db vr user groupId <*> getGroupMemberById db vr user gmId + when (isNothing $ supportChat m) $ throwCmdError "member has no support chat" + when (memberPending m) $ throwCmdError "member is pending" + (gInfo', m') <- withFastStore' $ \db -> deleteGroupMemberSupportChat db user gInfo m + pure $ CRMemberSupportChatDeleted user gInfo' m' APIMembersRole groupId memberIds newRole -> withUser $ \user -> withGroupLock "memberRole" groupId . procCmd $ do g@(Group gInfo members) <- withFastStore $ \db -> getGroup db vr user groupId @@ -4106,6 +4112,7 @@ chatCommandP = "/_add #" *> (APIAddMember <$> A.decimal <* A.space <*> A.decimal <*> memberRole), "/_join #" *> (APIJoinGroup <$> A.decimal <*> pure MFAll), -- needs to be changed to support in UI "/_accept member #" *> (APIAcceptMember <$> A.decimal <* A.space <*> A.decimal <*> memberRole), + "/_delete member chat #" *> (APIDeleteMemberSupportChat <$> A.decimal <* A.space <*> A.decimal), "/_member role #" *> (APIMembersRole <$> A.decimal <*> _strP <*> memberRole), "/_block #" *> (APIBlockMembersForAll <$> A.decimal <*> _strP <* " blocked=" <*> onOffP), "/_remove #" *> (APIRemoveMembers <$> A.decimal <*> _strP <*> (" messages=" *> onOffP <|> pure False)), diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index 68fdb5c0be..4470641491 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -80,6 +80,7 @@ module Simplex.Chat.Store.Groups updateGroupMemberStatus, updateGroupMemberStatusById, updateGroupMemberAccepted, + deleteGroupMemberSupportChat, updateGroupMembersRequireAttention, decreaseGroupMembersRequireAttention, increaseGroupMembersRequireAttention, @@ -1231,6 +1232,36 @@ updateGroupMemberAccepted db User {userId} m@GroupMember {groupMemberId} status (status, role, currentTs, userId, groupMemberId) pure m {memberStatus = status, memberRole = role, updatedAt = currentTs} +deleteGroupMemberSupportChat :: DB.Connection -> User -> GroupInfo -> GroupMember -> IO (GroupInfo, GroupMember) +deleteGroupMemberSupportChat db user@User {userId} g@GroupInfo {groupId, membersRequireAttention} m@GroupMember {groupMemberId, supportChat} = do + let requiredAttention = gmRequiresAttention m + currentTs <- getCurrentTime + DB.execute + db + [sql| + DELETE FROM chat_items + WHERE group_scope_group_member_id = ? + |] + (Only groupMemberId) + DB.execute + db + [sql| + UPDATE group_members + SET support_chat_ts = NULL, + support_chat_items_unread = 0, + support_chat_items_member_attention = 0, + support_chat_items_mentions = 0, + support_chat_last_msg_from_member_ts = NULL, + updated_at = ? + WHERE group_member_id = ? + |] + (currentTs, groupMemberId) + let m' = m {supportChat = Nothing, updatedAt = currentTs} + g' <- if requiredAttention + then decreaseGroupMembersRequireAttention db user g + else pure g + pure (g', m') + updateGroupMembersRequireAttention :: DB.Connection -> User -> GroupInfo -> GroupMember -> GroupMember -> IO GroupInfo updateGroupMembersRequireAttention db user g member member' | nowRequires && not didRequire = diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 44b915a8fe..cf3c3fb206 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -3482,6 +3482,21 @@ Query: Plan: SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) +Query: + DELETE FROM chat_items + WHERE group_scope_group_member_id = ? + +Plan: +SEARCH chat_items USING COVERING INDEX idx_chat_items_group_scope_group_member_id (group_scope_group_member_id=?) +SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?) +SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?) +SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?) +SEARCH calls USING COVERING INDEX idx_calls_chat_item_id (chat_item_id=?) +SEARCH chat_item_messages USING COVERING INDEX sqlite_autoindex_chat_item_messages_2 (chat_item_id=?) +SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd_from_chat_item_id=?) +SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?) +SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?) + Query: DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND chat_item_id = ? @@ -4405,6 +4420,19 @@ Query: Plan: SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) +Query: + UPDATE group_members + SET support_chat_ts = NULL, + support_chat_items_unread = 0, + support_chat_items_member_attention = 0, + support_chat_items_mentions = 0, + support_chat_last_msg_from_member_ts = NULL, + updated_at = ? + WHERE group_member_id = ? + +Plan: +SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) + Query: UPDATE group_profiles SET preferences = ?, updated_at = ? diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index c11df38dba..c13b164693 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -222,6 +222,7 @@ chatResponseToView hu cfg@ChatConfig {logLevel, showReactions, testView} liveIte CRNetworkStatuses u statuses -> if testView then ttyUser' u $ viewNetworkStatuses statuses else [] CRJoinedGroupMember u g m -> ttyUser u $ viewJoinedGroupMember g m CRMemberAccepted u g m -> ttyUser u $ viewMemberAccepted g m + CRMemberSupportChatDeleted u g m -> ttyUser u [ttyGroup' g <> ": " <> ttyMember m <> " support chat deleted"] CRMembersRoleUser u g members r' -> ttyUser u $ viewMemberRoleUserChanged g members r' CRMembersBlockedForAllUser u g members blocked -> ttyUser u $ viewMembersBlockedForAllUser g members blocked CRGroupUpdated u g g' m -> ttyUser u $ viewGroupUpdated g g' m diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 591a8fb311..d1588ce6fb 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -3118,6 +3118,10 @@ testGLinkReviewMember = (bob "/_delete member chat #1 5" + alice <## "bad chat command: member is pending" + -- accept member dan ##> "/_accept member #1 5 member" concurrentlyN_ @@ -6923,6 +6927,9 @@ testScopedSupportSingleModerator = cath ##> "/_send #1(_support:3) text 5" cath <## "#team: you have insufficient permissions for this action, the required role is moderator" + alice ##> "/_delete member chat #1 2" + alice <## "#team: bob support chat deleted" + testScopedSupportManyModerators :: HasCallStack => TestParams -> IO () testScopedSupportManyModerators = testChat4 aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do From b441527f7d891e58189eb0f06579bdc9be2b5001 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 20 May 2025 12:46:52 +0100 Subject: [PATCH 08/14] ui: translations (#5929) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (German) Currently translated at 100.0% (2054 of 2054 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2054 of 2054 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Ukrainian) Currently translated at 100.0% (2356 of 2356 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/uk/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2356 of 2356 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2054 of 2054 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Indonesian) Currently translated at 100.0% (2356 of 2356 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/id/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2389 of 2389 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2054 of 2054 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2389 of 2389 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2054 of 2054 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (German) Currently translated at 100.0% (2389 of 2389 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2389 of 2389 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2389 of 2389 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2054 of 2054 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2053 of 2053 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Italian) Currently translated at 100.0% (2389 of 2389 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (German) Currently translated at 100.0% (2053 of 2053 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2389 of 2389 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * process localizations --------- Co-authored-by: mlanp Co-authored-by: Random Co-authored-by: Bezruchenko Simon Co-authored-by: summoner001 Co-authored-by: Rafi Co-authored-by: Hosted Weblate Co-authored-by: 大王叫我来巡山 --- .../bg.xcloc/Localized Contents/bg.xliff | 110 ++++++++++++- .../cs.xcloc/Localized Contents/cs.xliff | 110 ++++++++++++- .../de.xcloc/Localized Contents/de.xliff | 113 +++++++++++++- .../en.xcloc/Localized Contents/en.xliff | 135 +++++++++++++++- .../es.xcloc/Localized Contents/es.xliff | 110 ++++++++++++- .../fi.xcloc/Localized Contents/fi.xliff | 110 ++++++++++++- .../fr.xcloc/Localized Contents/fr.xliff | 110 ++++++++++++- .../hu.xcloc/Localized Contents/hu.xliff | 145 +++++++++++++++--- .../it.xcloc/Localized Contents/it.xliff | 111 +++++++++++++- .../ja.xcloc/Localized Contents/ja.xliff | 110 ++++++++++++- .../nl.xcloc/Localized Contents/nl.xliff | 110 ++++++++++++- .../pl.xcloc/Localized Contents/pl.xliff | 110 ++++++++++++- .../ru.xcloc/Localized Contents/ru.xliff | 110 ++++++++++++- .../th.xcloc/Localized Contents/th.xliff | 110 ++++++++++++- .../tr.xcloc/Localized Contents/tr.xliff | 110 ++++++++++++- .../uk.xcloc/Localized Contents/uk.xliff | 110 ++++++++++++- .../Localized Contents/zh-Hans.xliff | 110 ++++++++++++- apps/ios/bg.lproj/Localizable.strings | 17 +- apps/ios/cs.lproj/Localizable.strings | 17 +- apps/ios/de.lproj/Localizable.strings | 22 +-- apps/ios/es.lproj/Localizable.strings | 19 ++- apps/ios/fi.lproj/Localizable.strings | 17 +- apps/ios/fr.lproj/Localizable.strings | 19 ++- apps/ios/hu.lproj/Localizable.strings | 54 +++---- apps/ios/it.lproj/Localizable.strings | 22 +-- apps/ios/ja.lproj/Localizable.strings | 17 +- apps/ios/nl.lproj/Localizable.strings | 19 ++- apps/ios/pl.lproj/Localizable.strings | 19 ++- apps/ios/ru.lproj/Localizable.strings | 15 +- apps/ios/th.lproj/Localizable.strings | 17 +- apps/ios/tr.lproj/Localizable.strings | 19 ++- apps/ios/uk.lproj/Localizable.strings | 19 ++- apps/ios/zh-Hans.lproj/Localizable.strings | 17 +- .../commonMain/resources/MR/de/strings.xml | 35 ++++- .../commonMain/resources/MR/hu/strings.xml | 71 ++++++--- .../commonMain/resources/MR/in/strings.xml | 2 +- .../commonMain/resources/MR/it/strings.xml | 33 ++++ .../commonMain/resources/MR/uk/strings.xml | 2 +- .../resources/MR/zh-rCN/strings.xml | 33 ++++ 39 files changed, 2163 insertions(+), 276 deletions(-) diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index 776199ac1f..7f38695470 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -554,6 +554,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Приеми условията @@ -575,6 +583,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Приети условия @@ -1535,11 +1547,23 @@ set passcode view Chat will be deleted for you - this cannot be undone! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Чатове No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. No comment provided by engineer. @@ -2698,7 +2722,7 @@ swipe action Don't show again Не показвай отново - No comment provided by engineer. + alert action Done @@ -3006,6 +3030,10 @@ chat item action Грешка при приемане на заявка за контакт No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Грешка при добавяне на член(ове) @@ -3196,7 +3224,7 @@ chat item action Error removing member Грешка при отстраняване на член - No comment provided by engineer. + alert title Error reordering lists @@ -4508,6 +4536,10 @@ This is your link for group %@! Член No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive item status text @@ -4539,6 +4571,10 @@ This is your link for group %@! Членът ще бъде премахнат от групата - това не може да бъде отменено! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Членовете на групата могат да добавят реакции към съобщенията. @@ -4931,6 +4967,10 @@ This is your link for group %@! Нова членска роля No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Ново съобщение @@ -4967,6 +5007,10 @@ This is your link for group %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Няма избрани контакти @@ -5140,7 +5184,8 @@ This is your link for group %@! Ok Ок - alert button + alert action +alert button Old database @@ -5531,6 +5576,10 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -5981,7 +6030,7 @@ swipe action Remove member? Острани член? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6053,6 +6102,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -6157,6 +6210,14 @@ swipe action Review conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Отзови @@ -6210,6 +6271,10 @@ chat item action Запази (и уведоми контактите) alert button + + Save admission settings? + alert title + Save and notify contact Запази и уведоми контакта @@ -6689,6 +6754,10 @@ chat item action Задайте го вместо системната идентификация. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8343,6 +8412,10 @@ Repeat join request? Можете да видите отново линкът за покана в подробностите за връзката. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Не може да изпращате съобщения! @@ -8635,6 +8708,10 @@ Repeat connection request? по-горе, след това избери: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call обаждането прието @@ -8644,6 +8721,10 @@ Repeat connection request? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin админ @@ -8664,6 +8745,10 @@ Repeat connection request? съгласуване на криптиране… chat item text + + all + member criteria value + all members всички членове @@ -9226,6 +9311,7 @@ pref value изключено enabled status group pref value +member criteria value time to disappear @@ -9274,6 +9360,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption квантово устойчиво e2e криптиране @@ -9327,6 +9417,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved запазено @@ -9508,6 +9606,10 @@ last received msg: %2$@ вие No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group вие сте поканени в групата diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index 0400839cb0..23709c29de 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -544,6 +544,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions No comment provided by engineer. @@ -564,6 +572,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions No comment provided by engineer. @@ -1456,11 +1468,23 @@ set passcode view Chat will be deleted for you - this cannot be undone! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Chaty No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. No comment provided by engineer. @@ -2584,7 +2608,7 @@ swipe action Don't show again Znovu neukazuj - No comment provided by engineer. + alert action Done @@ -2878,6 +2902,10 @@ chat item action Chyba při přijímání žádosti o kontakt No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Chyba přidávání člena(ů) @@ -3065,7 +3093,7 @@ chat item action Error removing member Chyba při odebrání člena - No comment provided by engineer. + alert title Error reordering lists @@ -4333,6 +4361,10 @@ This is your link for group %@! Člen No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive item status text @@ -4364,6 +4396,10 @@ This is your link for group %@! Člen bude odstraněn ze skupiny - toto nelze vzít zpět! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Členové skupin mohou přidávat reakce na zprávy. @@ -4739,6 +4775,10 @@ This is your link for group %@! Nová role člena No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Nová zpráva @@ -4775,6 +4815,10 @@ This is your link for group %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Nebyl vybrán žádný kontakt @@ -4945,7 +4989,8 @@ This is your link for group %@! Ok Ok - alert button + alert action +alert button Old database @@ -5320,6 +5365,10 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -5762,7 +5811,7 @@ swipe action Remove member? Odebrat člena? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -5829,6 +5878,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -5932,6 +5985,14 @@ swipe action Review conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Odvolat @@ -5984,6 +6045,10 @@ chat item action Uložit (a informovat kontakty) alert button + + Save admission settings? + alert title + Save and notify contact Uložit a upozornit kontakt @@ -6455,6 +6520,10 @@ chat item action Nastavte jej namísto ověřování systému. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8044,6 +8113,10 @@ Repeat join request? You can view invitation link again in connection details. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Nemůžete posílat zprávy! @@ -8330,6 +8403,10 @@ Repeat connection request? výše, pak vyberte: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call přijatý hovor @@ -8339,6 +8416,10 @@ Repeat connection request? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin správce @@ -8358,6 +8439,10 @@ Repeat connection request? povoluji šifrování… chat item text + + all + member criteria value + all members feature role @@ -8910,6 +8995,7 @@ pref value vypnuto enabled status group pref value +member criteria value time to disappear @@ -8957,6 +9043,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption chat item text @@ -9007,6 +9097,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved No comment provided by engineer. @@ -9178,6 +9276,10 @@ last received msg: %2$@ you No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group jste pozváni do skupiny diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 06fd7c5a1d..f4e5083fb0 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Nutzungsbedingungen akzeptieren @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Akzeptierte Nutzungsbedingungen @@ -1582,11 +1594,23 @@ set passcode view Der Chat wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Chats No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Alle 20min Nachrichten überprüfen. @@ -2825,7 +2849,7 @@ swipe action Don't show again Nicht nochmals anzeigen - No comment provided by engineer. + alert action Done @@ -3143,6 +3167,10 @@ chat item action Fehler beim Annehmen der Kontaktanfrage No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Fehler beim Hinzufügen von Mitgliedern @@ -3346,7 +3374,7 @@ chat item action Error removing member Fehler beim Entfernen des Mitglieds - No comment provided by engineer. + alert title Error reordering lists @@ -4730,6 +4758,10 @@ Das ist Ihr Link für die Gruppe %@! Mitglied No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Mitglied inaktiv @@ -4765,6 +4797,10 @@ Das ist Ihr Link für die Gruppe %@! Das Mitglied wird aus der Gruppe entfernt. Dies kann nicht rückgängig gemacht werden! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Gruppenmitglieder können eine Reaktion auf Nachrichten geben. @@ -5185,6 +5221,10 @@ Das ist Ihr Link für die Gruppe %@! Neue Mitgliedsrolle No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Neue Nachricht @@ -5225,6 +5265,10 @@ Das ist Ihr Link für die Gruppe %@! Keine Chats in der Liste %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Keine Kontakte ausgewählt @@ -5417,7 +5461,8 @@ Das ist Ihr Link für die Gruppe %@! Ok Ok - alert button + alert action +alert button Old database @@ -5575,6 +5620,7 @@ Dies erfordert die Aktivierung eines VPNs. Open link? + Link öffnen? alert title @@ -5828,6 +5874,10 @@ Fehler: %@ Bitte versuchen Sie, die Benachrichtigungen zu deaktivieren und wieder zu aktivieren. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. Bitte warten Sie, bis die Token-Aktivierung abgeschlossen ist. @@ -6314,7 +6364,7 @@ swipe action Remove member? Das Mitglied entfernen? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6391,6 +6441,10 @@ swipe action Grund der Meldung? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. Spam melden: Nur Gruppenmoderatoren werden es sehen. @@ -6506,6 +6560,14 @@ swipe action Nutzungsbedingungen einsehen No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Widerrufen @@ -6562,6 +6624,10 @@ chat item action Speichern (und Kontakte benachrichtigen) alert button + + Save admission settings? + alert title + Save and notify contact Speichern und Kontakt benachrichtigen @@ -7077,6 +7143,10 @@ chat item action Anstelle der System-Authentifizierung festlegen. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. Verfallsdatum von Nachrichten in Chats festlegen. @@ -8839,6 +8909,10 @@ Verbindungsanfrage wiederholen? Den Einladungslink können Sie in den Details der Verbindung nochmals sehen. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Sie können keine Nachrichten versenden! @@ -9078,7 +9152,7 @@ Verbindungsanfrage wiederholen? Your profile is stored on your device and only shared with your contacts. - Das Profil wird nur mit Ihren Kontakten geteilt. + Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt. No comment provided by engineer. @@ -9141,6 +9215,10 @@ Verbindungsanfrage wiederholen? Danach die gewünschte Aktion auswählen: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call Anruf angenommen @@ -9151,6 +9229,10 @@ Verbindungsanfrage wiederholen? Einladung angenommen chat list item title + + accepted you + rcv group event chat item + admin Admin @@ -9171,6 +9253,10 @@ Verbindungsanfrage wiederholen? Verschlüsselung zustimmen… chat item text + + all + member criteria value + all members Alle Mitglieder @@ -9743,6 +9829,7 @@ pref value Aus enabled status group pref value +member criteria value time to disappear @@ -9795,6 +9882,10 @@ time to disappear ausstehende Genehmigung No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption Quantum-resistente E2E-Verschlüsselung @@ -9850,6 +9941,14 @@ time to disappear Zur Verbindung aufgefordert chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved abgespeichert @@ -10039,6 +10138,10 @@ Zuletzt empfangene Nachricht: %2$@ Profil No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group Sie sind zu der Gruppe eingeladen diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index fd71e0dee6..9821e49098 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -565,6 +565,16 @@ time interval accept incoming call via notification swipe action + + Accept as member + Accept as member + alert action + + + Accept as observer + Accept as observer + alert action + Accept conditions Accept conditions @@ -586,6 +596,11 @@ swipe action accept contact request via notification swipe action + + Accept member + Accept member + alert title + Accepted conditions Accepted conditions @@ -1582,11 +1597,26 @@ set passcode view Chat will be deleted for you - this cannot be undone! No comment provided by engineer. + + Chat with admins + Chat with admins + chat toolbar + + + Chat with member + Chat with member + No comment provided by engineer. + Chats Chats No comment provided by engineer. + + Chats with members + Chats with members + No comment provided by engineer. + Check messages every 20 min. Check messages every 20 min. @@ -2825,7 +2855,7 @@ swipe action Don't show again Don't show again - No comment provided by engineer. + alert action Done @@ -3143,6 +3173,11 @@ chat item action Error accepting contact request No comment provided by engineer. + + Error accepting member + Error accepting member + alert title + Error adding member(s) Error adding member(s) @@ -3346,7 +3381,7 @@ chat item action Error removing member Error removing member - No comment provided by engineer. + alert title Error reordering lists @@ -4730,6 +4765,11 @@ This is your link for group %@! Member No comment provided by engineer. + + Member admission + Member admission + No comment provided by engineer. + Member inactive Member inactive @@ -4765,6 +4805,11 @@ This is your link for group %@! Member will be removed from group - this cannot be undone! No comment provided by engineer. + + Member will join the group, accept member? + Member will join the group, accept member? + alert message + Members can add message reactions. Members can add message reactions. @@ -5185,6 +5230,11 @@ This is your link for group %@! New member role No comment provided by engineer. + + New member wants to join the group. + New member wants to join the group. + rcv group event chat item + New message New message @@ -5225,6 +5275,11 @@ This is your link for group %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No chats with members + No comment provided by engineer. + No contacts selected No contacts selected @@ -5417,7 +5472,8 @@ This is your link for group %@! Ok Ok - alert button + alert action +alert button Old database @@ -5829,6 +5885,11 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. Please wait for token activation to complete. @@ -6315,7 +6376,7 @@ swipe action Remove member? Remove member? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6392,6 +6453,11 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + Report sent to moderators + alert title + Report spam: only group moderators will see it. Report spam: only group moderators will see it. @@ -6507,6 +6573,16 @@ swipe action Review conditions No comment provided by engineer. + + Review members + Review members + admission stage + + + Review members before admitting ("knocking"). + Review members before admitting ("knocking"). + admission stage description + Revoke Revoke @@ -6563,6 +6639,11 @@ chat item action Save (and notify contacts) alert button + + Save admission settings? + Save admission settings? + alert title + Save and notify contact Save and notify contact @@ -7078,6 +7159,11 @@ chat item action Set it instead of system authentication. No comment provided by engineer. + + Set member admission + Set member admission + No comment provided by engineer. + Set message expiration in chats. Set message expiration in chats. @@ -8840,6 +8926,11 @@ Repeat join request? You can view invitation link again in connection details. alert message + + You can view your reports in Chat with admins. + You can view your reports in Chat with admins. + alert message + You can't send messages! You can't send messages! @@ -9142,6 +9233,11 @@ Repeat connection request? above, then choose: No comment provided by engineer. + + accepted %@ + accepted %@ + rcv group event chat item + accepted call accepted call @@ -9152,6 +9248,11 @@ Repeat connection request? accepted invitation chat list item title + + accepted you + accepted you + rcv group event chat item + admin admin @@ -9172,6 +9273,11 @@ Repeat connection request? agreeing encryption… chat item text + + all + all + member criteria value + all members all members @@ -9744,6 +9850,7 @@ pref value off enabled status group pref value +member criteria value time to disappear @@ -9796,6 +9903,11 @@ time to disappear pending approval No comment provided by engineer. + + pending review + pending review + No comment provided by engineer. + quantum resistant e2e encryption quantum resistant e2e encryption @@ -9851,6 +9963,16 @@ time to disappear requested to connect chat list item title + + review + review + No comment provided by engineer. + + + reviewed by admins + reviewed by admins + No comment provided by engineer. + saved saved @@ -10040,6 +10162,11 @@ last received msg: %2$@ you No comment provided by engineer. + + you accepted this member + you accepted this member + snd group event chat item + you are invited to group you are invited to group diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index d39fb61249..2a9d2e9430 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Aceptar condiciones @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Condiciones aceptadas @@ -1582,11 +1594,23 @@ set passcode view El chat será eliminado para tí. ¡No puede deshacerse! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Chats No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Comprobar mensajes cada 20 min. @@ -2825,7 +2849,7 @@ swipe action Don't show again No volver a mostrar - No comment provided by engineer. + alert action Done @@ -3143,6 +3167,10 @@ chat item action Error al aceptar solicitud del contacto No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Error al añadir miembro(s) @@ -3346,7 +3374,7 @@ chat item action Error removing member Error al expulsar miembro - No comment provided by engineer. + alert title Error reordering lists @@ -4730,6 +4758,10 @@ This is your link for group %@! Miembro No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Miembro inactivo @@ -4765,6 +4797,10 @@ This is your link for group %@! El miembro será expulsado del grupo. ¡No puede deshacerse! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Los miembros pueden añadir reacciones a los mensajes. @@ -5185,6 +5221,10 @@ This is your link for group %@! Nuevo rol de miembro No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Mensaje nuevo @@ -5225,6 +5265,10 @@ This is your link for group %@! Sin chats en la lista %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Ningún contacto seleccionado @@ -5417,7 +5461,8 @@ This is your link for group %@! Ok Ok - alert button + alert action +alert button Old database @@ -5828,6 +5873,10 @@ Error: %@ Por favor, intenta desactivar y reactivar las notificaciones. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. Por favor, espera a que el token de activación se complete. @@ -6314,7 +6363,7 @@ swipe action Remove member? ¿Expulsar miembro? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6391,6 +6440,10 @@ swipe action ¿Motivo del informe? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. Informar de spam: sólo los moderadores del grupo lo verán. @@ -6506,6 +6559,14 @@ swipe action Revisar condiciones No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Revocar @@ -6562,6 +6623,10 @@ chat item action Guardar (y notificar contactos) alert button + + Save admission settings? + alert title + Save and notify contact Guardar y notificar contacto @@ -7077,6 +7142,10 @@ chat item action Úsalo en lugar de la autenticación del sistema. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. Establece el vencimiento para los mensajes en los chats. @@ -8839,6 +8908,10 @@ Repeat join request? Podrás ver el enlace de invitación en detalles de conexión. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! ¡No puedes enviar mensajes! @@ -9141,6 +9214,10 @@ Repeat connection request? y después elige: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call llamada aceptada @@ -9151,6 +9228,10 @@ Repeat connection request? invitación aceptada chat list item title + + accepted you + rcv group event chat item + admin administrador @@ -9171,6 +9252,10 @@ Repeat connection request? acordando cifrado… chat item text + + all + member criteria value + all members todos los miembros @@ -9743,6 +9828,7 @@ pref value desactivado enabled status group pref value +member criteria value time to disappear @@ -9795,6 +9881,10 @@ time to disappear pendiente de aprobación No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption cifrado e2e resistente a tecnología cuántica @@ -9850,6 +9940,14 @@ time to disappear solicitado para conectar chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved guardado @@ -10039,6 +10137,10 @@ last received msg: %2$@ tu No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group has sido invitado a un grupo diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index a54666bb10..6e5928281d 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -527,6 +527,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions No comment provided by engineer. @@ -547,6 +555,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions No comment provided by engineer. @@ -1437,11 +1449,23 @@ set passcode view Chat will be deleted for you - this cannot be undone! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Keskustelut No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. No comment provided by engineer. @@ -2565,7 +2589,7 @@ swipe action Don't show again Älä näytä uudelleen - No comment provided by engineer. + alert action Done @@ -2858,6 +2882,10 @@ chat item action Virhe kontaktipyynnön hyväksymisessä No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Virhe lisättäessä jäseniä @@ -3044,7 +3072,7 @@ chat item action Error removing member Virhe poistettaessa jäsentä - No comment provided by engineer. + alert title Error reordering lists @@ -4311,6 +4339,10 @@ This is your link for group %@! Jäsen No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive item status text @@ -4342,6 +4374,10 @@ This is your link for group %@! Jäsen poistetaan ryhmästä - tätä ei voi perua! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Ryhmän jäsenet voivat lisätä viestireaktioita. @@ -4716,6 +4752,10 @@ This is your link for group %@! Uusi jäsenrooli No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Uusi viesti @@ -4752,6 +4792,10 @@ This is your link for group %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Kontakteja ei ole valittu @@ -4922,7 +4966,8 @@ This is your link for group %@! Ok Ok - alert button + alert action +alert button Old database @@ -5296,6 +5341,10 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -5738,7 +5787,7 @@ swipe action Remove member? Poista jäsen? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -5805,6 +5854,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -5908,6 +5961,14 @@ swipe action Review conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Peruuta @@ -5960,6 +6021,10 @@ chat item action Tallenna (ja ilmoita kontakteille) alert button + + Save admission settings? + alert title + Save and notify contact Tallenna ja ilmoita kontaktille @@ -6430,6 +6495,10 @@ chat item action Aseta se järjestelmän todennuksen sijaan. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8017,6 +8086,10 @@ Repeat join request? You can view invitation link again in connection details. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Et voi lähettää viestejä! @@ -8303,6 +8376,10 @@ Repeat connection request? edellä, valitse sitten: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call hyväksytty puhelu @@ -8312,6 +8389,10 @@ Repeat connection request? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin ylläpitäjä @@ -8331,6 +8412,10 @@ Repeat connection request? hyväksyy salausta… chat item text + + all + member criteria value + all members feature role @@ -8882,6 +8967,7 @@ pref value pois enabled status group pref value +member criteria value time to disappear @@ -8929,6 +9015,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption chat item text @@ -8979,6 +9069,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved No comment provided by engineer. @@ -9149,6 +9247,10 @@ last received msg: %2$@ you No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group sinut on kutsuttu ryhmään diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index 59bde0650e..edafb47a53 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Accepter les conditions @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Conditions acceptées @@ -1580,11 +1592,23 @@ set passcode view Le discussion sera supprimé pour vous - il n'est pas possible de revenir en arrière ! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Discussions No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Consulter les messages toutes les 20 minutes. @@ -2823,7 +2847,7 @@ swipe action Don't show again Ne plus afficher - No comment provided by engineer. + alert action Done @@ -3141,6 +3165,10 @@ chat item action Erreur de validation de la demande de contact No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Erreur lors de l'ajout de membre·s @@ -3344,7 +3372,7 @@ chat item action Error removing member Erreur lors de la suppression d'un membre - No comment provided by engineer. + alert title Error reordering lists @@ -4712,6 +4740,10 @@ Voici votre lien pour le groupe %@ ! Membre No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Membre inactif @@ -4746,6 +4778,10 @@ Voici votre lien pour le groupe %@ ! Ce membre sera retiré du groupe - impossible de revenir en arrière ! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Les membres du groupe peuvent ajouter des réactions aux messages. @@ -5160,6 +5196,10 @@ Voici votre lien pour le groupe %@ ! Nouveau rôle No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Nouveau message @@ -5197,6 +5237,10 @@ Voici votre lien pour le groupe %@ ! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Aucun contact sélectionné @@ -5383,7 +5427,8 @@ Voici votre lien pour le groupe %@ ! Ok Ok - alert button + alert action +alert button Old database @@ -5790,6 +5835,10 @@ Erreur : %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -6267,7 +6316,7 @@ swipe action Remove member? Retirer ce membre ? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6339,6 +6388,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -6449,6 +6502,14 @@ swipe action Vérifier les conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Révoquer @@ -6505,6 +6566,10 @@ chat item action Enregistrer (et en informer les contacts) alert button + + Save admission settings? + alert title + Save and notify contact Enregistrer et en informer le contact @@ -7017,6 +7082,10 @@ chat item action Il permet de remplacer l'authentification du système. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8762,6 +8831,10 @@ Répéter la demande d'adhésion ? Vous pouvez à nouveau consulter le lien d'invitation dans les détails de la connexion. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Vous ne pouvez pas envoyer de messages ! @@ -9063,6 +9136,10 @@ Répéter la demande de connexion ? ci-dessus, puis choisissez : No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call appel accepté @@ -9073,6 +9150,10 @@ Répéter la demande de connexion ? invitation acceptée chat list item title + + accepted you + rcv group event chat item + admin admin @@ -9093,6 +9174,10 @@ Répéter la demande de connexion ? négociation du chiffrement… chat item text + + all + member criteria value + all members tous les membres @@ -9663,6 +9748,7 @@ pref value off enabled status group pref value +member criteria value time to disappear @@ -9713,6 +9799,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption chiffrement e2e résistant post-quantique @@ -9767,6 +9857,14 @@ time to disappear demande à se connecter chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved enregistré @@ -9956,6 +10054,10 @@ dernier message reçu : %2$@ vous No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group vous êtes invité·e au groupe diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 78bee138e4..559875b5cd 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Feltételek elfogadása @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Elfogadott feltételek @@ -1582,11 +1594,23 @@ set passcode view A csevegés törölve lesz az Ön számára – ez a művelet nem vonható vissza! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Csevegések No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Üzenetek ellenőrzése 20 percenként. @@ -2240,7 +2264,7 @@ Ez a saját egyszer használható meghívója! Database IDs and Transport isolation option. - Adatbázis-azonosítók és átvitel-izolációs beállítások. + Adatbázis-azonosítók és átvitelelkülönítési beállítások. No comment provided by engineer. @@ -2338,7 +2362,7 @@ Ez a saját egyszer használható meghívója! Decryption error - Titkosítás visszafejtési hiba + Titkosításvisszafejtési hiba message decrypt error item @@ -2674,7 +2698,7 @@ swipe action Different names, avatars and transport isolation. - Különböző nevek, profilképek és átvitel-izoláció. + Különböző nevek, profilképek és átvitelizoláció. No comment provided by engineer. @@ -2825,7 +2849,7 @@ swipe action Don't show again Ne mutasd újra - No comment provided by engineer. + alert action Done @@ -3143,6 +3167,10 @@ chat item action Hiba történt a meghívási kérés elfogadásakor No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Hiba történt a tag(ok) hozzáadásakor @@ -3265,7 +3293,7 @@ chat item action Error deleting user profile - Hiba történt a felhasználó-profil törlésekor + Hiba történt a felhasználói profil törlésekor No comment provided by engineer. @@ -3346,7 +3374,7 @@ chat item action Error removing member Hiba történt a tag eltávolításakor - No comment provided by engineer. + alert title Error reordering lists @@ -4449,7 +4477,7 @@ További fejlesztések hamarosan! It can happen when you or your connection used the old database backup. - Ez akkor fordulhat elő, ha Ön vagy a partnere régi adatbázis biztonsági mentést használt. + Ez akkor fordulhat elő, ha Ön vagy a partnere egy régi adatbázis biztonsági mentését használta. No comment provided by engineer. @@ -4459,7 +4487,7 @@ További fejlesztések hamarosan! 3. The connection was compromised. Ez akkor fordulhat elő, ha: 1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak. -2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere régebbi adatbázis biztonsági mentést használt. +2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere egy régi adatbázis biztonsági mentését használta. 3. A kapcsolat sérült. No comment provided by engineer. @@ -4730,6 +4758,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Tag No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Inaktív tag @@ -4765,6 +4797,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! A tag el lesz távolítva a csoportból – ez a művelet nem vonható vissza! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. A tagok reakciókat adhatnak hozzá az üzenetekhez. @@ -4942,12 +4978,12 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery. - Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve. + Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve. No comment provided by engineer. Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery. - Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve. + Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve. No comment provided by engineer. @@ -5185,6 +5221,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Új tag szerepköre No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Új üzenet @@ -5225,6 +5265,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Nincsenek csevegések a(z) %@ nevű listában No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Nincs partner kijelölve @@ -5347,7 +5391,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! No user identifiers. - Nincsenek felhasználó-azonosítók. + Nincsenek felhasználói azonosítók. No comment provided by engineer. @@ -5417,7 +5461,8 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Ok Rendben - alert button + alert action +alert button Old database @@ -5575,6 +5620,7 @@ VPN engedélyezése szükséges. Open link? + Megnyitja a hivatkozást? alert title @@ -5828,6 +5874,10 @@ Hiba: %@ Próbálja meg letiltani és újra engedélyezni az értesítéseket. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. Várjon, amíg a token aktiválása befejeződik. @@ -6283,12 +6333,12 @@ swipe action Relay server is only used if necessary. Another party can observe your IP address. - A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címet. + A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét. No comment provided by engineer. Relay server protects your IP address, but it can observe the duration of the call. - A továbbítókiszolgáló megvédi az Ön IP-címét, de megfigyelheti a hívás időtartamát. + A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát. No comment provided by engineer. @@ -6314,7 +6364,7 @@ swipe action Remove member? Eltávolítja a tagot? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6391,6 +6441,10 @@ swipe action Jelentés indoklása? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. Kéretlen tartalom jelentése: csak a csoport moderátorai látják. @@ -6506,6 +6560,14 @@ swipe action Feltételek felülvizsgálata No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Visszavonás @@ -6562,6 +6624,10 @@ chat item action Mentés (és a partnerek értesítése) alert button + + Save admission settings? + alert title + Save and notify contact Mentés és a partner értesítése @@ -7077,6 +7143,10 @@ chat item action Beállítás a rendszer-hitelesítés helyett. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. Üzenetek eltűnési idejének módosítása a csevegésekben. @@ -7335,7 +7405,7 @@ chat item action SimpleX protocols reviewed by Trail of Bits. - A SimpleX Chat biztonsága a Trail of Bits által lett felülvizsgálva. + A SimpleX-protokollokat a Trail of Bits auditálta. No comment provided by engineer. @@ -8027,7 +8097,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll Transport isolation - Átvitel-izoláció + Átvitelelkülönítés No comment provided by engineer. @@ -8339,7 +8409,7 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso Use private routing with unknown servers when IP address is not protected. - Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett. + Használjon privát útválasztást az ismeretlen kiszolgálókkal, ha az IP-cím nem védett. No comment provided by engineer. @@ -8624,12 +8694,12 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso Without Tor or VPN, your IP address will be visible to file servers. - Tor vagy VPN nélkül az Ön IP-címe látható lesz a fájlkiszolgálók számára. + Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára. No comment provided by engineer. Without Tor or VPN, your IP address will be visible to these XFTP relays: %@. - Tor vagy VPN nélkül az Ön IP-címe látható lesz a következő XFTP-továbbítókiszolgálók számára: %@. + Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára: %@. alert message @@ -8839,6 +8909,10 @@ Megismétli a meghívási kérést? A meghívási hivatkozást újra megtekintheti a kapcsolat részleteinél. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Nem lehet üzeneteket küldeni! @@ -9078,7 +9152,7 @@ Megismétli a meghívási kérést? Your profile is stored on your device and only shared with your contacts. - A profilja csak a partnereivel van megosztva. + A profilja az eszközén van tárolva és csak a partnereivel van megosztva. No comment provided by engineer. @@ -9141,6 +9215,10 @@ Megismétli a meghívási kérést? gombra fent, majd válassza ki: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call fogadott hívás @@ -9151,6 +9229,10 @@ Megismétli a meghívási kérést? elfogadott meghívó chat list item title + + accepted you + rcv group event chat item + admin adminisztrátor @@ -9171,6 +9253,10 @@ Megismétli a meghívási kérést? titkosítás elfogadása… chat item text + + all + member criteria value + all members összes tag @@ -9743,6 +9829,7 @@ pref value kikapcsolva enabled status group pref value +member criteria value time to disappear @@ -9795,6 +9882,10 @@ time to disappear jóváhagyásra vár No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption végpontok közötti kvantumbiztos titkosítás @@ -9850,6 +9941,14 @@ time to disappear Függőben lévő meghívási kérelem chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved mentett @@ -10039,6 +10138,10 @@ utoljára fogadott üzenet: %2$@ Ön No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group Ön meghívást kapott a csoportba diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index cf5f61918f..e3f29b9ce5 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Accetta le condizioni @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Condizioni accettate @@ -1582,11 +1594,23 @@ set passcode view La chat verrà eliminata solo per te, non è reversibile! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Chat No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Controlla i messaggi ogni 20 min. @@ -2825,7 +2849,7 @@ swipe action Don't show again Non mostrare più - No comment provided by engineer. + alert action Done @@ -3143,6 +3167,10 @@ chat item action Errore nell'accettazione della richiesta di contatto No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Errore di aggiunta membro/i @@ -3346,7 +3374,7 @@ chat item action Error removing member Errore nella rimozione del membro - No comment provided by engineer. + alert title Error reordering lists @@ -4730,6 +4758,10 @@ Questo è il tuo link per il gruppo %@! Membro No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Membro inattivo @@ -4765,6 +4797,10 @@ Questo è il tuo link per il gruppo %@! Il membro verrà rimosso dal gruppo, non è reversibile! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. I membri del gruppo possono aggiungere reazioni ai messaggi. @@ -5185,6 +5221,10 @@ Questo è il tuo link per il gruppo %@! Nuovo ruolo del membro No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Nuovo messaggio @@ -5225,6 +5265,10 @@ Questo è il tuo link per il gruppo %@! Nessuna chat nell'elenco %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Nessun contatto selezionato @@ -5417,7 +5461,8 @@ Questo è il tuo link per il gruppo %@! Ok Ok - alert button + alert action +alert button Old database @@ -5575,6 +5620,7 @@ Richiede l'attivazione della VPN. Open link? + Aprire il link? alert title @@ -5828,6 +5874,10 @@ Errore: %@ Prova a disattivare e riattivare le notifiche. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. Attendi il completamento dell'attivazione del token. @@ -6314,7 +6364,7 @@ swipe action Remove member? Rimuovere il membro? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6391,6 +6441,10 @@ swipe action Motivo della segnalazione? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. Segnala spam: solo i moderatori del gruppo lo vedranno. @@ -6506,6 +6560,14 @@ swipe action Leggi le condizioni No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Revoca @@ -6562,6 +6624,10 @@ chat item action Salva (e avvisa i contatti) alert button + + Save admission settings? + alert title + Save and notify contact Salva e avvisa il contatto @@ -7077,6 +7143,10 @@ chat item action Impostalo al posto dell'autenticazione di sistema. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. Imposta la scadenza dei messaggi nelle chat. @@ -8839,6 +8909,10 @@ Ripetere la richiesta di ingresso? Puoi vedere di nuovo il link di invito nei dettagli di connessione. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Non puoi inviare messaggi! @@ -9141,6 +9215,10 @@ Ripetere la richiesta di connessione? sopra, quindi scegli: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call chiamata accettata @@ -9151,6 +9229,10 @@ Ripetere la richiesta di connessione? invito accettato chat list item title + + accepted you + rcv group event chat item + admin amministratore @@ -9171,6 +9253,10 @@ Ripetere la richiesta di connessione? concordando la crittografia… chat item text + + all + member criteria value + all members tutti i membri @@ -9743,6 +9829,7 @@ pref value off enabled status group pref value +member criteria value time to disappear @@ -9795,6 +9882,10 @@ time to disappear in attesa di approvazione No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption crittografia e2e resistente alla quantistica @@ -9850,6 +9941,14 @@ time to disappear richiesto di connettersi chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved salvato @@ -10039,6 +10138,10 @@ ultimo msg ricevuto: %2$@ tu No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group sei stato/a invitato/a al gruppo diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 27134216a7..ab4dd08133 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -561,6 +561,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions No comment provided by engineer. @@ -581,6 +589,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions No comment provided by engineer. @@ -1488,11 +1500,23 @@ set passcode view Chat will be deleted for you - this cannot be undone! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats チャット No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. No comment provided by engineer. @@ -2637,7 +2661,7 @@ swipe action Don't show again 次から表示しない - No comment provided by engineer. + alert action Done @@ -2931,6 +2955,10 @@ chat item action 連絡先リクエストの承諾にエラー発生 No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) メンバー追加にエラー発生 @@ -3117,7 +3145,7 @@ chat item action Error removing member メンバー除名にエラー発生 - No comment provided by engineer. + alert title Error reordering lists @@ -4384,6 +4412,10 @@ This is your link for group %@! メンバー No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive item status text @@ -4415,6 +4447,10 @@ This is your link for group %@! メンバーをグループから除名する (※元に戻せません※)! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. グループメンバーはメッセージへのリアクションを追加できます。 @@ -4792,6 +4828,10 @@ This is your link for group %@! 新しいメンバーの役割 No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message 新しいメッセージ @@ -4828,6 +4868,10 @@ This is your link for group %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected 連絡先が選択されてません @@ -4998,7 +5042,8 @@ This is your link for group %@! Ok OK - alert button + alert action +alert button Old database @@ -5373,6 +5418,10 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -5815,7 +5864,7 @@ swipe action Remove member? メンバーを除名しますか? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -5882,6 +5931,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -5985,6 +6038,14 @@ swipe action Review conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke 取り消す @@ -6037,6 +6098,10 @@ chat item action 保存(連絡先に通知) alert button + + Save admission settings? + alert title + Save and notify contact 保存して、連絡先にに知らせる @@ -6500,6 +6565,10 @@ chat item action システム認証の代わりに設定します。 No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8088,6 +8157,10 @@ Repeat join request? You can view invitation link again in connection details. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! メッセージを送信できませんでした! @@ -8374,6 +8447,10 @@ Repeat connection request? 上で選んでください: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call 受けた通話 @@ -8383,6 +8460,10 @@ Repeat connection request? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin 管理者 @@ -8402,6 +8483,10 @@ Repeat connection request? 暗号化に同意しています… chat item text + + all + member criteria value + all members feature role @@ -8953,6 +9038,7 @@ pref value オフ enabled status group pref value +member criteria value time to disappear @@ -9000,6 +9086,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption chat item text @@ -9050,6 +9140,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved No comment provided by engineer. @@ -9220,6 +9318,10 @@ last received msg: %2$@ you No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group グループ招待が届きました diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index 4008c57ac0..f827435b83 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Accepteer voorwaarden @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Geaccepteerde voorwaarden @@ -1581,11 +1593,23 @@ set passcode view De chat wordt voor je verwijderd - dit kan niet ongedaan worden gemaakt! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Chats No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Controleer uw berichten elke 20 minuten. @@ -2824,7 +2848,7 @@ swipe action Don't show again Niet meer weergeven - No comment provided by engineer. + alert action Done @@ -3142,6 +3166,10 @@ chat item action Fout bij het accepteren van een contactverzoek No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Fout bij het toevoegen van leden @@ -3345,7 +3373,7 @@ chat item action Error removing member Fout bij verwijderen van lid - No comment provided by engineer. + alert title Error reordering lists @@ -4729,6 +4757,10 @@ Dit is jouw link voor groep %@! Lid No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Lid inactief @@ -4764,6 +4796,10 @@ Dit is jouw link voor groep %@! Lid wordt uit de groep verwijderd, dit kan niet ongedaan worden gemaakt! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Groepsleden kunnen bericht reacties toevoegen. @@ -5184,6 +5220,10 @@ Dit is jouw link voor groep %@! Nieuwe leden rol No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message nieuw bericht @@ -5224,6 +5264,10 @@ Dit is jouw link voor groep %@! Geen chats in lijst %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Geen contacten geselecteerd @@ -5416,7 +5460,8 @@ Dit is jouw link voor groep %@! Ok OK - alert button + alert action +alert button Old database @@ -5827,6 +5872,10 @@ Fout: %@ Probeer meldingen uit en weer in te schakelen. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. Wacht tot de tokenactivering voltooid is. @@ -6313,7 +6362,7 @@ swipe action Remove member? Lid verwijderen? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6390,6 +6439,10 @@ swipe action Reden melding? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. Spam melden: alleen groepsmoderators kunnen het zien. @@ -6505,6 +6558,14 @@ swipe action Voorwaarden bekijken No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Intrekken @@ -6561,6 +6622,10 @@ chat item action Bewaar (en informeer contacten) alert button + + Save admission settings? + alert title + Save and notify contact Opslaan en Contact melden @@ -7076,6 +7141,10 @@ chat item action Stel het in in plaats van systeemverificatie. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. Stel de berichtvervaldatum in chats in. @@ -8832,6 +8901,10 @@ Deelnameverzoek herhalen? U kunt de uitnodigingslink opnieuw bekijken in de verbindingsdetails. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Je kunt geen berichten versturen! @@ -9134,6 +9207,10 @@ Verbindingsverzoek herhalen? hier boven, kies dan: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call geaccepteerde oproep @@ -9144,6 +9221,10 @@ Verbindingsverzoek herhalen? geaccepteerde uitnodiging chat list item title + + accepted you + rcv group event chat item + admin Beheerder @@ -9164,6 +9245,10 @@ Verbindingsverzoek herhalen? versleuteling overeenkomen… chat item text + + all + member criteria value + all members alle leden @@ -9736,6 +9821,7 @@ pref value uit enabled status group pref value +member criteria value time to disappear @@ -9788,6 +9874,10 @@ time to disappear in afwachting van goedkeuring No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption quantum bestendige e2e-codering @@ -9843,6 +9933,14 @@ time to disappear verzocht om verbinding te maken chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved opgeslagen @@ -10032,6 +10130,10 @@ laatst ontvangen bericht: %2$@ jij No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group je bent uitgenodigd voor de groep diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index 175c8b4112..87c78b1d65 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Zaakceptuj warunki @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Zaakceptowano warunki @@ -1575,11 +1587,23 @@ set passcode view Czat zostanie usunięty dla Ciebie – tej operacji nie można cofnąć! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Czaty No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Sprawdzaj wiadomości co 20 min. @@ -2787,7 +2811,7 @@ swipe action Don't show again Nie pokazuj ponownie - No comment provided by engineer. + alert action Done @@ -3100,6 +3124,10 @@ chat item action Błąd przyjmowania prośby o kontakt No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Błąd dodawania członka(ów) @@ -3297,7 +3325,7 @@ chat item action Error removing member Błąd usuwania członka - No comment provided by engineer. + alert title Error reordering lists @@ -4641,6 +4669,10 @@ To jest twój link do grupy %@! Członek No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Członek nieaktywny @@ -4673,6 +4705,10 @@ To jest twój link do grupy %@! Członek zostanie usunięty z grupy - nie można tego cofnąć! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Członkowie grupy mogą dodawać reakcje wiadomości. @@ -5083,6 +5119,10 @@ To jest twój link do grupy %@! Nowa rola członka No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Nowa wiadomość @@ -5119,6 +5159,10 @@ To jest twój link do grupy %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Nie wybrano kontaktów @@ -5298,7 +5342,8 @@ To jest twój link do grupy %@! Ok Ok - alert button + alert action +alert button Old database @@ -5698,6 +5743,10 @@ Błąd: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -6173,7 +6222,7 @@ swipe action Remove member? Usunąć członka? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6245,6 +6294,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -6354,6 +6407,14 @@ swipe action Review conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Odwołaj @@ -6410,6 +6471,10 @@ chat item action Zapisz (i powiadom kontakty) alert button + + Save admission settings? + alert title + Save and notify contact Zapisz i powiadom kontakt @@ -6918,6 +6983,10 @@ chat item action Ustaw go zamiast uwierzytelniania systemowego. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8630,6 +8699,10 @@ Powtórzyć prośbę dołączenia? Możesz zobaczyć link zaproszenia ponownie w szczegółach połączenia. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Nie możesz wysyłać wiadomości! @@ -8930,6 +9003,10 @@ Powtórzyć prośbę połączenia? powyżej, a następnie wybierz: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call zaakceptowane połączenie @@ -8939,6 +9016,10 @@ Powtórzyć prośbę połączenia? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin administrator @@ -8959,6 +9040,10 @@ Powtórzyć prośbę połączenia? uzgadnianie szyfrowania… chat item text + + all + member criteria value + all members wszyscy członkowie @@ -9529,6 +9614,7 @@ pref value wyłączony enabled status group pref value +member criteria value time to disappear @@ -9579,6 +9665,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption kwantowo odporne szyfrowanie e2e @@ -9632,6 +9722,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved zapisane @@ -9821,6 +9919,10 @@ ostatnia otrzymana wiadomość: %2$@ Ty No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group jesteś zaproszony do grupy diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index 419fa75375..58eb585574 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Принять условия @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Принятые условия @@ -1581,11 +1593,23 @@ set passcode view Разговор будет удален для Вас - это действие нельзя отменить! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Чаты No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Проверять сообщения каждые 20 минут. @@ -2822,7 +2846,7 @@ swipe action Don't show again Не показывать - No comment provided by engineer. + alert action Done @@ -3139,6 +3163,10 @@ chat item action Ошибка при принятии запроса на соединение No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) No comment provided by engineer. @@ -3339,7 +3367,7 @@ chat item action Error removing member - No comment provided by engineer. + alert title Error reordering lists @@ -4714,6 +4742,10 @@ This is your link for group %@! Member No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive item status text @@ -4744,6 +4776,10 @@ This is your link for group %@! Member will be removed from group - this cannot be undone! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. No comment provided by engineer. @@ -5153,6 +5189,10 @@ This is your link for group %@! New member role No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Новое сообщение @@ -5193,6 +5233,10 @@ This is your link for group %@! Нет чатов в списке %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Контакты не выбраны @@ -5382,7 +5426,8 @@ This is your link for group %@! Ok Ок - alert button + alert action +alert button Old database @@ -5792,6 +5837,10 @@ Error: %@ Попробуйте выключить и снова включить уведомления. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. Пожалуйста, дождитесь завершения активации токена. @@ -6275,7 +6324,7 @@ swipe action Remove member? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6352,6 +6401,10 @@ swipe action Причина сообщения? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. Пожаловаться на спам: увидят только модераторы группы. @@ -6467,6 +6520,14 @@ swipe action Посмотреть условия No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Отозвать @@ -6523,6 +6584,10 @@ chat item action Сохранить (и уведомить контакты) alert button + + Save admission settings? + alert title + Save and notify contact Сохранить и уведомить контакт @@ -7036,6 +7101,10 @@ chat item action Установите код вместо системной аутентификации. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. Установите срок хранения сообщений в чатах. @@ -8781,6 +8850,10 @@ Repeat join request? Вы можете увидеть ссылку-приглашение снова открыв соединение. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Вы не можете отправлять сообщения! @@ -9081,6 +9154,10 @@ Repeat connection request? наверху, затем выберите: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call принятый звонок @@ -9091,6 +9168,10 @@ Repeat connection request? принятое приглашение chat list item title + + accepted you + rcv group event chat item + admin админ @@ -9111,6 +9192,10 @@ Repeat connection request? шифрование согласовывается… chat item text + + all + member criteria value + all members feature role @@ -9680,6 +9765,7 @@ pref value нет enabled status group pref value +member criteria value time to disappear @@ -9732,6 +9818,10 @@ time to disappear ожидает утверждения No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption квантово-устойчивое e2e шифрование @@ -9787,6 +9877,14 @@ time to disappear запрошено соединение chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved сохранено @@ -9976,6 +10074,10 @@ last received msg: %2$@ Вы No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group Вы приглашены в группу diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index 671dd87d7d..481b8271fb 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -520,6 +520,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions No comment provided by engineer. @@ -539,6 +547,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions No comment provided by engineer. @@ -1429,11 +1441,23 @@ set passcode view Chat will be deleted for you - this cannot be undone! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats แชท No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. No comment provided by engineer. @@ -2551,7 +2575,7 @@ swipe action Don't show again ไม่ต้องแสดงอีก - No comment provided by engineer. + alert action Done @@ -2843,6 +2867,10 @@ chat item action เกิดข้อผิดพลาดในการรับคำขอติดต่อ No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) เกิดข้อผิดพลาดในการเพิ่มสมาชิก @@ -3028,7 +3056,7 @@ chat item action Error removing member เกิดข้อผิดพลาดในการลบสมาชิก - No comment provided by engineer. + alert title Error reordering lists @@ -4293,6 +4321,10 @@ This is your link for group %@! สมาชิก No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive item status text @@ -4324,6 +4356,10 @@ This is your link for group %@! สมาชิกจะถูกลบออกจากกลุ่ม - ไม่สามารถยกเลิกได้! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. สมาชิกกลุ่มสามารถเพิ่มการแสดงปฏิกิริยาต่อข้อความได้ @@ -4697,6 +4733,10 @@ This is your link for group %@! บทบาทของสมาชิกใหม่ No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message ข้อความใหม่ @@ -4733,6 +4773,10 @@ This is your link for group %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected ไม่ได้เลือกผู้ติดต่อ @@ -4902,7 +4946,8 @@ This is your link for group %@! Ok ตกลง - alert button + alert action +alert button Old database @@ -5274,6 +5319,10 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -5714,7 +5763,7 @@ swipe action Remove member? ลบสมาชิกออก? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -5781,6 +5830,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -5884,6 +5937,14 @@ swipe action Review conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke ถอน @@ -5936,6 +5997,10 @@ chat item action บันทึก (และแจ้งผู้ติดต่อ) alert button + + Save admission settings? + alert title + Save and notify contact บันทึกและแจ้งผู้ติดต่อ @@ -6404,6 +6469,10 @@ chat item action ตั้งแทนการรับรองความถูกต้องของระบบ No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -7986,6 +8055,10 @@ Repeat join request? You can view invitation link again in connection details. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! คุณไม่สามารถส่งข้อความได้! @@ -8270,6 +8343,10 @@ Repeat connection request? ด้านบน จากนั้นเลือก: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call รับสายแล้ว @@ -8279,6 +8356,10 @@ Repeat connection request? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin ผู้ดูแลระบบ @@ -8298,6 +8379,10 @@ Repeat connection request? เห็นด้วยกับการ encryption… chat item text + + all + member criteria value + all members feature role @@ -8848,6 +8933,7 @@ pref value ปิด enabled status group pref value +member criteria value time to disappear @@ -8895,6 +8981,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption chat item text @@ -8945,6 +9035,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved No comment provided by engineer. @@ -9115,6 +9213,10 @@ last received msg: %2$@ you No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group คุณได้รับเชิญให้เข้าร่วมกลุ่ม diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index bbee40c2b9..1acf4576a1 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -563,6 +563,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Koşulları kabul et @@ -584,6 +592,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Kabul edilmiş koşullar @@ -1557,11 +1569,23 @@ set passcode view Sohbet senden silinecek - bu geri alınamaz! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Sohbetler No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Her 20 dakikada mesajları kontrol et. @@ -2780,7 +2804,7 @@ swipe action Don't show again Yeniden gösterme - No comment provided by engineer. + alert action Done @@ -3095,6 +3119,10 @@ chat item action Bağlantı isteği kabul edilirken hata oluştu No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Üye(ler) eklenirken hata oluştu @@ -3294,7 +3322,7 @@ chat item action Error removing member Kişiyi silerken sorun oluştu - No comment provided by engineer. + alert title Error reordering lists @@ -4653,6 +4681,10 @@ Bu senin grup için bağlantın %@! Kişi No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Üye inaktif @@ -4686,6 +4718,10 @@ Bu senin grup için bağlantın %@! Üye gruptan çıkarılacaktır - bu geri alınamaz! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Grup üyeleri mesaj tepkileri ekleyebilir. @@ -5096,6 +5132,10 @@ Bu senin grup için bağlantın %@! Yeni üye rolü No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Yeni mesaj @@ -5132,6 +5172,10 @@ Bu senin grup için bağlantın %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Hiçbir kişi seçilmedi @@ -5311,7 +5355,8 @@ Bu senin grup için bağlantın %@! Ok Tamam - alert button + alert action +alert button Old database @@ -5711,6 +5756,10 @@ Hata: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -6186,7 +6235,7 @@ swipe action Remove member? Kişi silinsin mi? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6258,6 +6307,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -6367,6 +6420,14 @@ swipe action Review conditions No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke İptal et @@ -6423,6 +6484,10 @@ chat item action Kaydet (ve kişilere bildir) alert button + + Save admission settings? + alert title + Save and notify contact Kaydet ve kişilere bildir @@ -6931,6 +6996,10 @@ chat item action Sistem kimlik doğrulaması yerine ayarla. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8646,6 +8715,10 @@ Katılma isteği tekrarlansın mı? Bağlantı detaylarından davet bağlantısını yeniden görüntüleyebilirsin. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Mesajlar gönderemezsiniz! @@ -8945,6 +9018,10 @@ Bağlantı isteği tekrarlansın mı? yukarı çıkın, ardından seçin: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call kabul edilen arama @@ -8954,6 +9031,10 @@ Bağlantı isteği tekrarlansın mı? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin yönetici @@ -8974,6 +9055,10 @@ Bağlantı isteği tekrarlansın mı? şifreleme kabul ediliyor… chat item text + + all + member criteria value + all members bütün üyeler @@ -9544,6 +9629,7 @@ pref value kapalı enabled status group pref value +member criteria value time to disappear @@ -9594,6 +9680,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption kuantuma dayanıklı e2e şifreleme @@ -9647,6 +9737,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved kaydedildi @@ -9836,6 +9934,10 @@ son alınan msj: %2$@ sen No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group gruba davet edildiniz diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index c0375e3b02..2c515339ff 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -563,6 +563,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions Прийняти умови @@ -584,6 +592,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions Прийняті умови @@ -1557,11 +1569,23 @@ set passcode view Чат буде видалено для вас - цю дію неможливо скасувати! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats Чати No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. Перевіряйте повідомлення кожні 20 хв. @@ -2781,7 +2805,7 @@ swipe action Don't show again Більше не показувати - No comment provided by engineer. + alert action Done @@ -3096,6 +3120,10 @@ chat item action Помилка при прийнятті запиту на контакт No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) Помилка додавання користувача(ів) @@ -3295,7 +3323,7 @@ chat item action Error removing member Помилка видалення учасника - No comment provided by engineer. + alert title Error reordering lists @@ -4654,6 +4682,10 @@ This is your link for group %@! Учасник No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive Користувач неактивний @@ -4688,6 +4720,10 @@ This is your link for group %@! Учасник буде видалений з групи - це неможливо скасувати! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. Учасники групи можуть додавати реакції на повідомлення. @@ -5102,6 +5138,10 @@ This is your link for group %@! Нова роль учасника No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message Нове повідомлення @@ -5139,6 +5179,10 @@ This is your link for group %@! No chats in list %@ No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected Не вибрано жодного контакту @@ -5325,7 +5369,8 @@ This is your link for group %@! Ok Гаразд - alert button + alert action +alert button Old database @@ -5732,6 +5777,10 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -6209,7 +6258,7 @@ swipe action Remove member? Видалити учасника? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6281,6 +6330,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -6391,6 +6444,14 @@ swipe action Умови перегляду No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke Відкликати @@ -6447,6 +6508,10 @@ chat item action Зберегти (і повідомити контактам) alert button + + Save admission settings? + alert title + Save and notify contact Зберегти та повідомити контакт @@ -6959,6 +7024,10 @@ chat item action Встановіть його замість аутентифікації системи. No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8704,6 +8773,10 @@ Repeat join request? Ви можете переглянути посилання на запрошення ще раз у деталях підключення. alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! Ви не можете надсилати повідомлення! @@ -9005,6 +9078,10 @@ Repeat connection request? вище, а потім обирайте: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call прийнято виклик @@ -9015,6 +9092,10 @@ Repeat connection request? прийняте запрошення chat list item title + + accepted you + rcv group event chat item + admin адмін @@ -9035,6 +9116,10 @@ Repeat connection request? узгодження шифрування… chat item text + + all + member criteria value + all members всі учасники @@ -9605,6 +9690,7 @@ pref value вимкнено enabled status group pref value +member criteria value time to disappear @@ -9655,6 +9741,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption квантово-стійке шифрування e2e @@ -9709,6 +9799,14 @@ time to disappear запит на підключення chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved збережено @@ -9898,6 +9996,10 @@ last received msg: %2$@ ти No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group вас запрошують до групи diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index d5411f86e3..683abce868 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -565,6 +565,14 @@ time interval accept incoming call via notification swipe action + + Accept as member + alert action + + + Accept as observer + alert action + Accept conditions 接受条款 @@ -586,6 +594,10 @@ swipe action accept contact request via notification swipe action + + Accept member + alert title + Accepted conditions 已接受的条款 @@ -1582,11 +1594,23 @@ set passcode view 将为你删除聊天 - 此操作无法撤销! No comment provided by engineer. + + Chat with admins + chat toolbar + + + Chat with member + No comment provided by engineer. + Chats 聊天 No comment provided by engineer. + + Chats with members + No comment provided by engineer. + Check messages every 20 min. 每 20 分钟检查消息。 @@ -2824,7 +2848,7 @@ swipe action Don't show again 不再显示 - No comment provided by engineer. + alert action Done @@ -3142,6 +3166,10 @@ chat item action 接受联系人请求错误 No comment provided by engineer. + + Error accepting member + alert title + Error adding member(s) 添加成员错误 @@ -3344,7 +3372,7 @@ chat item action Error removing member 删除成员错误 - No comment provided by engineer. + alert title Error reordering lists @@ -4728,6 +4756,10 @@ This is your link for group %@! 成员 No comment provided by engineer. + + Member admission + No comment provided by engineer. + Member inactive 成员不活跃 @@ -4763,6 +4795,10 @@ This is your link for group %@! 成员将被移出群组——此操作无法撤消! No comment provided by engineer. + + Member will join the group, accept member? + alert message + Members can add message reactions. 群组成员可以添加信息回应。 @@ -5183,6 +5219,10 @@ This is your link for group %@! 新成员角色 No comment provided by engineer. + + New member wants to join the group. + rcv group event chat item + New message 新消息 @@ -5223,6 +5263,10 @@ This is your link for group %@! 列表 %@ 中无聊天 No comment provided by engineer. + + No chats with members + No comment provided by engineer. + No contacts selected 未选择联系人 @@ -5415,7 +5459,8 @@ This is your link for group %@! Ok 好的 - alert button + alert action +alert button Old database @@ -5823,6 +5868,10 @@ Error: %@ Please try to disable and re-enable notfications. token info + + Please wait for group moderators to review your request to join the group. + snd group event chat item + Please wait for token activation to complete. token info @@ -6297,7 +6346,7 @@ swipe action Remove member? 删除成员吗? - No comment provided by engineer. + alert title Remove passphrase from keychain? @@ -6369,6 +6418,10 @@ swipe action Report reason? No comment provided by engineer. + + Report sent to moderators + alert title + Report spam: only group moderators will see it. report reason @@ -6479,6 +6532,14 @@ swipe action 审阅条款 No comment provided by engineer. + + Review members + admission stage + + + Review members before admitting ("knocking"). + admission stage description + Revoke 吊销 @@ -6534,6 +6595,10 @@ chat item action 保存(并通知联系人) alert button + + Save admission settings? + alert title + Save and notify contact 保存并通知联系人 @@ -7041,6 +7106,10 @@ chat item action 设置它以代替系统身份验证。 No comment provided by engineer. + + Set member admission + No comment provided by engineer. + Set message expiration in chats. No comment provided by engineer. @@ -8750,6 +8819,10 @@ Repeat join request? 您可以在连接详情中再次查看邀请链接。 alert message + + You can view your reports in Chat with admins. + alert message + You can't send messages! 您无法发送消息! @@ -9045,6 +9118,10 @@ Repeat connection request? 上面,然后选择: No comment provided by engineer. + + accepted %@ + rcv group event chat item + accepted call 已接受通话 @@ -9054,6 +9131,10 @@ Repeat connection request? accepted invitation chat list item title + + accepted you + rcv group event chat item + admin 管理员 @@ -9074,6 +9155,10 @@ Repeat connection request? 同意加密… chat item text + + all + member criteria value + all members 所有成员 @@ -9644,6 +9729,7 @@ pref value 关闭 enabled status group pref value +member criteria value time to disappear @@ -9694,6 +9780,10 @@ time to disappear pending approval No comment provided by engineer. + + pending review + No comment provided by engineer. + quantum resistant e2e encryption 抗量子端到端加密 @@ -9747,6 +9837,14 @@ time to disappear requested to connect chat list item title + + review + No comment provided by engineer. + + + reviewed by admins + No comment provided by engineer. + saved 已保存 @@ -9936,6 +10034,10 @@ last received msg: %2$@ No comment provided by engineer. + + you accepted this member + snd group event chat item + you are invited to group 您被邀请加入群组 diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings index e4bc8f2150..47f1390e0b 100644 --- a/apps/ios/bg.lproj/Localizable.strings +++ b/apps/ios/bg.lproj/Localizable.strings @@ -1485,7 +1485,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "Не активирай"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Не показвай отново"; /* No comment provided by engineer. */ @@ -1777,7 +1777,7 @@ chat item action */ /* alert title */ "Error receiving file" = "Грешка при получаване на файл"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Грешка при отстраняване на член"; /* No comment provided by engineer. */ @@ -2747,6 +2747,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "изключено"; @@ -2759,7 +2760,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "предлага %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ок"; /* No comment provided by engineer. */ @@ -3156,7 +3158,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Острани член"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Острани член?"; /* No comment provided by engineer. */ @@ -3776,9 +3778,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Старата база данни не бе премахната по време на миграцията, тя може да бъде изтрита."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Профилът се споделя само с вашите контакти."; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Втората отметка, която пропуснахме! ✅"; @@ -4446,10 +4445,10 @@ chat item action */ "Your profile **%@** will be shared." = "Вашият профил **%@** ще бъде споделен."; /* No comment provided by engineer. */ -"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти. SimpleX сървърите не могат да видят вашия профил."; +"Your profile is stored on your device and only shared with your contacts." = "Профилът се споделя само с вашите контакти."; /* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство."; +"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Вашият профил се съхранява на вашето устройство и се споделя само с вашите контакти. SimpleX сървърите не могат да видят вашия профил."; /* No comment provided by engineer. */ "Your random profile" = "Вашият автоматично генериран профил"; diff --git a/apps/ios/cs.lproj/Localizable.strings b/apps/ios/cs.lproj/Localizable.strings index 08a94615a3..cc19af7a74 100644 --- a/apps/ios/cs.lproj/Localizable.strings +++ b/apps/ios/cs.lproj/Localizable.strings @@ -1127,7 +1127,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "Nepovolovat"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Znovu neukazuj"; /* No comment provided by engineer. */ @@ -1367,7 +1367,7 @@ swipe action */ /* alert title */ "Error receiving file" = "Chyba při příjmu souboru"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Chyba při odebrání člena"; /* No comment provided by engineer. */ @@ -2145,6 +2145,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "vypnuto"; @@ -2157,7 +2158,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "nabídl %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ok"; /* No comment provided by engineer. */ @@ -2476,7 +2478,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Odstranit člena"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Odebrat člena?"; /* No comment provided by engineer. */ @@ -2988,9 +2990,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Stará databáze nebyla během přenášení odstraněna, lze ji smazat."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Profil je sdílen pouze s vašimi kontakty."; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Druhé zaškrtnutí jsme přehlédli! ✅"; @@ -3472,10 +3471,10 @@ chat item action */ "Your profile **%@** will be shared." = "Váš profil **%@** bude sdílen."; /* No comment provided by engineer. */ -"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil."; +"Your profile is stored on your device and only shared with your contacts." = "Profil je sdílen pouze s vašimi kontakty."; /* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Váš profil, kontakty a doručené zprávy jsou uloženy ve vašem zařízení."; +"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil."; /* No comment provided by engineer. */ "Your random profile" = "Váš náhodný profil"; diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index 8da7835c43..71cfaa841b 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -1872,7 +1872,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "Verpassen Sie keine wichtigen Nachrichten."; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Nicht nochmals anzeigen"; /* No comment provided by engineer. */ @@ -2236,7 +2236,7 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Fehler beim Registrieren für Benachrichtigungen"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Fehler beim Entfernen des Mitglieds"; /* alert title */ @@ -3587,6 +3587,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "Aus"; @@ -3599,7 +3600,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "angeboten %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ok"; /* No comment provided by engineer. */ @@ -3695,6 +3697,9 @@ time to disappear */ /* No comment provided by engineer. */ "Open group" = "Gruppe öffnen"; +/* alert title */ +"Open link?" = "Link öffnen?"; + /* authentication reason */ "Open migration to another device" = "Migration auf ein anderes Gerät öffnen"; @@ -4170,7 +4175,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Mitglied entfernen"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Das Mitglied entfernen?"; /* No comment provided by engineer. */ @@ -5100,9 +5105,6 @@ report reason */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Die alte Datenbank wurde während der Migration nicht entfernt. Sie kann gelöscht werden."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Das Profil wird nur mit Ihren Kontakten geteilt."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Dieselben Nutzungsbedingungen gelten auch für den Betreiber **%@**."; @@ -5991,15 +5993,15 @@ report reason */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Ihr Profil **%@** wird geteilt."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt. SimpleX-Server können Ihr Profil nicht einsehen."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ihr Profil wurde geändert. Wenn Sie es speichern, wird das aktualisierte Profil an alle Ihre Kontakte gesendet."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Ihr Profil, Ihre Kontakte und zugestellten Nachrichten werden auf Ihrem Gerät gespeichert."; - /* No comment provided by engineer. */ "Your random profile" = "Ihr Zufallsprofil"; diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index 28ba0f0642..9ae294f6ef 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -1872,7 +1872,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "No pierdas los mensajes importantes."; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "No volver a mostrar"; /* No comment provided by engineer. */ @@ -2236,7 +2236,7 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Error al registrarse para notificaciones"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Error al expulsar miembro"; /* alert title */ @@ -3587,6 +3587,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "desactivado"; @@ -3599,7 +3600,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "ofrecido %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ok"; /* No comment provided by engineer. */ @@ -4170,7 +4172,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Expulsar miembro"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "¿Expulsar miembro?"; /* No comment provided by engineer. */ @@ -5100,9 +5102,6 @@ report reason */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "La base de datos antigua no se eliminó durante la migración, puede eliminarse."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "El perfil sólo se comparte con tus contactos."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Las mismas condiciones se aplicarán al operador **%@**."; @@ -5991,15 +5990,15 @@ report reason */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "El perfil **%@** será compartido."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "El perfil sólo se comparte con tus contactos."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos. Los servidores SimpleX no pueden ver tu perfil."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Tu perfil ha sido modificado. Si lo guardas la actualización será enviada a todos tus contactos."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Tu perfil, contactos y mensajes se almacenan en tu dispositivo."; - /* No comment provided by engineer. */ "Your random profile" = "Tu perfil aleatorio"; diff --git a/apps/ios/fi.lproj/Localizable.strings b/apps/ios/fi.lproj/Localizable.strings index 4891c7fb26..3aa3bdbc42 100644 --- a/apps/ios/fi.lproj/Localizable.strings +++ b/apps/ios/fi.lproj/Localizable.strings @@ -1073,7 +1073,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "Älä salli"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Älä näytä uudelleen"; /* No comment provided by engineer. */ @@ -1307,7 +1307,7 @@ swipe action */ /* alert title */ "Error receiving file" = "Virhe tiedoston vastaanottamisessa"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Virhe poistettaessa jäsentä"; /* No comment provided by engineer. */ @@ -2079,6 +2079,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "pois"; @@ -2091,7 +2092,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "tarjottu %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ok"; /* No comment provided by engineer. */ @@ -2407,7 +2409,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Poista jäsen"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Poista jäsen?"; /* No comment provided by engineer. */ @@ -2910,9 +2912,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Vanhaa tietokantaa ei poistettu siirron aikana, se voidaan kuitenkin poistaa."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Profiili jaetaan vain kontaktiesi kanssa."; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Toinen kuittaus, joka uupui! ✅"; @@ -3391,10 +3390,10 @@ chat item action */ "Your profile **%@** will be shared." = "Profiilisi **%@** jaetaan."; /* No comment provided by engineer. */ -"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi."; +"Your profile is stored on your device and only shared with your contacts." = "Profiili jaetaan vain kontaktiesi kanssa."; /* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Profiilisi, kontaktisi ja toimitetut viestit tallennetaan laitteellesi."; +"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi."; /* No comment provided by engineer. */ "Your random profile" = "Satunnainen profiilisi"; diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings index 4dd75039dc..55a76aaa37 100644 --- a/apps/ios/fr.lproj/Localizable.strings +++ b/apps/ios/fr.lproj/Localizable.strings @@ -1863,7 +1863,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "Ne manquez pas les messages importants."; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Ne plus afficher"; /* No comment provided by engineer. */ @@ -2227,7 +2227,7 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Erreur lors de l'inscription aux notifications"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Erreur lors de la suppression d'un membre"; /* alert title */ @@ -3479,6 +3479,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "off"; @@ -3491,7 +3492,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "propose %1$@ : %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ok"; /* No comment provided by engineer. */ @@ -4014,7 +4016,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Retirer le membre"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Retirer ce membre ?"; /* No comment provided by engineer. */ @@ -4883,9 +4885,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "L'ancienne base de données n'a pas été supprimée lors de la migration, elle peut être supprimée."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Le profil n'est partagé qu'avec vos contacts."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Les mêmes conditions s'appliquent à l'opérateur **%@**."; @@ -5741,15 +5740,15 @@ chat item action */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Votre profil **%@** sera partagé."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Le profil n'est partagé qu'avec vos contacts."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts. Les serveurs SimpleX ne peuvent pas voir votre profil."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Votre profil a été modifié. Si vous l'enregistrez, le profil mis à jour sera envoyé à tous vos contacts."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Votre profil, vos contacts et les messages reçus sont stockés sur votre appareil."; - /* No comment provided by engineer. */ "Your random profile" = "Votre profil aléatoire"; diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings index 5a9b6b4e38..5431eb51d8 100644 --- a/apps/ios/hu.lproj/Localizable.strings +++ b/apps/ios/hu.lproj/Localizable.strings @@ -1505,7 +1505,7 @@ set passcode view */ "Database ID: %d" = "Adatbázis-azonosító: %d"; /* No comment provided by engineer. */ -"Database IDs and Transport isolation option." = "Adatbázis-azonosítók és átvitel-izolációs beállítások."; +"Database IDs and Transport isolation option." = "Adatbázis-azonosítók és átvitelelkülönítési beállítások."; /* No comment provided by engineer. */ "Database is encrypted using a random passphrase, you can change it." = "Az adatbázis egy véletlenszerű jelmondattal van titkosítva, amelyet szabadon módosíthat."; @@ -1550,7 +1550,7 @@ set passcode view */ "Decentralized" = "Decentralizált"; /* message decrypt error item */ -"Decryption error" = "Titkosítás visszafejtési hiba"; +"Decryption error" = "Titkosításvisszafejtési hiba"; /* No comment provided by engineer. */ "decryption errors" = "visszafejtési hibák"; @@ -1777,7 +1777,7 @@ swipe action */ "different migration in the app/database: %@ / %@" = "különböző átköltöztetés az alkalmazásban/adatbázisban: %@ / %@"; /* No comment provided by engineer. */ -"Different names, avatars and transport isolation." = "Különböző nevek, profilképek és átvitel-izoláció."; +"Different names, avatars and transport isolation." = "Különböző nevek, profilképek és átvitelizoláció."; /* connection level description */ "direct" = "közvetlen"; @@ -1872,7 +1872,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "Ne maradjon le a fontos üzenetekről."; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Ne mutasd újra"; /* No comment provided by engineer. */ @@ -2189,7 +2189,7 @@ chat item action */ "Error deleting token" = "Hiba történt a token törlésekor"; /* No comment provided by engineer. */ -"Error deleting user profile" = "Hiba történt a felhasználó-profil törlésekor"; +"Error deleting user profile" = "Hiba történt a felhasználói profil törlésekor"; /* No comment provided by engineer. */ "Error downloading the archive" = "Hiba történt az archívum letöltésekor"; @@ -2236,7 +2236,7 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Hiba történt az értesítések regisztrálásakor"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Hiba történt a tag eltávolításakor"; /* alert title */ @@ -2956,10 +2956,10 @@ snd error text */ "It allows having many anonymous connections without any shared data between them in a single chat profile." = "Lehetővé teszi, hogy egyetlen csevegési profilon belül több névtelen kapcsolat legyen, anélkül, hogy megosztott adatok lennének közöttük."; /* No comment provided by engineer. */ -"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha Ön vagy a partnere régi adatbázis biztonsági mentést használt."; +"It can happen when you or your connection used the old database backup." = "Ez akkor fordulhat elő, ha Ön vagy a partnere egy régi adatbázis biztonsági mentését használta."; /* No comment provided by engineer. */ -"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült."; +"It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised." = "Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere egy régi adatbázis biztonsági mentését használta.\n3. A kapcsolat sérült."; /* No comment provided by engineer. */ "It protects your IP address and connections." = "Védi az IP-címét és a kapcsolatait."; @@ -3274,10 +3274,10 @@ snd error text */ "Messages were deleted after you selected them." = "Az üzeneteket törölték miután kijelölte őket."; /* No comment provided by engineer. */ -"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve."; +"Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve."; /* No comment provided by engineer. */ -"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve."; +"Messages, files and calls are protected by **quantum resistant e2e encryption** with perfect forward secrecy, repudiation and break-in recovery." = "Az üzenetek, a fájlok és a hívások **végpontok közötti kvantumbiztos titkosítással**, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve."; /* No comment provided by engineer. */ "Migrate device" = "Eszköz átköltöztetése"; @@ -3550,7 +3550,7 @@ snd error text */ "No unread chats" = "Nincsenek olvasatlan csevegések"; /* No comment provided by engineer. */ -"No user identifiers." = "Nincsenek felhasználó-azonosítók."; +"No user identifiers." = "Nincsenek felhasználói azonosítók."; /* No comment provided by engineer. */ "Not compatible!" = "Nem kompatibilis!"; @@ -3587,6 +3587,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "kikapcsolva"; @@ -3599,7 +3600,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "ajánlotta: %1$@, ekkor: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Rendben"; /* No comment provided by engineer. */ @@ -3695,6 +3697,9 @@ time to disappear */ /* No comment provided by engineer. */ "Open group" = "Csoport megnyitása"; +/* alert title */ +"Open link?" = "Megnyitja a hivatkozást?"; + /* authentication reason */ "Open migration to another device" = "Átköltöztetés indítása egy másik eszközre"; @@ -4153,10 +4158,10 @@ swipe action */ "rejected call" = "elutasított hívás"; /* No comment provided by engineer. */ -"Relay server is only used if necessary. Another party can observe your IP address." = "A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címet."; +"Relay server is only used if necessary. Another party can observe your IP address." = "A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét."; /* No comment provided by engineer. */ -"Relay server protects your IP address, but it can observe the duration of the call." = "A továbbítókiszolgáló megvédi az Ön IP-címét, de megfigyelheti a hívás időtartamát."; +"Relay server protects your IP address, but it can observe the duration of the call." = "A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát."; /* No comment provided by engineer. */ "Remove" = "Eltávolítás"; @@ -4170,7 +4175,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Eltávolítás"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Eltávolítja a tagot?"; /* No comment provided by engineer. */ @@ -4830,7 +4835,7 @@ chat item action */ "SimpleX one-time invitation" = "Egyszer használható SimpleX-meghívó"; /* No comment provided by engineer. */ -"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX Chat biztonsága a Trail of Bits által lett felülvizsgálva."; +"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX-protokollokat a Trail of Bits auditálta."; /* No comment provided by engineer. */ "Simplified incognito mode" = "Egyszerűsített inkognitómód"; @@ -5100,9 +5105,6 @@ report reason */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "A régi adatbázis nem lett eltávolítva az átköltöztetéskor, ezért törölhető."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "A profilja csak a partnereivel van megosztva."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Ugyanezek a feltételek lesznek elfogadva a következő üzemeltető számára is: **%@**."; @@ -5263,7 +5265,7 @@ report reason */ "Total" = "Összes kapcsolat"; /* No comment provided by engineer. */ -"Transport isolation" = "Átvitel-izoláció"; +"Transport isolation" = "Átvitelelkülönítés"; /* No comment provided by engineer. */ "Transport sessions" = "Munkamenetek átvitele"; @@ -5458,7 +5460,7 @@ report reason */ "Use only local notifications?" = "Csak helyi értesítések használata?"; /* No comment provided by engineer. */ -"Use private routing with unknown servers when IP address is not protected." = "Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett."; +"Use private routing with unknown servers when IP address is not protected." = "Használjon privát útválasztást az ismeretlen kiszolgálókkal, ha az IP-cím nem védett."; /* No comment provided by engineer. */ "Use private routing with unknown servers." = "Használjon privát útválasztást ismeretlen kiszolgálókkal."; @@ -5680,10 +5682,10 @@ report reason */ "With reduced battery usage." = "Csökkentett akkumulátor-használattal."; /* No comment provided by engineer. */ -"Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az Ön IP-címe látható lesz a fájlkiszolgálók számára."; +"Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára."; /* alert message */ -"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az Ön IP-címe látható lesz a következő XFTP-továbbítókiszolgálók számára: %@."; +"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára: %@."; /* No comment provided by engineer. */ "Wrong database passphrase" = "Érvénytelen adatbázis-jelmondat"; @@ -5991,15 +5993,15 @@ report reason */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "A(z) **%@** nevű profilja meg lesz osztva."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva. A SimpleX-kiszolgálók nem láthatják a profilját."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "A profilja módosult. Ha elmenti, a profilfrissítés el lesz küldve a partnerei számára."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "A profilja, a partnerei és az elküldött üzenetei a saját eszközén vannak tárolva."; - /* No comment provided by engineer. */ "Your random profile" = "Véletlenszerű profil"; diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings index b914a06079..996484aea0 100644 --- a/apps/ios/it.lproj/Localizable.strings +++ b/apps/ios/it.lproj/Localizable.strings @@ -1872,7 +1872,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "Non perdere messaggi importanti."; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Non mostrare più"; /* No comment provided by engineer. */ @@ -2236,7 +2236,7 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Errore di registrazione per le notifiche"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Errore nella rimozione del membro"; /* alert title */ @@ -3587,6 +3587,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "off"; @@ -3599,7 +3600,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "offerto %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ok"; /* No comment provided by engineer. */ @@ -3695,6 +3697,9 @@ time to disappear */ /* No comment provided by engineer. */ "Open group" = "Apri gruppo"; +/* alert title */ +"Open link?" = "Aprire il link?"; + /* authentication reason */ "Open migration to another device" = "Apri migrazione ad un altro dispositivo"; @@ -4170,7 +4175,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Rimuovi membro"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Rimuovere il membro?"; /* No comment provided by engineer. */ @@ -5100,9 +5105,6 @@ report reason */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Il database vecchio non è stato rimosso durante la migrazione, può essere eliminato."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Il profilo è condiviso solo con i tuoi contatti."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Le stesse condizioni si applicheranno all'operatore **%@**."; @@ -5991,15 +5993,15 @@ report reason */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Verrà condiviso il tuo profilo **%@**."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Il profilo è condiviso solo con i tuoi contatti."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti. I server di SimpleX non possono vedere il tuo profilo."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Il tuo profilo è stato cambiato. Se lo salvi, il profilo aggiornato verrà inviato a tutti i tuoi contatti."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Il tuo profilo, i contatti e i messaggi recapitati sono memorizzati sul tuo dispositivo."; - /* No comment provided by engineer. */ "Your random profile" = "Il tuo profilo casuale"; diff --git a/apps/ios/ja.lproj/Localizable.strings b/apps/ios/ja.lproj/Localizable.strings index d214f88e1c..8e4b071f88 100644 --- a/apps/ios/ja.lproj/Localizable.strings +++ b/apps/ios/ja.lproj/Localizable.strings @@ -1277,7 +1277,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "有効にしない"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "次から表示しない"; /* No comment provided by engineer. */ @@ -1514,7 +1514,7 @@ swipe action */ /* alert title */ "Error receiving file" = "ファイル受信にエラー発生"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "メンバー除名にエラー発生"; /* No comment provided by engineer. */ @@ -2295,6 +2295,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "オフ"; @@ -2307,7 +2308,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "提供された %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "OK"; /* No comment provided by engineer. */ @@ -2626,7 +2628,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "メンバーを除名する"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "メンバーを除名しますか?"; /* No comment provided by engineer. */ @@ -3111,9 +3113,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "古いデータベースは移行時に削除されなかったので、削除することができます。"; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "プロフィールは連絡先にしか共有されません。"; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "長らくお待たせしました! ✅"; @@ -3592,10 +3591,10 @@ chat item action */ "Your profile **%@** will be shared." = "あなたのプロファイル **%@** が共有されます。"; /* No comment provided by engineer. */ -"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "プロフィールはデバイスに保存され、連絡先とのみ共有されます。 SimpleX サーバーはあなたのプロファイルを参照できません。"; +"Your profile is stored on your device and only shared with your contacts." = "プロフィールは連絡先にしか共有されません。"; /* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "あなたのプロフィール、連絡先、送信したメッセージがご自分の端末に保存されます。"; +"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "プロフィールはデバイスに保存され、連絡先とのみ共有されます。 SimpleX サーバーはあなたのプロファイルを参照できません。"; /* No comment provided by engineer. */ "Your random profile" = "あなたのランダム・プロフィール"; diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings index 232de56641..f0ca51fffb 100644 --- a/apps/ios/nl.lproj/Localizable.strings +++ b/apps/ios/nl.lproj/Localizable.strings @@ -1869,7 +1869,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "Mis geen belangrijke berichten."; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Niet meer weergeven"; /* No comment provided by engineer. */ @@ -2233,7 +2233,7 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Fout bij registreren voor meldingen"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Fout bij verwijderen van lid"; /* alert title */ @@ -3584,6 +3584,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "uit"; @@ -3596,7 +3597,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "voorgesteld %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "OK"; /* No comment provided by engineer. */ @@ -4167,7 +4169,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Lid verwijderen"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Lid verwijderen?"; /* No comment provided by engineer. */ @@ -5091,9 +5093,6 @@ report reason */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "De oude database is niet verwijderd tijdens de migratie, deze kan worden verwijderd."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Het profiel wordt alleen gedeeld met uw contacten."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Dezelfde voorwaarden gelden voor operator **%@**."; @@ -5970,15 +5969,15 @@ report reason */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Uw profiel **%@** wordt gedeeld."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Het profiel wordt alleen gedeeld met uw contacten."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten. SimpleX servers kunnen uw profiel niet zien."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Je profiel is gewijzigd. Als je het opslaat, wordt het bijgewerkte profiel naar al je contacten verzonden."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Uw profiel, contacten en afgeleverde berichten worden op uw apparaat opgeslagen."; - /* No comment provided by engineer. */ "Your random profile" = "Je willekeurige profiel"; diff --git a/apps/ios/pl.lproj/Localizable.strings b/apps/ios/pl.lproj/Localizable.strings index 31a9b87662..e3582c7647 100644 --- a/apps/ios/pl.lproj/Localizable.strings +++ b/apps/ios/pl.lproj/Localizable.strings @@ -1761,7 +1761,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "Nie włączaj"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Nie pokazuj ponownie"; /* No comment provided by engineer. */ @@ -2092,7 +2092,7 @@ chat item action */ /* No comment provided by engineer. */ "Error reconnecting servers" = "Błąd ponownego łączenia serwerów"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Błąd usuwania członka"; /* No comment provided by engineer. */ @@ -3236,6 +3236,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "wyłączony"; @@ -3248,7 +3249,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "zaoferował %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ok"; /* No comment provided by engineer. */ @@ -3744,7 +3746,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Usuń członka"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Usunąć członka?"; /* No comment provided by engineer. */ @@ -4556,9 +4558,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Stara baza danych nie została usunięta podczas migracji, można ją usunąć."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Profil jest udostępniany tylko Twoim kontaktom."; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Drugi tik, który przegapiliśmy! ✅"; @@ -5354,15 +5353,15 @@ chat item action */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Twój profil **%@** zostanie udostępniony."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Profil jest udostępniany tylko Twoim kontaktom."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Twój profil jest przechowywany na urządzeniu i udostępniany tylko Twoim kontaktom. Serwery SimpleX nie mogą zobaczyć Twojego profilu."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Twój profil został zmieniony. Jeśli go zapiszesz, zaktualizowany profil zostanie wysłany do wszystkich kontaktów."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Twój profil, kontakty i dostarczone wiadomości są przechowywane na Twoim urządzeniu."; - /* No comment provided by engineer. */ "Your random profile" = "Twój losowy profil"; diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index cb837836ff..c14c7a7e9f 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -1860,7 +1860,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "Не пропустите важные сообщения."; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Не показывать"; /* No comment provided by engineer. */ @@ -3482,6 +3482,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "нет"; @@ -3494,7 +3495,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "предложил(a) %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Ок"; /* No comment provided by engineer. */ @@ -4956,9 +4958,6 @@ report reason */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Предыдущая версия данных чата не удалена при перемещении, её можно удалить."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Ваш профиль храниться на Вашем устройстве и отправляется только контактам."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Те же самые условия будут приняты для оператора **%@**."; @@ -5811,15 +5810,15 @@ report reason */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Будет отправлен Ваш профиль **%@**."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Ваш профиль храниться на Вашем устройстве и отправляется только контактам."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ваш профиль хранится на Вашем устройстве и отправляется только Вашим контактам. SimpleX серверы не могут получить доступ к Вашему профилю."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ваш профиль был изменен. Если вы сохраните его, обновленный профиль будет отправлен всем вашим контактам."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве."; - /* No comment provided by engineer. */ "Your random profile" = "Случайный профиль"; diff --git a/apps/ios/th.lproj/Localizable.strings b/apps/ios/th.lproj/Localizable.strings index 57c0466eb9..d6e48caf86 100644 --- a/apps/ios/th.lproj/Localizable.strings +++ b/apps/ios/th.lproj/Localizable.strings @@ -1028,7 +1028,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "อย่าเปิดใช้งาน"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "ไม่ต้องแสดงอีก"; /* No comment provided by engineer. */ @@ -1256,7 +1256,7 @@ swipe action */ /* alert title */ "Error receiving file" = "เกิดข้อผิดพลาดในการรับไฟล์"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "เกิดข้อผิดพลาดในการลบสมาชิก"; /* No comment provided by engineer. */ @@ -2016,6 +2016,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "ปิด"; @@ -2028,7 +2029,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "เสนอแล้ว %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "ตกลง"; /* No comment provided by engineer. */ @@ -2338,7 +2340,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "ลบสมาชิกออก"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "ลบสมาชิกออก?"; /* No comment provided by engineer. */ @@ -2829,9 +2831,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "ฐานข้อมูลเก่าไม่ได้ถูกลบในระหว่างการย้ายข้อมูล แต่สามารถลบได้"; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "โปรไฟล์นี้แชร์กับผู้ติดต่อของคุณเท่านั้น"; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "ขีดที่สองที่เราพลาด! ✅"; @@ -3292,10 +3291,10 @@ chat item action */ "Your privacy" = "ความเป็นส่วนตัวของคุณ"; /* No comment provided by engineer. */ -"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้"; +"Your profile is stored on your device and only shared with your contacts." = "โปรไฟล์นี้แชร์กับผู้ติดต่อของคุณเท่านั้น"; /* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ"; +"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "โปรไฟล์ของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณและแชร์กับผู้ติดต่อของคุณเท่านั้น เซิร์ฟเวอร์ SimpleX ไม่สามารถดูโปรไฟล์ของคุณได้"; /* No comment provided by engineer. */ "Your random profile" = "โปรไฟล์แบบสุ่มของคุณ"; diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings index e3bb11d1cc..2433c9ae58 100644 --- a/apps/ios/tr.lproj/Localizable.strings +++ b/apps/ios/tr.lproj/Localizable.strings @@ -1740,7 +1740,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "Etkinleştirme"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Yeniden gösterme"; /* No comment provided by engineer. */ @@ -2083,7 +2083,7 @@ chat item action */ /* No comment provided by engineer. */ "Error reconnecting servers" = "Hata sunuculara yeniden bağlanılıyor"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Kişiyi silerken sorun oluştu"; /* No comment provided by engineer. */ @@ -3272,6 +3272,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "kapalı"; @@ -3284,7 +3285,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "%1$@: %2$@ teklif etti"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Tamam"; /* No comment provided by engineer. */ @@ -3780,7 +3782,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Kişiyi sil"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Kişi silinsin mi?"; /* No comment provided by engineer. */ @@ -4601,9 +4603,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Eski veritabanı geçiş sırasında kaldırılmadı, silinebilir."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Profil sadece kişilerinle paylaşılacak."; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Özlediğimiz ikinci tik! ✅"; @@ -5399,15 +5398,15 @@ chat item action */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Profiliniz **%@** paylaşılacaktır."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Profil sadece kişilerinle paylaşılacak."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır. SimpleX sunucuları profilinizi göremez."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Profiliniz değiştirildi. Kaydederseniz, güncellenmiş profil tüm kişilerinize gönderilecektir."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Profiliniz, kişileriniz ve gönderilmiş mesajlar cihazınızda saklanır."; - /* No comment provided by engineer. */ "Your random profile" = "Rasgele profiliniz"; diff --git a/apps/ios/uk.lproj/Localizable.strings b/apps/ios/uk.lproj/Localizable.strings index 734b8dda82..6e6197cdb7 100644 --- a/apps/ios/uk.lproj/Localizable.strings +++ b/apps/ios/uk.lproj/Localizable.strings @@ -1746,7 +1746,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't enable" = "Не вмикати"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "Більше не показувати"; /* No comment provided by engineer. */ @@ -2089,7 +2089,7 @@ chat item action */ /* No comment provided by engineer. */ "Error reconnecting servers" = "Помилка перепідключення серверів"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "Помилка видалення учасника"; /* No comment provided by engineer. */ @@ -3317,6 +3317,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "вимкнено"; @@ -3329,7 +3330,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "запропонував %1$@: %2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "Гаразд"; /* No comment provided by engineer. */ @@ -3852,7 +3854,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Видалити учасника"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "Видалити учасника?"; /* No comment provided by engineer. */ @@ -4721,9 +4723,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Стара база даних не була видалена під час міграції, її можна видалити."; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "Профіль доступний лише вашим контактам."; - /* No comment provided by engineer. */ "The same conditions will apply to operator **%@**." = "Такі ж умови діятимуть і для оператора **%@**."; @@ -5579,15 +5578,15 @@ chat item action */ /* No comment provided by engineer. */ "Your profile **%@** will be shared." = "Ваш профіль **%@** буде опублікований."; +/* No comment provided by engineer. */ +"Your profile is stored on your device and only shared with your contacts." = "Профіль доступний лише вашим контактам."; + /* No comment provided by engineer. */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "Ваш профіль зберігається на вашому пристрої і доступний лише вашим контактам. Сервери SimpleX не бачать ваш профіль."; /* alert message */ "Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "Ваш профіль було змінено. Якщо ви збережете його, оновлений профіль буде надіслано всім вашим контактам."; -/* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "Ваш профіль, контакти та доставлені повідомлення зберігаються на вашому пристрої."; - /* No comment provided by engineer. */ "Your random profile" = "Ваш випадковий профіль"; diff --git a/apps/ios/zh-Hans.lproj/Localizable.strings b/apps/ios/zh-Hans.lproj/Localizable.strings index e3f9669d9f..9df0e04717 100644 --- a/apps/ios/zh-Hans.lproj/Localizable.strings +++ b/apps/ios/zh-Hans.lproj/Localizable.strings @@ -1866,7 +1866,7 @@ swipe action */ /* No comment provided by engineer. */ "Don't miss important messages." = "不错过重要消息。"; -/* No comment provided by engineer. */ +/* alert action */ "Don't show again" = "不再显示"; /* No comment provided by engineer. */ @@ -2227,7 +2227,7 @@ chat item action */ /* alert title */ "Error registering for notifications" = "注册消息推送出错"; -/* No comment provided by engineer. */ +/* alert title */ "Error removing member" = "删除成员错误"; /* alert title */ @@ -3575,6 +3575,7 @@ snd error text */ /* enabled status group pref value +member criteria value time to disappear */ "off" = "关闭"; @@ -3587,7 +3588,8 @@ time to disappear */ /* feature offered item */ "offered %@: %@" = "已提供 %1$@:%2$@"; -/* alert button */ +/* alert action +alert button */ "Ok" = "好的"; /* No comment provided by engineer. */ @@ -4107,7 +4109,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "删除成员"; -/* No comment provided by engineer. */ +/* alert title */ "Remove member?" = "删除成员吗?"; /* No comment provided by engineer. */ @@ -4922,9 +4924,6 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "旧数据库在迁移过程中没有被移除,可以删除。"; -/* No comment provided by engineer. */ -"Your profile is stored on your device and only shared with your contacts." = "该资料仅与您的联系人共享。"; - /* No comment provided by engineer. */ "The second tick we missed! ✅" = "我们错过的第二个\"√\"!✅"; @@ -5697,10 +5696,10 @@ chat item action */ "Your profile **%@** will be shared." = "您的个人资料 **%@** 将被共享。"; /* No comment provided by engineer. */ -"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "您的资料存储在您的设备上并仅与您的联系人共享。 SimpleX 服务器无法看到您的资料。"; +"Your profile is stored on your device and only shared with your contacts." = "该资料仅与您的联系人共享。"; /* No comment provided by engineer. */ -"Your profile, contacts and delivered messages are stored on your device." = "您的资料、联系人和发送的消息存储在您的设备上。"; +"Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "您的资料存储在您的设备上并仅与您的联系人共享。 SimpleX 服务器无法看到您的资料。"; /* No comment provided by engineer. */ "Your random profile" = "您的随机资料"; diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 6646720c5c..5529c8dcb3 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -1465,7 +1465,7 @@ Profil erstellen %s und %s Ihrer Gruppe beitreten? - %1$s.]]> + %1$s.]]> Das ist Ihr eigener Einmal-Link! %d Nachrichten als gelöscht markiert Gruppe besteht bereits! @@ -2462,4 +2462,37 @@ Aus TCP-Port 443 nur für voreingestellte Server verwenden. Voreingestellte Server + %d Chats mit Mitgliedern + %d Chat(s) + Meldung wurde an die Moderatoren gesendet + Sie haben dieses Mitglied übernommen + Überprüfung der Mitglieder vor der Aufnahme (Anklopfen). + Überprüfung der Mitglieder + alle + Aus + Als Beobachter übernehmen + Mitglied übernehmen + Chats mit Mitgliedern + Chat mit Administratoren + Keine Chats mit Mitgliedern + Entfernen + hat Sie übernommen + Chat mit einem Mitglied + %d Nachrichten + Ein Mitglied wird der Gruppe beitreten. Übernehmen? + Ein neues Mitglied will der Gruppe beitreten. + Überprüfung + Von Administratoren überprüft + Aufnahme von Mitgliedern festlegen + Speichern der Aufnahme-Einstellungen? + Sie können Ihre Meldungen im Chat mit den Administratoren sehen. + Chat mit Administratoren + %1$s übernommen + Als Mitglied übernehmen + Fehler beim Übernehmen eines Mitglieds + Aufnahme von Mitgliedern + Ausstehende Überprüfung + Chat mit einem Mitglied + Übernehmen + Bitte warten Sie auf die Überprüfung Ihrer Anfrage durch die Gruppen-Moderatoren, um der Gruppe beitreten zu können. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index c8897c4063..e3d668d4f0 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -350,7 +350,7 @@ Az adatbázis titkosítási jelmondata frissülni fog és a beállításokban lesz tárolva. Adatbázis-azonosító Adatbázis-azonosító: %d - Adatbázis-azonosítók és átvitel-izolációs beállítások. + Adatbázis-azonosítók és átvitelelkülönítési beállítások. Az adatbázis titkosítási jelmondata frissülni fog és a Keystore-ban lesz tárolva. Az adatbázis titkosítva lesz, a jelmondat pedig a beállításokban lesz tárolva. Kiszolgáló törlése @@ -366,7 +366,7 @@ %dmp Kézbesítési jelentések! Az eszközön nincs beállítva a képernyőzár. A SimpleX-zár az „Adatvédelem és biztonság” menüben kapcsolható be, miután beállította a képernyőzárat az eszközén. - Titkosítás visszafejtési hiba + Titkosításvisszafejtési hiba Eltűnik: %s szerkesztve Törlés @@ -532,7 +532,7 @@ Fájlok és médiatartalmak KONZOLHOZ Nem sikerült a titkosítást újraegyeztetni. - Hiba történt a felhasználó-profil törlésekor + Hiba történt a felhasználóprofil törlésekor Csoporttag általi javítás nem támogatott Adja meg az üdvözlőüzenetet… Titkosított adatbázis @@ -676,7 +676,7 @@ Csevegési profil létrehozása Védett a kéretlen tartalommal szemben Hordozható eszközök leválasztása - Különböző nevek, profilképek és átvitel-izoláció. + Különböző nevek, profilképek és átvitelelkülönítés. Elutasítás esetén a feladó NEM kap értesítést. Szerepkörválasztó kibontása A kép akkor érkezik meg, amikor a küldője elérhető lesz, várjon, vagy ellenőrizze később! @@ -716,7 +716,7 @@ Hamarosan további fejlesztések érkeznek! A reakciók hozzáadása az üzenetekhez le van tiltva ebben a csevegésben. Helytelen biztonsági kód! - Ez akkor fordulhat elő, ha Ön vagy a partnere régi adatbázis biztonsági mentést használt. + Ez akkor fordulhat elő, ha Ön vagy a partnere egy régi adatbázis biztonsági mentését használta. Új számítógép-alkalmazás! Most már az adminisztrátorok is:\n- törölhetik a tagok üzeneteit.\n- letilthatnak tagokat (megfigyelő szerepkör) meghívta őt: %1$s @@ -810,7 +810,7 @@ %s ajánlotta Csoport elhagyása %s összes üzenete meg fog jelenni! - Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült visszafejteni az üzenetet, mert Ön, vagy a partnere régebbi adatbázis biztonsági mentést használt.\n3. A kapcsolat sérült. + Ez akkor fordulhat elő, ha:\n1. Az üzenetek 2 nap után, vagy a kiszolgálón 30 nap után lejártak.\n2. Nem sikerült az üzenetet visszafejteni, mert Ön, vagy a partnere egy régi adatbázis biztonsági mentését használta.\n3. A kapcsolat sérült. megfigyelő inkognitó a csoporthivatkozáson keresztül Onion-kiszolgálók használata, ha azok rendelkezésre állnak. @@ -1203,7 +1203,7 @@ Ön eltávolította őt: %1$s Jelmondat mentése és a csevegés megnyitása Menti a beállításokat? - Nincsenek felhasználó-azonosítók. + Nincsenek felhasználói azonosítók. A közvetlen üzenetek küldése a tagok között le van tiltva. SOCKS-proxy használata? Hangszóró kikapcsolva @@ -1345,7 +1345,7 @@ %1$s nevű csoporthoz.]]> Amikor az alkalmazás fut Inkognitóprofilt használ ehhez a csoporthoz – fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva - Átvitel-izoláció + Átvitelelkülönítés Akkor lesz kapcsolódva, ha a meghívási kérése el lesz fogadva, várjon, vagy ellenőrizze később! A hangüzenetek küldése le van tiltva. Alkalmazás akkumulátor-használata / Korlátlan módot az alkalmazás beállításaiban.]]> @@ -1364,8 +1364,8 @@ Adatainak védelme érdekében a SimpleX külön üzenet-azonosítókat használ minden egyes kapcsolatához. (a megosztáshoz a partnerével) Csoportmeghívó elküldve - Frissíti az átvitel-izoláció módját? - Átvitel-izoláció + Frissíti az átvitelelkülönítési módot? + Átvitelelkülönítés Ettől a csoporttól nem fog értesítéseket kapni. A csevegési előzmények megmaradnak. A csevegési adatbázis nem titkosított – állítson be egy jelmondatot annak védelméhez. Közvetlen internetkapcsolat használata? @@ -1395,7 +1395,7 @@ a SimpleX Chat fejlesztőivel, ahol bármiről kérdezhet és értesülhet a friss hírekről.]]> Nem kötelező üdvözlőüzenettel. Ismeretlen adatbázishiba: %s - Elrejtheti vagy lenémíthatja a felhasználó-profiljait – koppintson (vagy számítógép-alkalmazásban kattintson) hosszan a profilra a felugró menühöz. + Elrejtheti vagy lenémíthatja a felhasználóprofiljait – koppintson (vagy számítógép-alkalmazásban kattintson) hosszan a profilra a felugró menühöz. Inkognitóra váltás kapcsolódáskor. Megoszthat egy hivatkozást vagy QR-kódot – így bárki csatlakozhat a csoporthoz. Ha a csoportot Ön később törli, akkor nem fogja elveszíteni annak tagjait. Ön csatlakozott ehhez a csoporthoz @@ -1435,7 +1435,7 @@ A kézbesítési jelentések le vannak tiltva %d csoportban Néhány nem végzetes hiba történt az importáláskor: Köszönet a felhasználóknak a Weblate-en való közreműködésért! - A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címet. + A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét. Beállítás a rendszer-hitelesítés helyett. A fogadási cím egy másik kiszolgálóra fog módosulni. A cím módosítása a feladó online állapotba kerülése után fejeződik be. A csevegés megállítása a csevegési adatbázis exportálásához, importálásához vagy törléséhez. A csevegés megállításakor nem tud üzeneteket fogadni és küldeni. @@ -1444,7 +1444,7 @@ Jelmondat mentése a beállításokban Ennek a csoportnak több mint %1$d tagja van, a kézbesítési jelentések nem lesznek elküldve. A második jelölés, amit kihagytunk! ✅ - A továbbítókiszolgáló megvédi az Ön IP-címét, de megfigyelheti a hívás időtartamát. + A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát. Az utolsó üzenet tervezetének megőrzése a mellékletekkel együtt. A mentett WebRTC ICE-kiszolgálók el lesznek távolítva. A kézbesítési jelentések engedélyezve vannak %d csoportban @@ -1664,8 +1664,8 @@ Ez a csevegés végpontok közötti titkosítással védett. Átköltöztetési párbeszédablak megnyitása Ez a csevegés végpontok közötti kvantumbiztos titkosítással védett. - végpontok közötti titkosítással, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.]]> - végpontok közötti kvantumbiztos titkosítással, sérülés utáni titkosságvédelemmel és -helyreállítással, továbbá letagadhatósággal vannak védve.]]> + végpontok közötti titkosítással, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.]]> + végpontok közötti kvantumbiztos titkosítással, kompromittálás előtti és utáni titkosságvédelemmel, illetve letagadhatósággal vannak védve.]]> Hiba történt az értesítés megjelenítésekor, lépjen kapcsolatba a fejlesztőkkel. Keresse meg ezt az engedélyt az Android beállításaiban, és adja meg kézzel. Engedélyezés a beállításokban @@ -1749,14 +1749,14 @@ Az IP-cím védelmének érdekében a privát útválasztás az SMP-kiszolgálókat használja az üzenetek kézbesítéséhez. Üzenet-útválasztási tartalék PRIVÁT ÜZENET-ÚTVÁLASZTÁS - Használjon privát útválasztást ismeretlen kiszolgálókkal, ha az IP-cím nem védett. + Használjon privát útválasztást az ismeretlen kiszolgálókkal, ha az IP-cím nem védett. NE küldjön üzeneteket közvetlenül, még akkor sem, ha a saját kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást. - Tor vagy VPN nélkül az Ön IP-címe látható lesz a fájlkiszolgálók számára. + Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára. FÁJLOK IP-cím védelme Az alkalmazás kérni fogja az ismeretlen fájlkiszolgálókról történő letöltések megerősítését (kivéve, ha az .onion vagy a SOCKS-proxy engedélyezve van). Ismeretlen kiszolgálók! - Tor vagy VPN nélkül az Ön IP-címe látható lesz a következő XFTP-továbbítókiszolgálók számára:\n%1$s. + Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára:\n%1$s. Összes színmód Fekete Színmód @@ -2072,7 +2072,7 @@ Hang/Videó váltása hívás közben. Csevegési profilváltás az egyszer használható meghívókhoz. Továbbfejlesztett biztonság ✅ - A SimpleX Chat biztonsága a Trail of Bits által lett felülvizsgálva. + A SimpleX-protokollokat a Trail of Bits auditálta. Hiba történt a kiszolgálók mentésekor Nincsenek üzenet-kiszolgálók. Nincsenek üzenetfogadási kiszolgálók. @@ -2354,4 +2354,37 @@ Kikapcsolva Előre beállított kiszolgálók A 443-as TCP-port használata kizárólag az előre beállított kiszolgálokhoz. + Hiba a tag befogadásakor + %d csevegés a tagokkal + %d üzenet + 1 csevegés egy taggal + %d csevegés + A jelentés el lett küldve a moderátoroknak + A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben. + áttekintésre vár + áttekintés + Csevegés az adminisztrátorokkal + Csevegés a tagokkal + Tagbefogadás + Nincsenek csevegések a tagokkal + Tagok áttekintése + Tagok áttekintése a befogadás előtt (kopogtatás). + Csevegés az adminisztrátorokkal + A tag csatlakozni akar a csoporthoz, befogadja a tagot? + Eltávolítás + Befogadás + Tag befogadása + összes + Csevegés a taggal + Új tag szeretne csatlakozni a csoporthoz. + kikapcsolva + Befogadás megfigyelőként + Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét. + befogadta Önt + Tagbefogadás beállítása + Elmenti a befogadási beállításokat? + Ön befogadta ezt a tagot + Befogadás tagként + befogadta őt: %1$s + áttekintve a moderátorok által diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml index a269149e99..b69ed8405f 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/in/strings.xml @@ -434,7 +434,7 @@ Panggilan berlangsung Menghubungkan panggilan Pesan yang terlewati - Hash dari pesan sebelumnya berbeda.\" + Hash dari pesan sebelumnya berbeda. Privasi & keamanan Enkripsi berkas lokal Terima gambar otomatis diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index 6c086835ea..bbd8c9404f 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -2391,4 +2391,37 @@ Off Server preimpostati Usa la porta TCP 443 solo per i server preimpostati. + 1 chat con un membro + %d chat + %d chat con membri + %d messaggi + Salvare le impostazioni di ammissione? + ha accettato %1$s + ti ha accettato/a + Attendi che i moderatori del gruppo revisionino la tua richiesta di entrare nel gruppo. + hai accettato questo membro + revisiona + Ammissione del membro + Nessuna chat con membri + off + Revisiona i membri + Revisiona i membri prima di ammetterli (bussare). + Accetta + Chat con amministratori + Rimuovi + Il membro entrerà nel gruppo, accettarlo? + revisionato dagli amministratori + Accetta membro + Chatta con gli amministratori + Accetta come osservatore + Il nuovo membro vuole entrare nel gruppo. + tutti + Chatta con il membro + Chat con membri + Errore di accettazione del membro + Accetta come membro + Imposta l\'ammissione del membro + Segnalazione inviata ai moderatori + in attesa di revisione + Puoi vedere i tuoi resoconti nella chat con gli amministratori. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml index 549cb01b63..a962298f19 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/uk/strings.xml @@ -459,7 +459,7 @@ Створити без зашифрування e2e контакт має зашифрування e2e - Хеш попереднього повідомлення інший.\" + Хеш попереднього повідомлення інший. Підтвердити пароль Новий пароль Перезапустити diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index 28a5f6f50d..e68b8bcdaa 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -2375,4 +2375,37 @@ 关闭 预设服务器 仅预设服务器使用 TCP 协议 443 端口。 + 接受成员出错 + 举报已发送至 moderators + %d 个聊天 + 和成员的 %d 个聊天 + %d 条消息 + 接受了 %1$s + 接受了你 + 你接受了该成员 + 新成员要加入本群。 + 审核 + 待审核 + 全部 + 成员准入 + 关闭 + 删除 + 接受 + 和成员聊天 + 和管理员聊天 + 没有和成员的聊天 + 接受为成员 + 接受成员 + 成员将加入本群,接受成员吗? + 由管理员审核 + 设置成员入群准许 + 和成员聊天 + 和管理员聊天 + 准许入群前审核成员(knocking)。 + 请等待群的 moderator 审核你加入该群的请求。 + 审核成员 + 保存入群设置? + 你可以在和管理员和聊天中查看你的举报。 + 接受为观察员 + 和一名成员的一个聊天 From 22364a28be5118db1503bb5bfa1fb75a3e579b8e Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Tue, 20 May 2025 14:11:49 +0100 Subject: [PATCH 09/14] ios: export localizations --- .../Views/Chat/Group/MemberSupportView.swift | 2 +- .../bg.xcloc/Localized Contents/bg.xliff | 50 ++++++++++++++- .../cs.xcloc/Localized Contents/cs.xliff | 50 ++++++++++++++- .../de.xcloc/Localized Contents/de.xliff | 50 ++++++++++++++- .../en.xcloc/Localized Contents/en.xliff | 62 ++++++++++++++++++- .../es.xcloc/Localized Contents/es.xliff | 50 ++++++++++++++- .../fi.xcloc/Localized Contents/fi.xliff | 50 ++++++++++++++- .../fr.xcloc/Localized Contents/fr.xliff | 50 ++++++++++++++- .../hu.xcloc/Localized Contents/hu.xliff | 50 ++++++++++++++- .../it.xcloc/Localized Contents/it.xliff | 50 ++++++++++++++- .../ja.xcloc/Localized Contents/ja.xliff | 50 ++++++++++++++- .../nl.xcloc/Localized Contents/nl.xliff | 50 ++++++++++++++- .../pl.xcloc/Localized Contents/pl.xliff | 50 ++++++++++++++- .../ru.xcloc/Localized Contents/ru.xliff | 50 ++++++++++++++- .../th.xcloc/Localized Contents/th.xliff | 50 ++++++++++++++- .../tr.xcloc/Localized Contents/tr.xliff | 50 ++++++++++++++- .../uk.xcloc/Localized Contents/uk.xliff | 50 ++++++++++++++- .../Localized Contents/zh-Hans.xliff | 50 ++++++++++++++- .../commonMain/resources/MR/base/strings.xml | 2 +- 19 files changed, 847 insertions(+), 19 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift index 0bcf09aabd..7f3672ea17 100644 --- a/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift +++ b/apps/ios/Shared/Views/Chat/Group/MemberSupportView.swift @@ -271,7 +271,7 @@ func deleteMemberSupportChat(_ groupInfo: GroupInfo, _ member: GroupMember) { logger.error("apiDeleteMemberSupportChat error: \(responseError(error))") await MainActor.run { showAlert( - NSLocalizedString("Error deleting member support chat", comment: "alert title"), + NSLocalizedString("Error deleting chat with member", comment: "alert title"), message: responseError(error) ) } diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index 7f38695470..b5a217d8c0 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -2324,6 +2324,10 @@ swipe action Изтриване на чат профила? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? No comment provided by engineer. @@ -3122,6 +3126,10 @@ chat item action Грешка при изтриване на базата данни No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Грешка при изтриването на чата! @@ -5999,6 +6007,10 @@ swipe action Отхвърли заявката за контакт No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Реле сървър се използва само ако е необходимо. Друга страна може да наблюдава вашия IP адрес. @@ -6030,7 +6042,7 @@ swipe action Remove member? Острани член? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -8832,6 +8844,10 @@ marked deleted chat item preview text повикване… call status + + can't send messages + No comment provided by engineer. + cancelled %@ отменен %@ @@ -8937,6 +8953,14 @@ marked deleted chat item preview text името на контакта %1$@ е променено на %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption контактът има e2e криптиране @@ -8947,6 +8971,10 @@ marked deleted chat item preview text контактът няма e2e криптиране No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator създател @@ -9115,6 +9143,10 @@ pref value групата е изтрита No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated профилът на групата е актуализиран @@ -9238,6 +9270,10 @@ pref value свързан rcv group event chat item + + member has old version + No comment provided by engineer. + message No comment provided by engineer. @@ -9301,6 +9337,10 @@ pref value няма текст copied message info in history + + not synchronized + No comment provided by engineer. + observer наблюдател @@ -9403,6 +9443,10 @@ time to disappear премахнат адрес за контакт profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture премахната профилна снимка @@ -9413,6 +9457,10 @@ time to disappear ви острани rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index 23709c29de..fe0e02ccdf 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -2217,6 +2217,10 @@ swipe action Smazat chat profil? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? No comment provided by engineer. @@ -2993,6 +2997,10 @@ chat item action Chyba při mazání databáze chatu No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Chyba při mazání chatu! @@ -5780,6 +5788,10 @@ swipe action Odmítnout žádost o kontakt No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Přenosový server se používá pouze v případě potřeby. Jiná strana může sledovat vaši IP adresu. @@ -5811,7 +5823,7 @@ swipe action Remove member? Odebrat člena? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -8520,6 +8532,10 @@ marked deleted chat item preview text volání… call status + + can't send messages + No comment provided by engineer. + cancelled %@ zrušeno %@ @@ -8624,6 +8640,14 @@ marked deleted chat item preview text contact %1$@ changed to %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption kontakt má šifrování e2e @@ -8634,6 +8658,10 @@ marked deleted chat item preview text kontakt nemá šifrování e2e No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator tvůrce @@ -8800,6 +8828,10 @@ pref value skupina smazána No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated profil skupiny aktualizován @@ -8922,6 +8954,10 @@ pref value připojeno rcv group event chat item + + member has old version + No comment provided by engineer. + message No comment provided by engineer. @@ -8985,6 +9021,10 @@ pref value žádný text copied message info in history + + not synchronized + No comment provided by engineer. + observer pozorovatel @@ -9084,6 +9124,10 @@ time to disappear removed contact address profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture profile update event chat item @@ -9093,6 +9137,10 @@ time to disappear odstranil vás rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index f4e5083fb0..94d7c0b81b 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -2426,6 +2426,10 @@ swipe action Chat-Profil löschen? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Chat löschen? @@ -3266,6 +3270,10 @@ chat item action Fehler beim Löschen der Chat-Datenbank No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Fehler beim Löschen des Chats! @@ -6331,6 +6339,10 @@ swipe action Kontaktanfrage ablehnen No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Relais-Server werden nur genutzt, wenn sie benötigt werden. Ihre IP-Adresse kann von Anderen erfasst werden. @@ -6364,7 +6376,7 @@ swipe action Remove member? Das Mitglied entfernen? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9343,6 +9355,10 @@ marked deleted chat item preview text Anrufen… call status + + can't send messages + No comment provided by engineer. + cancelled %@ abgebrochen %@ @@ -9448,6 +9464,14 @@ marked deleted chat item preview text Der Kontaktname wurde von %1$@ auf %2$@ geändert profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption Kontakt nutzt E2E-Verschlüsselung @@ -9458,6 +9482,10 @@ marked deleted chat item preview text Kontakt nutzt keine E2E-Verschlüsselung No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator Ersteller @@ -9629,6 +9657,10 @@ pref value Gruppe gelöscht No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated Gruppenprofil aktualisiert @@ -9754,6 +9786,10 @@ pref value ist der Gruppe beigetreten rcv group event chat item + + member has old version + No comment provided by engineer. + message Nachricht @@ -9819,6 +9855,10 @@ pref value Kein Text copied message info in history + + not synchronized + No comment provided by engineer. + observer Beobachter @@ -9926,6 +9966,10 @@ time to disappear Die Kontaktadresse wurde entfernt profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture Das Profil-Bild wurde entfernt @@ -9936,6 +9980,10 @@ time to disappear hat Sie aus der Gruppe entfernt rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect Zur Verbindung aufgefordert diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 9821e49098..5982f620b8 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -2432,6 +2432,11 @@ swipe action Delete chat profile? No comment provided by engineer. + + Delete chat with member? + Delete chat with member? + alert title + Delete chat? Delete chat? @@ -3273,6 +3278,11 @@ chat item action Error deleting chat database No comment provided by engineer. + + Error deleting chat with member + Error deleting chat with member + alert title + Error deleting chat! Error deleting chat! @@ -6343,6 +6353,11 @@ swipe action Reject contact request No comment provided by engineer. + + Reject member? + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Relay server is only used if necessary. Another party can observe your IP address. @@ -6376,7 +6391,7 @@ swipe action Remove member? Remove member? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9364,6 +9379,11 @@ marked deleted chat item preview text calling… call status + + can't send messages + can't send messages + No comment provided by engineer. + cancelled %@ cancelled %@ @@ -9469,6 +9489,16 @@ marked deleted chat item preview text contact %1$@ changed to %2$@ profile update event chat item + + contact deleted + contact deleted + No comment provided by engineer. + + + contact disabled + contact disabled + No comment provided by engineer. + contact has e2e encryption contact has e2e encryption @@ -9479,6 +9509,11 @@ marked deleted chat item preview text contact has no e2e encryption No comment provided by engineer. + + contact not ready + contact not ready + No comment provided by engineer. + creator creator @@ -9650,6 +9685,11 @@ pref value group deleted No comment provided by engineer. + + group is deleted + group is deleted + No comment provided by engineer. + group profile updated group profile updated @@ -9775,6 +9815,11 @@ pref value connected rcv group event chat item + + member has old version + member has old version + No comment provided by engineer. + message message @@ -9840,6 +9885,11 @@ pref value no text copied message info in history + + not synchronized + not synchronized + No comment provided by engineer. + observer observer @@ -9948,6 +9998,11 @@ time to disappear removed contact address profile update event chat item + + removed from group + removed from group + No comment provided by engineer. + removed profile picture removed profile picture @@ -9958,6 +10013,11 @@ time to disappear removed you rcv group event chat item + + request to join rejected + request to join rejected + No comment provided by engineer. + requested to connect requested to connect diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index 2a9d2e9430..3c3ae9ff46 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -2426,6 +2426,10 @@ swipe action ¿Eliminar perfil? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? ¿Eliminar chat? @@ -3266,6 +3270,10 @@ chat item action Error al eliminar base de datos No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! ¡Error al eliminar chat! @@ -6330,6 +6338,10 @@ swipe action Rechazar solicitud de contacto No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. El servidor de retransmisión sólo se usa en caso de necesidad. Un tercero podría ver tu IP. @@ -6363,7 +6375,7 @@ swipe action Remove member? ¿Expulsar miembro? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9342,6 +9354,10 @@ marked deleted chat item preview text llamando… call status + + can't send messages + No comment provided by engineer. + cancelled %@ cancelado %@ @@ -9447,6 +9463,14 @@ marked deleted chat item preview text el contacto %1$@ ha cambiado a %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption el contacto dispone de cifrado de extremo a extremo @@ -9457,6 +9481,10 @@ marked deleted chat item preview text el contacto no dispone de cifrado de extremo a extremo No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator creador @@ -9628,6 +9656,10 @@ pref value grupo eliminado No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated perfil de grupo actualizado @@ -9753,6 +9785,10 @@ pref value conectado rcv group event chat item + + member has old version + No comment provided by engineer. + message mensaje @@ -9818,6 +9854,10 @@ pref value sin texto copied message info in history + + not synchronized + No comment provided by engineer. + observer observador @@ -9925,6 +9965,10 @@ time to disappear dirección de contacto eliminada profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture ha eliminado la imagen del perfil @@ -9935,6 +9979,10 @@ time to disappear te ha expulsado rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect solicitado para conectar diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index 6e5928281d..7c93c5b0bb 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -2198,6 +2198,10 @@ swipe action Poista keskusteluprofiili? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? No comment provided by engineer. @@ -2972,6 +2976,10 @@ chat item action Virhe keskustelujen tietokannan poistamisessa No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Virhe keskutelun poistamisessa! @@ -5756,6 +5764,10 @@ swipe action Hylkää yhteyspyyntö No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Välityspalvelinta käytetään vain tarvittaessa. Toinen osapuoli voi tarkkailla IP-osoitettasi. @@ -5787,7 +5799,7 @@ swipe action Remove member? Poista jäsen? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -8493,6 +8505,10 @@ marked deleted chat item preview text soittaa… call status + + can't send messages + No comment provided by engineer. + cancelled %@ peruutettu %@ @@ -8596,6 +8612,14 @@ marked deleted chat item preview text contact %1$@ changed to %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption kontaktilla on e2e-salaus @@ -8606,6 +8630,10 @@ marked deleted chat item preview text kontaktilla ei ole e2e-salausta No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator luoja @@ -8772,6 +8800,10 @@ pref value ryhmä poistettu No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated ryhmäprofiili päivitetty @@ -8894,6 +8926,10 @@ pref value yhdistetty rcv group event chat item + + member has old version + No comment provided by engineer. + message No comment provided by engineer. @@ -8957,6 +8993,10 @@ pref value ei tekstiä copied message info in history + + not synchronized + No comment provided by engineer. + observer tarkkailija @@ -9056,6 +9096,10 @@ time to disappear removed contact address profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture profile update event chat item @@ -9065,6 +9109,10 @@ time to disappear poisti sinut rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index edafb47a53..80b3428cfe 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -2424,6 +2424,10 @@ swipe action Supprimer le profil du chat ? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Supprimer la discussion ? @@ -3264,6 +3268,10 @@ chat item action Erreur lors de la suppression de la base de données du chat No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Erreur lors de la suppression du chat ! @@ -6283,6 +6291,10 @@ swipe action Rejeter la demande de contact No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Le serveur relais n'est utilisé que si nécessaire. Un tiers peut observer votre adresse IP. @@ -6316,7 +6328,7 @@ swipe action Remove member? Retirer ce membre ? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9263,6 +9275,10 @@ marked deleted chat item preview text appel… call status + + can't send messages + No comment provided by engineer. + cancelled %@ annulé %@ @@ -9368,6 +9384,14 @@ marked deleted chat item preview text le contact %1$@ est devenu %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption Ce contact a le chiffrement de bout en bout @@ -9378,6 +9402,10 @@ marked deleted chat item preview text Ce contact n'a pas le chiffrement de bout en bout No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator créateur @@ -9549,6 +9577,10 @@ pref value groupe supprimé No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated mise à jour du profil de groupe @@ -9674,6 +9706,10 @@ pref value est connecté·e rcv group event chat item + + member has old version + No comment provided by engineer. + message message @@ -9738,6 +9774,10 @@ pref value aucun texte copied message info in history + + not synchronized + No comment provided by engineer. + observer observateur @@ -9842,6 +9882,10 @@ time to disappear suppression de l'adresse de contact profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture suppression de la photo de profil @@ -9852,6 +9896,10 @@ time to disappear vous a retiré rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect demande à se connecter diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 559875b5cd..43f7d8b31e 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -2426,6 +2426,10 @@ swipe action Törli a csevegési profilt? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Törli a csevegést? @@ -3266,6 +3270,10 @@ chat item action Hiba történt a csevegési adatbázis törlésekor No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Hiba történt a csevegés törlésekor! @@ -6331,6 +6339,10 @@ swipe action Meghívási kérés elutasítása No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét. @@ -6364,7 +6376,7 @@ swipe action Remove member? Eltávolítja a tagot? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9343,6 +9355,10 @@ marked deleted chat item preview text hívás… call status + + can't send messages + No comment provided by engineer. + cancelled %@ %@ visszavonva @@ -9448,6 +9464,14 @@ marked deleted chat item preview text %1$@ a következőre módosította a nevét: %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption a partner e2e titkosítással rendelkezik @@ -9458,6 +9482,10 @@ marked deleted chat item preview text a partner nem rendelkezik e2e titkosítással No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator készítő @@ -9629,6 +9657,10 @@ pref value a csoport törölve No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated csoportprofil frissítve @@ -9754,6 +9786,10 @@ pref value kapcsolódott rcv group event chat item + + member has old version + No comment provided by engineer. + message üzenet @@ -9819,6 +9855,10 @@ pref value nincs szöveg copied message info in history + + not synchronized + No comment provided by engineer. + observer megfigyelő @@ -9926,6 +9966,10 @@ time to disappear eltávolította a kapcsolattartási címet profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture eltávolította a profilképét @@ -9936,6 +9980,10 @@ time to disappear eltávolította Önt rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect Függőben lévő meghívási kérelem diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index e3f29b9ce5..d672a0da4f 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -2426,6 +2426,10 @@ swipe action Eliminare il profilo di chat? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Eliminare la chat? @@ -3266,6 +3270,10 @@ chat item action Errore nell'eliminazione del database della chat No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Errore nell'eliminazione della chat! @@ -6331,6 +6339,10 @@ swipe action Rifiuta la richiesta di contatto No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Il server relay viene usato solo se necessario. Un altro utente può osservare il tuo indirizzo IP. @@ -6364,7 +6376,7 @@ swipe action Remove member? Rimuovere il membro? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9343,6 +9355,10 @@ marked deleted chat item preview text chiamata… call status + + can't send messages + No comment provided by engineer. + cancelled %@ annullato %@ @@ -9448,6 +9464,14 @@ marked deleted chat item preview text contatto %1$@ cambiato in %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption il contatto ha la crittografia e2e @@ -9458,6 +9482,10 @@ marked deleted chat item preview text il contatto non ha la crittografia e2e No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator creatore @@ -9629,6 +9657,10 @@ pref value gruppo eliminato No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated profilo del gruppo aggiornato @@ -9754,6 +9786,10 @@ pref value si è connesso/a rcv group event chat item + + member has old version + No comment provided by engineer. + message messaggio @@ -9819,6 +9855,10 @@ pref value nessun testo copied message info in history + + not synchronized + No comment provided by engineer. + observer osservatore @@ -9926,6 +9966,10 @@ time to disappear indirizzo di contatto rimosso profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture immagine del profilo rimossa @@ -9936,6 +9980,10 @@ time to disappear ti ha rimosso/a rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect richiesto di connettersi diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index ab4dd08133..2a7bfa8df1 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -2268,6 +2268,10 @@ swipe action チャットのプロフィールを削除しますか? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? No comment provided by engineer. @@ -3046,6 +3050,10 @@ chat item action チャットデータベース削除にエラー発生 No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! チャット削除にエラー発生! @@ -5833,6 +5841,10 @@ swipe action 連絡要求を拒否する No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. 中継サーバーは必要な場合にのみ使用されます。 別の当事者があなたの IP アドレスを監視できます。 @@ -5864,7 +5876,7 @@ swipe action Remove member? メンバーを除名しますか? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -8564,6 +8576,10 @@ marked deleted chat item preview text 発信中… call status + + can't send messages + No comment provided by engineer. + cancelled %@ キャンセルされました %@ @@ -8667,6 +8683,14 @@ marked deleted chat item preview text contact %1$@ changed to %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption 連絡先はエンドツーエンド暗号化があります @@ -8677,6 +8701,10 @@ marked deleted chat item preview text 連絡先はエンドツーエンド暗号化がありません No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator 作成者 @@ -8843,6 +8871,10 @@ pref value グループ削除済み No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated グループのプロフィールが更新されました @@ -8965,6 +8997,10 @@ pref value 接続中 rcv group event chat item + + member has old version + No comment provided by engineer. + message No comment provided by engineer. @@ -9028,6 +9064,10 @@ pref value テキストなし copied message info in history + + not synchronized + No comment provided by engineer. + observer オブザーバー @@ -9127,6 +9167,10 @@ time to disappear removed contact address profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture profile update event chat item @@ -9136,6 +9180,10 @@ time to disappear あなたを除名しました rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index f827435b83..d0b430cf02 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -2425,6 +2425,10 @@ swipe action Chatprofiel verwijderen? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Chat verwijderen? @@ -3265,6 +3269,10 @@ chat item action Fout bij het verwijderen van de chat database No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Fout bij verwijderen gesprek! @@ -6329,6 +6337,10 @@ swipe action Contactverzoek afwijzen No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Relay server wordt alleen gebruikt als dat nodig is. Een andere partij kan uw IP-adres zien. @@ -6362,7 +6374,7 @@ swipe action Remove member? Lid verwijderen? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9335,6 +9347,10 @@ marked deleted chat item preview text bellen… call status + + can't send messages + No comment provided by engineer. + cancelled %@ geannuleerd %@ @@ -9440,6 +9456,14 @@ marked deleted chat item preview text contactpersoon %1$@ gewijzigd in %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption contact heeft e2e-codering @@ -9450,6 +9474,10 @@ marked deleted chat item preview text contact heeft geen e2e versleuteling No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator creator @@ -9621,6 +9649,10 @@ pref value groep verwijderd No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated groep profiel bijgewerkt @@ -9746,6 +9778,10 @@ pref value is toegetreden rcv group event chat item + + member has old version + No comment provided by engineer. + message bericht @@ -9811,6 +9847,10 @@ pref value geen tekst copied message info in history + + not synchronized + No comment provided by engineer. + observer Waarnemer @@ -9918,6 +9958,10 @@ time to disappear contactadres verwijderd profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture profielfoto verwijderd @@ -9928,6 +9972,10 @@ time to disappear heeft je verwijderd rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect verzocht om verbinding te maken diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index 87c78b1d65..3255489efd 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -2398,6 +2398,10 @@ swipe action Usunąć profil czatu? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? No comment provided by engineer. @@ -3219,6 +3223,10 @@ chat item action Błąd usuwania bazy danych czatu No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Błąd usuwania czatu! @@ -6189,6 +6197,10 @@ swipe action Odrzuć prośbę kontaktu No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Serwer przekaźnikowy jest używany tylko w razie potrzeby. Inna strona może obserwować Twój adres IP. @@ -6222,7 +6234,7 @@ swipe action Remove member? Usunąć członka? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9129,6 +9141,10 @@ marked deleted chat item preview text dzwonie… call status + + can't send messages + No comment provided by engineer. + cancelled %@ anulowany %@ @@ -9234,6 +9250,14 @@ marked deleted chat item preview text kontakt %1$@ zmieniony na %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption kontakt posiada szyfrowanie e2e @@ -9244,6 +9268,10 @@ marked deleted chat item preview text kontakt nie posiada szyfrowania e2e No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator twórca @@ -9415,6 +9443,10 @@ pref value grupa usunięta No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated zaktualizowano profil grupy @@ -9540,6 +9572,10 @@ pref value połączony rcv group event chat item + + member has old version + No comment provided by engineer. + message wiadomość @@ -9604,6 +9640,10 @@ pref value brak tekstu copied message info in history + + not synchronized + No comment provided by engineer. + observer obserwator @@ -9708,6 +9748,10 @@ time to disappear usunięto adres kontaktu profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture usunięto zdjęcie profilu @@ -9718,6 +9762,10 @@ time to disappear usunął cię rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index 58eb585574..651d9a7063 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -2425,6 +2425,10 @@ swipe action Удалить профиль? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Удалить разговор? @@ -3260,6 +3264,10 @@ chat item action Ошибка при удалении данных чата No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Ошибка при удалении чата! @@ -6293,6 +6301,10 @@ swipe action Отклонить запрос No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Relay сервер используется только при необходимости. Другая сторона может видеть Ваш IP адрес. @@ -6324,7 +6336,7 @@ swipe action Remove member? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9281,6 +9293,10 @@ marked deleted chat item preview text входящий звонок… call status + + can't send messages + No comment provided by engineer. + cancelled %@ отменил(a) %@ @@ -9386,6 +9402,14 @@ marked deleted chat item preview text контакт %1$@ изменён на %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption у контакта есть e2e шифрование @@ -9396,6 +9420,10 @@ marked deleted chat item preview text у контакта нет e2e шифрования No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator создатель @@ -9567,6 +9595,10 @@ pref value группа удалена No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated профиль группы обновлен @@ -9690,6 +9722,10 @@ pref value соединен(а) rcv group event chat item + + member has old version + No comment provided by engineer. + message написать @@ -9755,6 +9791,10 @@ pref value нет текста copied message info in history + + not synchronized + No comment provided by engineer. + observer читатель @@ -9862,6 +9902,10 @@ time to disappear удалён адрес контакта profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture удалена картинка профиля @@ -9872,6 +9916,10 @@ time to disappear удалил(а) Вас из группы rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect запрошено соединение diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index 481b8271fb..528219b13a 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -2186,6 +2186,10 @@ swipe action ลบโปรไฟล์แชทไหม? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? No comment provided by engineer. @@ -2956,6 +2960,10 @@ chat item action เกิดข้อผิดพลาดในการลบฐานข้อมูลแชท No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! เกิดข้อผิดพลาดในการลบแชท! @@ -5732,6 +5740,10 @@ swipe action ปฏิเสธคำขอติดต่อ No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. ใช้เซิร์ฟเวอร์รีเลย์ในกรณีที่จำเป็นเท่านั้น บุคคลอื่นสามารถสังเกตที่อยู่ IP ของคุณได้ @@ -5763,7 +5775,7 @@ swipe action Remove member? ลบสมาชิกออก? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -8460,6 +8472,10 @@ marked deleted chat item preview text กำลังโทร… call status + + can't send messages + No comment provided by engineer. + cancelled %@ ยกเลิก %@ @@ -8563,6 +8579,14 @@ marked deleted chat item preview text contact %1$@ changed to %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption ผู้ติดต่อมีการ encrypt จากต้นจนจบ @@ -8573,6 +8597,10 @@ marked deleted chat item preview text ผู้ติดต่อไม่มีการ encrypt จากต้นจนจบ No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator ผู้สร้าง @@ -8738,6 +8766,10 @@ pref value ลบกลุ่มแล้ว No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated อัปเดตโปรไฟล์กลุ่มแล้ว @@ -8860,6 +8892,10 @@ pref value เชื่อมต่อสำเร็จ rcv group event chat item + + member has old version + No comment provided by engineer. + message No comment provided by engineer. @@ -8923,6 +8959,10 @@ pref value ไม่มีข้อความ copied message info in history + + not synchronized + No comment provided by engineer. + observer ผู้สังเกตการณ์ @@ -9022,6 +9062,10 @@ time to disappear removed contact address profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture profile update event chat item @@ -9031,6 +9075,10 @@ time to disappear ลบคุณออกแล้ว rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index 1acf4576a1..d17a272016 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -2388,6 +2388,10 @@ swipe action Sohbet profili silinsin mi? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Sohbet silinsin mi? @@ -3215,6 +3219,10 @@ chat item action Sohbet veritabanı silinirken sorun oluştu No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Sohbet silinirken hata oluştu! @@ -6202,6 +6210,10 @@ swipe action Bağlanma isteğini reddet No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Yönlendirici sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir. @@ -6235,7 +6247,7 @@ swipe action Remove member? Kişi silinsin mi? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9144,6 +9156,10 @@ marked deleted chat item preview text aranıyor… call status + + can't send messages + No comment provided by engineer. + cancelled %@ %@ iptal edildi @@ -9249,6 +9265,14 @@ marked deleted chat item preview text %1$@ kişisi %2$@ olarak değişti profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption kişi uçtan uca şifrelemeye sahiptir @@ -9259,6 +9283,10 @@ marked deleted chat item preview text kişi uçtan uca şifrelemeye sahip değildir No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator oluşturan @@ -9430,6 +9458,10 @@ pref value grup silindi No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated grup profili güncellendi @@ -9555,6 +9587,10 @@ pref value bağlanıldı rcv group event chat item + + member has old version + No comment provided by engineer. + message mesaj @@ -9619,6 +9655,10 @@ pref value metin yok copied message info in history + + not synchronized + No comment provided by engineer. + observer gözlemci @@ -9723,6 +9763,10 @@ time to disappear kişi adresi silindi profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture profil fotoğrafı silindi @@ -9733,6 +9777,10 @@ time to disappear sen kaldırıldın rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index 2c515339ff..687393cfab 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -2388,6 +2388,10 @@ swipe action Видалити профіль чату? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? Видалити чат? @@ -3216,6 +3220,10 @@ chat item action Помилка видалення бази даних чату No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! Помилка видалення чату! @@ -6225,6 +6233,10 @@ swipe action Відхилити запит на контакт No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. Релейний сервер використовується тільки в разі потреби. Інша сторона може бачити вашу IP-адресу. @@ -6258,7 +6270,7 @@ swipe action Remove member? Видалити учасника? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9205,6 +9217,10 @@ marked deleted chat item preview text дзвоніть… call status + + can't send messages + No comment provided by engineer. + cancelled %@ скасовано %@ @@ -9310,6 +9326,14 @@ marked deleted chat item preview text контакт %1$@ змінено на %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption контакт має шифрування e2e @@ -9320,6 +9344,10 @@ marked deleted chat item preview text контакт не має шифрування e2e No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator творець @@ -9491,6 +9519,10 @@ pref value групу видалено No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated оновлено профіль групи @@ -9616,6 +9648,10 @@ pref value з'єднаний rcv group event chat item + + member has old version + No comment provided by engineer. + message повідомлення @@ -9680,6 +9716,10 @@ pref value без тексту copied message info in history + + not synchronized + No comment provided by engineer. + observer спостерігач @@ -9784,6 +9824,10 @@ time to disappear видалено контактну адресу profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture видалено зображення профілю @@ -9794,6 +9838,10 @@ time to disappear прибрали вас rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect запит на підключення diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index 683abce868..06ce8d4950 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -2425,6 +2425,10 @@ swipe action 删除聊天资料? No comment provided by engineer. + + Delete chat with member? + alert title + Delete chat? 删除聊天? @@ -3264,6 +3268,10 @@ chat item action 删除聊天数据库错误 No comment provided by engineer. + + Error deleting chat with member + alert title + Error deleting chat! 删除聊天错误! @@ -6314,6 +6322,10 @@ swipe action 拒绝联系人请求 No comment provided by engineer. + + Reject member? + alert title + Relay server is only used if necessary. Another party can observe your IP address. 中继服务器仅在必要时使用。其他人可能会观察到您的IP地址。 @@ -6346,7 +6358,7 @@ swipe action Remove member? 删除成员吗? - alert title + No comment provided by engineer. Remove passphrase from keychain? @@ -9244,6 +9256,10 @@ marked deleted chat item preview text 呼叫中…… call status + + can't send messages + No comment provided by engineer. + cancelled %@ 已取消 %@ @@ -9349,6 +9365,14 @@ marked deleted chat item preview text 联系人 %1$@ 已更改为 %2$@ profile update event chat item + + contact deleted + No comment provided by engineer. + + + contact disabled + No comment provided by engineer. + contact has e2e encryption 联系人具有端到端加密 @@ -9359,6 +9383,10 @@ marked deleted chat item preview text 联系人没有端到端加密 No comment provided by engineer. + + contact not ready + No comment provided by engineer. + creator 创建者 @@ -9530,6 +9558,10 @@ pref value 群组已删除 No comment provided by engineer. + + group is deleted + No comment provided by engineer. + group profile updated 群组资料已更新 @@ -9655,6 +9687,10 @@ pref value 已连接 rcv group event chat item + + member has old version + No comment provided by engineer. + message 消息 @@ -9719,6 +9755,10 @@ pref value 无文本 copied message info in history + + not synchronized + No comment provided by engineer. + observer 观察者 @@ -9823,6 +9863,10 @@ time to disappear 删除了联系地址 profile update event chat item + + removed from group + No comment provided by engineer. + removed profile picture 删除了资料图片 @@ -9833,6 +9877,10 @@ time to disappear 已将您移除 rcv group event chat item + + request to join rejected + No comment provided by engineer. + requested to connect chat list item title diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 7bb6562a3f..b5bf2efaff 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -159,7 +159,7 @@ Error adding member(s) Error joining group Error accepting member - Error deleting member support chat + Error deleting chat with member Cannot receive file Sender cancelled file transfer. Unknown servers! From a8e7db0b8f3e99a9a6eddf4f0099a54f3b93de30 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Tue, 20 May 2025 15:27:03 +0100 Subject: [PATCH 10/14] android, desktop: update translation key --- .../common/src/commonMain/resources/MR/de/strings.xml | 2 +- .../common/src/commonMain/resources/MR/hu/strings.xml | 2 +- .../common/src/commonMain/resources/MR/it/strings.xml | 2 +- .../common/src/commonMain/resources/MR/zh-rCN/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 5529c8dcb3..fbb9f94a64 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -2475,7 +2475,7 @@ Chats mit Mitgliedern Chat mit Administratoren Keine Chats mit Mitgliedern - Entfernen + Entfernen hat Sie übernommen Chat mit einem Mitglied %d Nachrichten diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index e3d668d4f0..dfa4c81504 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -2371,7 +2371,7 @@ Tagok áttekintése a befogadás előtt (kopogtatás). Csevegés az adminisztrátorokkal A tag csatlakozni akar a csoporthoz, befogadja a tagot? - Eltávolítás + Eltávolítás Befogadás Tag befogadása összes diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index bbd8c9404f..bf920e2fca 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -2408,7 +2408,7 @@ Revisiona i membri prima di ammetterli (bussare). Accetta Chat con amministratori - Rimuovi + Rimuovi Il membro entrerà nel gruppo, accettarlo? revisionato dagli amministratori Accetta membro diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index e68b8bcdaa..a72a4938c2 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -2389,7 +2389,7 @@ 全部 成员准入 关闭 - 删除 + 删除 接受 和成员聊天 和管理员聊天 From 1ef53d153088bf8fc0e9a80200fa08b3b614349a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 20 May 2025 15:38:00 +0100 Subject: [PATCH 11/14] ui: translations (#5931) * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2404 of 2404 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2404 of 2404 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 99.0% (2071 of 2090 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 99.0% (2071 of 2090 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 99.9% (2089 of 2090 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 99.9% (2089 of 2090 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2404 of 2404 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2090 of 2090 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * ios: import --------- Co-authored-by: Hosted Weblate Co-authored-by: summoner001 Co-authored-by: Ghost of Sparta --- .../hu.xcloc/Localized Contents/hu.xliff | 37 ++++++ apps/ios/hu.lproj/Localizable.strings | 113 +++++++++++++++++- .../commonMain/resources/MR/hu/strings.xml | 20 +++- 3 files changed, 167 insertions(+), 3 deletions(-) diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 43f7d8b31e..5fd4c21027 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -567,10 +567,12 @@ swipe action Accept as member + Befogadás tagként alert action Accept as observer + Befogadás megfigyelőként alert action @@ -596,6 +598,7 @@ swipe action Accept member + Tag befogadása alert title @@ -1596,10 +1599,12 @@ set passcode view Chat with admins + Csevegés az adminisztrátorokkal chat toolbar Chat with member + Csevegés a taggal No comment provided by engineer. @@ -1609,6 +1614,7 @@ set passcode view Chats with members + Csevegés a tagokkal No comment provided by engineer. @@ -2428,6 +2434,7 @@ swipe action Delete chat with member? + Törli a taggal való csevegést? alert title @@ -3173,6 +3180,7 @@ chat item action Error accepting member + Hiba a tag befogadásakor alert title @@ -3272,6 +3280,7 @@ chat item action Error deleting chat with member + Hiba a taggal való csevegés törlésekor alert title @@ -4768,6 +4777,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Member admission + Tagbefogadás No comment provided by engineer. @@ -4807,6 +4817,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Member will join the group, accept member? + A tag csatlakozni akar a csoporthoz, befogadja a tagot? alert message @@ -5231,6 +5242,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! New member wants to join the group. + Új tag szeretne csatlakozni a csoporthoz. rcv group event chat item @@ -5275,6 +5287,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! No chats with members + Nincsenek csevegések a tagokkal No comment provided by engineer. @@ -5884,6 +5897,7 @@ Hiba: %@ Please wait for group moderators to review your request to join the group. + Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét. snd group event chat item @@ -6341,6 +6355,7 @@ swipe action Reject member? + Elutasítja a tagot? alert title @@ -6455,6 +6470,7 @@ swipe action Report sent to moderators + A jelentés el lett küldve a moderátoroknak alert title @@ -6574,10 +6590,12 @@ swipe action Review members + Tagok áttekintése admission stage Review members before admitting ("knocking"). + Tagok áttekintése a befogadás előtt (kopogtatás). admission stage description @@ -6638,6 +6656,7 @@ chat item action Save admission settings? + Elmenti a befogadási beállításokat? alert title @@ -7157,6 +7176,7 @@ chat item action Set member admission + Tagbefogadás beállítása No comment provided by engineer. @@ -8923,6 +8943,7 @@ Megismétli a meghívási kérést? You can view your reports in Chat with admins. + A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben. alert message @@ -9229,6 +9250,7 @@ Megismétli a meghívási kérést? accepted %@ + befogadta őt: %@ rcv group event chat item @@ -9243,6 +9265,7 @@ Megismétli a meghívási kérést? accepted you + befogadta Önt rcv group event chat item @@ -9267,6 +9290,7 @@ Megismétli a meghívási kérést? all + összes member criteria value @@ -9357,6 +9381,7 @@ marked deleted chat item preview text can't send messages + nem lehet üzeneteket küldeni No comment provided by engineer. @@ -9466,10 +9491,12 @@ marked deleted chat item preview text contact deleted + partner törölve No comment provided by engineer. contact disabled + partner letiltva No comment provided by engineer. @@ -9484,6 +9511,7 @@ marked deleted chat item preview text contact not ready + a kapcsolat nem áll készen No comment provided by engineer. @@ -9659,6 +9687,7 @@ pref value group is deleted + csoport törölve No comment provided by engineer. @@ -9788,6 +9817,7 @@ pref value member has old version + a tag régi verziót használ No comment provided by engineer. @@ -9857,6 +9887,7 @@ pref value not synchronized + nincs szinkronizálva No comment provided by engineer. @@ -9924,6 +9955,7 @@ time to disappear pending review + függőben lévő áttekintés No comment provided by engineer. @@ -9968,6 +10000,7 @@ time to disappear removed from group + eltávolítva a csoportból No comment provided by engineer. @@ -9982,6 +10015,7 @@ time to disappear request to join rejected + csatlakozási kérelem elutasítva No comment provided by engineer. @@ -9991,10 +10025,12 @@ time to disappear review + áttekintés No comment provided by engineer. reviewed by admins + áttekintve a moderátorok által No comment provided by engineer. @@ -10188,6 +10224,7 @@ utoljára fogadott üzenet: %2$@ you accepted this member + Ön befogadta ezt a tagot snd group event chat item diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings index 5431eb51d8..9a1da01665 100644 --- a/apps/ios/hu.lproj/Localizable.strings +++ b/apps/ios/hu.lproj/Localizable.strings @@ -345,6 +345,12 @@ accept incoming call via notification swipe action */ "Accept" = "Elfogadás"; +/* alert action */ +"Accept as member" = "Befogadás tagként"; + +/* alert action */ +"Accept as observer" = "Befogadás megfigyelőként"; + /* No comment provided by engineer. */ "Accept conditions" = "Feltételek elfogadása"; @@ -358,6 +364,12 @@ swipe action */ swipe action */ "Accept incognito" = "Elfogadás inkognitóban"; +/* alert title */ +"Accept member" = "Tag befogadása"; + +/* rcv group event chat item */ +"accepted %@" = "befogadta őt: %@"; + /* call status */ "accepted call" = "fogadott hívás"; @@ -367,6 +379,9 @@ swipe action */ /* chat list item title */ "accepted invitation" = "elfogadott meghívó"; +/* rcv group event chat item */ +"accepted you" = "befogadta Önt"; + /* No comment provided by engineer. */ "Acknowledged" = "Visszaigazolt"; @@ -463,6 +478,9 @@ swipe action */ /* chat item text */ "agreeing encryption…" = "titkosítás elfogadása…"; +/* member criteria value */ +"all" = "összes"; + /* No comment provided by engineer. */ "All" = "Összes"; @@ -905,6 +923,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't message member" = "Nem lehet üzenetet küldeni a tagnak"; +/* No comment provided by engineer. */ +"can't send messages" = "nem lehet üzeneteket küldeni"; + /* alert action alert button */ "Cancel" = "Mégse"; @@ -1042,9 +1063,18 @@ set passcode view */ /* No comment provided by engineer. */ "Chat will be deleted for you - this cannot be undone!" = "A csevegés törölve lesz az Ön számára – ez a művelet nem vonható vissza!"; +/* chat toolbar */ +"Chat with admins" = "Csevegés az adminisztrátorokkal"; + +/* No comment provided by engineer. */ +"Chat with member" = "Csevegés a taggal"; + /* No comment provided by engineer. */ "Chats" = "Csevegések"; +/* No comment provided by engineer. */ +"Chats with members" = "Csevegés a tagokkal"; + /* No comment provided by engineer. */ "Check messages every 20 min." = "Üzenetek ellenőrzése 20 percenként."; @@ -1333,9 +1363,15 @@ set passcode view */ /* No comment provided by engineer. */ "Contact already exists" = "A partner már létezik"; +/* No comment provided by engineer. */ +"contact deleted" = "partner törölve"; + /* No comment provided by engineer. */ "Contact deleted!" = "Partner törölve!"; +/* No comment provided by engineer. */ +"contact disabled" = "partner letiltva"; + /* No comment provided by engineer. */ "contact has e2e encryption" = "a partner e2e titkosítással rendelkezik"; @@ -1354,6 +1390,9 @@ set passcode view */ /* No comment provided by engineer. */ "Contact name" = "Csak név"; +/* No comment provided by engineer. */ +"contact not ready" = "a kapcsolat nem áll készen"; + /* No comment provided by engineer. */ "Contact preferences" = "Partnerbeállítások"; @@ -1602,6 +1641,9 @@ swipe action */ /* No comment provided by engineer. */ "Delete chat profile?" = "Törli a csevegési profilt?"; +/* alert title */ +"Delete chat with member?" = "Törli a taggal való csevegést?"; + /* No comment provided by engineer. */ "Delete chat?" = "Törli a csevegést?"; @@ -2116,6 +2158,9 @@ chat item action */ /* No comment provided by engineer. */ "Error accepting contact request" = "Hiba történt a meghívási kérés elfogadásakor"; +/* alert title */ +"Error accepting member" = "Hiba a tag befogadásakor"; + /* No comment provided by engineer. */ "Error adding member(s)" = "Hiba történt a tag(ok) hozzáadásakor"; @@ -2173,6 +2218,9 @@ chat item action */ /* No comment provided by engineer. */ "Error deleting chat database" = "Hiba történt a csevegési adatbázis törlésekor"; +/* alert title */ +"Error deleting chat with member" = "Hiba a taggal való csevegés törlésekor"; + /* No comment provided by engineer. */ "Error deleting chat!" = "Hiba történt a csevegés törlésekor!"; @@ -2610,6 +2658,9 @@ snd error text */ /* No comment provided by engineer. */ "Group invitation is no longer valid, it was removed by sender." = "A csoportmeghívó már nem érvényes, a küldője eltávolította."; +/* No comment provided by engineer. */ +"group is deleted" = "csoport törölve"; + /* No comment provided by engineer. */ "Group link" = "Csoporthivatkozás"; @@ -3138,9 +3189,15 @@ snd error text */ /* profile update event chat item */ "member %@ changed to %@" = "%1$@ a következőre módosította a nevét: %2$@"; +/* No comment provided by engineer. */ +"Member admission" = "Tagbefogadás"; + /* rcv group event chat item */ "member connected" = "kapcsolódott"; +/* No comment provided by engineer. */ +"member has old version" = "a tag régi verziót használ"; + /* item status text */ "Member inactive" = "Inaktív tag"; @@ -3162,6 +3219,9 @@ snd error text */ /* No comment provided by engineer. */ "Member will be removed from group - this cannot be undone!" = "A tag el lesz távolítva a csoportból – ez a művelet nem vonható vissza!"; +/* alert message */ +"Member will join the group, accept member?" = "A tag csatlakozni akar a csoporthoz, befogadja a tagot?"; + /* No comment provided by engineer. */ "Members can add message reactions." = "A tagok reakciókat adhatnak hozzá az üzenetekhez."; @@ -3432,6 +3492,9 @@ snd error text */ /* No comment provided by engineer. */ "New member role" = "Új tag szerepköre"; +/* rcv group event chat item */ +"New member wants to join the group." = "Új tag szeretne csatlakozni a csoporthoz."; + /* notification */ "new message" = "új üzenet"; @@ -3471,6 +3534,9 @@ snd error text */ /* No comment provided by engineer. */ "No chats in list %@" = "Nincsenek csevegések a(z) %@ nevű listában"; +/* No comment provided by engineer. */ +"No chats with members" = "Nincsenek csevegések a tagokkal"; + /* No comment provided by engineer. */ "No contacts selected" = "Nincs partner kijelölve"; @@ -3555,6 +3621,9 @@ snd error text */ /* No comment provided by engineer. */ "Not compatible!" = "Nem kompatibilis!"; +/* No comment provided by engineer. */ +"not synchronized" = "nincs szinkronizálva"; + /* No comment provided by engineer. */ "Notes" = "Jegyzetek"; @@ -3802,6 +3871,9 @@ alert button */ /* No comment provided by engineer. */ "pending approval" = "jóváhagyásra vár"; +/* No comment provided by engineer. */ +"pending review" = "függőben lévő áttekintés"; + /* No comment provided by engineer. */ "Periodic" = "Időszakos"; @@ -3871,6 +3943,9 @@ alert button */ /* token info */ "Please try to disable and re-enable notfications." = "Próbálja meg letiltani és újra engedélyezni az értesítéseket."; +/* snd group event chat item */ +"Please wait for group moderators to review your request to join the group." = "Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét."; + /* token info */ "Please wait for token activation to complete." = "Várjon, amíg a token aktiválása befejeződik."; @@ -4151,6 +4226,9 @@ swipe action */ /* No comment provided by engineer. */ "Reject contact request" = "Meghívási kérés elutasítása"; +/* alert title */ +"Reject member?" = "Elutasítja a tagot?"; + /* No comment provided by engineer. */ "rejected" = "elutasítva"; @@ -4175,7 +4253,7 @@ swipe action */ /* No comment provided by engineer. */ "Remove member" = "Eltávolítás"; -/* alert title */ +/* No comment provided by engineer. */ "Remove member?" = "Eltávolítja a tagot?"; /* No comment provided by engineer. */ @@ -4190,6 +4268,9 @@ swipe action */ /* profile update event chat item */ "removed contact address" = "eltávolította a kapcsolattartási címet"; +/* No comment provided by engineer. */ +"removed from group" = "eltávolítva a csoportból"; + /* profile update event chat item */ "removed profile picture" = "eltávolította a profilképét"; @@ -4238,6 +4319,9 @@ swipe action */ /* No comment provided by engineer. */ "Report reason?" = "Jelentés indoklása?"; +/* alert title */ +"Report sent to moderators" = "A jelentés el lett küldve a moderátoroknak"; + /* report reason */ "Report spam: only group moderators will see it." = "Kéretlen tartalom jelentése: csak a csoport moderátorai látják."; @@ -4253,6 +4337,9 @@ swipe action */ /* No comment provided by engineer. */ "Reports" = "Jelentések"; +/* No comment provided by engineer. */ +"request to join rejected" = "csatlakozási kérelem elutasítva"; + /* chat list item title */ "requested to connect" = "Függőben lévő meghívási kérelem"; @@ -4307,9 +4394,21 @@ swipe action */ /* chat item action */ "Reveal" = "Felfedés"; +/* No comment provided by engineer. */ +"review" = "áttekintés"; + /* No comment provided by engineer. */ "Review conditions" = "Feltételek felülvizsgálata"; +/* admission stage */ +"Review members" = "Tagok áttekintése"; + +/* admission stage description */ +"Review members before admitting (\"knocking\")." = "Tagok áttekintése a befogadás előtt (kopogtatás)."; + +/* No comment provided by engineer. */ +"reviewed by admins" = "áttekintve a moderátorok által"; + /* No comment provided by engineer. */ "Revoke" = "Visszavonás"; @@ -4338,6 +4437,9 @@ chat item action */ /* alert button */ "Save (and notify contacts)" = "Mentés (és a partnerek értesítése)"; +/* alert title */ +"Save admission settings?" = "Elmenti a befogadási beállításokat?"; + /* alert button */ "Save and notify contact" = "Mentés és a partner értesítése"; @@ -4674,6 +4776,9 @@ chat item action */ /* No comment provided by engineer. */ "Set it instead of system authentication." = "Beállítás a rendszer-hitelesítés helyett."; +/* No comment provided by engineer. */ +"Set member admission" = "Tagbefogadás beállítása"; + /* No comment provided by engineer. */ "Set message expiration in chats." = "Üzenetek eltűnési idejének módosítása a csevegésekben."; @@ -5714,6 +5819,9 @@ report reason */ /* No comment provided by engineer. */ "You accepted connection" = "Kapcsolat létrehozása"; +/* snd group event chat item */ +"you accepted this member" = "Ön befogadta ezt a tagot"; + /* No comment provided by engineer. */ "You allow" = "Ön engedélyezi"; @@ -5825,6 +5933,9 @@ report reason */ /* alert message */ "You can view invitation link again in connection details." = "A meghívási hivatkozást újra megtekintheti a kapcsolat részleteinél."; +/* alert message */ +"You can view your reports in Chat with admins." = "A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben."; + /* No comment provided by engineer. */ "You can't send messages!" = "Nem lehet üzeneteket küldeni!"; diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index dfa4c81504..1a1ca0e8a6 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -1026,7 +1026,7 @@ frissítette a csoport profilját SIMPLEX CHAT TÁMOGATÁSA SimpleX Chat szolgáltatás - Nem lehet üzeneteket küldeni! + Ön megfigyelő %s hitelesítve Jelszó a megjelenítéshez Adatvédelem és biztonság @@ -2361,7 +2361,7 @@ %d csevegés A jelentés el lett küldve a moderátoroknak A jelentéseket megtekintheti a „Csevegés az adminisztrátorokkal” menüben. - áttekintésre vár + függőben lévő áttekintés áttekintés Csevegés az adminisztrátorokkal Csevegés a tagokkal @@ -2387,4 +2387,20 @@ Befogadás tagként befogadta őt: %1$s áttekintve a moderátorok által + nem lehet üzeneteket küldeni + partner letiltva + csoport törölve + eltávolítva a csoportból + csatlakozási kérelem elutasítva + Ön elhagyta a csoportot + a tag régi verziót használ + Hiba a taggal való csevegés törlésekor + Ön nem tud üzeneteket küldeni! + a kapcsolat nem áll készen + nincs szinkronizálva + Törli a taggal való csevegést? + partner törölve + Csevegés törlése + Elutasítás + Elutasítja a tagot? From f162f96be8136724b48546c4234ebbad3f2b896e Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 20 May 2025 15:44:33 +0100 Subject: [PATCH 12/14] website: translations (#5932) * Translated using Weblate (Ukrainian) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/uk/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 78.5% (202 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/zh_Hant/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 78.5% (202 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/zh_Hant/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/ * Translated using Weblate (Russian) Currently translated at 99.6% (256 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/ru/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/ --------- Co-authored-by: Bezruchenko Simon Co-authored-by: dns Co-authored-by: 4 Bi 5aYzVk 93FCVjWLWxh44XH3984teVSfjwFYmUGUrbvnHwGirk9 Co-authored-by: summoner001 Co-authored-by: Vitaly Kanevsky Co-authored-by: Ghost of Sparta --- website/langs/hu.json | 30 +++++++++++++++--------------- website/langs/ru.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/website/langs/hu.json b/website/langs/hu.json index 9dfd3d9f65..a55136d26a 100644 --- a/website/langs/hu.json +++ b/website/langs/hu.json @@ -31,7 +31,7 @@ "hero-overlay-2-textlink": "Hogyan működik a SimpleX?", "hero-overlay-3-textlink": "Biztonsági felmérések", "hero-2-header": "Privát kapcsolat létrehozása", - "hero-2-header-desc": "A videó bemutatja, hogyan kapcsolódhat a partneréhez egy egyszer használható QR-kód segítségével, személyesen vagy videokapcsolaton keresztül. Ugyanakkor egy meghívási hivatkozás megosztásával is kapcsolódhat.", + "hero-2-header-desc": "A videó bemutatja, hogyan kapcsolódhat a partneréhez egy egyszer használható QR-kód segítségével, személyesen vagy videóhíváson keresztül. Ugyanakkor egy meghívási hivatkozás megosztásával is kapcsolódhat.", "hero-overlay-1-title": "Hogyan működik a SimpleX?", "hero-overlay-2-title": "Miért ártanak a felhasználói azonosítók az adatvédelemnek?", "hero-overlay-3-title": "Biztonsági felmérések", @@ -40,14 +40,14 @@ "feature-3-title": "E2E-titkosított decentralizált csoportok — csak a felhasználók tudják, hogy ezek léteznek", "feature-4-title": "E2E-titkosított hangüzenetek", "feature-5-title": "Eltűnő üzenetek", - "feature-6-title": "E2E-titkosított
hang- és videohívások", + "feature-6-title": "E2E-titkosított
hang- és videóhívások", "feature-7-title": "Hordozható titkosított alkalmazás-adattárolás — profil átköltöztetése egy másik eszközre", "feature-8-title": "Az inkognitómód —
egyedülálló a SimpleX Chatben", "simplex-network-overlay-1-title": "Összehasonlítás más P2P-üzenetküldő protokollokkal", "simplex-private-1-title": "2 rétegű végpontok közötti titkosítás", "simplex-private-2-title": "További rétege a
kiszolgáló-titkosítás", - "simplex-private-4-title": "Nem kötelező
hozzáférés Tor-on keresztül", - "simplex-private-5-title": "Több rétegű
tartalom kitöltés", + "simplex-private-4-title": "Hozzáférés Tor-hálózaton keresztül
(nem kötelező)", + "simplex-private-5-title": "Több rétegű
tartalomkitöltés", "simplex-private-6-title": "Sávon kívüli
kulcscsere", "simplex-private-7-title": "Üzenetintegritás
hitelesítés", "simplex-private-8-title": "Üzenetek keverése
a korreláció csökkentése érdekében", @@ -59,14 +59,14 @@ "simplex-private-card-3-point-1": "A kliens és a kiszolgálók közötti kapcsolatokhoz csak az erős algoritmusokkal rendelkező TLS 1.2/1.3 protokollt használja.", "simplex-private-card-3-point-2": "A kiszolgáló ujjlenyomata és a csatornakötés megakadályozza a MITM- és a visszajátszási támadásokat.", "simplex-private-card-3-point-3": "Az újrakapcsolódás le van tiltva a munkamenet elleni támadások megelőzése érdekében.", - "simplex-private-card-4-point-1": "Az IP-címe védelme érdekében a kiszolgálókat a Tor-on vagy más átvitel-átfedő-hálózaton keresztül is elérheti.", + "simplex-private-card-4-point-1": "Az IP-címe védelme érdekében a kiszolgálókat a Tor hálózaton vagy más átvitelátfedő hálózaton keresztül is elérheti.", "simplex-private-card-6-point-1": "Számos kommunikációs hálózat sebezhető a kiszolgálók vagy a hálózat-szolgáltatók MITM-támadásaival szemben.", "simplex-private-card-6-point-2": "Ennek megakadályozása érdekében a SimpleX-alkalmazások egyszeri kulcsokat adnak át sávon kívül, amikor egy címet hivatkozásként vagy QR-kódként oszt meg.", "simplex-private-card-7-point-1": "Az integritás garantálása érdekében az üzenetek sorszámozással vannak ellátva, és tartalmazzák az előző üzenet hasítóértékét.", "simplex-private-card-7-point-2": "Ha bármilyen üzenetet hozzáadnak, eltávolítanak vagy módosítanak, a címzett értesítést kap róla.", "simplex-private-card-8-point-1": "A SimpleX-kiszolgálók alacsony késleltetésű keverési csomópontokként működnek — a bejövő és kimenő üzenetek sorrendje eltérő.", "simplex-private-card-9-point-1": "Minden üzenetsorbaállítás egy irányba továbbítja az üzeneteket, a különböző küldési és vételi címekkel.", - "simplex-private-card-9-point-2": "A hagyományos üzenetküldőkhöz képest csökkenti a támadási vektorokat és a rendelkezésre álló metaadatokat.", + "simplex-private-card-9-point-2": "Kevesebb támadási felülettel rendelkezik, mint a hagyományos üzenetváltó alkalmazások, és kevesebb metaadatot tesz elérhetővé.", "simplex-private-card-10-point-1": "A SimpleX ideiglenes, névtelen, páros címeket és hitelesítő adatokat használ minden egyes felhasználói kapcsolathoz vagy csoporttaghoz.", "simplex-private-card-10-point-2": "Lehetővé teszi az üzenetek felhasználói profilazonosítók nélküli kézbesítését, ami az alternatíváknál jobb metaadat-védelmet biztosít.", "privacy-matters-1-overlay-1-title": "Az adatvédelemmel pénzt spórol meg", @@ -95,7 +95,7 @@ "hero-overlay-card-2-p-3": "Még a Tor v3 szolgáltatásokat használó, legprivátabb alkalmazások esetében is, ha két különböző kapcsolattartóval beszél ugyanazon a profilon keresztül, bizonyítani tudják, hogy ugyanahhoz a személyhez kapcsolódnak.", "hero-overlay-card-2-p-4": "A SimpleX úgy védekezik ezen támadások ellen, hogy nem tartalmaz felhasználói azonosítókat. Ha pedig használja az inkognitómódot, akkor minden egyes létrejött kapcsolatban más-más felhasználó név jelenik meg, így elkerülhető a közöttük lévő összefüggések teljes bizonyítása.", "hero-overlay-card-3-p-1": "Trail of Bits egy vezető biztonsági és technológiai tanácsadó cég, amelynek az ügyfelei közé tartoznak nagy technológiai cégek, kormányzati ügynökségek és jelentős blokklánc projektek.", - "hero-overlay-card-3-p-2": "A Trail of Bits 2022 novemberében áttekintette a SimpleX-platform kriptográfiai és hálózati komponenseit. További információk.", + "hero-overlay-card-3-p-2": "A Trail of Bits 2022 novemberében auditálta a SimpleX-platform kriptográfiai és hálózati komponenseit. További információk.", "simplex-network-overlay-card-1-li-1": "A P2P-hálózatok az üzenetek továbbítására a DHT valamelyik változatát használják. A DHT kialakításakor egyensúlyt kell teremteni a kézbesítési garancia és a késleltetés között. A SimpleX jobb kézbesítési garanciával és alacsonyabb késleltetéssel rendelkezik, mint a P2P, mivel az üzenet redundánsan, a címzett által kiválasztott kiszolgálók segítségével több kiszolgálón keresztül párhuzamosan továbbítható. A P2P-hálózatokban az üzenet O(log N) csomóponton halad át szekvenciálisan, az algoritmus által kiválasztott csomópontok segítségével.", "simplex-network-overlay-card-1-li-2": "A SimpleX kialakítása a legtöbb P2P-hálózattól eltérően nem rendelkezik semmiféle globális felhasználói azonosítóval, még ideiglenessel sem, és csak az üzenetekhez használ ideiglenes, páros azonosítókat, ami jobb névtelenséget és metaadatvédelmet biztosít.", "simplex-network-overlay-card-1-li-3": "A P2P nem oldja meg a MITM-támadás problémát, és a legtöbb létező implementáció nem használ sávon kívüli üzeneteket a kezdeti kulcscseréhez. A SimpleX a kezdeti kulcscseréhez sávon kívüli üzeneteket, vagy bizonyos esetekben már meglévő biztonságos és megbízható kapcsolatokat használ.", @@ -139,7 +139,7 @@ "sign-up-to-receive-our-updates": "Regisztráljon a hírleveleinkre, hogy ne maradjon le semmiről", "enter-your-email-address": "Adja meg az e-mail-címét", "get-simplex": "A SimpleX számítógépes alkalmazásának letöltése", - "why-simplex-is-unique": "Mitől egyedülálló a SimpleX", + "why-simplex-is-unique": "A SimpleX mitől egyedülálló", "learn-more": "Tudjon meg többet", "more-info": "További információ", "hide-info": "Információ elrejtése", @@ -164,7 +164,7 @@ "simplex-chat-for-the-terminal": "SimpleX Chat a terminálhoz", "copy-the-command-below-text": "másolja be az alábbi parancsot, és használja a csevegésben:", "privacy-matters-section-header": "Miért számít az adatvédelem", - "privacy-matters-section-subheader": "A metaadatok védelmének megőrzése — kivel beszélget — megvédi a következőktől:", + "privacy-matters-section-subheader": "A metaadatok — pédául, hogy kivel beszélget — védelmének megőrzése biztonságot nyújt a következők ellen:", "privacy-matters-section-label": "Győződjön meg arról, hogy az üzenetváltó-alkalmazás amit használ nem fér hozzá az adataihoz!", "simplex-private-section-header": "Mitől lesz a SimpleX privát", "simplex-network-section-header": "SimpleX-hálózat", @@ -202,7 +202,7 @@ "guide-dropdown-3": "Titkos csoportok", "guide-dropdown-4": "Csevegési profilok", "guide-dropdown-5": "Adatkezelés", - "guide-dropdown-6": "Hang- és videó hívások", + "guide-dropdown-6": "Hang- és videóhívások", "guide-dropdown-7": "Adatvédelem és biztonság", "guide-dropdown-8": "Alkalmazás beállításai", "guide": "Útmutató", @@ -223,8 +223,8 @@ "contact-hero-header": "Kapott egy meghívót a SimpleX Chaten való beszélgetéshez", "invitation-hero-header": "Kapott egy egyszer használható meghívót a SimpleX Chaten való beszélgetéshez", "simplex-network-overlay-card-1-li-4": "A P2P-megvalósításokat egyes internetszolgáltatók blokkolhatják (mint például a BitTorrent). A SimpleX átvitel-független — a szabványos webes protokollokon, például WebSocketsen keresztül is működik.", - "simplex-private-card-4-point-2": "A SimpleX Tor-on keresztüli használatához telepítse az Orbot alkalmazást és engedélyezze a SOCKS5 proxyt (vagy a VPN-t az iOS-ban).", - "simplex-private-card-5-point-1": "A SimpleX minden titkosítási réteghez tartalomkitöltést használ, hogy meghiúsítsa az üzenetméret ellen irányuló támadásokat.", + "simplex-private-card-4-point-2": "A SimpleX, Tor-hálózaton keresztüli használatához telepítse az Orbot alkalmazást és engedélyezze a SOCKS5 proxyt (vagy a VPN-t az iOS-ban).", + "simplex-private-card-5-point-1": "A SimpleX minden titkosítási réteghez tartalomkitöltést használ az üzenetméretre irányuló támadások meghiúsítása érdekében.", "simplex-private-card-5-point-2": "A kiszolgálók és a hálózatot megfigyelők számára a különböző méretű üzenetek egyformának tűnnek.", "privacy-matters-1-title": "Hirdetés és árdiszkrimináció", "hero-overlay-card-1-p-3": "Ön határozza meg, hogy melyik kiszolgáló(ka)t használja az üzenetek fogadására, a kapcsolatokhoz — azokat a kiszolgálókat, amelyeket az üzenetek küldésére használ. Minden beszélgetés két különböző kiszolgálót használ.", @@ -232,7 +232,7 @@ "chat-bot-example": "Példa csevegési botra", "simplex-private-3-title": "Biztonságos, hitelesített
TLS adatátvitel", "github-repository": "GitHub tárolójában", - "tap-to-close": "Koppintson a bezáráshoz", + "tap-to-close": "Bezárás", "simplex-network-1-header": "A P2P-hálózatokkal ellentétben", "simplex-network-1-overlay-linktext": "a P2P-hálózatok problémái", "comparison-point-3-text": "Függés a DNS-től", @@ -254,6 +254,6 @@ "simplex-chat-via-f-droid": "SimpleX Chat az F-Droidon keresztül", "simplex-chat-repo": "A SimpleX Chat tárolója", "stable-and-beta-versions-built-by-developers": "A fejlesztők által készített stabil és béta verziók", - "hero-overlay-card-3-p-3": "A Trail of Bits 2024 júliusában felülvizsgálta a SimpleX hálózati protokollok kriptográfiai felépítését. Tudjon meg többet.", + "hero-overlay-card-3-p-3": "A Trail of Bits 2024 júliusában ismét auditálta a SimpleX-protokollok kriptográfiai és hálózati komponenseit. További információk.", "docs-dropdown-14": "SimpleX üzleti célra" -} +} \ No newline at end of file diff --git a/website/langs/ru.json b/website/langs/ru.json index 335b19ab11..7f8e191ccd 100644 --- a/website/langs/ru.json +++ b/website/langs/ru.json @@ -149,7 +149,7 @@ "back-to-top": "Вернуться к началу", "simplex-network-1-desc": "Все сообщения отправляются через серверы, что обеспечивает лучшую конфиденциальность метаданных и надежную асинхронную доставку сообщений, избегая при этом многих", "simplex-chat-repo": "Репозиторий SimpleX Chat", - "simplex-private-card-6-point-1": "Многие коммуникационные платформы уязвимы для MITM-атак со стороны серверов или сетевых провайдеров.", + "simplex-private-card-6-point-1": "Многие коммуникационные сети уязвимы для MITM-атак со стороны серверов или сетевых провайдеров.", "privacy-matters-3-overlay-1-linkText": "Конфиденциальность защищает Вашу свободу", "simplex-unique-overlay-card-1-p-2": "Для доставки сообщений SimpleX использует попарные, анонимные адреса однонаправленных очередей сообщений, раздельные для полученных и отправленных сообщений, обычно через разные серверы.", "simplex-unique-overlay-card-3-p-4": "Со стороны не видно разницы между отправлением или получением сообщений — если кто-то наблюдает за этим, он не cможет легко определить, кто с кем общается, даже если протокол TLS будет скомпрометирован.", From e84016e1b9531ab49a2139974c0b81e6f2712e23 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Tue, 20 May 2025 16:18:23 +0000 Subject: [PATCH 13/14] core, ui: update group scope unread stats on item deletions; create reports as read (reports use a different attention mechanism) (#5930) --- apps/ios/Shared/Model/SimpleXAPI.swift | 3 + apps/ios/Shared/Views/Chat/ChatView.swift | 7 ++ .../chat/simplex/common/model/SimpleXAPI.kt | 5 + .../simplex/common/views/chat/ChatView.kt | 7 ++ src/Simplex/Chat/Library/Commands.hs | 10 +- src/Simplex/Chat/Library/Internal.hs | 37 +++++- src/Simplex/Chat/Messages.hs | 24 +++- src/Simplex/Chat/Messages/CIContent.hs | 3 + src/Simplex/Chat/Store/Groups.hs | 2 +- src/Simplex/Chat/Store/Messages.hs | 112 +++++++++--------- .../SQLite/Migrations/chat_query_plans.txt | 29 ++--- tests/ChatTests/Groups.hs | 37 +++++- 12 files changed, 186 insertions(+), 90 deletions(-) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 8621baaade..6b938aaa4d 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -2206,6 +2206,9 @@ func processReceivedMsg(_ res: ChatEvent) async { m.decreaseGroupReportsCounter(item.deletedChatItem.chatInfo.id) } } + if let updatedChatInfo = items.last?.deletedChatItem.chatInfo { + m.updateChatInfo(updatedChatInfo) + } } case let .groupChatItemsDeleted(user, groupInfo, chatItemIDs, _, member_): await groupChatItemsDeleted(user, groupInfo, chatItemIDs, member_) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 093827ac59..8ce0c50849 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -2277,6 +2277,7 @@ struct ChatView: View { if deletedItem.isActiveReport { m.decreaseGroupReportsCounter(chat.chatInfo.id) } + m.updateChatInfo(itemDeletion.deletedChatItem.chatInfo) } } } @@ -2466,6 +2467,9 @@ private func deleteMessages(_ chat: Chat, _ deletingItems: [Int64], _ mode: CIDe ChatModel.shared.decreaseGroupReportsCounter(chat.chatInfo.id) } } + if let updatedChatInfo = deletedItems.last?.deletedChatItem.chatInfo { + ChatModel.shared.updateChatInfo(updatedChatInfo) + } } await onSuccess() } catch { @@ -2497,6 +2501,9 @@ func archiveReports(_ chatInfo: ChatInfo, _ itemIds: [Int64], _ forAll: Bool, _ ChatModel.shared.decreaseGroupReportsCounter(chatInfo.id) } } + if let updatedChatInfo = deleted.last?.deletedChatItem.chatInfo { + ChatModel.shared.updateChatInfo(updatedChatInfo) + } } await onSuccess() } catch { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index c3b681dbc7..7cb2d9fe5e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -2533,6 +2533,11 @@ object ChatController { } } } + r.chatItemDeletions.lastOrNull()?.deletedChatItem?.chatInfo?.let { updatedChatInfo -> + withContext(Dispatchers.Main) { + chatModel.chatsContext.updateChatInfo(rhId, updatedChatInfo) + } + } } is CR.GroupChatItemsDeleted -> { groupChatItemsDeleted(rhId, r) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index c51b5ff622..2ca0dcc35d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -455,6 +455,7 @@ fun ChatView( if (deletedItem.isActiveReport) { chatModel.chatsContext.decreaseGroupReportsCounter(chatRh, chatInfo.id) } + chatModel.chatsContext.updateChatInfo(chatRh, deleted.deletedChatItem.chatInfo) } withContext(Dispatchers.Main) { if (toChatItem != null) { @@ -2672,6 +2673,9 @@ private fun deleteMessages(chatRh: Long?, chatInfo: ChatInfo, itemIds: List + chatModel.chatsContext.updateChatInfo(chatRh, updatedChatInfo) + } } withContext(Dispatchers.Main) { for (di in deleted) { @@ -2712,6 +2716,9 @@ private fun archiveReports(chatRh: Long?, chatInfo: ChatInfo, itemIds: List + chatModel.chatsContext.updateChatInfo(chatRh, updatedChatInfo) + } } withContext(Dispatchers.Main) { for (di in deleted) { diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 79714af0ec..20f9468cd6 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -1032,8 +1032,9 @@ processChatCommand' vr = \case user <- getUserByGroupId db chatId gInfo <- getGroupInfo db vr user chatId pure (user, gInfo) + chatScopeInfo <- mapM (getChatScopeInfo vr user) scope (timedItems, gInfo') <- withFastStore $ \db -> do - (timedItems, gInfo') <- updateGroupChatItemsReadList db vr user gInfo scope itemIds + (timedItems, gInfo') <- updateGroupChatItemsReadList db vr user gInfo chatScopeInfo itemIds timedItems' <- liftIO $ setGroupChatItemsDeleteAt db user chatId timedItems =<< getCurrentTime pure (timedItems', gInfo') forM_ timedItems $ \(itemId, deleteAt) -> startProximateTimedItemThread user (chatRef, itemId) deleteAt @@ -2239,7 +2240,7 @@ processChatCommand' vr = \case deleted = deleted1 <> deleted2 <> deleted3 <> deleted4 -- Read group info with updated membersRequireAttention gInfo' <- withFastStore $ \db -> getGroupInfo db vr user groupId - let acis' = map (updateCIGroupInfo gInfo') acis + let acis' = map (updateACIGroupInfo gInfo') acis unless (null acis') $ toView $ CEvtNewChatItems user acis' unless (null errs) $ toView $ CEvtChatErrors errs when withMessages $ deleteMessages user gInfo' deleted @@ -2299,11 +2300,6 @@ processChatCommand' vr = \case -- instead we re-read it once after deleting all members before response. void $ deleteOrUpdateMemberRecordIO db user gInfo m pure m {memberStatus = GSMemRemoved} - updateCIGroupInfo :: GroupInfo -> AChatItem -> AChatItem - updateCIGroupInfo gInfo' = \case - AChatItem SCTGroup SMDSnd (GroupChat _gInfo chatScopeInfo) ci -> - AChatItem SCTGroup SMDSnd (GroupChat gInfo' chatScopeInfo) ci - aci -> aci deleteMessages user gInfo@GroupInfo {membership} ms | groupFeatureMemberAllowed SGFFullDelete membership gInfo = deleteGroupMembersCIs user gInfo ms membership | otherwise = markGroupMembersCIsDeleted user gInfo ms membership diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index d3a0e6e59f..bdc5e4b920 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -37,7 +37,7 @@ import Data.Foldable (foldr') import Data.Functor (($>)) import Data.Functor.Identity import Data.Int (Int64) -import Data.List (find, mapAccumL, partition) +import Data.List (find, foldl', mapAccumL, partition) import Data.List.NonEmpty (NonEmpty (..), (<|)) import qualified Data.List.NonEmpty as L import Data.Map.Strict (Map) @@ -459,7 +459,14 @@ deleteGroupCIs user gInfo chatScopeInfo items byGroupMember_ deletedTs = do deleteCIFiles user ciFilesInfo (errs, deletions) <- lift $ partitionEithers <$> withStoreBatch' (\db -> map (deleteItem db) items) unless (null errs) $ toView $ CEvtChatErrors errs - pure deletions + vr <- chatVersionRange + deletions' <- case chatScopeInfo of + Nothing -> pure deletions + Just scopeInfo@GCSIMemberSupport {groupMember_} -> do + let decStats = countDeletedUnreadItems groupMember_ deletions + gInfo' <- withFastStore' $ \db -> updateGroupScopeUnreadStats db vr user gInfo scopeInfo decStats + pure $ map (updateDeletionGroupInfo gInfo') deletions + pure deletions' where deleteItem :: DB.Connection -> CChatItem 'CTGroup -> IO ChatItemDeletion deleteItem db (CChatItem md ci) = do @@ -467,6 +474,32 @@ deleteGroupCIs user gInfo chatScopeInfo items byGroupMember_ deletedTs = do Just m -> Just <$> updateGroupChatItemModerated db user gInfo ci m deletedTs Nothing -> Nothing <$ deleteGroupChatItem db user gInfo ci pure $ groupDeletion md gInfo chatScopeInfo ci ci' + countDeletedUnreadItems :: Maybe GroupMember -> [ChatItemDeletion] -> (Int, Int, Int) + countDeletedUnreadItems scopeMember_ = foldl' countItem (0, 0, 0) + where + countItem :: (Int, Int, Int) -> ChatItemDeletion -> (Int, Int, Int) + countItem (!unread, !unanswered, !mentions) ChatItemDeletion {deletedChatItem} + | aChatItemIsRcvNew deletedChatItem = + let unread' = unread + 1 + unanswered' = case (scopeMember_, aChatItemRcvFromMember deletedChatItem) of + (Just scopeMember, Just rcvFromMember) + | groupMemberId' rcvFromMember == groupMemberId' scopeMember -> unanswered + 1 + _ -> unanswered + mentions' = if isACIUserMention deletedChatItem then mentions + 1 else mentions + in (unread', unanswered', mentions') + | otherwise = (unread, unanswered, mentions) + updateDeletionGroupInfo :: GroupInfo -> ChatItemDeletion -> ChatItemDeletion + updateDeletionGroupInfo gInfo' ChatItemDeletion {deletedChatItem, toChatItem} = + ChatItemDeletion + { deletedChatItem = updateACIGroupInfo gInfo' deletedChatItem, + toChatItem = updateACIGroupInfo gInfo' <$> toChatItem + } + +updateACIGroupInfo :: GroupInfo -> AChatItem -> AChatItem +updateACIGroupInfo gInfo' = \case + AChatItem SCTGroup dir (GroupChat _gInfo chatScopeInfo) ci -> + AChatItem SCTGroup dir (GroupChat gInfo' chatScopeInfo) ci + aci -> aci deleteGroupMemberCIs :: MsgDirectionI d => User -> GroupInfo -> GroupMember -> GroupMember -> SMsgDirection d -> CM () deleteGroupMemberCIs user gInfo member byGroupMember msgDir = do diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs index 9a8dc786cd..dfd37527d1 100644 --- a/src/Simplex/Chat/Messages.hs +++ b/src/Simplex/Chat/Messages.hs @@ -215,6 +215,9 @@ data CIMentionMember = CIMentionMember } deriving (Eq, Show) +isACIUserMention :: AChatItem -> Bool +isACIUserMention (AChatItem _ _ _ ci) = isUserMention ci + isUserMention :: ChatItem c d -> Bool isUserMention ChatItem {meta = CIMeta {userMention}} = userMention @@ -295,6 +298,16 @@ chatItemMember GroupInfo {membership} ChatItem {chatDir} = case chatDir of CIGroupSnd -> membership CIGroupRcv m -> m +chatItemRcvFromMember :: ChatItem c d -> Maybe GroupMember +chatItemRcvFromMember ChatItem {chatDir} = case chatDir of + CIGroupRcv m -> Just m + _ -> Nothing + +chatItemIsRcvNew :: ChatItem c d -> Bool +chatItemIsRcvNew ChatItem {meta = CIMeta {itemStatus}} = case itemStatus of + CISRcvNew -> True + _ -> False + ciReactionAllowed :: ChatItem c d -> Bool ciReactionAllowed ChatItem {meta = CIMeta {itemDeleted = Just _}} = False ciReactionAllowed ChatItem {content} = isJust $ ciMsgContent content @@ -395,6 +408,12 @@ aChatItemTs (AChatItem _ _ _ ci) = chatItemTs' ci aChatItemDir :: AChatItem -> MsgDirection aChatItemDir (AChatItem _ sMsgDir _ _) = toMsgDirection sMsgDir +aChatItemRcvFromMember :: AChatItem -> Maybe GroupMember +aChatItemRcvFromMember (AChatItem _ _ _ ci) = chatItemRcvFromMember ci + +aChatItemIsRcvNew :: AChatItem -> Bool +aChatItemIsRcvNew (AChatItem _ _ _ ci) = chatItemIsRcvNew ci + updateFileStatus :: forall c d. ChatItem c d -> CIFileStatus d -> ChatItem c d updateFileStatus ci@ChatItem {file} status = case file of Just f -> ci {file = Just (f :: CIFile d) {fileStatus = status}} @@ -966,7 +985,10 @@ ciStatusNew = case msgDirection @d of ciCreateStatus :: forall d. MsgDirectionI d => CIContent d -> CIStatus d ciCreateStatus content = case msgDirection @d of SMDSnd -> ciStatusNew - SMDRcv -> if ciRequiresAttention content then ciStatusNew else CISRcvRead + SMDRcv + | isCIReport content -> CISRcvRead + | ciRequiresAttention content -> ciStatusNew + | otherwise -> CISRcvRead membersGroupItemStatus :: [(GroupSndStatus, Int)] -> CIStatus 'MDSnd membersGroupItemStatus memStatusCounts diff --git a/src/Simplex/Chat/Messages/CIContent.hs b/src/Simplex/Chat/Messages/CIContent.hs index cc2f97ac44..cc6529831c 100644 --- a/src/Simplex/Chat/Messages/CIContent.hs +++ b/src/Simplex/Chat/Messages/CIContent.hs @@ -182,6 +182,9 @@ ciMsgContent = \case CIRcvMsgContent mc -> Just mc _ -> Nothing +isCIReport :: CIContent d -> Bool +isCIReport = maybe False isReport . ciMsgContent + data MsgDecryptError = MDERatchetHeader | MDETooManySkipped diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index 4470641491..6c66ea0e64 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -1233,7 +1233,7 @@ updateGroupMemberAccepted db User {userId} m@GroupMember {groupMemberId} status pure m {memberStatus = status, memberRole = role, updatedAt = currentTs} deleteGroupMemberSupportChat :: DB.Connection -> User -> GroupInfo -> GroupMember -> IO (GroupInfo, GroupMember) -deleteGroupMemberSupportChat db user@User {userId} g@GroupInfo {groupId, membersRequireAttention} m@GroupMember {groupMemberId, supportChat} = do +deleteGroupMemberSupportChat db user g m@GroupMember {groupMemberId} = do let requiredAttention = gmRequiresAttention m currentTs <- getCurrentTime DB.execute diff --git a/src/Simplex/Chat/Store/Messages.hs b/src/Simplex/Chat/Store/Messages.hs index d6affc4f12..a9bd03ed0e 100644 --- a/src/Simplex/Chat/Store/Messages.hs +++ b/src/Simplex/Chat/Store/Messages.hs @@ -80,6 +80,7 @@ module Simplex.Chat.Store.Messages updateGroupChatItemsRead, getGroupUnreadTimedItems, updateGroupChatItemsReadList, + updateGroupScopeUnreadStats, setGroupChatItemsDeleteAt, updateLocalChatItemsRead, getChatRefViaItemId, @@ -2018,13 +2019,17 @@ getGroupUnreadTimedItems db User {userId} groupId = |] (userId, groupId, CISRcvNew) -updateGroupChatItemsReadList :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> Maybe GroupChatScope -> NonEmpty ChatItemId -> ExceptT StoreError IO ([(ChatItemId, Int)], GroupInfo) -updateGroupChatItemsReadList db vr user@User {userId} g@GroupInfo {groupId, membership, membersRequireAttention} scope itemIds = do +updateGroupChatItemsReadList :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> Maybe GroupChatScopeInfo -> NonEmpty ChatItemId -> ExceptT StoreError IO ([(ChatItemId, Int)], GroupInfo) +updateGroupChatItemsReadList db vr user@User {userId} g@GroupInfo {groupId} scopeInfo_ itemIds = do currentTs <- liftIO getCurrentTime -- Possible improvement is to differentiate retrieval queries for each scope, -- but we rely on UI to not pass item IDs from incorrect scope. readItemsData <- liftIO $ catMaybes . L.toList <$> mapM (getUpdateGroupItem currentTs) itemIds - g' <- updateChatStats readItemsData + g' <- case scopeInfo_ of + Nothing -> pure g + Just scopeInfo@GCSIMemberSupport {groupMember_} -> do + let decStats = countReadItems groupMember_ readItemsData + liftIO $ updateGroupScopeUnreadStats db vr user g scopeInfo decStats pure (timedItems readItemsData, g') where getUpdateGroupItem :: UTCTime -> ChatItemId -> IO (Maybe (ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt)) @@ -2038,67 +2043,58 @@ updateGroupChatItemsReadList db vr user@User {userId} g@GroupInfo {groupId, memb RETURNING chat_item_id, timed_ttl, timed_delete_at, group_member_id, user_mention |] (CISRcvRead, currentTs, userId, groupId, CISRcvNew, itemId) - updateChatStats :: [(ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt)] -> ExceptT StoreError IO GroupInfo - updateChatStats readItemsData = case scope of - Nothing -> pure g - Just GCSMemberSupport {groupMemberId_} -> case groupMemberId_ of - Nothing -> do - membership' <- updateGMStats membership - pure g {membership = membership'} - Just groupMemberId -> do - member <- getGroupMemberById db vr user groupMemberId - member' <- updateGMStats member - let didRequire = gmRequiresAttention member - nowRequires = gmRequiresAttention member' - if (not nowRequires && didRequire) - then do - liftIO $ - DB.execute - db - [sql| - UPDATE groups - SET members_require_attention = members_require_attention - 1 - WHERE user_id = ? AND group_id = ? - |] - (userId, groupId) - pure g {membersRequireAttention = membersRequireAttention - 1} - else - pure g - where - updateGMStats GroupMember {groupMemberId} = do - let unread = length readItemsData - (unanswered, mentions) = decStats - liftIO $ - DB.execute - db - [sql| - UPDATE group_members - SET support_chat_items_unread = support_chat_items_unread - ?, - support_chat_items_member_attention = support_chat_items_member_attention - ?, - support_chat_items_mentions = support_chat_items_mentions - ? - WHERE group_member_id = ? - |] - (unread, unanswered, mentions, groupMemberId) - getGroupMemberById db vr user groupMemberId - where - decStats :: (Int, Int) - decStats = foldl' countItem (0, 0) readItemsData - where - countItem :: (Int, Int) -> (ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt) -> (Int, Int) - countItem (!unanswered, !mentions) (_, _, _, itemGMId_, userMention_) = - let unanswered' = case (groupMemberId_, itemGMId_) of - (Just scopeGMId, Just itemGMId) | itemGMId == scopeGMId -> unanswered + 1 - _ -> unanswered - mentions' = case userMention_ of - Just (BI True) -> mentions + 1 - _ -> mentions - in (unanswered', mentions') + countReadItems :: Maybe GroupMember -> [(ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt)] -> (Int, Int, Int) + countReadItems scopeMember_ readItemsData = + let unread = length readItemsData + (unanswered, mentions) = foldl' countItem (0, 0) readItemsData + in (unread, unanswered, mentions) + where + countItem :: (Int, Int) -> (ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt) -> (Int, Int) + countItem (!unanswered, !mentions) (_, _, _, itemGMId_, userMention_) = + let unanswered' = case (scopeMember_, itemGMId_) of + (Just scopeMember, Just itemGMId) | itemGMId == groupMemberId' scopeMember -> unanswered + 1 + _ -> unanswered + mentions' = case userMention_ of + Just (BI True) -> mentions + 1 + _ -> mentions + in (unanswered', mentions') timedItems :: [(ChatItemId, Maybe Int, Maybe UTCTime, Maybe GroupMemberId, Maybe BoolInt)] -> [(ChatItemId, Int)] timedItems = foldl' addTimedItem [] where addTimedItem acc (itemId, Just ttl, Nothing, _, _) = (itemId, ttl) : acc addTimedItem acc _ = acc +updateGroupScopeUnreadStats :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> GroupChatScopeInfo -> (Int, Int, Int) -> IO GroupInfo +updateGroupScopeUnreadStats db vr user g@GroupInfo {membership} scopeInfo (unread, unanswered, mentions) = + case scopeInfo of + GCSIMemberSupport {groupMember_} -> case groupMember_ of + Nothing -> do + membership' <- updateGMStats membership + pure g {membership = membership'} + Just member -> do + member' <- updateGMStats member + let didRequire = gmRequiresAttention member + nowRequires = gmRequiresAttention member' + if (not nowRequires && didRequire) + then decreaseGroupMembersRequireAttention db user g + else pure g + where + updateGMStats m@GroupMember {groupMemberId} = do + currentTs <- getCurrentTime + DB.execute + db + [sql| + UPDATE group_members + SET support_chat_items_unread = support_chat_items_unread - ?, + support_chat_items_member_attention = support_chat_items_member_attention - ?, + support_chat_items_mentions = support_chat_items_mentions - ?, + updated_at = ? + WHERE group_member_id = ? + |] + (unread, unanswered, mentions, currentTs, groupMemberId) + m_ <- runExceptT $ getGroupMemberById db vr user groupMemberId + pure $ either (const m) id m_ -- Left shouldn't happen, but types require it + deriving instance Show BoolInt setGroupChatItemsDeleteAt :: DB.Connection -> User -> GroupId -> [(ChatItemId, Int)] -> UTCTime -> IO [(ChatItemId, UTCTime)] diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index cf3c3fb206..b0e98856d9 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -1,21 +1,3 @@ -Query: - UPDATE groups - SET members_require_attention = members_require_attention - 1 - WHERE user_id = ? AND group_id = ? - -Plan: -SEARCH groups USING INTEGER PRIMARY KEY (rowid=?) - -Query: - UPDATE group_members - SET support_chat_items_unread = support_chat_items_unread - ?, - support_chat_items_member_attention = support_chat_items_member_attention - ?, - support_chat_items_mentions = support_chat_items_mentions - ? - WHERE group_member_id = ? - -Plan: -SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) - Query: UPDATE groups SET chat_ts = ?, @@ -1321,6 +1303,17 @@ Query: Plan: SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) +Query: + UPDATE group_members + SET support_chat_items_unread = support_chat_items_unread - ?, + support_chat_items_member_attention = support_chat_items_member_attention - ?, + support_chat_items_mentions = support_chat_items_mentions - ?, + updated_at = ? + WHERE group_member_id = ? + +Plan: +SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) + Query: UPDATE group_profiles SET display_name = ?, full_name = ?, description = ?, image = ?, preferences = ?, member_admission = ?, updated_at = ? diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index d1588ce6fb..1cf6d0d0d6 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -196,7 +196,8 @@ chatGroupTests = do it "should send scoped messages to support (single moderator)" testScopedSupportSingleModerator it "should send scoped messages to support (many moderators)" testScopedSupportManyModerators it "should send messages to admins and members" testSupportCLISendCommand - it "should correctly maintain unread stats for support chats" testScopedSupportUnreadStats + it "should correctly maintain unread stats for support chats on reading chat items" testScopedSupportUnreadStatsOnRead + it "should correctly maintain unread stats for support chats on deleting chat items" testScopedSupportUnreadStatsOnDelete testGroupCheckMessages :: HasCallStack => TestParams -> IO () testGroupCheckMessages = @@ -7009,8 +7010,8 @@ testSupportCLISendCommand = bob ##> "#team (support 4" bob <## "bad chat command: Failed reading: empty" -testScopedSupportUnreadStats :: HasCallStack => TestParams -> IO () -testScopedSupportUnreadStats = +testScopedSupportUnreadStatsOnRead :: HasCallStack => TestParams -> IO () +testScopedSupportUnreadStatsOnRead = testChatOpts4 opts aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do createGroup4 "team" alice (bob, GRMember) (cath, GRMember) (dan, GRModerator) @@ -7149,3 +7150,33 @@ testScopedSupportUnreadStats = { markRead = False } +testScopedSupportUnreadStatsOnDelete :: HasCallStack => TestParams -> IO () +testScopedSupportUnreadStatsOnDelete = + testChatOpts2 opts aliceProfile bobProfile $ \alice bob -> do + createGroup2 "team" alice bob + + alice ##> "/set delete #team on" + alice <## "updated group preferences:" + alice <## "Full deletion: on" + bob <## "alice updated group #team:" + bob <## "updated group preferences:" + bob <## "Full deletion: on" + + bob #> "#team (support) 1" + alice <# "#team (support: bob) bob> 1" + + msgIdBob <- lastItemId bob + + alice ##> "/member support chats #team" + alice <## "bob (Bob) (id 2): unread: 1, require attention: 1, mentions: 0" + + bob #$> ("/_delete item #1(_support) " <> msgIdBob <> " broadcast", id, "message deleted") + alice <# "#team (support: bob) bob> [deleted] 1" + + alice ##> "/member support chats #team" + alice <## "bob (Bob) (id 2): unread: 0, require attention: 0, mentions: 0" + where + opts = + testOpts + { markRead = False + } From 0e99e8010ad31de65aa8c0fc471c6692b7549ef7 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Wed, 21 May 2025 10:12:53 +0100 Subject: [PATCH 14/14] core: 6.4.0.2 (simplexmq 6.4.0.4) --- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- simplex-chat.cabal | 2 +- src/Simplex/Chat/Controller.hs | 2 +- src/Simplex/Chat/Remote.hs | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cabal.project b/cabal.project index 44305353f2..48b75a86cd 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: f44ea0a6d8eec8abf4af177ebeb91629f7d89165 + tag: d352d518c2b3a42bc7a298954dde799422e1457f source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 0c29b47a36..68a6054ef0 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."f44ea0a6d8eec8abf4af177ebeb91629f7d89165" = "1biq1kq33v7hnacbhllry9n5c6dmh9dyqnz8hc5abgsv1z38qb1a"; + "https://github.com/simplex-chat/simplexmq.git"."d352d518c2b3a42bc7a298954dde799422e1457f" = "1rha84pfpaqx3mf218szkfra334vhijqf17hanxqmp1sicfbf1x3"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 7b09e9c926..553f2ec6cd 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 6.4.0.1 +version: 6.4.0.2 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 753e4543d6..97bf26fd84 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -841,7 +841,7 @@ data ChatEvent | CEvtRemoteHostConnected {remoteHost :: RemoteHostInfo} | CEvtRemoteHostStopped {remoteHostId_ :: Maybe RemoteHostId, rhsState :: RemoteHostSessionState, rhStopReason :: RemoteHostStopReason} | CEvtRemoteCtrlFound {remoteCtrl :: RemoteCtrlInfo, ctrlAppInfo_ :: Maybe CtrlAppInfo, appVersion :: AppVersion, compatible :: Bool} - | CEvtRemoteCtrlSessionCode {remoteCtrl_ :: Maybe RemoteCtrlInfo, sessionCode :: Text} + | CEvtRemoteCtrlSessionCode {remoteCtrl_ :: Maybe RemoteCtrlInfo, sessionCode :: Text} | CEvtRemoteCtrlStopped {rcsState :: RemoteCtrlSessionState, rcStopReason :: RemoteCtrlStopReason} | CEvtContactPQEnabled {user :: User, contact :: Contact, pqEnabled :: PQEncryption} | CEvtContactDisabled {user :: User, contact :: Contact} diff --git a/src/Simplex/Chat/Remote.hs b/src/Simplex/Chat/Remote.hs index b71b103919..f6c94badfe 100644 --- a/src/Simplex/Chat/Remote.hs +++ b/src/Simplex/Chat/Remote.hs @@ -75,11 +75,11 @@ remoteFilesFolder = "simplex_v1_files" -- when acting as host minRemoteCtrlVersion :: AppVersion -minRemoteCtrlVersion = AppVersion [6, 4, 0, 1] +minRemoteCtrlVersion = AppVersion [6, 4, 0, 2] -- when acting as controller minRemoteHostVersion :: AppVersion -minRemoteHostVersion = AppVersion [6, 4, 0, 1] +minRemoteHostVersion = AppVersion [6, 4, 0, 2] currentAppVersion :: AppVersion currentAppVersion = AppVersion SC.version