Compare commits

..

20 Commits

Author SHA1 Message Date
Evgeny Poberezkin 09f916b5e4 Merge branch 'master' into master-android 2024-12-07 16:02:12 +00:00
Evgeny Poberezkin ea4927c9b0 core: 6.2.0.7 updated version 2024-12-07 16:01:57 +00:00
Evgeny fe0d811bf7 ui: operator information (#5343)
* ios: operator information

* android, desktop: operator information

* move texts, simplify navigation
2024-12-07 14:41:54 +00:00
Evgeny Poberezkin 554cfbfcc7 Merge branch 'master' into master-android 2024-12-07 14:40:58 +00:00
Evgeny Poberezkin cbb3da8f83 core: 6.2.0.7 (simplexmq: 6.2.0.7) 2024-12-07 14:40:35 +00:00
Stanislav Dmitrenko 83f0bd9fd3 android, desktop: onboarding button multiline layout (#5348)
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-12-07 14:24:14 +00:00
Diogo 615c483912 android: onboarding small design adjustments (#5346)
* android: onboarding small design adjustments

* bigger

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-12-07 14:20:01 +00:00
spaced4ndy e0c2272fcb android, desktop: operators info on onboarding (#5341) 2024-12-06 21:35:10 +04:00
spaced4ndy 362581432c ios: export localizations, add translations (#5339)
* ios: export localizations, add translations

* import
2024-12-06 16:01:55 +00:00
Diogo df1a471c56 ios: remove all unsafe warnings in group preferences save (#5340) 2024-12-06 19:55:15 +04:00
Diogo 7d43a43e82 ios: ask for confirmation of save on contact preferences sheet dismiss (#5337) 2024-12-06 18:44:56 +04:00
spaced4ndy ae8ad5c639 ios: operators info on onboarding (#5336) 2024-12-06 17:49:57 +04:00
spaced4ndy 1408d75eb3 ios: use async getServerOperators api (#5334) 2024-12-06 17:21:55 +04:00
spaced4ndy f408988035 ios: fix oneHandUI setting becoming enabled on import (#5335) 2024-12-06 13:05:39 +00:00
spaced4ndy 945c5015d8 ui: improve pending connection texts (#5333)
* ui: improve contact request text

* android

* ternary

* shorter

* kotlin

* change

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
2024-12-06 15:35:26 +04:00
Diogo 2e431c5afa ios: fix some real time updates in group members (#5332)
* ios: fix some real time updates in group members

* use chat instead of binding for group info updates
2024-12-06 11:10:52 +00:00
Diogo 924273191e ios: ask for confirmation of save on group preferences sheet dismiss (#5327)
* ios: ask for confirmation of save on group preferences sheet dismiss

* fix exit without saving temporary state and also apply fix on dismiss during group creation
2024-12-06 10:21:58 +00:00
Evgeny Poberezkin 9b82cc3303 core: fix feature items when updating preferences in business chats 2024-12-06 10:18:48 +00:00
Evgeny Poberezkin 19e2cebd68 android, desktop: remove footer in Run chat section when chat is running 2024-12-06 01:16:42 +00:00
Evgeny Poberezkin eff4f2f603 Merge branch 'master' into master-android 2024-12-05 18:36:19 +00:00
93 changed files with 943 additions and 608 deletions
+9 -2
View File
@@ -519,7 +519,14 @@ func testProtoServer(server: String) async throws -> Result<(), ProtocolTestFail
throw r
}
func getServerOperators() throws -> ServerOperatorConditions {
func getServerOperators() async throws -> ServerOperatorConditions {
let r = await chatSendCmd(.apiGetServerOperators)
if case let .serverOperatorConditions(conditions) = r { return conditions }
logger.error("getServerOperators error: \(String(describing: r))")
throw r
}
func getServerOperatorsSync() throws -> ServerOperatorConditions {
let r = chatSendCmdSync(.apiGetServerOperators)
if case let .serverOperatorConditions(conditions) = r { return conditions }
logger.error("getServerOperators error: \(String(describing: r))")
@@ -1599,7 +1606,7 @@ func initializeChat(start: Bool, confirmStart: Bool = false, dbKey: String? = ni
try apiSetEncryptLocalFiles(privacyEncryptLocalFilesGroupDefault.get())
m.chatInitialized = true
m.currentUser = try apiGetActiveUser()
m.conditions = try getServerOperators()
m.conditions = try getServerOperatorsSync()
if shouldImportAppSettingsDefault.get() {
do {
let appSettings = try apiGetAppSettings(settings: AppSettings.current.prepareForExport())
+34 -2
View File
@@ -96,6 +96,8 @@ struct ChatInfoView: View {
@ObservedObject var chat: Chat
@State var contact: Contact
@State var localAlias: String
@State var featuresAllowed: ContactFeaturesAllowed
@State var currentFeaturesAllowed: ContactFeaturesAllowed
var onSearch: () -> Void
@State private var connectionStats: ConnectionStats? = nil
@State private var customUserProfile: Profile? = nil
@@ -327,6 +329,16 @@ struct ChatInfoView: View {
$0.content
}
}
.onDisappear {
if currentFeaturesAllowed != featuresAllowed {
showAlert(
title: NSLocalizedString("Save preferences?", comment: "alert title"),
buttonTitle: NSLocalizedString("Save and notify contact", comment: "alert button"),
buttonAction: { savePreferences() },
cancelButton: true
)
}
}
}
private func contactInfoHeader() -> some View {
@@ -447,8 +459,9 @@ struct ChatInfoView: View {
NavigationLink {
ContactPreferencesView(
contact: $contact,
featuresAllowed: contactUserPrefsToFeaturesAllowed(contact.mergedPreferences),
currentFeaturesAllowed: contactUserPrefsToFeaturesAllowed(contact.mergedPreferences)
featuresAllowed: $featuresAllowed,
currentFeaturesAllowed: $currentFeaturesAllowed,
savePreferences: savePreferences
)
.navigationBarTitle("Contact preferences")
.modifier(ThemedBackground(grouped: true))
@@ -617,6 +630,23 @@ struct ChatInfoView: View {
}
}
}
private func savePreferences() {
Task {
do {
let prefs = contactFeaturesAllowedToPrefs(featuresAllowed)
if let toContact = try await apiSetContactPrefs(contactId: contact.contactId, preferences: prefs) {
await MainActor.run {
contact = toContact
chatModel.updateContact(toContact)
currentFeaturesAllowed = featuresAllowed
}
}
} catch {
logger.error("ContactPreferencesView apiSetContactPrefs error: \(responseError(error))")
}
}
}
}
struct AudioCallButton: View {
@@ -1173,6 +1203,8 @@ struct ChatInfoView_Previews: PreviewProvider {
chat: Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: []),
contact: Contact.sampleData,
localAlias: "",
featuresAllowed: contactUserPrefsToFeaturesAllowed(Contact.sampleData.mergedPreferences),
currentFeaturesAllowed: contactUserPrefsToFeaturesAllowed(Contact.sampleData.mergedPreferences),
onSearch: {}
)
}
+10 -1
View File
@@ -133,7 +133,12 @@ struct ChatView: View {
.appSheet(item: $selectedMember) { member in
Group {
if case let .group(groupInfo) = chat.chatInfo {
GroupMemberInfoView(groupInfo: groupInfo, groupMember: member, navigation: true)
GroupMemberInfoView(
groupInfo: groupInfo,
chat: chat,
groupMember: member,
navigation: true
)
}
}
}
@@ -226,6 +231,8 @@ struct ChatView: View {
chat: chat,
contact: contact,
localAlias: chat.chatInfo.localAlias,
featuresAllowed: contactUserPrefsToFeaturesAllowed(contact.mergedPreferences),
currentFeaturesAllowed: contactUserPrefsToFeaturesAllowed(contact.mergedPreferences),
onSearch: { focusSearch() }
)
}
@@ -1122,6 +1129,7 @@ struct ChatView: View {
} else {
let mem = GMember.init(member)
m.groupMembers.append(mem)
m.groupMembersIndexes[member.groupMemberId] = m.groupMembers.count - 1
selectedMember = mem
}
}
@@ -1877,6 +1885,7 @@ struct ReactionContextMenu: View {
} else {
let member = GMember.init(mem)
m.groupMembers.append(member)
m.groupMembersIndexes[member.groupMemberId] = m.groupMembers.count - 1
selectedMember = member
}
} label: {
@@ -14,9 +14,10 @@ struct ContactPreferencesView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@Binding var contact: Contact
@State var featuresAllowed: ContactFeaturesAllowed
@State var currentFeaturesAllowed: ContactFeaturesAllowed
@Binding var featuresAllowed: ContactFeaturesAllowed
@Binding var currentFeaturesAllowed: ContactFeaturesAllowed
@State private var showSaveDialogue = false
let savePreferences: () -> Void
var body: some View {
let user: User = chatModel.currentUser!
@@ -48,7 +49,10 @@ struct ContactPreferencesView: View {
savePreferences()
dismiss()
}
Button("Exit without saving") { dismiss() }
Button("Exit without saving") {
featuresAllowed = currentFeaturesAllowed
dismiss()
}
}
}
@@ -118,31 +122,15 @@ struct ContactPreferencesView: View {
private func featureFooter(_ feature: ChatFeature, _ enabled: FeatureEnabled) -> some View {
Text(feature.enabledDescription(enabled))
}
private func savePreferences() {
Task {
do {
let prefs = contactFeaturesAllowedToPrefs(featuresAllowed)
if let toContact = try await apiSetContactPrefs(contactId: contact.contactId, preferences: prefs) {
await MainActor.run {
contact = toContact
chatModel.updateContact(toContact)
currentFeaturesAllowed = featuresAllowed
}
}
} catch {
logger.error("ContactPreferencesView apiSetContactPrefs error: \(responseError(error))")
}
}
}
}
struct ContactPreferencesView_Previews: PreviewProvider {
static var previews: some View {
ContactPreferencesView(
contact: Binding.constant(Contact.sampleData),
featuresAllowed: ContactFeaturesAllowed.sampleData,
currentFeaturesAllowed: ContactFeaturesAllowed.sampleData
featuresAllowed: Binding.constant(ContactFeaturesAllowed.sampleData),
currentFeaturesAllowed: Binding.constant(ContactFeaturesAllowed.sampleData),
savePreferences: {}
)
}
}
@@ -78,7 +78,12 @@ struct AddGroupMembersViewCommon: View {
let count = selectedContacts.count
Section {
if creatingGroup {
groupPreferencesButton($groupInfo, true)
GroupPreferencesButton(
groupInfo: $groupInfo,
preferences: groupInfo.fullGroupPreferences,
currentPreferences: groupInfo.fullGroupPreferences,
creatingGroup: true
)
}
rolePicker()
inviteMembersButton()
@@ -87,7 +87,7 @@ struct GroupChatInfoView: View {
if groupInfo.groupProfile.description != nil || (groupInfo.isOwner && groupInfo.businessChat == nil) {
addOrEditWelcomeMessage()
}
groupPreferencesButton($groupInfo)
GroupPreferencesButton(groupInfo: $groupInfo, preferences: groupInfo.fullGroupPreferences, currentPreferences: groupInfo.fullGroupPreferences)
if members.filter({ $0.wrapped.memberCurrent }).count <= SMALL_GROUPS_RCPS_MEM_LIMIT {
sendReceiptsOption()
} else {
@@ -439,7 +439,7 @@ struct GroupChatInfoView: View {
}
private func memberInfoView(_ groupMember: GMember) -> some View {
GroupMemberInfoView(groupInfo: groupInfo, groupMember: groupMember)
GroupMemberInfoView(groupInfo: groupInfo, chat: chat, groupMember: groupMember)
.navigationBarHidden(false)
}
@@ -654,27 +654,72 @@ func deleteGroupAlertMessage(_ groupInfo: GroupInfo) -> Text {
)
}
func groupPreferencesButton(_ groupInfo: Binding<GroupInfo>, _ creatingGroup: Bool = false) -> some View {
let label: LocalizedStringKey = groupInfo.wrappedValue.businessChat == nil ? "Group preferences" : "Chat preferences"
return NavigationLink {
GroupPreferencesView(
groupInfo: groupInfo,
preferences: groupInfo.wrappedValue.fullGroupPreferences,
currentPreferences: groupInfo.wrappedValue.fullGroupPreferences,
creatingGroup: creatingGroup
)
.navigationBarTitle(label)
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
} label: {
if creatingGroup {
Text("Set group preferences")
} else {
Label(label, systemImage: "switch.2")
struct GroupPreferencesButton: View {
@Binding var groupInfo: GroupInfo
@State var preferences: FullGroupPreferences
@State var currentPreferences: FullGroupPreferences
var creatingGroup: Bool = false
private var label: LocalizedStringKey {
groupInfo.businessChat == nil ? "Group preferences" : "Chat preferences"
}
var body: some View {
NavigationLink {
GroupPreferencesView(
groupInfo: $groupInfo,
preferences: $preferences,
currentPreferences: currentPreferences,
creatingGroup: creatingGroup,
savePreferences: savePreferences
)
.navigationBarTitle(label)
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
.onDisappear {
let saveText = NSLocalizedString(
creatingGroup ? "Save" : "Save and notify group members",
comment: "alert button"
)
if groupInfo.fullGroupPreferences != preferences {
showAlert(
title: NSLocalizedString("Save preferences?", comment: "alert title"),
buttonTitle: saveText,
buttonAction: { savePreferences() },
cancelButton: true
)
}
}
} label: {
if creatingGroup {
Text("Set group preferences")
} else {
Label(label, systemImage: "switch.2")
}
}
}
private func savePreferences() {
Task {
do {
var gp = groupInfo.groupProfile
gp.groupPreferences = toGroupPreferences(preferences)
let gInfo = try await apiUpdateGroup(groupInfo.groupId, gp)
await MainActor.run {
groupInfo = gInfo
ChatModel.shared.updateGroup(gInfo)
currentPreferences = preferences
}
} catch {
logger.error("GroupPreferencesView apiUpdateGroup error: \(responseError(error))")
}
}
}
}
func cantInviteIncognitoAlert() -> Alert {
Alert(
title: Text("Can't invite contacts!"),
@@ -14,6 +14,7 @@ struct GroupMemberInfoView: View {
@EnvironmentObject var theme: AppTheme
@Environment(\.dismiss) var dismiss: DismissAction
@State var groupInfo: GroupInfo
@ObservedObject var chat: Chat
@ObservedObject var groupMember: GMember
var navigation: Bool = false
@State private var connectionStats: ConnectionStats? = nil
@@ -261,6 +262,11 @@ struct GroupMemberInfoView: View {
ProgressView().scaleEffect(2)
}
}
.onChange(of: chat.chatInfo) { c in
if case let .group(gI) = chat.chatInfo {
groupInfo = gI
}
}
.modifier(ThemedBackground(grouped: true))
}
@@ -758,6 +764,7 @@ struct GroupMemberInfoView_Previews: PreviewProvider {
static var previews: some View {
GroupMemberInfoView(
groupInfo: GroupInfo.sampleData,
chat: Chat.sampleData,
groupMember: GMember.sampleData
)
}
@@ -20,9 +20,10 @@ struct GroupPreferencesView: View {
@EnvironmentObject var chatModel: ChatModel
@EnvironmentObject var theme: AppTheme
@Binding var groupInfo: GroupInfo
@State var preferences: FullGroupPreferences
@State var currentPreferences: FullGroupPreferences
@Binding var preferences: FullGroupPreferences
var currentPreferences: FullGroupPreferences
let creatingGroup: Bool
let savePreferences: () -> Void
@State private var showSaveDialogue = false
var body: some View {
@@ -68,7 +69,10 @@ struct GroupPreferencesView: View {
savePreferences()
dismiss()
}
Button("Exit without saving") { dismiss() }
Button("Exit without saving") {
preferences = currentPreferences
dismiss()
}
}
}
@@ -132,32 +136,16 @@ struct GroupPreferencesView: View {
}
}
}
private func savePreferences() {
Task {
do {
var gp = groupInfo.groupProfile
gp.groupPreferences = toGroupPreferences(preferences)
let gInfo = try await apiUpdateGroup(groupInfo.groupId, gp)
await MainActor.run {
groupInfo = gInfo
chatModel.updateGroup(gInfo)
currentPreferences = preferences
}
} catch {
logger.error("GroupPreferencesView apiUpdateGroup error: \(responseError(error))")
}
}
}
}
struct GroupPreferencesView_Previews: PreviewProvider {
static var previews: some View {
GroupPreferencesView(
groupInfo: Binding.constant(GroupInfo.sampleData),
preferences: FullGroupPreferences.sampleData,
preferences: Binding.constant(FullGroupPreferences.sampleData),
currentPreferences: FullGroupPreferences.sampleData,
creatingGroup: false
creatingGroup: false,
savePreferences: {}
)
}
}
@@ -62,7 +62,6 @@ struct ChooseServerOperators: View {
var onboarding: Bool
@State private var serverOperators: [ServerOperator] = []
@State private var selectedOperatorIds = Set<Int64>()
@State private var reviewConditionsNavLinkActive = false
@State private var sheetItem: ChooseServerOperatorsSheet? = nil
@State private var notificationsModeNavLinkActive = false
@State private var justOpened = true
@@ -79,7 +78,7 @@ struct ChooseServerOperators: View {
.frame(maxWidth: .infinity, alignment: .center)
if onboarding {
title.padding(.top, 50)
title.padding(.top, 25)
} else {
title
}
@@ -92,11 +91,14 @@ struct ChooseServerOperators: View {
ForEach(serverOperators) { srvOperator in
operatorCheckView(srvOperator)
}
Text("You can configure servers via settings.")
.font(.footnote)
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity, alignment: .center)
.padding(.horizontal, 32)
VStack {
Text("SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.").padding(.bottom, 8)
Text("You can configure servers via settings.")
}
.font(.footnote)
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity, alignment: .center)
.padding(.horizontal, 16)
Spacer()
@@ -166,8 +168,9 @@ struct ChooseServerOperators: View {
.modifier(ThemedBackground(grouped: true))
}
}
.frame(maxHeight: .infinity, alignment: .top)
}
.frame(maxHeight: .infinity)
.frame(maxHeight: .infinity, alignment: .top)
.padding(onboarding ? 25 : 16)
}
@@ -214,23 +217,15 @@ struct ChooseServerOperators: View {
}
private func reviewConditionsButton() -> some View {
ZStack {
Button {
reviewConditionsNavLinkActive = true
} label: {
Text("Review conditions")
}
.buttonStyle(OnboardingButtonStyle(isDisabled: selectedOperatorIds.isEmpty))
.disabled(selectedOperatorIds.isEmpty)
NavigationLink(isActive: $reviewConditionsNavLinkActive) {
reviewConditionsDestinationView()
} label: {
EmptyView()
}
.frame(width: 1, height: 1)
.hidden()
NavigationLink("Review conditions") {
reviewConditionsView()
.navigationTitle("Conditions of use")
.navigationBarTitleDisplayMode(.large)
.toolbar { ToolbarItem(placement: .navigationBarTrailing, content: conditionsLinkButton) }
.modifier(ThemedBackground(grouped: true))
}
.buttonStyle(OnboardingButtonStyle(isDisabled: selectedOperatorIds.isEmpty))
.disabled(selectedOperatorIds.isEmpty)
}
private func setOperatorsButton() -> some View {
@@ -309,20 +304,12 @@ struct ChooseServerOperators: View {
.modifier(ThemedBackground())
}
private func reviewConditionsDestinationView() -> some View {
reviewConditionsView()
.navigationTitle("Conditions of use")
.navigationBarTitleDisplayMode(.large)
.toolbar { ToolbarItem(placement: .navigationBarTrailing, content: conditionsLinkButton) }
.modifier(ThemedBackground(grouped: true))
}
@ViewBuilder private func reviewConditionsView() -> some View {
let operatorsWithConditionsAccepted = ChatModel.shared.conditions.serverOperators.filter { $0.conditionsAcceptance.conditionsAccepted }
let acceptForOperators = selectedOperators.filter { !$0.conditionsAcceptance.conditionsAccepted }
VStack(alignment: .leading, spacing: 20) {
if !operatorsWithConditionsAccepted.isEmpty {
Text("Conditions are already accepted for following operator(s): **\(operatorsWithConditionsAccepted.map { $0.legalName_ }.joined(separator: ", "))**.")
Text("Conditions are already accepted for these operator(s): **\(operatorsWithConditionsAccepted.map { $0.legalName_ }.joined(separator: ", "))**.")
Text("The same conditions will apply to operator(s): **\(acceptForOperators.map { $0.legalName_ }.joined(separator: ", "))**.")
} else {
Text("Conditions will be accepted for operator(s): **\(acceptForOperators.map { $0.legalName_ }.joined(separator: ", "))**.")
@@ -409,26 +396,53 @@ struct ChooseServerOperators: View {
let operatorsPostLink = URL(string: "https://simplex.chat/blog/20241125-servers-operated-by-flux-true-privacy-and-decentralization-for-all-users.html")!
struct ChooseServerOperatorsInfoView: View {
@Environment(\.colorScheme) var colorScheme: ColorScheme
@EnvironmentObject var theme: AppTheme
var body: some View {
VStack(alignment: .leading) {
Text("Server operators")
.font(.largeTitle)
.bold()
.padding(.vertical)
ScrollView {
VStack(alignment: .leading) {
Group {
Text("The app protects your privacy by using different operators in each conversation.")
Text("When more than one operator is enabled, none of them has metadata to learn who communicates with whom.")
Text("For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server.")
NavigationView {
List {
VStack(alignment: .leading, spacing: 12) {
Text("The app protects your privacy by using different operators in each conversation.")
Text("When more than one operator is enabled, none of them has metadata to learn who communicates with whom.")
Text("For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server.")
}
.fixedSize(horizontal: false, vertical: true)
.listRowBackground(Color.clear)
.listRowSeparator(.hidden)
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
.padding(.top)
Section {
ForEach(ChatModel.shared.conditions.serverOperators) { op in
operatorInfoNavLinkView(op)
}
.padding(.bottom)
} header: {
Text("About operators")
.foregroundColor(theme.colors.secondary)
}
}
.navigationTitle("Server operators")
.navigationBarTitleDisplayMode(.large)
.modifier(ThemedBackground(grouped: true))
}
}
private func operatorInfoNavLinkView(_ op: ServerOperator) -> some View {
NavigationLink() {
OperatorInfoView(serverOperator: op)
.navigationBarTitle("Network operator")
.modifier(ThemedBackground(grouped: true))
.navigationBarTitleDisplayMode(.large)
} label: {
HStack {
Image(op.logo(colorScheme))
.resizable()
.scaledToFit()
.frame(width: 24, height: 24)
Text(op.tradeName)
}
}
.padding()
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.modifier(ThemedBackground())
}
}
@@ -136,7 +136,6 @@ struct CreateFirstProfile: View {
.multilineTextAlignment(.center)
}
.frame(maxWidth: .infinity) // Ensures it takes up the full width
.padding(.top, 25)
.padding(.horizontal, 10)
HStack {
@@ -22,7 +22,7 @@ struct SetNotificationsMode: View {
Text("Push notifications")
.font(.largeTitle)
.bold()
.padding(.top, 50)
.padding(.top, 25)
infoText()
@@ -331,9 +331,12 @@ struct OperatorInfoView: View {
Text(d)
}
}
Link(serverOperator.info.website.absoluteString, destination: serverOperator.info.website)
}
Section {
Link("\(serverOperator.info.website)", destination: URL(string: serverOperator.info.website)!)
if let selfhost = serverOperator.info.selfhost {
Section {
Link(selfhost.text, destination: selfhost.link)
}
}
}
}
@@ -421,7 +424,6 @@ struct SingleOperatorUsageConditionsView: View {
@Binding var userServers: [UserOperatorServers]
@Binding var serverErrors: [UserServersError]
var operatorIndex: Int
@State private var usageConditionsNavLinkActive: Bool = false
var body: some View {
viewBody()
@@ -433,52 +435,45 @@ struct SingleOperatorUsageConditionsView: View {
// In current UI implementation this branch doesn't get shown - as conditions can't be opened from inside operator once accepted
VStack(alignment: .leading, spacing: 20) {
Group {
viewHeader()
ConditionsTextView()
.padding(.bottom)
.padding(.bottom)
}
.padding(.horizontal)
viewHeader()
ConditionsTextView()
}
.padding(.bottom)
.padding(.bottom)
.padding(.horizontal)
.frame(maxHeight: .infinity)
} else if !operatorsWithConditionsAccepted.isEmpty {
NavigationView {
VStack(alignment: .leading, spacing: 20) {
Group {
viewHeader()
Text("Conditions are already accepted for following operator(s): **\(operatorsWithConditionsAccepted.map { $0.legalName_ }.joined(separator: ", "))**.")
Text("The same conditions will apply to operator **\(userServers[operatorIndex].operator_.legalName_)**.")
conditionsAppliedToOtherOperatorsText()
usageConditionsNavLinkButton()
viewHeader()
Text("Conditions are already accepted for these operator(s): **\(operatorsWithConditionsAccepted.map { $0.legalName_ }.joined(separator: ", "))**.")
Text("The same conditions will apply to operator **\(userServers[operatorIndex].operator_.legalName_)**.")
conditionsAppliedToOtherOperatorsText()
Spacer()
Spacer()
acceptConditionsButton()
.padding(.bottom)
.padding(.bottom)
}
.padding(.horizontal)
acceptConditionsButton()
usageConditionsNavLinkButton()
}
.padding(.bottom)
.padding(.bottom)
.padding(.horizontal)
.frame(maxHeight: .infinity)
}
} else {
VStack(alignment: .leading, spacing: 20) {
Group {
viewHeader()
Text("To use the servers of **\(userServers[operatorIndex].operator_.legalName_)**, accept conditions of use.")
conditionsAppliedToOtherOperatorsText()
ConditionsTextView()
acceptConditionsButton()
.padding(.bottom)
.padding(.bottom)
}
.padding(.horizontal)
viewHeader()
Text("To use the servers of **\(userServers[operatorIndex].operator_.legalName_)**, accept conditions of use.")
conditionsAppliedToOtherOperatorsText()
ConditionsTextView()
acceptConditionsButton()
.padding(.bottom)
.padding(.bottom)
}
.padding(.horizontal)
.frame(maxHeight: .infinity)
}
@@ -545,31 +540,16 @@ struct SingleOperatorUsageConditionsView: View {
}
private func usageConditionsNavLinkButton() -> some View {
ZStack {
Button {
usageConditionsNavLinkActive = true
} label: {
Text("View conditions")
}
NavigationLink(isActive: $usageConditionsNavLinkActive) {
usageConditionsDestinationView()
} label: {
EmptyView()
}
.frame(width: 1, height: 1)
.hidden()
NavigationLink("View conditions") {
ConditionsTextView()
.padding()
.navigationTitle("Conditions of use")
.navigationBarTitleDisplayMode(.large)
.toolbar { ToolbarItem(placement: .navigationBarTrailing, content: conditionsLinkButton) }
.modifier(ThemedBackground(grouped: true))
}
}
private func usageConditionsDestinationView() -> some View {
ConditionsTextView()
.padding()
.padding(.bottom)
.navigationTitle("Conditions of use")
.navigationBarTitleDisplayMode(.large)
.toolbar { ToolbarItem(placement: .navigationBarTrailing, content: conditionsLinkButton) }
.modifier(ThemedBackground(grouped: true))
.font(.callout)
.frame(maxWidth: .infinity, alignment: .center)
}
}
@@ -566,6 +566,10 @@
<target>За SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<note>No comment provided by engineer.</note>
@@ -1533,8 +1537,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5762,7 +5766,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Запази и уведоми контакта</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -5796,7 +5800,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Запази настройките?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6376,6 +6380,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX Адрес</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>Сигурността на SimpleX Chat беше одитирана от Trail of Bits.</target>
@@ -8118,6 +8126,10 @@ Repeat connection request?</source>
<target>обаждането прието</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>админ</target>
@@ -8304,7 +8316,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>свързване…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -8788,6 +8800,10 @@ Repeat connection request?</source>
<target>ви острани</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>запазено</target>
@@ -548,6 +548,10 @@
<target>O SimpleX chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<note>No comment provided by engineer.</note>
@@ -1488,8 +1492,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5572,7 +5576,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Uložit a upozornit kontakt</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -5606,7 +5610,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Uložit předvolby?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6174,6 +6178,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX Adresa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>Zabezpečení SimpleX chatu bylo auditováno společností Trail of Bits.</target>
@@ -7849,6 +7857,10 @@ Repeat connection request?</source>
<target>přijatý hovor</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>správce</target>
@@ -8028,7 +8040,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>připojení…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -8503,6 +8515,10 @@ Repeat connection request?</source>
<target>odstranil vás</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
@@ -577,6 +577,10 @@
<target>Über SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Akzent</target>
@@ -1602,8 +1606,8 @@
<target>Die Nutzungsbedingungen der/des Betreiber(s) werden akzeptiert: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>Die Nutzungsbedingungen der/des folgenden Betreiber(s) wurden schon akzeptiert: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -6030,7 +6034,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Speichern und Kontakt benachrichtigen</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6065,7 +6069,7 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Präferenzen speichern?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6688,6 +6692,11 @@ Aktivieren Sie es in den *Netzwerk &amp; Server* Einstellungen.</target>
<target>SimpleX-Adresse</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<target>SimpleX-Chat und Flux haben vereinbart, die von Flux betriebenen Server in die App aufzunehmen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>Die Sicherheit von SimpleX Chat wurde von Trail of Bits überprüft.</target>
@@ -8517,6 +8526,10 @@ Verbindungsanfrage wiederholen?</target>
<target>Anruf angenommen</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>Admin</target>
@@ -8705,7 +8718,7 @@ Verbindungsanfrage wiederholen?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>Verbinde…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9199,6 +9212,10 @@ Verbindungsanfrage wiederholen?</target>
<target>hat Sie aus der Gruppe entfernt</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>abgespeichert</target>
@@ -577,6 +577,11 @@
<target>About SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<target>About operators</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Accent</target>
@@ -1612,9 +1617,9 @@
<target>Conditions are accepted for the operator(s): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<target>Conditions are already accepted for following operator(s): **%@**.</target>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>Conditions are already accepted for these operator(s): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -6051,7 +6056,7 @@ Enable in *Network &amp; servers* settings.</target>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Save and notify contact</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6086,7 +6091,7 @@ Enable in *Network &amp; servers* settings.</target>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Save preferences?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6709,6 +6714,11 @@ Enable in *Network &amp; servers* settings.</target>
<target>SimpleX Address</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<target>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>SimpleX Chat security was audited by Trail of Bits.</target>
@@ -8541,6 +8551,11 @@ Repeat connection request?</target>
<target>accepted call</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<target>accepted invitation</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>admin</target>
@@ -8729,7 +8744,7 @@ Repeat connection request?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>connecting…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9223,6 +9238,11 @@ Repeat connection request?</target>
<target>removed you</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>requested to connect</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>saved</target>
@@ -577,6 +577,10 @@
<target>Sobre SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Color</target>
@@ -1602,8 +1606,8 @@
<target>Las condiciones se han aceptado para el(los) operador(s): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>Las condiciones ya se han aceptado para el/los siguiente(s) operador(s): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -6030,7 +6034,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Guardar y notificar contacto</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6065,7 +6069,7 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>¿Guardar preferencias?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6688,6 +6692,11 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
<target>Dirección SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<target>Simplex Chat y Flux han acordado incluir servidores operados por Flux en la aplicación</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>La seguridad de SimpleX Chat ha sido auditada por Trail of Bits.</target>
@@ -8517,6 +8526,10 @@ Repeat connection request?</source>
<target>llamada aceptada</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>administrador</target>
@@ -8705,7 +8718,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>conectando…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9199,6 +9212,10 @@ Repeat connection request?</source>
<target>te ha expulsado</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>guardado</target>
@@ -543,6 +543,10 @@
<target>Tietoja SimpleX Chatistä</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<note>No comment provided by engineer.</note>
@@ -1481,8 +1485,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5560,7 +5564,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Tallenna ja ilmoita kontaktille</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -5594,7 +5598,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Tallenna asetukset?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6161,6 +6165,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX-osoite</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>Trail of Bits on tarkastanut SimpleX Chatin tietoturvan.</target>
@@ -7834,6 +7842,10 @@ Repeat connection request?</source>
<target>hyväksytty puhelu</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>ylläpitäjä</target>
@@ -8012,7 +8024,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>yhdistää…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -8488,6 +8500,10 @@ Repeat connection request?</source>
<target>poisti sinut</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
@@ -572,6 +572,10 @@
<target>À propos de SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Principale</target>
@@ -1585,8 +1589,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5968,7 +5972,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Enregistrer et en informer le contact</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6003,7 +6007,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Enregistrer les préférences?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6619,6 +6623,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
<target>Adresse SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>La sécurité de SimpleX Chat a été auditée par Trail of Bits.</target>
@@ -8421,6 +8429,10 @@ Répéter la demande de connexion ?</target>
<target>appel accepté</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>admin</target>
@@ -8609,7 +8621,7 @@ Répéter la demande de connexion ?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>connexion…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9102,6 +9114,10 @@ Répéter la demande de connexion ?</target>
<target>vous a retiré</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>enregistré</target>
@@ -577,6 +577,10 @@
<target>A SimpleX Chatről</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Kiemelés</target>
@@ -1612,8 +1616,8 @@
<target>A következő üzemeltető(k) számára elfogadott feltételek: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>A feltételek már el lettek fogadva a következő üzemeltető(k) számára: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -6051,7 +6055,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Mentés és az ismerős értesítése</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6086,7 +6090,7 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Beállítások mentése?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6709,6 +6713,10 @@ Engedélyezze a „Beállítások -&gt; Hálózat és kiszolgálók” menüben.
<target>SimpleX-cím</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>A SimpleX Chat biztonsága a Trail of Bits által lett auditálva.</target>
@@ -8541,6 +8549,10 @@ Kapcsolatkérés megismétlése?</target>
<target>elfogadott hívás</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>adminisztrátor</target>
@@ -8729,7 +8741,7 @@ Kapcsolatkérés megismétlése?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>kapcsolódás…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9223,6 +9235,10 @@ Kapcsolatkérés megismétlése?</target>
<target>eltávolította Önt</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>mentett</target>
@@ -577,6 +577,10 @@
<target>Riguardo SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Principale</target>
@@ -1612,8 +1616,8 @@
<target>Le condizioni sono state accettate per gli operatori: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>Le condizioni sono già state accettate per i seguenti operatori: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -6051,7 +6055,7 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Salva e avvisa il contatto</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6086,7 +6090,7 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Salvare le preferenze?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6709,6 +6713,10 @@ Attivalo nelle impostazioni *Rete e server*.</target>
<target>Indirizzo SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>La sicurezza di SimpleX Chat è stata verificata da Trail of Bits.</target>
@@ -8541,6 +8549,10 @@ Ripetere la richiesta di connessione?</target>
<target>chiamata accettata</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>amministratore</target>
@@ -8729,7 +8741,7 @@ Ripetere la richiesta di connessione?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>in connessione…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9223,6 +9235,10 @@ Ripetere la richiesta di connessione?</target>
<target>ti ha rimosso/a</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>salvato</target>
@@ -560,6 +560,10 @@
<target>SimpleX Chat について</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<note>No comment provided by engineer.</note>
@@ -1511,8 +1515,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5609,7 +5613,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>保存して、連絡先にに知らせる</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -5643,7 +5647,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>この設定でよろしいですか?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6203,6 +6207,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleXアドレス</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>SimpleX Chat のセキュリティは Trail of Bits によって監査されました。</target>
@@ -7876,6 +7884,10 @@ Repeat connection request?</source>
<target>受けた通話</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>管理者</target>
@@ -8054,7 +8066,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>接続待ち…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -8530,6 +8542,10 @@ Repeat connection request?</source>
<target>あなたを除名しました</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
@@ -577,6 +577,10 @@
<target>Over SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Accent</target>
@@ -1612,8 +1616,8 @@
<target>Voorwaarden worden geaccepteerd voor de operator(s): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>Voorwaarden zijn reeds geaccepteerd voor de volgende operator(s): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -6051,7 +6055,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Opslaan en Contact melden</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6086,7 +6090,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Voorkeuren opslaan?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6709,6 +6713,11 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
<target>SimpleX adres</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<target>Simplex-chat en flux hebben een overeenkomst gemaakt om door flux geëxploiteerde servers in de app op te nemen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>De beveiliging van SimpleX Chat is gecontroleerd door Trail of Bits.</target>
@@ -8541,6 +8550,10 @@ Verbindingsverzoek herhalen?</target>
<target>geaccepteerde oproep</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>Beheerder</target>
@@ -8729,7 +8742,7 @@ Verbindingsverzoek herhalen?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>Verbinden…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9223,6 +9236,10 @@ Verbindingsverzoek herhalen?</target>
<target>heeft je verwijderd</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>opgeslagen</target>
@@ -572,6 +572,10 @@
<target>O SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Akcent</target>
@@ -1580,8 +1584,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5958,7 +5962,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Zapisz i powiadom kontakt</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -5993,7 +5997,7 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Zapisać preferencje?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6609,6 +6613,10 @@ Włącz w ustawianiach *Sieć i serwery* .</target>
<target>Adres SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>Bezpieczeństwo SimpleX Chat zostało zaudytowane przez Trail of Bits.</target>
@@ -8408,6 +8416,10 @@ Powtórzyć prośbę połączenia?</target>
<target>zaakceptowane połączenie</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>administrator</target>
@@ -8596,7 +8608,7 @@ Powtórzyć prośbę połączenia?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>łączenie…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9089,6 +9101,10 @@ Powtórzyć prośbę połączenia?</target>
<target>usunął cię</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>zapisane</target>
@@ -577,6 +577,11 @@
<target>Информация о SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<target>Об операторах</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Акцент</target>
@@ -1612,8 +1617,8 @@
<target>Условия приняты для оператора(ов): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>Условия уже приняты для следующих оператора(ов): **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -6050,7 +6055,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Сохранить и уведомить контакт</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6085,7 +6090,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Сохранить предпочтения?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6708,6 +6713,11 @@ Enable in *Network &amp; servers* settings.</source>
<target>Адрес SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<target>SimpleX Chat и Flux заключили соглашение добавить серверы под управлением Flux в приложение.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>Безопасность SimpleX Chat была проверена Trail of Bits.</target>
@@ -8145,7 +8155,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can configure servers via settings." xml:space="preserve">
<source>You can configure servers via settings.</source>
<target>Вы можете сконфигурировать серверы через настройки.</target>
<target>Вы можете настроить серверы позже.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can create it later" xml:space="preserve">
@@ -8540,6 +8550,11 @@ Repeat connection request?</source>
<target>принятый звонок</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<target>принятое приглашение</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>админ</target>
@@ -8728,7 +8743,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>соединяется…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9222,6 +9237,11 @@ Repeat connection request?</source>
<target>удалил(а) Вас из группы</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<target>запрошено соединение</target>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>сохранено</target>
@@ -536,6 +536,10 @@
<target>เกี่ยวกับ SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<note>No comment provided by engineer.</note>
@@ -1473,8 +1477,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5537,7 +5541,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>บันทึกและแจ้งผู้ติดต่อ</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -5571,7 +5575,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>บันทึกการตั้งค่า?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6135,6 +6139,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>ที่อยู่ SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>ความปลอดภัยของ SimpleX Chat ได้รับการตรวจสอบโดย Trail of Bits</target>
@@ -7802,6 +7810,10 @@ Repeat connection request?</source>
<target>รับสายแล้ว</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>ผู้ดูแลระบบ</target>
@@ -7980,7 +7992,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>กำลังเชื่อมต่อ…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -8454,6 +8466,10 @@ Repeat connection request?</source>
<target>ลบคุณออกแล้ว</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<note>No comment provided by engineer.</note>
@@ -572,6 +572,10 @@
<target>SimpleX Chat hakkında</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Ana renk</target>
@@ -1585,8 +1589,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5968,7 +5972,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Kaydet ve kişilere bildir</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6003,7 +6007,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Tercihler kaydedilsin mi?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6619,6 +6623,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX Adresi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>SimpleX Chat güvenliği Trails of Bits tarafından denetlenmiştir.</target>
@@ -8421,6 +8429,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>kabul edilen arama</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>yönetici</target>
@@ -8609,7 +8621,7 @@ Bağlantı isteği tekrarlansın mı?</target>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>bağlanılıyor…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9102,6 +9114,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>sen kaldırıldın</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>kaydedildi</target>
@@ -577,6 +577,10 @@
<target>Про чат SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>Акцент</target>
@@ -1602,8 +1606,8 @@
<target>Для оператора(ів) приймаються умови: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<target>Умови вже прийняті для наступних операторів: **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -6030,7 +6034,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>Зберегти та повідомити контакт</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -6065,7 +6069,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>Зберегти настройки?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6688,6 +6692,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>Адреса SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>Безпека SimpleX Chat була перевірена компанією Trail of Bits.</target>
@@ -8517,6 +8525,10 @@ Repeat connection request?</source>
<target>прийнято виклик</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>адмін</target>
@@ -8705,7 +8717,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>з'єднання…</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9199,6 +9211,10 @@ Repeat connection request?</source>
<target>прибрали вас</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>збережено</target>
@@ -566,6 +566,10 @@
<target>关于SimpleX Chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About operators" xml:space="preserve">
<source>About operators</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accent" xml:space="preserve">
<source>Accent</source>
<target>强调</target>
@@ -1571,8 +1575,8 @@
<source>Conditions are accepted for the operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions are already accepted for following operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for following operator(s): **%@**.</source>
<trans-unit id="Conditions are already accepted for these operator(s): **%@**." xml:space="preserve">
<source>Conditions are already accepted for these operator(s): **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Conditions of use" xml:space="preserve">
@@ -5921,7 +5925,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save and notify contact" xml:space="preserve">
<source>Save and notify contact</source>
<target>保存并通知联系人</target>
<note>No comment provided by engineer.</note>
<note>alert button</note>
</trans-unit>
<trans-unit id="Save and notify group members" xml:space="preserve">
<source>Save and notify group members</source>
@@ -5956,7 +5960,7 @@ Enable in *Network &amp; servers* settings.</source>
<trans-unit id="Save preferences?" xml:space="preserve">
<source>Save preferences?</source>
<target>保存偏好设置?</target>
<note>No comment provided by engineer.</note>
<note>alert title</note>
</trans-unit>
<trans-unit id="Save profile password" xml:space="preserve">
<source>Save profile password</source>
@@ -6566,6 +6570,10 @@ Enable in *Network &amp; servers* settings.</source>
<target>SimpleX 地址</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." xml:space="preserve">
<source>SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX Chat security was audited by Trail of Bits." xml:space="preserve">
<source>SimpleX Chat security was audited by Trail of Bits.</source>
<target>SimpleX Chat 的安全性 由 Trail of Bits 审核。</target>
@@ -8354,6 +8362,10 @@ Repeat connection request?</source>
<target>已接受通话</target>
<note>call status</note>
</trans-unit>
<trans-unit id="accepted invitation" xml:space="preserve">
<source>accepted invitation</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="admin" xml:space="preserve">
<source>admin</source>
<target>管理员</target>
@@ -8542,7 +8554,7 @@ Repeat connection request?</source>
<trans-unit id="connecting…" xml:space="preserve">
<source>connecting…</source>
<target>连接中……</target>
<note>chat list item title</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="connection established" xml:space="preserve">
<source>connection established</source>
@@ -9035,6 +9047,10 @@ Repeat connection request?</source>
<target>已将您移除</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="requested to connect" xml:space="preserve">
<source>requested to connect</source>
<note>chat list item title</note>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>已保存</target>
+12 -51
View File
@@ -1212,13 +1212,12 @@ public enum ServerProtocol: String, Decodable {
public enum OperatorTag: String, Codable {
case simplex = "simplex"
case flux = "flux"
case xyz = "xyz"
case demo = "demo"
}
public struct ServerOperatorInfo: Decodable {
public struct ServerOperatorInfo {
public var description: [String]
public var website: String
public var website: URL
public var selfhost: (text: String, link: URL)? = nil
public var logo: String
public var largeLogo: String
public var logoDarkMode: String
@@ -1228,10 +1227,10 @@ public struct ServerOperatorInfo: Decodable {
public let operatorsInfo: Dictionary<OperatorTag, ServerOperatorInfo> = [
.simplex: ServerOperatorInfo(
description: [
"SimpleX Chat is the first communication network that has no user profile IDs of any kind, not even random numbers or keys that identify the users.",
"SimpleX Chat is the first communication network that has no user profile IDs of any kind, not even random numbers or identity keys.",
"SimpleX Chat Ltd develops the communication software for SimpleX network."
],
website: "https://simplex.chat",
website: URL(string: "https://simplex.chat")!,
logo: "decentralized",
largeLogo: "logo",
logoDarkMode: "decentralized-light",
@@ -1239,31 +1238,17 @@ public let operatorsInfo: Dictionary<OperatorTag, ServerOperatorInfo> = [
),
.flux: ServerOperatorInfo(
description: [
"Flux is the largest decentralized cloud infrastructure, leveraging a global network of user-operated computational nodes.",
"Flux offers a powerful, scalable, and affordable platform designed to support individuals, businesses, and cutting-edge technologies like AI. With high uptime and worldwide distribution, Flux ensures reliable, accessible cloud computing for all."
"Flux is the largest decentralized cloud, based on a global network of user-operated nodes.",
"Flux offers a powerful, scalable, and affordable cutting edge technology platform for all.",
"Flux operates servers in SimpleX network to improve its privacy and decentralization."
],
website: "https://runonflux.com",
website: URL(string: "https://runonflux.com")!,
selfhost: (text: "Self-host SimpleX servers on Flux", link: URL(string: "https://home.runonflux.io/apps/marketplace?q=simplex")!),
logo: "flux_logo_symbol",
largeLogo: "flux_logo",
logoDarkMode: "flux_logo_symbol",
largeLogoDarkMode: "flux_logo-light"
),
.xyz: ServerOperatorInfo(
description: ["XYZ servers"],
website: "XYZ website",
logo: "shield",
largeLogo: "logo",
logoDarkMode: "shield",
largeLogoDarkMode: "logo-light"
),
.demo: ServerOperatorInfo(
description: ["Demo operator"],
website: "Demo website",
logo: "decentralized",
largeLogo: "logo",
logoDarkMode: "decentralized-light",
largeLogoDarkMode: "logo-light"
)
]
public struct UsageConditions: Decodable {
@@ -1358,7 +1343,7 @@ public struct ServerOperator: Identifiable, Equatable, Codable {
public static let dummyOperatorInfo = ServerOperatorInfo(
description: ["Default"],
website: "Default",
website: URL(string: "https://simplex.chat")!,
logo: "decentralized",
largeLogo: "logo",
logoDarkMode: "decentralized-light",
@@ -1384,30 +1369,6 @@ public struct ServerOperator: Identifiable, Equatable, Codable {
smpRoles: ServerRoles(storage: true, proxy: true),
xftpRoles: ServerRoles(storage: true, proxy: true)
)
public static var sampleData2 = ServerOperator(
operatorId: 2,
operatorTag: .xyz,
tradeName: "XYZ",
legalName: nil,
serverDomains: ["xyz.com"],
conditionsAcceptance: .required(deadline: nil),
enabled: false,
smpRoles: ServerRoles(storage: false, proxy: true),
xftpRoles: ServerRoles(storage: false, proxy: true)
)
public static var sampleData3 = ServerOperator(
operatorId: 3,
operatorTag: .demo,
tradeName: "Demo",
legalName: nil,
serverDomains: ["demo.com"],
conditionsAcceptance: .required(deadline: nil),
enabled: false,
smpRoles: ServerRoles(storage: true, proxy: false),
xftpRoles: ServerRoles(storage: true, proxy: false)
)
}
public struct ServerRoles: Equatable, Codable {
@@ -2725,7 +2686,7 @@ public struct AppSettings: Codable, Equatable {
uiDarkColorScheme: DefaultTheme.SIMPLEX.themeName,
uiCurrentThemeIds: nil as [String: String]?,
uiThemes: nil as [ThemeOverrides]?,
oneHandUI: false,
oneHandUI: true,
chatBottomBar: true
)
}
+4 -2
View File
@@ -1782,9 +1782,11 @@ public struct PendingContactConnection: Decodable, NamedChat, Hashable {
public var displayName: String {
get {
if let initiated = pccConnStatus.initiated {
return initiated && !viaContactUri
return viaContactUri
? NSLocalizedString("requested to connect", comment: "chat list item title")
: initiated
? NSLocalizedString("invited to connect", comment: "chat list item title")
: NSLocalizedString("connecting…", comment: "chat list item title")
: NSLocalizedString("accepted invitation", comment: "chat list item title")
} else {
// this should not be in the list
return NSLocalizedString("connection established", comment: "chat list item title (it should not be shown")
+3 -3
View File
@@ -918,7 +918,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Свързване с настолно устройство";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "свързване…";
/* No comment provided by engineer. */
@@ -3139,7 +3139,7 @@
/* alert button */
"Save (and notify contacts)" = "Запази (и уведоми контактите)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Запази и уведоми контакта";
/* No comment provided by engineer. */
@@ -3157,7 +3157,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Запази паролата в Keychain";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Запази настройките?";
/* No comment provided by engineer. */
+3 -3
View File
@@ -729,7 +729,7 @@
/* No comment provided by engineer. */
"Connecting server… (error: %@)" = "Připojování k serveru... (chyba: %@)";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "připojení…";
/* No comment provided by engineer. */
@@ -2538,7 +2538,7 @@
/* alert button */
"Save (and notify contacts)" = "Uložit (a informovat kontakty)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Uložit a upozornit kontakt";
/* No comment provided by engineer. */
@@ -2556,7 +2556,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Uložit přístupovou frázi do Klíčenky";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Uložit předvolby?";
/* No comment provided by engineer. */
+16 -13
View File
@@ -863,6 +863,9 @@
/* No comment provided by engineer. */
"Change" = "Ändern";
/* authentication reason */
"Change chat profiles" = "Chat-Profile wechseln";
/* No comment provided by engineer. */
"Change database passphrase?" = "Datenbank-Passwort ändern?";
@@ -891,9 +894,6 @@
set passcode view */
"Change self-destruct passcode" = "Selbstzerstörungs-Zugangscode ändern";
/* authentication reason */
"Change chat profiles" = "Chat-Profile wechseln";
/* chat item text */
"changed address for you" = "Wechselte die Empfängeradresse von Ihnen";
@@ -1030,7 +1030,7 @@
"Conditions are accepted for the operator(s): **%@**." = "Die Nutzungsbedingungen der/des Betreiber(s) werden akzeptiert: **%@**.";
/* No comment provided by engineer. */
"Conditions are already accepted for following operator(s): **%@**." = "Die Nutzungsbedingungen der/des folgenden Betreiber(s) wurden schon akzeptiert: **%@**.";
"Conditions are already accepted for these operator(s): **%@**." = "Die Nutzungsbedingungen der/des folgenden Betreiber(s) wurden schon akzeptiert: **%@**.";
/* No comment provided by engineer. */
"Conditions of use" = "Nutzungsbedingungen";
@@ -1173,7 +1173,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Mit dem Desktop verbinden";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "Verbinde…";
/* No comment provided by engineer. */
@@ -3945,12 +3945,6 @@
/* No comment provided by engineer. */
"Safer groups" = "Sicherere Gruppen";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Dieselben Nutzungsbedingungen gelten auch für den Betreiber **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Dieselben Nutzungsbedingungen gelten auch für den/die Betreiber: **%@**.";
/* alert button
chat item action */
"Save" = "Speichern";
@@ -3958,7 +3952,7 @@
/* alert button */
"Save (and notify contacts)" = "Speichern (und Kontakte benachrichtigen)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Speichern und Kontakt benachrichtigen";
/* No comment provided by engineer. */
@@ -3979,7 +3973,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Passwort im Schlüsselbund speichern";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Präferenzen speichern?";
/* No comment provided by engineer. */
@@ -4397,6 +4391,9 @@
/* No comment provided by engineer. */
"SimpleX address or 1-time link?" = "SimpleX-Adresse oder Einmal-Link?";
/* No comment provided by engineer. */
"SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "SimpleX-Chat und Flux haben vereinbart, die von Flux betriebenen Server in die App aufzunehmen.";
/* No comment provided by engineer. */
"SimpleX Chat security was audited by Trail of Bits." = "Die Sicherheit von SimpleX Chat wurde von Trail of Bits überprüft.";
@@ -4691,6 +4688,12 @@
/* No comment provided by engineer. */
"The profile is 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 **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Dieselben Nutzungsbedingungen gelten auch für den/die Betreiber: **%@**.";
/* No comment provided by engineer. */
"The second preset operator in the app!" = "Der zweite voreingestellte Netzwerk-Betreiber in der App!";
+16 -13
View File
@@ -863,6 +863,9 @@
/* No comment provided by engineer. */
"Change" = "Cambiar";
/* authentication reason */
"Change chat profiles" = "Cambiar perfil de usuario";
/* No comment provided by engineer. */
"Change database passphrase?" = "¿Cambiar contraseña de la base de datos?";
@@ -891,9 +894,6 @@
set passcode view */
"Change self-destruct passcode" = "Cambiar código autodestrucción";
/* authentication reason */
"Change chat profiles" = "Cambiar perfil de usuario";
/* chat item text */
"changed address for you" = "ha cambiado tu servidor de envío";
@@ -1030,7 +1030,7 @@
"Conditions are accepted for the operator(s): **%@**." = "Las condiciones se han aceptado para el(los) operador(s): **%@**.";
/* No comment provided by engineer. */
"Conditions are already accepted for following operator(s): **%@**." = "Las condiciones ya se han aceptado para el/los siguiente(s) operador(s): **%@**.";
"Conditions are already accepted for these operator(s): **%@**." = "Las condiciones ya se han aceptado para el/los siguiente(s) operador(s): **%@**.";
/* No comment provided by engineer. */
"Conditions of use" = "Condiciones de uso";
@@ -1173,7 +1173,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Conectando con ordenador";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "conectando…";
/* No comment provided by engineer. */
@@ -3945,12 +3945,6 @@
/* No comment provided by engineer. */
"Safer groups" = "Grupos más seguros";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Las mismas condiciones se aplicarán al operador **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Las mismas condiciones se aplicarán a el/los operador(es) **%@**.";
/* alert button
chat item action */
"Save" = "Guardar";
@@ -3958,7 +3952,7 @@
/* alert button */
"Save (and notify contacts)" = "Guardar (y notificar contactos)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Guardar y notificar contacto";
/* No comment provided by engineer. */
@@ -3979,7 +3973,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Guardar la contraseña en Keychain";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "¿Guardar preferencias?";
/* No comment provided by engineer. */
@@ -4397,6 +4391,9 @@
/* No comment provided by engineer. */
"SimpleX address or 1-time link?" = "Dirección SimpleX o enlace de un uso?";
/* No comment provided by engineer. */
"SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "Simplex Chat y Flux han acordado incluir servidores operados por Flux en la aplicación";
/* No comment provided by engineer. */
"SimpleX Chat security was audited by Trail of Bits." = "La seguridad de SimpleX Chat ha sido auditada por Trail of Bits.";
@@ -4691,6 +4688,12 @@
/* No comment provided by engineer. */
"The profile is 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 **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Las mismas condiciones se aplicarán a el/los operador(es) **%@**.";
/* No comment provided by engineer. */
"The second preset operator in the app!" = "El segundo operador predefinido!";
+3 -3
View File
@@ -711,7 +711,7 @@
/* No comment provided by engineer. */
"Connecting server… (error: %@)" = "Yhteyden muodostaminen palvelimeen... (virhe: %@)";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "yhdistää…";
/* No comment provided by engineer. */
@@ -2508,7 +2508,7 @@
/* alert button */
"Save (and notify contacts)" = "Tallenna (ja ilmoita kontakteille)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Tallenna ja ilmoita kontaktille";
/* No comment provided by engineer. */
@@ -2526,7 +2526,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Tallenna tunnuslause Avainnippuun";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Tallenna asetukset?";
/* No comment provided by engineer. */
+3 -3
View File
@@ -1101,7 +1101,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Connexion au bureau";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "connexion…";
/* No comment provided by engineer. */
@@ -3763,7 +3763,7 @@
/* alert button */
"Save (and notify contacts)" = "Enregistrer (et en informer les contacts)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Enregistrer et en informer le contact";
/* No comment provided by engineer. */
@@ -3784,7 +3784,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Enregistrer la phrase secrète dans la Keychain";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Enregistrer les préférences?";
/* No comment provided by engineer. */
+13 -13
View File
@@ -878,6 +878,9 @@
/* No comment provided by engineer. */
"Change" = "Változtatás";
/* authentication reason */
"Change chat profiles" = "Felhasználói profilok megváltoztatása";
/* No comment provided by engineer. */
"Change database passphrase?" = "Adatbázis-jelmondat megváltoztatása?";
@@ -906,9 +909,6 @@
set passcode view */
"Change self-destruct passcode" = "Önmegsemmisító jelkód megváltoztatása";
/* authentication reason */
"Change chat profiles" = "Felhasználói profilok megváltoztatása";
/* chat item text */
"changed address for you" = "cím megváltoztatva";
@@ -1060,7 +1060,7 @@
"Conditions are accepted for the operator(s): **%@**." = "A következő üzemeltető(k) számára elfogadott feltételek: **%@**.";
/* No comment provided by engineer. */
"Conditions are already accepted for following operator(s): **%@**." = "A feltételek már el lettek fogadva a következő üzemeltető(k) számára: **%@**.";
"Conditions are already accepted for these operator(s): **%@**." = "A feltételek már el lettek fogadva a következő üzemeltető(k) számára: **%@**.";
/* No comment provided by engineer. */
"Conditions of use" = "Használati feltételek";
@@ -1203,7 +1203,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Kapcsolódás a számítógéphez";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "kapcsolódás…";
/* No comment provided by engineer. */
@@ -4008,12 +4008,6 @@
/* No comment provided by engineer. */
"Safer groups" = "Biztonságosabb csoportok";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Ugyanezek a feltételek vonatkoznak a következő üzemeltetőre is: **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Ugyanezek a feltételek lesznek elfogadva a következő üzemeltető(k)re is: **%@**.";
/* alert button
chat item action */
"Save" = "Mentés";
@@ -4021,7 +4015,7 @@
/* alert button */
"Save (and notify contacts)" = "Mentés és az ismerősök értesítése";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Mentés és az ismerős értesítése";
/* No comment provided by engineer. */
@@ -4042,7 +4036,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Jelmondat mentése a kulcstartóba";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Beállítások mentése?";
/* No comment provided by engineer. */
@@ -4757,6 +4751,12 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "A profilja csak az ismerőseivel kerül megosztásra.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Ugyanezek a feltételek vonatkoznak a következő üzemeltetőre is: **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Ugyanezek a feltételek lesznek elfogadva a következő üzemeltető(k)re is: **%@**.";
/* No comment provided by engineer. */
"The second preset operator in the app!" = "A második előre beállított üzemeltető az alkalmazásban!";
+13 -13
View File
@@ -878,6 +878,9 @@
/* No comment provided by engineer. */
"Change" = "Cambia";
/* authentication reason */
"Change chat profiles" = "Modifica profili utente";
/* No comment provided by engineer. */
"Change database passphrase?" = "Cambiare password del database?";
@@ -906,9 +909,6 @@
set passcode view */
"Change self-destruct passcode" = "Cambia codice di autodistruzione";
/* authentication reason */
"Change chat profiles" = "Modifica profili utente";
/* chat item text */
"changed address for you" = "indirizzo cambiato per te";
@@ -1060,7 +1060,7 @@
"Conditions are accepted for the operator(s): **%@**." = "Le condizioni sono state accettate per gli operatori: **%@**.";
/* No comment provided by engineer. */
"Conditions are already accepted for following operator(s): **%@**." = "Le condizioni sono già state accettate per i seguenti operatori: **%@**.";
"Conditions are already accepted for these operator(s): **%@**." = "Le condizioni sono già state accettate per i seguenti operatori: **%@**.";
/* No comment provided by engineer. */
"Conditions of use" = "Condizioni d'uso";
@@ -1203,7 +1203,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Connessione al desktop";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "in connessione…";
/* No comment provided by engineer. */
@@ -4008,12 +4008,6 @@
/* No comment provided by engineer. */
"Safer groups" = "Gruppi più sicuri";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Le stesse condizioni si applicheranno all'operatore **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Le stesse condizioni si applicheranno agli operatori **%@**.";
/* alert button
chat item action */
"Save" = "Salva";
@@ -4021,7 +4015,7 @@
/* alert button */
"Save (and notify contacts)" = "Salva (e avvisa i contatti)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Salva e avvisa il contatto";
/* No comment provided by engineer. */
@@ -4042,7 +4036,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Salva password nel portachiavi";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Salvare le preferenze?";
/* No comment provided by engineer. */
@@ -4757,6 +4751,12 @@
/* No comment provided by engineer. */
"The profile is 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 **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Le stesse condizioni si applicheranno agli operatori **%@**.";
/* No comment provided by engineer. */
"The second preset operator in the app!" = "Il secondo operatore preimpostato nell'app!";
+3 -3
View File
@@ -828,7 +828,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "デスクトップに接続中";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "接続待ち…";
/* No comment provided by engineer. */
@@ -2655,7 +2655,7 @@
/* alert button */
"Save (and notify contacts)" = "保存(連絡先に通知)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "保存して、連絡先にに知らせる";
/* No comment provided by engineer. */
@@ -2673,7 +2673,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "パスフレーズをキーチェーンに保存";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "この設定でよろしいですか?";
/* No comment provided by engineer. */
+16 -13
View File
@@ -878,6 +878,9 @@
/* No comment provided by engineer. */
"Change" = "Veranderen";
/* authentication reason */
"Change chat profiles" = "Gebruikersprofielen wijzigen";
/* No comment provided by engineer. */
"Change database passphrase?" = "Wachtwoord database wijzigen?";
@@ -906,9 +909,6 @@
set passcode view */
"Change self-destruct passcode" = "Zelfvernietigings code wijzigen";
/* authentication reason */
"Change chat profiles" = "Gebruikersprofielen wijzigen";
/* chat item text */
"changed address for you" = "adres voor u gewijzigd";
@@ -1060,7 +1060,7 @@
"Conditions are accepted for the operator(s): **%@**." = "Voorwaarden worden geaccepteerd voor de operator(s): **%@**.";
/* No comment provided by engineer. */
"Conditions are already accepted for following operator(s): **%@**." = "Voorwaarden zijn reeds geaccepteerd voor de volgende operator(s): **%@**.";
"Conditions are already accepted for these operator(s): **%@**." = "Voorwaarden zijn reeds geaccepteerd voor de volgende operator(s): **%@**.";
/* No comment provided by engineer. */
"Conditions of use" = "Gebruiksvoorwaarden";
@@ -1203,7 +1203,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Verbinding maken met desktop";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "Verbinden…";
/* No comment provided by engineer. */
@@ -4008,12 +4008,6 @@
/* No comment provided by engineer. */
"Safer groups" = "Veiligere groepen";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Dezelfde voorwaarden gelden voor operator **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Dezelfde voorwaarden gelden voor operator(s): **%@**.";
/* alert button
chat item action */
"Save" = "Opslaan";
@@ -4021,7 +4015,7 @@
/* alert button */
"Save (and notify contacts)" = "Bewaar (en informeer contacten)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Opslaan en Contact melden";
/* No comment provided by engineer. */
@@ -4042,7 +4036,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Sla het wachtwoord op in de Keychain";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Voorkeuren opslaan?";
/* No comment provided by engineer. */
@@ -4460,6 +4454,9 @@
/* No comment provided by engineer. */
"SimpleX address or 1-time link?" = "SimpleX adres of eenmalige link?";
/* No comment provided by engineer. */
"SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "Simplex-chat en flux hebben een overeenkomst gemaakt om door flux geëxploiteerde servers in de app op te nemen.";
/* No comment provided by engineer. */
"SimpleX Chat security was audited by Trail of Bits." = "De beveiliging van SimpleX Chat is gecontroleerd door Trail of Bits.";
@@ -4757,6 +4754,12 @@
/* No comment provided by engineer. */
"The profile is 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 **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Dezelfde voorwaarden gelden voor operator(s): **%@**.";
/* No comment provided by engineer. */
"The second preset operator in the app!" = "De tweede vooraf ingestelde operator in de app!";
+3 -3
View File
@@ -1086,7 +1086,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Łączenie z komputerem";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "łączenie…";
/* No comment provided by engineer. */
@@ -3736,7 +3736,7 @@
/* alert button */
"Save (and notify contacts)" = "Zapisz (i powiadom kontakty)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Zapisz i powiadom kontakt";
/* No comment provided by engineer. */
@@ -3757,7 +3757,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Zapisz hasło w pęku kluczy";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Zapisać preferencje?";
/* No comment provided by engineer. */
+25 -13
View File
@@ -343,6 +343,9 @@
/* No comment provided by engineer. */
"Abort changing address?" = "Прекратить изменение адреса?";
/* No comment provided by engineer. */
"About operators" = "Об операторах";
/* No comment provided by engineer. */
"About SimpleX Chat" = "Информация о SimpleX Chat";
@@ -376,6 +379,9 @@
/* No comment provided by engineer. */
"Accepted conditions" = "Принятые условия";
/* chat list item title */
"accepted invitation" = "принятое приглашение";
/* No comment provided by engineer. */
"Acknowledged" = "Подтверждено";
@@ -878,6 +884,9 @@
/* No comment provided by engineer. */
"Change" = "Поменять";
/* authentication reason */
"Change chat profiles" = "Поменять профили";
/* No comment provided by engineer. */
"Change database passphrase?" = "Поменять пароль базы данных?";
@@ -906,9 +915,6 @@
set passcode view */
"Change self-destruct passcode" = "Изменить код самоуничтожения";
/* authentication reason */
"Change chat profiles" = "Поменять профили";
/* chat item text */
"changed address for you" = "поменял(а) адрес для Вас";
@@ -1060,7 +1066,7 @@
"Conditions are accepted for the operator(s): **%@**." = "Условия приняты для оператора(ов): **%@**.";
/* No comment provided by engineer. */
"Conditions are already accepted for following operator(s): **%@**." = "Условия уже приняты для следующих оператора(ов): **%@**.";
"Conditions are already accepted for these operator(s): **%@**." = "Условия уже приняты для следующих оператора(ов): **%@**.";
/* No comment provided by engineer. */
"Conditions of use" = "Условия использования";
@@ -1203,7 +1209,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Подключение к компьютеру";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "соединяется…";
/* No comment provided by engineer. */
@@ -3930,6 +3936,9 @@
/* chat item action */
"Reply" = "Ответить";
/* chat list item title */
"requested to connect" = "запрошено соединение";
/* No comment provided by engineer. */
"Required" = "Обязательно";
@@ -4008,12 +4017,6 @@
/* No comment provided by engineer. */
"Safer groups" = "Более безопасные группы";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Те же самые условия будут приняты для оператора **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Те же самые условия будут приняты для оператора(ов): **%@**.";
/* alert button
chat item action */
"Save" = "Сохранить";
@@ -4021,7 +4024,7 @@
/* alert button */
"Save (and notify contacts)" = "Сохранить (и уведомить контакты)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Сохранить и уведомить контакт";
/* No comment provided by engineer. */
@@ -4042,7 +4045,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Сохранить пароль в Keychain";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Сохранить предпочтения?";
/* No comment provided by engineer. */
@@ -4460,6 +4463,9 @@
/* No comment provided by engineer. */
"SimpleX address or 1-time link?" = "Адрес SimpleX или одноразовая ссылка?";
/* No comment provided by engineer. */
"SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "SimpleX Chat и Flux заключили соглашение добавить серверы под управлением Flux в приложение.";
/* No comment provided by engineer. */
"SimpleX Chat security was audited by Trail of Bits." = "Безопасность SimpleX Chat была проверена Trail of Bits.";
@@ -4757,6 +4763,12 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Профиль отправляется только Вашим контактам.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Те же самые условия будут приняты для оператора **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Те же самые условия будут приняты для оператора(ов): **%@**.";
/* No comment provided by engineer. */
"The second preset operator in the app!" = "Второй оператор серверов в приложении!";
+3 -3
View File
@@ -681,7 +681,7 @@
/* No comment provided by engineer. */
"Connecting server… (error: %@)" = "กำลังเชื่อมต่อกับเซิร์ฟเวอร์... (ข้อผิดพลาด: %@)";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "กำลังเชื่อมต่อ…";
/* No comment provided by engineer. */
@@ -2439,7 +2439,7 @@
/* alert button */
"Save (and notify contacts)" = "บันทึก (และแจ้งผู้ติดต่อ)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "บันทึกและแจ้งผู้ติดต่อ";
/* No comment provided by engineer. */
@@ -2457,7 +2457,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "บันทึกข้อความรหัสผ่านใน Keychain";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "บันทึกการตั้งค่า?";
/* No comment provided by engineer. */
+3 -3
View File
@@ -1101,7 +1101,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Bilgisayara bağlanıyor";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "bağlanılıyor…";
/* No comment provided by engineer. */
@@ -3763,7 +3763,7 @@
/* alert button */
"Save (and notify contacts)" = "Kaydet (ve kişilere bildir)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Kaydet ve kişilere bildir";
/* No comment provided by engineer. */
@@ -3784,7 +3784,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Parolayı Anahtar Zincirinde kaydet";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Tercihler kaydedilsin mi?";
/* No comment provided by engineer. */
+13 -16
View File
@@ -863,6 +863,9 @@
/* No comment provided by engineer. */
"Change" = "Зміна";
/* authentication reason */
"Change chat profiles" = "Зміна профілів користувачів";
/* No comment provided by engineer. */
"Change database passphrase?" = "Змінити пароль до бази даних?";
@@ -891,9 +894,6 @@
set passcode view */
"Change self-destruct passcode" = "Змінити пароль самознищення";
/* authentication reason */
"Change chat profiles" = "Зміна профілів користувачів";
/* chat item text */
"changed address for you" = "змінили для вас адресу";
@@ -1030,7 +1030,7 @@
"Conditions are accepted for the operator(s): **%@**." = "Для оператора(ів) приймаються умови: **%@**.";
/* No comment provided by engineer. */
"Conditions are already accepted for following operator(s): **%@**." = "Умови вже прийняті для наступних операторів: **%@**.";
"Conditions are already accepted for these operator(s): **%@**." = "Умови вже прийняті для наступних операторів: **%@**.";
/* No comment provided by engineer. */
"Conditions of use" = "Умови використання";
@@ -1173,7 +1173,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "Підключення до ПК";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "з'єднання…";
/* No comment provided by engineer. */
@@ -3668,9 +3668,6 @@
/* No comment provided by engineer. */
"Proxy requires password" = "Проксі вимагає пароль";
/* No comment provided by engineer. */
"Push notifications" = "Push-повідомлення";
/* No comment provided by engineer. */
"Push notifications" = "Push-сповіщення";
@@ -3948,12 +3945,6 @@
/* No comment provided by engineer. */
"Safer groups" = "Безпечніші групи";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Такі ж умови діятимуть і для оператора **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Такі ж умови будуть застосовуватися до оператора(ів): **%@**.";
/* alert button
chat item action */
"Save" = "Зберегти";
@@ -3961,7 +3952,7 @@
/* alert button */
"Save (and notify contacts)" = "Зберегти (і повідомити контактам)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "Зберегти та повідомити контакт";
/* No comment provided by engineer. */
@@ -3982,7 +3973,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "Збережіть парольну фразу в Keychain";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "Зберегти настройки?";
/* No comment provided by engineer. */
@@ -4694,6 +4685,12 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Профіль доступний лише вашим контактам.";
/* No comment provided by engineer. */
"The same conditions will apply to operator **%@**." = "Такі ж умови діятимуть і для оператора **%@**.";
/* No comment provided by engineer. */
"The same conditions will apply to operator(s): **%@**." = "Такі ж умови будуть застосовуватися до оператора(ів): **%@**.";
/* No comment provided by engineer. */
"The second preset operator in the app!" = "Другий попередньо встановлений оператор у застосунку!";
+3 -3
View File
@@ -1059,7 +1059,7 @@
/* No comment provided by engineer. */
"Connecting to desktop" = "正连接到桌面";
/* chat list item title */
/* No comment provided by engineer. */
"connecting…" = "连接中……";
/* No comment provided by engineer. */
@@ -3634,7 +3634,7 @@
/* alert button */
"Save (and notify contacts)" = "保存(并通知联系人)";
/* No comment provided by engineer. */
/* alert button */
"Save and notify contact" = "保存并通知联系人";
/* No comment provided by engineer. */
@@ -3655,7 +3655,7 @@
/* No comment provided by engineer. */
"Save passphrase in Keychain" = "在钥匙串中保存密码";
/* No comment provided by engineer. */
/* alert title */
"Save preferences?" = "保存偏好设置?";
/* No comment provided by engineer. */
@@ -1895,8 +1895,9 @@ class PendingContactConnection(
generalGetString(MR.strings.display_name_connection_established)
} else {
generalGetString(
if (initiated && !viaContactUri) MR.strings.display_name_invited_to_connect
else MR.strings.display_name_connecting
if (viaContactUri) MR.strings.display_name_requested_to_connect
else if (initiated) MR.strings.display_name_invited_to_connect
else MR.strings.display_name_accepted_invitation
)
}
}
@@ -3669,14 +3669,13 @@ enum class ServerProtocol {
@Serializable
enum class OperatorTag {
@SerialName("simplex") SimpleX,
@SerialName("flux") Flux,
@SerialName("xyz") XYZ,
@SerialName("demo") Demo
@SerialName("flux") Flux
}
data class ServerOperatorInfo(
val description: List<String>,
val website: String,
val selfhost: Pair<String, String>? = null,
val logo: ImageResource,
val largeLogo: ImageResource,
val logoDarkMode: ImageResource,
@@ -3696,31 +3695,17 @@ val operatorsInfo: Map<OperatorTag, ServerOperatorInfo> = mapOf(
),
OperatorTag.Flux to ServerOperatorInfo(
description = listOf(
"Flux is the largest decentralized cloud infrastructure, leveraging a global network of user-operated computational nodes.",
"Flux offers a powerful, scalable, and affordable platform designed to support individuals, businesses, and cutting-edge technologies like AI. With high uptime and worldwide distribution, Flux ensures reliable, accessible cloud computing for all."
"Flux is the largest decentralized cloud, based on a global network of user-operated nodes.",
"Flux offers a powerful, scalable, and affordable cutting edge technology platform for all.",
"Flux operates servers in SimpleX network to improve its privacy and decentralization."
),
website = "https://runonflux.com",
selfhost = "Self-host SimpleX servers on Flux" to "https://home.runonflux.io/apps/marketplace?q=simplex",
logo = MR.images.flux_logo_symbol,
largeLogo = MR.images.flux_logo,
logoDarkMode = MR.images.flux_logo_symbol,
largeLogoDarkMode = MR.images.flux_logo_light
),
OperatorTag.XYZ to ServerOperatorInfo(
description = listOf("XYZ servers"),
website = "XYZ website",
logo = MR.images.shield,
largeLogo = MR.images.logo,
logoDarkMode = MR.images.shield,
largeLogoDarkMode = MR.images.logo_light
),
OperatorTag.Demo to ServerOperatorInfo(
description = listOf("Demo operator"),
website = "Demo website",
logo = MR.images.decentralized,
largeLogo = MR.images.logo,
logoDarkMode = MR.images.decentralized_light,
largeLogoDarkMode = MR.images.logo_light
)
)
@Serializable
@@ -3800,7 +3785,7 @@ data class ServerOperator(
companion object {
val dummyOperatorInfo = ServerOperatorInfo(
description = listOf("Default"),
website = "Default",
website = "https://simplex.chat",
logo = MR.images.decentralized,
largeLogo = MR.images.logo,
logoDarkMode = MR.images.decentralized_light,
@@ -3818,30 +3803,6 @@ data class ServerOperator(
smpRoles = ServerRoles(storage = true, proxy = true),
xftpRoles = ServerRoles(storage = true, proxy = true)
)
val sampleData2 = ServerOperator(
operatorId = 2,
operatorTag = OperatorTag.XYZ,
tradeName = "XYZ",
legalName = null,
serverDomains = listOf("xyz.com"),
conditionsAcceptance = ConditionsAcceptance.Required(deadline = null),
enabled = false,
smpRoles = ServerRoles(storage = false, proxy = true),
xftpRoles = ServerRoles(storage = false, proxy = true)
)
val sampleData3 = ServerOperator(
operatorId = 3,
operatorTag = OperatorTag.Demo,
tradeName = "Demo",
legalName = null,
serverDomains = listOf("demo.com"),
conditionsAcceptance = ConditionsAcceptance.Required(deadline = null),
enabled = false,
smpRoles = ServerRoles(storage = true, proxy = false),
xftpRoles = ServerRoles(storage = true, proxy = false)
)
}
val id: Long
@@ -609,6 +609,7 @@ fun themedBackgroundBrush(): Brush = Brush.linearGradient(
)
val DEFAULT_PADDING = 20.dp
val DEFAULT_ONBOARDING_HORIZONTAL_PADDING = 25.dp
val DEFAULT_SPACE_AFTER_ICON = 4.dp
val DEFAULT_PADDING_HALF = DEFAULT_PADDING / 2
val DEFAULT_BOTTOM_PADDING = 48.dp
@@ -117,7 +117,7 @@ fun CreateFirstProfile(chatModel: ChatModel, close: () -> Unit) {
ColumnWithScrollBar {
val displayName = rememberSaveable { mutableStateOf("") }
val focusRequester = remember { FocusRequester() }
Column(if (appPlatform.isAndroid) Modifier.fillMaxSize().padding(start = DEFAULT_PADDING * 2, end = DEFAULT_PADDING * 2, bottom = DEFAULT_PADDING) else Modifier.widthIn(max = 600.dp).fillMaxHeight().padding(horizontal = DEFAULT_PADDING).align(Alignment.CenterHorizontally)) {
Column(if (appPlatform.isAndroid) Modifier.fillMaxSize().padding(start = DEFAULT_ONBOARDING_HORIZONTAL_PADDING * 2, end = DEFAULT_ONBOARDING_HORIZONTAL_PADDING * 2, bottom = DEFAULT_PADDING) else Modifier.widthIn(max = 600.dp).fillMaxHeight().padding(horizontal = DEFAULT_PADDING).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
Box(Modifier.align(Alignment.CenterHorizontally)) {
AppBarTitle(stringResource(MR.strings.create_your_profile), bottomPadding = DEFAULT_PADDING, withPadding = false)
}
@@ -130,7 +130,7 @@ fun CreateFirstProfile(chatModel: ChatModel, close: () -> Unit) {
Spacer(Modifier.fillMaxHeight().weight(1f))
Column(Modifier.widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
OnboardingActionButton(
if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
labelId = MR.strings.create_profile_button,
onboarding = null,
enabled = canCreateProfile(displayName.value),
@@ -192,13 +192,7 @@ fun DatabaseLayout(
}
RunChatSetting(stopped, toggleEnabled && !progressIndicator, startChat, stopChatAlert)
}
SectionTextFooter(
if (stopped) {
stringResource(MR.strings.you_must_use_the_most_recent_version_of_database)
} else {
stringResource(MR.strings.stop_chat_to_enable_database_actions)
}
)
if (stopped) SectionTextFooter(stringResource(MR.strings.you_must_use_the_most_recent_version_of_database))
SectionDividerSpaced(maxTopPadding = true)
}
@@ -1,7 +1,11 @@
package chat.simplex.common.views.onboarding
import SectionBottomSpacer
import SectionDividerSpaced
import SectionItemView
import SectionTextFooter
import SectionView
import TextIconSpaced
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.*
@@ -10,10 +14,12 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ServerOperator
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
@@ -57,7 +63,8 @@ fun ModalData.ChooseServerOperators(
Column((
if (appPlatform.isDesktop) Modifier.width(600.dp).align(Alignment.CenterHorizontally) else Modifier)
.fillMaxWidth()
.padding(horizontal = DEFAULT_PADDING)
.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING),
horizontalAlignment = Alignment.CenterHorizontally
) {
serverOperators.value.forEachIndexed { index, srvOperator ->
OperatorCheckView(srvOperator, selectedOperatorIds)
@@ -67,6 +74,7 @@ fun ModalData.ChooseServerOperators(
}
Spacer(Modifier.height(DEFAULT_PADDING_HALF))
SectionTextFooter(annotatedStringResource(MR.strings.onboarding_network_operators_simplex_flux_agreement), textAlign = TextAlign.Center)
SectionTextFooter(annotatedStringResource(MR.strings.onboarding_network_operators_configure_via_settings), textAlign = TextAlign.Center)
}
Spacer(Modifier.weight(1f))
@@ -169,7 +177,7 @@ private fun ReviewConditionsButton(
modalManager: ModalManager
) {
OnboardingActionButton(
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
labelId = MR.strings.operator_review_conditions,
onboarding = null,
enabled = enabled,
@@ -184,7 +192,7 @@ private fun ReviewConditionsButton(
@Composable
private fun SetOperatorsButton(enabled: Boolean, onboarding: Boolean, serverOperators: State<List<ServerOperator>>, selectedOperatorIds: State<Set<Long>>, close: () -> Unit) {
OnboardingActionButton(
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
labelId = MR.strings.onboarding_network_operators_update,
onboarding = null,
enabled = enabled,
@@ -206,7 +214,7 @@ private fun SetOperatorsButton(enabled: Boolean, onboarding: Boolean, serverOper
@Composable
private fun ContinueButton(enabled: Boolean, onboarding: Boolean, close: () -> Unit) {
OnboardingActionButton(
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
labelId = MR.strings.onboarding_network_operators_continue,
onboarding = null,
enabled = enabled,
@@ -234,7 +242,7 @@ private fun ReviewConditionsView(
// remembering both since we don't want to reload the view after the user accepts conditions
val operatorsWithConditionsAccepted = remember { chatModel.conditions.value.serverOperators.filter { it.conditionsAcceptance.conditionsAccepted } }
val acceptForOperators = remember { selectedOperators.value.filter { !it.conditionsAcceptance.conditionsAccepted } }
ColumnWithScrollBar(modifier = Modifier.fillMaxSize().padding(horizontal = DEFAULT_PADDING)) {
ColumnWithScrollBar(modifier = Modifier.fillMaxSize().padding(horizontal = if (onboarding) DEFAULT_ONBOARDING_HORIZONTAL_PADDING else DEFAULT_PADDING)) {
AppBarTitle(stringResource(MR.strings.operator_conditions_of_use), withPadding = false, enableAlphaChanges = false, bottomPadding = DEFAULT_PADDING)
if (operatorsWithConditionsAccepted.isNotEmpty()) {
ReadableText(MR.strings.operator_conditions_accepted_for_some, args = operatorsWithConditionsAccepted.joinToString(", ") { it.legalName_ })
@@ -267,7 +275,7 @@ private fun AcceptConditionsButton(
}
}
OnboardingActionButton(
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier,
modifier = if (appPlatform.isAndroid) Modifier.fillMaxWidth() else Modifier,
labelId = MR.strings.accept_conditions,
onboarding = null,
onclick = {
@@ -339,11 +347,45 @@ private fun enabledOperators(operators: List<ServerOperator>, selectedOperatorId
@Composable
private fun ChooseServerOperatorsInfoView() {
ColumnWithScrollBar(Modifier.padding(horizontal = DEFAULT_PADDING)) {
AppBarTitle(stringResource(MR.strings.onboarding_network_operators), withPadding = false)
ReadableText(stringResource(MR.strings.onboarding_network_operators_app_will_use_different_operators))
ReadableText(stringResource(MR.strings.onboarding_network_operators_cant_see_who_talks_to_whom))
ReadableText(stringResource(MR.strings.onboarding_network_operators_app_will_use_for_routing))
ColumnWithScrollBar {
AppBarTitle(stringResource(MR.strings.onboarding_network_operators))
Column(
Modifier.padding(horizontal = DEFAULT_PADDING)
) {
ReadableText(stringResource(MR.strings.onboarding_network_operators_app_will_use_different_operators))
ReadableText(stringResource(MR.strings.onboarding_network_operators_cant_see_who_talks_to_whom))
ReadableText(stringResource(MR.strings.onboarding_network_operators_app_will_use_for_routing))
}
SectionDividerSpaced()
SectionView(title = stringResource(MR.strings.onboarding_network_about_operators).uppercase()) {
chatModel.conditions.value.serverOperators.forEach { op ->
ServerOperatorRow(op)
}
}
SectionBottomSpacer()
}
}
@Composable()
private fun ServerOperatorRow(
operator: ServerOperator
) {
SectionItemView(
{
ModalManager.start.showModalCloseable { close ->
OperatorInfoView(operator)
}
}
) {
Image(
painterResource(operator.logo),
operator.tradeName,
modifier = Modifier.size(24.dp)
)
TextIconSpaced()
Text(operator.tradeName)
}
}
@@ -35,14 +35,14 @@ fun SetNotificationsMode(m: ChatModel) {
AppBarTitle(stringResource(MR.strings.onboarding_notifications_mode_title), bottomPadding = DEFAULT_PADDING)
}
val currentMode = rememberSaveable { mutableStateOf(NotificationsMode.default) }
Column(Modifier.padding(horizontal = DEFAULT_PADDING).fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
Column(Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
OnboardingInformationButton(
stringResource(MR.strings.onboarding_notifications_mode_subtitle),
onClick = { ModalManager.fullscreen.showModalCloseable { NotificationBatteryUsageInfo() } }
)
}
Spacer(Modifier.weight(1f))
Column(Modifier.padding(horizontal = DEFAULT_PADDING)) {
Column(Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING)) {
SelectableCard(currentMode, NotificationsMode.SERVICE, stringResource(MR.strings.onboarding_notifications_mode_service), annotatedStringResource(MR.strings.onboarding_notifications_mode_service_desc_short)) {
currentMode.value = NotificationsMode.SERVICE
}
@@ -56,7 +56,7 @@ fun SetNotificationsMode(m: ChatModel) {
Spacer(Modifier.weight(1f))
Column(Modifier.widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally) {
OnboardingActionButton(
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier,
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier,
labelId = MR.strings.use_chat,
onboarding = OnboardingStage.OnboardingComplete,
onclick = {
@@ -190,7 +190,7 @@ private fun SetupDatabasePassphraseLayout(
@Composable
private fun SetPassphraseButton(disabled: Boolean, onClick: () -> Unit) {
OnboardingActionButton(
if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING * 2).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
labelId = MR.strings.set_database_passphrase,
onboarding = null,
onclick = onClick,
@@ -5,6 +5,7 @@ import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
@@ -13,6 +14,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.layout
import androidx.compose.ui.text.TextLayoutResult
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.text.font.FontWeight
@@ -27,6 +30,8 @@ import chat.simplex.common.views.migration.MigrateToDeviceView
import chat.simplex.common.views.migration.MigrationToState
import chat.simplex.res.MR
import dev.icerock.moko.resources.StringResource
import kotlin.math.ceil
import kotlin.math.floor
@Composable
fun SimpleXInfo(chatModel: ChatModel, onboarding: Boolean = true) {
@@ -52,7 +57,7 @@ fun SimpleXInfoLayout(
user: User?,
onboardingStage: SharedPreference<OnboardingStage>?
) {
ColumnWithScrollBar(Modifier.padding(horizontal = DEFAULT_PADDING), horizontalAlignment = Alignment.CenterHorizontally) {
ColumnWithScrollBar(Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING), horizontalAlignment = Alignment.CenterHorizontally) {
Box(Modifier.widthIn(max = if (appPlatform.isAndroid) 250.dp else 500.dp).padding(top = DEFAULT_PADDING + 8.dp), contentAlignment = Alignment.Center) {
SimpleXLogo()
}
@@ -73,7 +78,7 @@ fun SimpleXInfoLayout(
Column(Modifier.fillMaxHeight().weight(1f)) { }
if (onboardingStage != null) {
Column(Modifier.padding(horizontal = DEFAULT_PADDING).widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally,) {
Column(Modifier.widthIn(max = if (appPlatform.isAndroid) 450.dp else 1000.dp).align(Alignment.CenterHorizontally), horizontalAlignment = Alignment.CenterHorizontally,) {
OnboardingActionButton(user, onboardingStage)
TextButtonBelowOnboardingButton(stringResource(MR.strings.migrate_from_another_device)) {
chatModel.migrationState.value = MigrationToState.PasteOrScanLink
@@ -139,7 +144,7 @@ fun OnboardingActionButton(
shape = CircleShape,
enabled = enabled,
// elevation = ButtonDefaults.elevation(defaultElevation = 0.dp, focusedElevation = 0.dp, pressedElevation = 0.dp, hoveredElevation = 0.dp),
contentPadding = PaddingValues(horizontal = if (icon == null) DEFAULT_PADDING * 2 else DEFAULT_PADDING * 1.5f, vertical = DEFAULT_PADDING),
contentPadding = PaddingValues(horizontal = if (icon == null) DEFAULT_PADDING * 2 else DEFAULT_PADDING * 1.5f, vertical = 17.dp),
colors = ButtonDefaults.buttonColors(MaterialTheme.colors.primary, disabledBackgroundColor = MaterialTheme.colors.secondary)
) {
if (icon != null) {
@@ -153,8 +158,8 @@ fun OnboardingActionButton(
fun TextButtonBelowOnboardingButton(text: String, onClick: (() -> Unit)?) {
val state = getKeyboardState()
val enabled = onClick != null
val topPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else DEFAULT_PADDING_HALF)
val bottomPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else DEFAULT_PADDING_HALF)
val topPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else 7.5.dp)
val bottomPadding by animateDpAsState(if (appPlatform.isAndroid && state.value == KeyboardState.Opened) 0.dp else 7.5.dp)
if ((appPlatform.isAndroid && state.value == KeyboardState.Closed) || topPadding > 0.dp) {
TextButton({ onClick?.invoke() }, Modifier.padding(top = topPadding, bottom = bottomPadding).clip(CircleShape), enabled = enabled) {
Text(
@@ -187,7 +192,35 @@ fun OnboardingInformationButton(
null,
tint = MaterialTheme.colors.primary
)
Text(text, style = MaterialTheme.typography.button, color = MaterialTheme.colors.primary)
// https://issuetracker.google.com/issues/206039942#comment32
var textLayoutResult: TextLayoutResult? by remember { mutableStateOf(null) }
Text(
text,
Modifier
.layout { measurable, constraints ->
val placeable = measurable.measure(constraints)
val newTextLayoutResult = textLayoutResult
if (newTextLayoutResult == null || newTextLayoutResult.lineCount == 0) {
// Default behavior if there is no text or the text layout is not measured yet
layout(placeable.width, placeable.height) {
placeable.placeRelative(0, 0)
}
} else {
val minX = (0 until newTextLayoutResult.lineCount).minOf(newTextLayoutResult::getLineLeft)
val maxX = (0 until newTextLayoutResult.lineCount).maxOf(newTextLayoutResult::getLineRight)
layout(ceil(maxX - minX).toInt(), placeable.height) {
placeable.place(-floor(minX).toInt(), 0)
}
}
},
onTextLayout = {
textLayoutResult = it
},
style = MaterialTheme.typography.button,
color = MaterialTheme.colors.primary
)
}
}
}
@@ -410,7 +410,7 @@ fun OperatorViewLayout(
}
@Composable
private fun OperatorInfoView(serverOperator: ServerOperator) {
fun OperatorInfoView(serverOperator: ServerOperator) {
ColumnWithScrollBar {
AppBarTitle(stringResource(MR.strings.operator_info_title))
@@ -427,23 +427,27 @@ private fun OperatorInfoView(serverOperator: ServerOperator) {
SectionDividerSpaced(maxBottomPadding = false)
val uriHandler = LocalUriHandler.current
SectionView {
SectionItemView {
Column(verticalArrangement = Arrangement.spacedBy(10.dp)) {
serverOperator.info.description.forEach { d ->
Text(d)
}
val website = serverOperator.info.website
Text(website, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openUriCatching(website) })
}
}
}
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.operator_website).uppercase()) {
SectionItemView {
val website = serverOperator.info.website
val uriHandler = LocalUriHandler.current
Text(website, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openUriCatching(website) })
val selfhost = serverOperator.info.selfhost
if (selfhost != null) {
SectionDividerSpaced(maxBottomPadding = false)
SectionView {
SectionItemView {
val (text, link) = selfhost
Text(text, color = MaterialTheme.colors.primary, modifier = Modifier.clickable { uriHandler.openUriCatching(link) })
}
}
}
}
@@ -1049,7 +1049,6 @@
<string name="stop_sharing_address">إيقاف مشاركة العنوان؟</string>
<string name="stop_sharing">إيقاف المشاركة</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">أوقف الدردشة لتصدير أو استيراد أو حذف قاعدة بيانات الدردشة. لن تتمكّن من استلام الرسائل وإرسالها أثناء إيقاف الدردشة.</string>
<string name="stop_chat_to_enable_database_actions">أوقف الدردشة لتمكين إجراءات قاعدة البيانات.</string>
<string name="chat_item_ttl_seconds">%s ثانية/ثواني</string>
<string name="callstate_starting">يبدأ…</string>
<string name="auth_simplex_lock_turned_on">تم تشغيل القفل SimpleX</string>
@@ -71,6 +71,8 @@
<string name="connection_local_display_name">connection %1$d</string>
<string name="display_name_connection_established">connection established</string>
<string name="display_name_invited_to_connect">invited to connect</string>
<string name="display_name_requested_to_connect">requested to connect</string>
<string name="display_name_accepted_invitation">accepted invitation</string>
<string name="display_name_connecting">connecting…</string>
<string name="description_you_shared_one_time_link">you shared one-time link</string>
<string name="description_you_shared_one_time_link_incognito">you shared one-time link incognito</string>
@@ -1075,9 +1077,11 @@
<!-- ChooseServerOperators.kt -->
<string name="onboarding_choose_server_operators">Server operators</string>
<string name="onboarding_network_operators">Network operators</string>
<string name="onboarding_network_operators_simplex_flux_agreement">SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app.</string>
<string name="onboarding_network_operators_app_will_use_different_operators">The app protects your privacy by using different operators in each conversation.</string>
<string name="onboarding_network_operators_cant_see_who_talks_to_whom">When more than one operator is enabled, none of them has metadata to learn who communicates with whom.</string>
<string name="onboarding_network_operators_app_will_use_for_routing">For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server.</string>
<string name="onboarding_network_about_operators">About operators</string>
<string name="onboarding_select_network_operators_to_use">Select network operators to use.</string>
<string name="how_it_helps_privacy">How it helps privacy</string>
<string name="onboarding_network_operators_configure_via_settings">You can configure servers via settings.</string>
@@ -1306,7 +1310,6 @@
<string name="chat_database_deleted">Chat database deleted</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Restart the app to create a new chat profile.</string>
<string name="you_must_use_the_most_recent_version_of_database">You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts.</string>
<string name="stop_chat_to_enable_database_actions">Stop chat to enable database actions.</string>
<string name="files_and_media_section">Files &amp; media</string>
<string name="delete_files_and_media_for_all_users">Delete files for all chat profiles</string>
<string name="delete_files_and_media_all">Delete all files</string>
@@ -1133,7 +1133,6 @@
<string name="save_preferences_question">Запази настройките\?</string>
<string name="icon_descr_speaker_on">Високоговорителят е включен</string>
<string name="icon_descr_speaker_off">Високоговорителят е изключен</string>
<string name="stop_chat_to_enable_database_actions">Спрете чата, за да активирате действията с базата данни.</string>
<string name="role_in_group">Роля</string>
<string name="network_options_save">Запази</string>
<string name="reset_color">Нулирай цветовете</string>
@@ -280,7 +280,6 @@
<string name="delete_chat_profile_action_cannot_be_undone_warning">Tuto akci nelze vzít zpět! Váš profil, kontakty, zprávy a soubory budou nenávratně ztraceny.</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Restartujte aplikaci a vytvořte nový chat profil.</string>
<string name="you_must_use_the_most_recent_version_of_database">Nejnovější verzi databáze chatu musíte používat POUZE v jednom zařízení, jinak se může stát, že přestanete přijímat zprávy od některých kontaktů.</string>
<string name="stop_chat_to_enable_database_actions">Zastavte chat a povolte akce s databází.</string>
<string name="files_and_media_section">Soubory a média</string>
<string name="delete_files_and_media_question">Smazat soubory a média\?</string>
<string name="delete_messages">Odstranit zprávy</string>
@@ -597,7 +597,6 @@
<string name="chat_database_deleted">Chat-Datenbank gelöscht</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Starten Sie die App neu, um ein neues Chat-Profil zu erstellen.</string>
<string name="you_must_use_the_most_recent_version_of_database">Sie dürfen die neueste Version Ihrer Chat-Datenbank NUR auf einem Gerät verwenden, andernfalls erhalten Sie möglicherweise keine Nachrichten mehr von einigen Ihrer Kontakte.</string>
<string name="stop_chat_to_enable_database_actions">Chat beenden, um Datenbankaktionen zu erlauben.</string>
<string name="delete_files_and_media_question">Dateien und Medien löschen?</string>
<string name="delete_files_and_media_desc">Diese Aktion kann nicht rückgängig gemacht werden! Es werden alle empfangenen und gesendeten Dateien und Medien gelöscht. Bilder mit niedriger Auflösung bleiben erhalten.</string>
<string name="no_received_app_files">Keine empfangenen oder gesendeten Dateien</string>
@@ -733,7 +733,6 @@
<string name="share_invitation_link">Compartir enlace de un uso</string>
<string name="update_network_session_mode_question">¿Actualizar el modo de aislamiento de transporte\?</string>
<string name="icon_descr_speaker_on">Altavoz activado</string>
<string name="stop_chat_to_enable_database_actions">Para habilitar las acciones sobre la base de datos, debes parar SimpleX</string>
<string name="connection_you_accepted_will_be_cancelled">¡La conexión que has aceptado se cancelará!</string>
<string name="database_initialization_error_desc">La base de datos no funciona correctamente. Pulsa para conocer más</string>
<string name="moderate_message_will_be_marked_warning">El mensaje será marcado como moderado para todos los miembros.</string>
@@ -942,7 +942,6 @@
<string name="delete_files_and_media_desc">این عمل قابل برگشت نیست - تمام پرونده‌ها و رسانه دریافتی حذف خواهند شد. عکس‌های با کیفیت پایین باقی خواهند ماند.</string>
<string name="you_must_use_the_most_recent_version_of_database">شما باید از تازه‌ترین نسخه پایگاه داده گپ خود روی فقط یک دستگاه استفاده کنید، در غیر این صورت ممکن است از بعضی از مخاطب‌ها ‌دیگر پیامی دریافت نکنید.</string>
<string name="messages_section_title">پیام‌ها</string>
<string name="stop_chat_to_enable_database_actions">به منظور فعال‌سازی اقدامات پایگاه داده، گپ را متوقف کنید.</string>
<string name="enable_automatic_deletion_message">این عمل قابل برگشت نیست - پیام‌های ارسالی و دریافتی قدیمی‌تر از زمان انتخابی حذف خواهند شد. این کار ممکن است چندین دقیقه زمان ببرد.</string>
<string name="error_changing_message_deletion">خطا در تغییر تنظیمات</string>
<string name="save_passphrase_in_settings">ذخیره عبارت عبور در تنظیمات</string>
@@ -666,7 +666,6 @@
<string name="self_destruct_passcode">Itsetuhoutuva pääsykoodi</string>
<string name="restart_the_app_to_use_imported_chat_database">Käynnistä sovellus uudelleen käyttääksesi tuotua keskustelutietokantaa.</string>
<string name="old_database_archive">Vanha tietokanta-arkisto</string>
<string name="stop_chat_to_enable_database_actions">Pysäytä keskustelu, jotta tietokantatoiminnot voidaan ottaa käyttöön.</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Luo uusi keskusteluprofiili käynnistämällä sovellus uudelleen.</string>
<string name="messages_section_title">Viestit</string>
<string name="chat_item_ttl_none">ei koskaan</string>
@@ -617,7 +617,6 @@
<string name="error_importing_database">Erreur lors de l\'importation de la base de données du chat</string>
<string name="chat_database_imported">Base de données du chat importée</string>
<string name="delete_chat_profile_question">Supprimer le profil du chat \?</string>
<string name="stop_chat_to_enable_database_actions">Arrêter le chat pour agir sur la base de données.</string>
<string name="delete_files_and_media_question">Supprimer les fichiers et médias \?</string>
<string name="delete_files_and_media_desc">Cette action ne peut être annulée - tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées.</string>
<string name="no_received_app_files">Aucun fichier reçu ou envoyé</string>
@@ -922,7 +922,6 @@
<string name="only_your_contact_can_make_calls">Csak az ismerőse tud hívást indítani.</string>
<string name="settings_section_title_themes">TÉMÁK</string>
<string name="videos_limit_title">Túl sok videó!</string>
<string name="stop_chat_to_enable_database_actions">Csevegési szolgáltatás megállítása az adatbázis műveletek elvégzéséhez.</string>
<string name="welcome">Üdvözöljük!</string>
<string name="v5_1_self_destruct_passcode">Önmegsemmisítési jelkód</string>
<string name="connect_via_link_or_qr_from_clipboard_or_in_person">(beolvasás, vagy beillesztés a vágólapról)</string>
@@ -874,7 +874,6 @@
<string name="remove_passphrase_from_keychain">Rimuovere la password dal Keystore\?</string>
<string name="save_passphrase_in_keychain">Salva la password nel Keystore</string>
<string name="chat_item_ttl_seconds">%s secondo/i</string>
<string name="stop_chat_to_enable_database_actions">Ferma la chat per attivare le azioni del database.</string>
<string name="delete_files_and_media_desc">Questa azione non può essere annullata: tutti i file e i media ricevuti e inviati verranno eliminati. Rimarranno le immagini a bassa risoluzione.</string>
<string name="enable_automatic_deletion_message">Questa azione non può essere annullata: i messaggi inviati e ricevuti prima di quanto selezionato verranno eliminati. Potrebbe richiedere diversi minuti.</string>
<string name="update_database">Aggiorna</string>
@@ -981,7 +981,6 @@
<string name="stop_chat_question">לעצור צ׳אט\?</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">עיצרו את הצ׳אט כדי לייצא, לייבא או למחוק את מסד הנתונים. לא תוכלו לקבל ולשלוח הודעות בזמן שהצ׳אט מופסק.</string>
<string name="stop_chat_confirmation">עצור</string>
<string name="stop_chat_to_enable_database_actions">עיצרו את הצ׳אט כדי לאפשר פעולות מסד נתונים.</string>
<string name="skip_inviting_button">דלג על הזמנת חברים</string>
<string name="share_address">שתף כתובת</string>
<string name="theme_simplex">SimpleX</string>
@@ -662,7 +662,6 @@
<string name="icon_descr_speaker_off">スピーカーオフ</string>
<string name="your_chat_database">あなたのチャットデータベース</string>
<string name="stop_chat_confirmation">停止</string>
<string name="stop_chat_to_enable_database_actions">データベース操作をするにはチャットを停止する必要があります。</string>
<string name="simplex_link_contact">SimpleX連絡先アドレス</string>
<string name="simplex_link_invitation">SimpleX使い捨て招待リンク</string>
<string name="description_via_contact_address_link">連絡先アドレスリンク経由</string>
@@ -851,7 +851,6 @@
<string name="submit_passcode">제출하기</string>
<string name="store_passphrase_securely_without_recover">암호를 모르면 채팅에 액세스할 수 없으니 암호를 안전하게 보관해 주세요.</string>
<string name="stop_chat_question">채팅 기능을 중지할까요\?</string>
<string name="stop_chat_to_enable_database_actions">데이터베이스 작업을 할 수 있도록 채팅 기능을 중지하기</string>
<string name="switch_receiving_address">수신 주소 바꾸기</string>
<string name="decryption_error">복호화 오류</string>
<string name="confirm_passcode">패스코드 확인</string>
@@ -1219,7 +1219,6 @@
<string name="set_database_passphrase">Nustatyti duomenų slaptafrazę</string>
<string name="set_passphrase">Nustatyti slaptafrazę</string>
<string name="privacy_show_last_messages">Rodyti paskutines žinutes</string>
<string name="stop_chat_to_enable_database_actions">Sustabdykite pokalbius, kad įgalinti duomenų bazės veiksmus.</string>
<string name="settings_section_title_support">PALAIKYKITE SIMPLEX CHAT</string>
<string name="receipts_section_description_1">Jų galima nepaisyti kontaktų ir grupių nustatymuose.</string>
<string name="enable_automatic_deletion_message">Šis veiksmas negali būti atšauktas - žinutės išsiųstos ir gautos anksčiau nei pasirinkta bus ištrintos. Tai gali užtrukti kelias minutes.</string>
@@ -740,7 +740,6 @@
<string name="restart_the_app_to_create_a_new_chat_profile">Start de app opnieuw om een nieuw chatprofiel aan te maken.</string>
<string name="you_must_use_the_most_recent_version_of_database">U mag ALLEEN de meest recente versie van uw chat-database op één apparaat gebruiken, anders ontvangt u mogelijk geen berichten meer van sommige contacten.</string>
<string name="restart_the_app_to_use_imported_chat_database">Start de app opnieuw om de geïmporteerde chat database te gebruiken.</string>
<string name="stop_chat_to_enable_database_actions">Stop de chat om database acties mogelijk te maken.</string>
<string name="delete_files_and_media_desc">Deze actie kan niet ongedaan worden gemaakt, alle ontvangen en verzonden bestanden en media worden verwijderd. Foto\'s met een lage resolutie blijven behouden.</string>
<string name="remove_passphrase_from_keychain">Wachtwoord verwijderen uit Keychain\?</string>
<string name="remove_passphrase">Verwijderen</string>
@@ -562,7 +562,6 @@
<string name="restart_the_app_to_create_a_new_chat_profile">Uruchom ponownie aplikację, aby utworzyć nowy profil czatu.</string>
<string name="save_passphrase_in_keychain">Zapisz hasło w Keystore</string>
<string name="chat_item_ttl_seconds">%s sekund(y)</string>
<string name="stop_chat_to_enable_database_actions">Zatrzymaj czat, aby umożliwić działania na bazie danych.</string>
<string name="enable_automatic_deletion_message">Tego działania nie można cofnąć - wiadomości wysłane i odebrane wcześniej niż wybrane zostaną usunięte. Może to potrwać kilka minut.</string>
<string name="delete_chat_profile_action_cannot_be_undone_warning">Tego działania nie można cofnąć - Twój profil, kontakty, wiadomości i pliki zostaną nieodwracalnie utracone.</string>
<string name="messages_section_description">To ustawienie dotyczy wiadomości Twojego bieżącego profilu czatu</string>
@@ -853,7 +853,6 @@
<string name="settings_section_title_socks">PROXY SOCKS</string>
<string name="database_backup_can_be_restored">A tentativa de alterar a senha do banco de dados não foi concluída.</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">Pare o bate-papo para exportar, importar ou excluir o banco de dados do chat. Você não poderá receber e enviar mensagens enquanto o chat estiver interrompido.</string>
<string name="stop_chat_to_enable_database_actions">Pare o bate-papo para ativar ações no banco de dados.</string>
<string name="chat_item_ttl_seconds">%s segundo(s)</string>
<string name="unknown_database_error_with_info">Erro de banco de dados desconhecido: %s</string>
<string name="unknown_error">Erro desconhecido</string>
@@ -760,7 +760,6 @@
<string name="group_members_n">%s, %s e %d membros</string>
<string name="add_contact_or_create_group">Iniciar nova conversa</string>
<string name="la_mode_system">Sistema</string>
<string name="stop_chat_to_enable_database_actions">Parar conversa para habilitar ações do banco de dados</string>
<string name="group_invitation_tap_to_join">Toque para participar</string>
<string name="rcv_group_event_3_members_connected">%s, %s e %s conectado</string>
<string name="network_option_tcp_connection_timeout">Tempo esgotado da conexão TCP</string>
@@ -600,7 +600,6 @@
<string name="chat_database_deleted">Данные чата удалены</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Перезапустите приложение, чтобы создать новый профиль.</string>
<string name="you_must_use_the_most_recent_version_of_database">Используйте самую последнюю версию архива чата и ТОЛЬКО на одном устройстве, иначе Вы можете перестать получать сообщения от некоторых контактов.</string>
<string name="stop_chat_to_enable_database_actions">Остановите чат, чтобы разблокировать операции с архивом чата.</string>
<string name="delete_files_and_media_for_all_users">Удалить файлы во всех профилях чата</string>
<string name="delete_files_and_media_all">Удалить все файлы</string>
<string name="delete_files_and_media_question">Удалить файлы и медиа?</string>
@@ -2321,6 +2320,7 @@
<string name="one_time_link_can_be_used_with_one_contact_only"><![CDATA[Одноразовая ссылка может быть использована <i>только с одним контактом</i> - поделитесь при встрече или через любой мессенджер.]]></string>
<string name="no_message_servers_configured_for_private_routing">Нет серверов для доставки сообщений.</string>
<string name="onboarding_network_operators_configure_via_settings">Вы можете настроить серверы позже.</string>
<string name="onboarding_network_operators_simplex_flux_agreement">SimpleX Chat и Flux заключили соглашение добавить серверы под управлением Flux в приложение.</string>
<string name="onboarding_network_operators_app_will_use_different_operators">Приложение улучшает конфиденциальность используя разных операторов в каждом разговоре.</string>
<string name="onboarding_network_operators_cant_see_who_talks_to_whom">Когда больше чем один оператор включен, ни один из них не видит метаданные, чтобы определить, кто соединен с кем.</string>
<string name="failed_to_save_servers">Ошибка сохранения серверов</string>
@@ -937,7 +937,6 @@
<string name="star_on_github">ติดดาวบน GitHub</string>
<string name="switch_verb">เปลี่ยน</string>
<string name="callstate_starting">กำลังเริ่มต้น…</string>
<string name="stop_chat_to_enable_database_actions">หยุดการแชทเพื่อเปิดใช้งานการดำเนินการกับฐานข้อมูล</string>
<string name="stop_chat_to_export_import_or_delete_chat_database">หยุดแชทเพื่อส่งออก นำเข้า หรือลบฐานข้อมูลแชท คุณจะไม่สามารถรับและส่งข้อความได้ในขณะที่การแชทหยุดลง</string>
<string name="v4_6_audio_video_calls_descr">รองรับบลูทูธและการปรับปรุงอื่นๆ</string>
<string name="stop_sharing_address">หยุดแชร์ที่อยู่ไหม\?</string>
@@ -1034,7 +1034,6 @@
<string name="stop_file__action">Dosyayı durdur</string>
<string name="error_alert_title">Hata</string>
<string name="create_another_profile_button">ProfilProfil oluştur</string>
<string name="stop_chat_to_enable_database_actions">Veri tabanı eylemlerini etkinleştirmek için sohbeti durdur.</string>
<string name="stop_snd_file__title">Dosya göndermeyi durdur?</string>
<string name="auth_stop_chat">Sohbeti durdur</string>
<string name="connect_use_current_profile">Mevcut profili kullan</string>
@@ -899,7 +899,6 @@
<string name="enable_lock">Увімкнути блокування</string>
<string name="passcode_not_changed">Пароль не змінено!</string>
<string name="change_lock_mode">Змінити режим блокування</string>
<string name="stop_chat_to_enable_database_actions">Зупиніть чат, щоб увімкнути дії з базою даних.</string>
<string name="restart_the_app_to_create_a_new_chat_profile">Перезапустіть додаток, щоб створити новий профіль чату.</string>
<string name="delete_files_and_media_for_all_users">Видалити файли для всіх профілів чату</string>
<string name="delete_files_and_media_question">Видалити файли та медіа?</string>
@@ -799,7 +799,6 @@
<string name="prohibit_direct_messages">禁止向成员发送私信。</string>
<string name="protect_app_screen">保护应用程序屏幕</string>
<string name="settings_section_title_themes">主题</string>
<string name="stop_chat_to_enable_database_actions">停止聊天以启用数据库操作。</string>
<string name="chat_item_ttl_seconds">%s 秒</string>
<string name="alert_message_no_group">该群已不存在。</string>
<string name="group_invitation_tap_to_join">点击加入</string>
@@ -119,7 +119,6 @@
<string name="chat_is_stopped">聊天室已停止運作</string>
<string name="stop_chat_confirmation">停止</string>
<string name="chat_database_deleted">已刪除數據庫的對話內容</string>
<string name="stop_chat_to_enable_database_actions">停止聊天室以啟用數據庫功能。</string>
<string name="change_database_passphrase_question">修改數據庫密碼?</string>
<string name="leave_group_question">確定要退出群組?</string>
<string name="leave_group_button">退出</string>
+1 -1
View File
@@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd
source-repository-package
type: git
location: https://github.com/simplex-chat/simplexmq.git
tag: 3f177b8c8a91de124dfe871af82bd7433f275efb
tag: 79e9447b73cc315ce35042b0a5f210c07ea39b07
source-repository-package
type: git
+4 -1
View File
@@ -1,5 +1,5 @@
name: simplex-chat
version: 6.2.0.6
version: 6.2.0.7
#synopsis:
#description:
homepage: https://github.com/simplex-chat/simplex-chat#readme
@@ -181,3 +181,6 @@ ghc-options:
- -Wredundant-constraints
- -Wincomplete-record-updates
- -Wunused-type-patterns
default-extensions:
- StrictData
+1 -1
View File
@@ -1,5 +1,5 @@
{
"https://github.com/simplex-chat/simplexmq.git"."3f177b8c8a91de124dfe871af82bd7433f275efb" = "18lhllv1w6wnvvphpqcib4fa7fqiyqf01swix2afs80mnxjip01v";
"https://github.com/simplex-chat/simplexmq.git"."79e9447b73cc315ce35042b0a5f210c07ea39b07" = "16z7z5a3f7gw0h188manykp008d1bqpydlrj7h497mgyjmp4cy9m";
"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";
+15 -1
View File
@@ -5,7 +5,7 @@ cabal-version: 1.12
-- see: https://github.com/sol/hpack
name: simplex-chat
version: 6.2.0.6
version: 6.2.0.7
category: Web, System, Services, Cryptography
homepage: https://github.com/simplex-chat/simplex-chat#readme
author: simplex.chat
@@ -201,6 +201,8 @@ library
Paths_simplex_chat
hs-source-dirs:
src
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns
build-depends:
aeson ==2.2.*
@@ -264,6 +266,8 @@ executable simplex-bot
Paths_simplex_chat
hs-source-dirs:
apps/simplex-bot
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -threaded
build-depends:
aeson ==2.2.*
@@ -328,6 +332,8 @@ executable simplex-bot-advanced
Paths_simplex_chat
hs-source-dirs:
apps/simplex-bot-advanced
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -threaded
build-depends:
aeson ==2.2.*
@@ -391,6 +397,8 @@ executable simplex-broadcast-bot
hs-source-dirs:
apps/simplex-broadcast-bot
apps/simplex-broadcast-bot/src
default-extensions:
StrictData
other-modules:
Broadcast.Bot
Broadcast.Options
@@ -460,6 +468,8 @@ executable simplex-chat
Paths_simplex_chat
hs-source-dirs:
apps/simplex-chat
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -threaded
build-depends:
aeson ==2.2.*
@@ -524,6 +534,8 @@ executable simplex-directory-service
hs-source-dirs:
apps/simplex-directory-service
apps/simplex-directory-service/src
default-extensions:
StrictData
other-modules:
Directory.Events
Directory.Options
@@ -629,6 +641,8 @@ test-suite simplex-chat-test
tests
apps/simplex-broadcast-bot/src
apps/simplex-directory-service/src
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -threaded
build-depends:
QuickCheck ==2.14.*
+2 -13
View File
@@ -2872,27 +2872,19 @@ processChatCommand' vr = \case
updateProfile_ user@User {profile = p@LocalProfile {displayName = n}} p'@Profile {displayName = n'} updateUser
| p' == fromLocalProfile p = pure $ CRUserProfileNoChange user
| otherwise = do
liftIO $ putStrLn $ "*** updateProfile_ profile: " <> show p'
when (n /= n') $ checkValidName n'
-- read contacts before user update to correctly merge preferences
contacts <- withFastStore' $ \db -> getUserContacts db vr user
liftIO $ putStrLn $ "*** updateProfile_ contacts: " <> show contacts
user' <- updateUser
asks currentUser >>= atomically . (`writeTVar` Just user')
withChatLock "updateProfile" . procCmd $ do
let changedCts_ = L.nonEmpty $ foldr (addChangedProfileContact user') [] contacts
summary <- case changedCts_ of
Nothing -> do
liftIO $ putStrLn $ "*** updateProfile_ no changed contacts"
pure $ UserProfileUpdateSummary 0 0 []
Nothing -> pure $ UserProfileUpdateSummary 0 0 []
Just changedCts -> do
liftIO $ putStrLn $ "*** updateProfile_ changed contacts: " <> show changedCts_
let idsEvts = L.map ctSndEvent changedCts
liftIO $ putStrLn $ "*** updateProfile_ before sending"
msgReqs_ <- lift $ L.zipWith ctMsgReq changedCts <$> createSndMessages idsEvts
liftIO $ putStrLn $ "*** updateProfile_ created messages"
(errs, cts) <- partitionEithers . L.toList . L.zipWith (second . const) changedCts <$> deliverMessagesB msgReqs_
liftIO $ putStrLn $ "*** updateProfile_ delivered messages to contacts: " <> show (length cts) <> ", errors: " <> show errs
unless (null errs) $ toView $ CRChatErrors (Just user) errs
let changedCts' = filter (\ChangedProfileContact {ct, ct'} -> directOrUsed ct' && mergedPreferences ct' /= mergedPreferences ct) cts
lift $ createContactsSndFeatureItems user' changedCts'
@@ -2900,7 +2892,7 @@ processChatCommand' vr = \case
UserProfileUpdateSummary
{ updateSuccesses = length cts,
updateFailures = length errs,
changedContacts = map (\ChangedProfileContact {ct'} -> ct') $ L.toList changedCts
changedContacts = map (\ChangedProfileContact {ct'} -> ct') changedCts'
}
pure $ CRUserProfileUpdated user' (fromLocalProfile p) p' summary
where
@@ -3513,7 +3505,6 @@ data ChangedProfileContact = ChangedProfileContact
mergedProfile' :: Profile,
conn :: Connection
}
deriving (Show)
prepareGroupMsg :: User -> GroupInfo -> MsgContent -> Maybe ChatItemId -> Maybe CIForwardedFrom -> Maybe FileInvitation -> Maybe CITimed -> Bool -> CM (MsgContainer, Maybe (CIQuote 'CTGroup))
prepareGroupMsg user GroupInfo {groupId, membership} mc quotedItemId_ itemForwarded fInv_ timed_ live = case (quotedItemId_, itemForwarded) of
@@ -7643,9 +7634,7 @@ deliverMessages msgs = deliverMessagesB $ L.map Right msgs
deliverMessagesB :: NonEmpty (Either ChatError ChatMsgReq) -> CM (NonEmpty (Either ChatError ([Int64], PQEncryption)))
deliverMessagesB msgReqs = do
msgReqs' <- liftIO compressBodies
liftIO $ putStrLn "deliverMessagesB"
sent <- L.zipWith prepareBatch msgReqs' <$> withAgent (`sendMessagesB` snd (mapAccumL toAgent Nothing msgReqs'))
liftIO $ putStrLn $ "deliverMessagesB sent: " <> show sent
lift . void $ withStoreBatch' $ \db -> map (updatePQSndEnabled db) (rights . L.toList $ sent)
lift . withStoreBatch $ \db -> L.map (bindRight $ createDelivery db) sent
where
+4 -8
View File
@@ -10,7 +10,6 @@ module Simplex.Chat.Mobile where
import Control.Concurrent.STM
import Control.Exception (SomeException, catch)
import Control.Logger.Simple
import Control.Monad.Except
import Control.Monad.Reader
import qualified Data.Aeson as J
@@ -54,7 +53,7 @@ import Simplex.Messaging.Encoding.String
import Simplex.Messaging.Parsers (defaultJSON, dropPrefix, sumTypeJSON)
import Simplex.Messaging.Protocol (AProtoServerWithAuth (..), AProtocolType (..), BasicAuth (..), CorrId (..), ProtoServerWithAuth (..), ProtocolServer (..))
import Simplex.Messaging.Util (catchAll, liftEitherWith, safeDecodeUtf8)
import System.IO (BufferMode (..), hSetBuffering, stderr, stdout, utf8)
import System.IO (utf8)
import System.Timeout (timeout)
data DBMigrationResult
@@ -193,7 +192,7 @@ mobileChatOpts dbFilePrefix =
smpServers = [],
xftpServers = [],
simpleNetCfg = defaultSimpleNetCfg,
logLevel = CLLDebug,
logLevel = CLLImportant,
logConnections = False,
logServerHosts = True,
logAgent = Nothing,
@@ -221,7 +220,7 @@ defaultMobileConfig :: ChatConfig
defaultMobileConfig =
defaultChatConfig
{ confirmMigrations = MCYesUp,
logLevel = CLLDebug,
logLevel = CLLError,
coreApi = True,
deviceNameForRemote = "Mobile"
}
@@ -267,10 +266,7 @@ handleErr :: IO () -> IO String
handleErr a = (a $> "") `catch` (pure . show @SomeException)
chatSendCmd :: ChatController -> B.ByteString -> IO JSONByteString
chatSendCmd cc cmd = withGlobalLogging logCfg $ do
hSetBuffering stdout LineBuffering
hSetBuffering stderr LineBuffering
chatSendRemoteCmd cc Nothing cmd
chatSendCmd cc = chatSendRemoteCmd cc Nothing
chatSendRemoteCmd :: ChatController -> Maybe RemoteHostId -> B.ByteString -> IO JSONByteString
chatSendRemoteCmd cc rh s = J.encode . APIResponse Nothing rh <$> runReaderT (execChatCommand rh s) cc
+2 -2
View File
@@ -73,11 +73,11 @@ import UnliftIO.Directory (copyFile, createDirectoryIfMissing, doesDirectoryExis
-- when acting as host
minRemoteCtrlVersion :: AppVersion
minRemoteCtrlVersion = AppVersion [6, 2, 0, 4]
minRemoteCtrlVersion = AppVersion [6, 2, 0, 7]
-- when acting as controller
minRemoteHostVersion :: AppVersion
minRemoteHostVersion = AppVersion [6, 2, 0, 4]
minRemoteHostVersion = AppVersion [6, 2, 0, 7]
currentAppVersion :: AppVersion
currentAppVersion = AppVersion SC.version
+3 -8
View File
@@ -85,7 +85,7 @@ where
import Control.Monad
import Control.Monad.Except
import Control.Monad.IO.Class
import Data.Either (partitionEithers, rights)
import Data.Either (rights)
import Data.Functor (($>))
import Data.Int (Int64)
import Data.Maybe (fromMaybe, isJust, isNothing)
@@ -590,13 +590,8 @@ getContactByName db vr user localDisplayName = do
getUserContacts :: DB.Connection -> VersionRangeChat -> User -> IO [Contact]
getUserContacts db vr user@User {userId} = do
contactIds <- map fromOnly <$> DB.query db "SELECT contact_id FROM contacts WHERE user_id = ? AND deleted = 0" (Only userId)
putStrLn $ "*** getUserContacts contactIds" <> show contactIds
(errs, contacts) <- partitionEithers <$> mapM (runExceptT . getContact db vr user) contactIds
putStrLn $ "*** getUserContacts contacts" <> show contacts
putStrLn $ "*** getUserContacts errors" <> show errs
r <- pure $ filter (\Contact {activeConn} -> isJust activeConn) contacts
putStrLn $ "*** getUserContacts filtered contacts" <> show r
pure r
contacts <- rights <$> mapM (runExceptT . getContact db vr user) contactIds
pure $ filter (\Contact {activeConn} -> isJust activeConn) contacts
createOrUpdateContactRequest :: DB.Connection -> VersionRangeChat -> User -> Int64 -> InvitationId -> VersionRangeChat -> Profile -> Maybe XContactId -> PQSupport -> ExceptT StoreError IO ChatOrRequest
createOrUpdateContactRequest db vr user@User {userId, userContactId} userContactLinkId invId (VersionRange minV maxV) Profile {displayName, fullName, image, contactLink, preferences} xContactId_ pqSup =
+1 -1
View File
@@ -1472,7 +1472,7 @@ updateGroupPreferences db User {userId} g@GroupInfo {groupId, groupProfile = p}
)
|]
(ps, currentTs, userId, groupId)
pure (g :: GroupInfo) {groupProfile = p {groupPreferences = Just ps}}
pure (g :: GroupInfo) {groupProfile = p {groupPreferences = Just ps}, fullGroupPreferences = mergeGroupPreferences $ Just ps}
updateGroupProfileFromMember :: DB.Connection -> User -> GroupInfo -> Profile -> ExceptT StoreError IO GroupInfo
updateGroupProfileFromMember db user g@GroupInfo {groupId} Profile {displayName = n, fullName = fn, image = img} = do
+3 -23
View File
@@ -22,7 +22,7 @@ import qualified Data.Aeson.TH as J
import qualified Data.ByteString.Base64 as B64
import Data.ByteString.Char8 (ByteString)
import Data.Int (Int64)
import Data.Maybe (fromMaybe, isJust, isNothing, listToMaybe)
import Data.Maybe (fromMaybe, isJust, listToMaybe)
import Data.Text (Text)
import qualified Data.Text as T
import Data.Time.Clock (UTCTime (..), getCurrentTime)
@@ -46,7 +46,6 @@ import Simplex.Messaging.Parsers (dropPrefix, sumTypeJSON)
import Simplex.Messaging.Protocol (SubscriptionMode (..))
import Simplex.Messaging.Util (allFinally)
import Simplex.Messaging.Version
import System.IO.Unsafe (unsafePerformIO)
import UnliftIO.STM
data ChatLockEntity
@@ -211,26 +210,7 @@ toConnection vr ((connId, acId, connLevel, viaContact, viaUserContactLink, viaGr
toMaybeConnection :: VersionRangeChat -> MaybeConnectionRow -> Maybe Connection
toMaybeConnection vr ((Just connId, Just agentConnId, Just connLevel, viaContact, viaUserContactLink, Just viaGroupLink, groupLinkId, customUserProfileId, Just connStatus, Just connType, Just contactConnInitiated, Just localAlias) :. (contactId, groupMemberId, sndFileId, rcvFileId, userContactLinkId) :. (Just createdAt, code_, verifiedAt_, Just pqSupport, Just pqEncryption, pqSndEnabled_, pqRcvEnabled_, Just authErrCounter, Just quotaErrCounter, connChatVersion, Just minVer, Just maxVer)) =
Just $ toConnection vr ((connId, agentConnId, connLevel, viaContact, viaUserContactLink, viaGroupLink, groupLinkId, customUserProfileId, connStatus, connType, contactConnInitiated, localAlias) :. (contactId, groupMemberId, sndFileId, rcvFileId, userContactLinkId) :. (createdAt, code_, verifiedAt_, pqSupport, pqEncryption, pqSndEnabled_, pqRcvEnabled_, authErrCounter, quotaErrCounter, connChatVersion, minVer, maxVer))
toMaybeConnection _ ((connId_, agentConnId_, connLevel_, viaContact, viaUserContactLink, viaGroupLink_, groupLinkId, customUserProfileId, connStatus_, connType_, contactConnInitiated_, localAlias_) :. (contactId, groupMemberId, sndFileId, rcvFileId, userContactLinkId) :. (createdAt_, code_, verifiedAt_, pqSupport_, pqEncryption_, pqSndEnabled_, pqRcvEnabled_, authErrCounter_, quotaErrCounter_, connChatVersion, minVer_, maxVer_)) =
unsafePerformIO logRow `seq` Nothing
where
logRow = do
putStrLn $ "connId_ = " <> show connId_
when (isNothing agentConnId_) $ putStrLn "agentConnId_ = Nothing"
when (isNothing connLevel_) $ putStrLn "connLevel_ = Nothing"
when (isNothing viaGroupLink_) $ putStrLn "viaGroupLink_ = Nothing"
when (isNothing connStatus_) $ putStrLn "connStatus_ = Nothing"
when (isNothing connType_) $ putStrLn "connType_ = Nothing"
when (isNothing contactConnInitiated_) $ putStrLn "contactConnInitiated_ = Nothing"
when (isNothing localAlias_) $ putStrLn "localAlias_ = Nothing"
when (isNothing contactId) $ putStrLn "contactId = Nothing"
when (isNothing createdAt_) $ putStrLn "createdAt_ = Nothing"
when (isNothing pqSupport_) $ putStrLn "pqSupport_ = Nothing"
when (isNothing pqEncryption_) $ putStrLn "pqEncryption_ = Nothing"
when (isNothing authErrCounter_) $ putStrLn "authErrCounter_ = Nothing"
when (isNothing quotaErrCounter_) $ putStrLn "quotaErrCounter_ = Nothing"
when (isNothing minVer_) $ putStrLn "minVer_ = Nothing"
when (isNothing maxVer_) $ putStrLn "maxVer_ = Nothing"
toMaybeConnection _ _ = Nothing
createConnection_ :: DB.Connection -> UserId -> ConnType -> Maybe Int64 -> ConnId -> ConnStatus -> VersionChat -> VersionRangeChat -> Maybe ContactId -> Maybe Int64 -> Maybe ProfileId -> Int -> UTCTime -> SubscriptionMode -> PQSupport -> IO Connection
createConnection_ db userId connType entityId acId connStatus connChatVersion peerChatVRange@(VersionRange minV maxV) viaContact viaUserContactLink customUserProfileId connLevel currentTs subMode pqSup = do
@@ -414,7 +394,7 @@ type ContactRow = Only ContactId :. ContactRow'
toContact :: VersionRangeChat -> User -> ContactRow :. MaybeConnectionRow -> Contact
toContact vr user ((Only contactId :. (profileId, localDisplayName, viaGroup, displayName, fullName, image, contactLink, localAlias, contactUsed, contactStatus) :. (enableNtfs_, sendRcpts, favorite, preferences, userPreferences, createdAt, updatedAt, chatTs) :. (contactGroupMemberId, contactGrpInvSent, uiThemes, chatDeleted, customData)) :. connRow) =
let profile = LocalProfile {profileId, displayName, fullName, image, contactLink, preferences, localAlias}
activeConn = unsafePerformIO (putStrLn $ "contactId " <> show contactId) `seq` toMaybeConnection vr connRow
activeConn = toMaybeConnection vr connRow
chatSettings = ChatSettings {enableNtfs = fromMaybe MFAll enableNtfs_, sendRcpts, favorite}
incognito = maybe False connIncognito activeConn
mergedPreferences = contactUserPreferences user userPreferences preferences incognito
+4
View File
@@ -857,6 +857,10 @@ testBusinessUpdateProfiles = testChat4 businessProfile aliceProfile bobProfile c
cath <## "updated group preferences:"
cath <## "Voice messages: on"
]
biz #$> ("/_get chat #1 count=1", chat, [(1, "Voice messages: on")])
alice #$> ("/_get chat #1 count=1", chat, [(0, "Voice messages: on")])
bob #$> ("/_get chat #1 count=1", chat, [(0, "Voice messages: on")])
cath #$> ("/_get chat #1 count=1", chat, [(0, "Voice messages: on")])
testPlanAddressOkKnown :: HasCallStack => FilePath -> IO ()
testPlanAddressOkKnown =