From 87c688a7395151bd4b5b74e1f03f20215363ccaa Mon Sep 17 00:00:00 2001
From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com>
Date: Sat, 16 Apr 2022 09:37:01 +0100
Subject: [PATCH] ios: i18n (#533)
* ios: prepare for i18n
* commit localizations
* update Russian translations
* fix notifications and layouts after localizations
* localization docs
* update translations
Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
* fix typo
* update translations
* fix translations for different link types
* update translations
Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
* update translation
Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
* update translations
* update translations
Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
---
apps/ios/LOCALIZATION.md | 29 +
apps/ios/Shared/ContentView.swift | 4 +-
apps/ios/Shared/Model/ChatModel.swift | 12 +-
apps/ios/Shared/Model/NtfManager.swift | 16 +-
apps/ios/Shared/Model/SimpleXAPI.swift | 4 +-
.../Shared/SimpleX (macOS)-Bridging-Header.h | 11 -
apps/ios/Shared/Views/Chat/ChatInfoView.swift | 2 +-
.../Views/Chat/ChatItem/FramedItemView.swift | 2 +-
apps/ios/Shared/Views/Chat/ChatView.swift | 2 +-
.../Chat/ComposeMessage/SendMessageView.swift | 2 +-
apps/ios/Shared/Views/ChatList/ChatHelp.swift | 6 +-
.../Views/ChatList/ChatListNavLink.swift | 2 +-
.../Shared/Views/ChatList/ChatListView.swift | 29 +-
.../Shared/Views/NewChat/AddContactView.swift | 4 +-
.../Views/NewChat/ConnectContactView.swift | 6 +-
.../Views/NewChat/CreateGroupView.swift | 2 +-
.../Shared/Views/NewChat/NewChatButton.swift | 9 +-
.../Views/UserSettings/MarkdownHelp.swift | 4 +-
.../Views/UserSettings/SMPServers.swift | 2 +-
.../Views/UserSettings/SettingsView.swift | 2 +-
.../Views/UserSettings/UserAddress.swift | 2 +-
.../AccentColor.colorset/Contents.json | 15 +
.../Shared/Assets.xcassets/Contents.json | 6 +
.../en.xcloc/Localized Contents/en.xliff | 801 ++++++++++++++++++
.../AccentColor.colorset/Contents.json | 23 +
.../Shared/Assets.xcassets/Contents.json | 6 +
.../en.lproj/Localizable.strings | Bin 0 -> 1678 bytes
.../en.lproj/SimpleX--iOS--InfoPlist.strings | 4 +
.../en.xcloc/contents.json | 12 +
.../AccentColor.colorset/Contents.json | 15 +
.../Shared/Assets.xcassets/Contents.json | 6 +
.../ru.xcloc/Localized Contents/ru.xliff | 800 +++++++++++++++++
.../AccentColor.colorset/Contents.json | 23 +
.../Shared/Assets.xcassets/Contents.json | 6 +
.../en.lproj/Localizable.strings | Bin 0 -> 1678 bytes
.../en.lproj/SimpleX--iOS--InfoPlist.strings | 4 +
.../ru.xcloc/contents.json | 12 +
apps/ios/SimpleX--macOS--Info.plist | 5 -
apps/ios/SimpleX.xcodeproj/project.pbxproj | 310 +------
.../xcschemes/SimpleX (iOS).xcscheme | 89 ++
apps/ios/Tests macOS/Tests_macOS.swift | 42 -
.../Tests macOS/Tests_macOSLaunchTests.swift | 32 -
apps/ios/macOS/macOS.entitlements | 10 -
apps/ios/ru.lproj/Localizable.strings | 462 ++++++++++
.../ru.lproj/SimpleX--iOS--InfoPlist.strings | 6 +
45 files changed, 2403 insertions(+), 438 deletions(-)
create mode 100644 apps/ios/LOCALIZATION.md
delete mode 100644 apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/Source Contents/en.lproj/Localizable.strings
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/Source Contents/en.lproj/SimpleX--iOS--InfoPlist.strings
create mode 100644 apps/ios/SimpleX Localizations/en.xcloc/contents.json
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/Shared/Assets.xcassets/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/en.lproj/Localizable.strings
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/en.lproj/SimpleX--iOS--InfoPlist.strings
create mode 100644 apps/ios/SimpleX Localizations/ru.xcloc/contents.json
delete mode 100644 apps/ios/SimpleX--macOS--Info.plist
create mode 100644 apps/ios/SimpleX.xcodeproj/xcshareddata/xcschemes/SimpleX (iOS).xcscheme
delete mode 100644 apps/ios/Tests macOS/Tests_macOS.swift
delete mode 100644 apps/ios/Tests macOS/Tests_macOSLaunchTests.swift
delete mode 100644 apps/ios/macOS/macOS.entitlements
create mode 100644 apps/ios/ru.lproj/Localizable.strings
create mode 100644 apps/ios/ru.lproj/SimpleX--iOS--InfoPlist.strings
diff --git a/apps/ios/LOCALIZATION.md b/apps/ios/LOCALIZATION.md
new file mode 100644
index 000000000..40fe37c21
--- /dev/null
+++ b/apps/ios/LOCALIZATION.md
@@ -0,0 +1,29 @@
+# Localization
+
+## Creating localization keys
+
+There are three ways XCode generates localization keys from strings:
+
+1. Automatically, from the texts used in standard components `Text`, `Label`, `Button`, etc.
+
+2. All strings passed to view variables and function parameters declared as `LocalizedStringKey` type. Only string constants (possibly, with interpolation) or other variables of type `LocalizedStringKey` can be passed to these parameters. See, for example, ContentView.swift.
+
+3. All strings wrapped in `NSLocalizedString`. Please note that such strings do not support swift interpolation, instead formatted strings should be used:
+
+```swift
+String.localizedStringWithFormat(NSLocalizedString("You can now send messages to %@", comment: "notification body")
+```
+
+## Adding strings to the existing localizations
+
+1. Choose `Product -> Export Localizations...` in the menu, choose `ios` folder as the destination and `SimpleX Localizations` as the folder name, confirm to overwrite it (make sure not to save to subfolder).
+2. Add `target` keys to the localizations that were added or changed.
+3. Choose `Product -> Import Localizations...` for any non-Enlish folders - that would update Localizable files.
+
+Localizable files values can be edited directly, the changes will be included in the next export. Following the process above though guarantees that all strings are localized.
+
+## Development
+
+Make sure to enable the option `Show non-localized strings` in `Product -> Scheme -> Edit scheme...` menu - it will be showing all non-localized strings as all caps.
+
+Read more about editing XLIFF and string files here: https://developer.apple.com/documentation/xcode/editing-xliff-and-strings-files
diff --git a/apps/ios/Shared/ContentView.swift b/apps/ios/Shared/ContentView.swift
index b9e7fb066..7d911d4c8 100644
--- a/apps/ios/Shared/ContentView.swift
+++ b/apps/ios/Shared/ContentView.swift
@@ -36,7 +36,7 @@ struct ContentView: View {
func notificationAlert() -> Alert {
Alert(
- title: Text("Notification are disabled!"),
+ title: Text("Notifications are disabled!"),
message: Text("The app can notify you when you receive messages or contact requests - please open settings to enable."),
primaryButton: .default(Text("Open Settings")) {
DispatchQueue.main.async {
@@ -61,7 +61,7 @@ final class AlertManager: ObservableObject {
}
}
- func showAlertMsg(title: String, message: String? = nil) {
+ func showAlertMsg(title: LocalizedStringKey, message: LocalizedStringKey? = nil) {
if let message = message {
showAlert(Alert(title: Text(title), message: Text(message)))
} else {
diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift
index b70aecf77..e05806458 100644
--- a/apps/ios/Shared/Model/ChatModel.swift
+++ b/apps/ios/Shared/Model/ChatModel.swift
@@ -384,7 +384,7 @@ final class Chat: ObservableObject, Identifiable {
case disconnected
case error(String)
- var statusString: String {
+ var statusString: LocalizedStringKey {
get {
switch self {
case .connected: return "Server connected"
@@ -394,7 +394,7 @@ final class Chat: ObservableObject, Identifiable {
}
}
- var statusExplanation: String {
+ var statusExplanation: LocalizedStringKey {
get {
switch self {
case .connected: return "You are connected to the server used to receive messages from this contact."
@@ -719,10 +719,10 @@ enum CIContent: Decodable, ItemContent {
switch self {
case let .sndMsgContent(mc): return mc.text
case let .rcvMsgContent(mc): return mc.text
- case .sndDeleted: return "deleted"
- case .rcvDeleted: return "deleted"
- case .sndFileInvitation: return "sending files is not supported yet"
- case .rcvFileInvitation: return "receiving files is not supported yet"
+ case .sndDeleted: return NSLocalizedString("deleted", comment: "deleted chat item")
+ case .rcvDeleted: return NSLocalizedString("deleted", comment: "deleted chat item")
+ case .sndFileInvitation: return NSLocalizedString("sending files is not supported yet", comment: "to be removed")
+ case .rcvFileInvitation: return NSLocalizedString("receiving files is not supported yet", comment: "to be removed")
}
}
}
diff --git a/apps/ios/Shared/Model/NtfManager.swift b/apps/ios/Shared/Model/NtfManager.swift
index 5d53cb31a..8861968b2 100644
--- a/apps/ios/Shared/Model/NtfManager.swift
+++ b/apps/ios/Shared/Model/NtfManager.swift
@@ -92,22 +92,22 @@ class NtfManager: NSObject, UNUserNotificationCenterDelegate, ObservableObject {
identifier: ntfCategoryContactRequest,
actions: [UNNotificationAction(
identifier: ntfActionAccept,
- title: "Accept"
+ title: NSLocalizedString("Accept", comment: "accept contact request via notification")
)],
intentIdentifiers: [],
- hiddenPreviewsBodyPlaceholder: "New contact request"
+ hiddenPreviewsBodyPlaceholder: NSLocalizedString("New contact request", comment: "notification")
),
UNNotificationCategory(
identifier: ntfCategoryContactConnected,
actions: [],
intentIdentifiers: [],
- hiddenPreviewsBodyPlaceholder: "Contact is connected"
+ hiddenPreviewsBodyPlaceholder: NSLocalizedString("Contact is connected", comment: "notification")
),
UNNotificationCategory(
identifier: ntfCategoryMessageReceived,
actions: [],
intentIdentifiers: [],
- hiddenPreviewsBodyPlaceholder: "New message"
+ hiddenPreviewsBodyPlaceholder: NSLocalizedString("New message", comment: "notifications")
)
])
}
@@ -139,8 +139,8 @@ class NtfManager: NSObject, UNUserNotificationCenterDelegate, ObservableObject {
logger.debug("NtfManager.notifyContactRequest")
addNotification(
categoryIdentifier: ntfCategoryContactRequest,
- title: "\(contactRequest.displayName) wants to connect!",
- body: "Accept contact request from \(contactRequest.chatViewName)?",
+ title: String.localizedStringWithFormat(NSLocalizedString("%@ wants to connect!", comment: "notification title"), contactRequest.displayName),
+ body: String.localizedStringWithFormat(NSLocalizedString("Accept contact request from %@?", comment: "notification body"), contactRequest.chatViewName),
targetContentIdentifier: nil,
userInfo: ["chatId": contactRequest.id, "contactRequestId": contactRequest.apiId]
)
@@ -150,8 +150,8 @@ class NtfManager: NSObject, UNUserNotificationCenterDelegate, ObservableObject {
logger.debug("NtfManager.notifyContactConnected")
addNotification(
categoryIdentifier: ntfCategoryContactConnected,
- title: "\(contact.displayName) is connected!",
- body: "You can now send messages to \(contact.chatViewName)",
+ title: String.localizedStringWithFormat(NSLocalizedString("%@ is connected!", comment: "notification title"), contact.displayName),
+ body: String.localizedStringWithFormat(NSLocalizedString("You can now send messages to %@", comment: "notification body"), contact.chatViewName),
targetContentIdentifier: contact.id
// userInfo: ["chatId": contact.id, "contactId": contact.apiId]
)
diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift
index f87a178dc..7622ac881 100644
--- a/apps/ios/Shared/Model/SimpleXAPI.swift
+++ b/apps/ios/Shared/Model/SimpleXAPI.swift
@@ -467,13 +467,13 @@ func apiConnect(connReq: String) async throws -> Bool {
case .chatCmdError(.errorAgent(.BROKER(.TIMEOUT))):
am.showAlertMsg(
title: "Connection timeout",
- message: "Please check your network connection and try again"
+ message: "Please check your network connection and try again."
)
return false
case .chatCmdError(.errorAgent(.BROKER(.NETWORK))):
am.showAlertMsg(
title: "Connection error",
- message: "Please check your network connection and try again"
+ message: "Please check your network connection and try again."
)
return false
default: throw r
diff --git a/apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h b/apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h
deleted file mode 100644
index bc28b42d3..000000000
--- a/apps/ios/Shared/SimpleX (macOS)-Bridging-Header.h
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Use this file to import your target's public headers that you would like to expose to Swift.
-//
-
-extern void hs_init(int argc, char **argv[]);
-
-typedef void* chat_ctrl;
-
-extern chat_ctrl chat_init(char *path);
-extern char *chat_send_cmd(chat_ctrl ctl, char *cmd);
-extern char *chat_recv_msg(chat_ctrl ctl);
diff --git a/apps/ios/Shared/Views/Chat/ChatInfoView.swift b/apps/ios/Shared/Views/Chat/ChatInfoView.swift
index ec52ac977..f345f458f 100644
--- a/apps/ios/Shared/Views/Chat/ChatInfoView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatInfoView.swift
@@ -64,7 +64,7 @@ struct ChatInfoView: View {
private func deleteContactAlert(_ contact: Contact) -> Alert {
Alert(
title: Text("Delete contact?"),
- message: Text("Contact and all messages will be deleted"),
+ message: Text("Contact and all messages will be deleted - this cannot be undone!"),
primaryButton: .destructive(Text("Delete")) {
Task {
do {
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
index 57ac507d8..0567598c0 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
@@ -87,7 +87,7 @@ struct FramedItemView: View {
}
}
- private func msgDeliveryError(_ err: String) {
+ private func msgDeliveryError(_ err: LocalizedStringKey) {
AlertManager.shared.showAlertMsg(
title: "Message delivery error",
message: err
diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift
index ee638d8bf..04cb218ed 100644
--- a/apps/ios/Shared/Views/Chat/ChatView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatView.swift
@@ -100,7 +100,7 @@ struct ChatView: View {
Button { chatModel.chatId = nil } label: {
HStack(spacing: 4) {
Image(systemName: "chevron.backward")
- Text("Chats")
+ Text("Chats", comment: "back button to return to chats list")
}
}
}
diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift
index 86ab93680..afaa4788b 100644
--- a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift
+++ b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift
@@ -11,7 +11,7 @@ import SwiftUI
struct SendMessageView: View {
var sendMessage: (String) -> Void
var inProgress: Bool = false
- @Binding var message: String //Lorem ipsum dolor sit amet, consectetur" // adipiscing elit, sed do eiusmod tempor incididunt ut labor7 et dolore magna aliqua. Ut enim ad minim veniam, quis"// nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."// Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+ @Binding var message: String
@Namespace var namespace
@FocusState.Binding var keyboardVisible: Bool
@Binding var editing: Bool
diff --git a/apps/ios/Shared/Views/ChatList/ChatHelp.swift b/apps/ios/Shared/Views/ChatList/ChatHelp.swift
index 58a43eb6c..3a9dc58f6 100644
--- a/apps/ios/Shared/Views/ChatList/ChatHelp.swift
+++ b/apps/ios/Shared/Views/ChatList/ChatHelp.swift
@@ -16,9 +16,9 @@ struct ChatHelp: View {
VStack(alignment: .leading, spacing: 10) {
Text("Thank you for installing SimpleX Chat!")
- HStack(spacing: 4) {
- Text("You can")
- Button("connect to SimpleX Chat founder.") {
+ VStack(alignment: .leading, spacing: 0) {
+ Text("To ask any questions and to receive updates:")
+ Button("connect to SimpleX Chat developers.") {
showSettings = false
DispatchQueue.main.async {
UIApplication.shared.open(simplexTeamURL)
diff --git a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift
index d2ec6c11e..d25ffafe5 100644
--- a/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift
+++ b/apps/ios/Shared/Views/ChatList/ChatListNavLink.swift
@@ -116,7 +116,7 @@ struct ChatListNavLink: View {
private func deleteContactAlert(_ contact: Contact) -> Alert {
Alert(
title: Text("Delete contact?"),
- message: Text("Contact and all messages will be deleted"),
+ message: Text("Contact and all messages will be deleted - this cannot be undone!"),
primaryButton: .destructive(Text("Delete")) {
Task {
do {
diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift
index f74e94a95..e22088249 100644
--- a/apps/ios/Shared/Views/ChatList/ChatListView.swift
+++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift
@@ -20,19 +20,13 @@ struct ChatListView: View {
let v = NavigationView {
List {
if chatModel.chats.isEmpty {
- VStack(alignment: .leading) {
- ChatHelp(showSettings: $showSettings)
- HStack {
- Text("This text is available in settings")
- SettingsButton()
- }
- .padding(.leading)
+ ChatHelp(showSettings: $showSettings)
+ } else {
+ ForEach(filteredChats()) { chat in
+ ChatListNavLink(chat: chat)
+ .padding(.trailing, -16)
}
}
- ForEach(filteredChats()) { chat in
- ChatListNavLink(chat: chat)
- .padding(.trailing, -16)
- }
}
.onChange(of: chatModel.chatId) { _ in
if chatModel.chatId == nil, let chatId = chatModel.chatToTop {
@@ -80,22 +74,23 @@ struct ChatListView: View {
logger.debug("ChatListView.connectViaUrlAlert path: \(path)")
if (path == "/contact" || path == "/invitation") {
path.removeFirst()
- let action = path
+ let action: ConnReqType = path == "contact" ? .contact : .invitation
let link = url.absoluteString.replacingOccurrences(of: "///\(path)", with: "/\(path)")
+ let title: LocalizedStringKey
+ if case .contact = action { title = "Connect via contact link?" }
+ else { title = "Connect via invitation link?" }
return Alert(
- title: Text("Connect via \(action) link?"),
+ title: Text(title),
message: Text("Your profile will be sent to the contact that you received this link from"),
primaryButton: .default(Text("Connect")) {
DispatchQueue.main.async {
Task {
do {
let ok = try await apiConnect(connReq: link)
- if ok {
- connectionReqSentAlert(action == "contact" ? .contact : .invitation)
- }
+ if ok { connectionReqSentAlert(action) }
} catch {
let err = error.localizedDescription
- AlertManager.shared.showAlertMsg(title: "Connection error", message: err)
+ AlertManager.shared.showAlertMsg(title: "Connection error", message: "Error: \(err)")
logger.debug("ChatListView.connectViaUrlAlert: apiConnect error: \(err)")
}
}
diff --git a/apps/ios/Shared/Views/NewChat/AddContactView.swift b/apps/ios/Shared/Views/NewChat/AddContactView.swift
index 3c924697e..9101e893f 100644
--- a/apps/ios/Shared/Views/NewChat/AddContactView.swift
+++ b/apps/ios/Shared/Views/NewChat/AddContactView.swift
@@ -22,9 +22,7 @@ struct AddContactView: View {
.multilineTextAlignment(.center)
QRCode(uri: connReqInvitation)
.padding()
- (Text("If you cannot meet in person, you can ") +
- Text("scan QR code in the video call").bold() +
- Text(", or you can share the invitation link via any other channel."))
+ Text("If you cannot meet in person, you can **show QR code in the video call**, or you can share the invitation link via any other channel.")
.font(.subheadline)
.multilineTextAlignment(.center)
.padding(.horizontal)
diff --git a/apps/ios/Shared/Views/NewChat/ConnectContactView.swift b/apps/ios/Shared/Views/NewChat/ConnectContactView.swift
index 2513801fc..9944dc21f 100644
--- a/apps/ios/Shared/Views/NewChat/ConnectContactView.swift
+++ b/apps/ios/Shared/Views/NewChat/ConnectContactView.swift
@@ -26,7 +26,11 @@ struct ConnectContactView: View {
.aspectRatio(1, contentMode: .fit)
.border(.gray)
}
- .padding(13.0)
+ .padding(12)
+ Text("If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link.")
+ .font(.subheadline)
+ .multilineTextAlignment(.center)
+ .padding(.horizontal)
}
}
diff --git a/apps/ios/Shared/Views/NewChat/CreateGroupView.swift b/apps/ios/Shared/Views/NewChat/CreateGroupView.swift
index 89a65f1ec..54f1d6c20 100644
--- a/apps/ios/Shared/Views/NewChat/CreateGroupView.swift
+++ b/apps/ios/Shared/Views/NewChat/CreateGroupView.swift
@@ -10,7 +10,7 @@ import SwiftUI
struct CreateGroupView: View {
var body: some View {
- Text("CreateGroupView")
+ EmptyView()
}
}
diff --git a/apps/ios/Shared/Views/NewChat/NewChatButton.swift b/apps/ios/Shared/Views/NewChat/NewChatButton.swift
index 0fff56bf3..83f7fd85f 100644
--- a/apps/ios/Shared/Views/NewChat/NewChatButton.swift
+++ b/apps/ios/Shared/Views/NewChat/NewChatButton.swift
@@ -65,7 +65,7 @@ struct NewChatButton: View {
}
func connectionErrorAlert(_ error: Error) {
- AlertManager.shared.showAlertMsg(title: "Connection error", message: error.localizedDescription)
+ AlertManager.shared.showAlertMsg(title: "Connection error", message: "Error: \(error.localizedDescription)")
}
}
@@ -75,12 +75,11 @@ enum ConnReqType: Equatable {
}
func connectionReqSentAlert(_ type: ConnReqType) {
- let whenConnected = type == .contact
- ? "your connection request is accepted"
- : "your contact's device is online"
AlertManager.shared.showAlertMsg(
title: "Connection request sent!",
- message: "You will be connected when \(whenConnected), please wait or check later!"
+ message: type == .contact
+ ? "You will be connected when your connection request is accepted, please wait or check later!"
+ : "You will be connected when your contact's device is online, please wait or check later!"
)
}
diff --git a/apps/ios/Shared/Views/UserSettings/MarkdownHelp.swift b/apps/ios/Shared/Views/UserSettings/MarkdownHelp.swift
index 855d0adff..c5dafc866 100644
--- a/apps/ios/Shared/Views/UserSettings/MarkdownHelp.swift
+++ b/apps/ios/Shared/Views/UserSettings/MarkdownHelp.swift
@@ -30,9 +30,9 @@ struct MarkdownHelp: View {
}
}
-private func mdFormat(_ format: String, _ example: Text) -> some View {
+private func mdFormat(_ format: LocalizedStringKey, _ example: Text) -> some View {
HStack {
- Text(format).frame(width: 88, alignment: .leading)
+ Text(format).frame(width: 120, alignment: .leading)
example
}
}
diff --git a/apps/ios/Shared/Views/UserSettings/SMPServers.swift b/apps/ios/Shared/Views/UserSettings/SMPServers.swift
index 861a93498..a687f613c 100644
--- a/apps/ios/Shared/Views/UserSettings/SMPServers.swift
+++ b/apps/ios/Shared/Views/UserSettings/SMPServers.swift
@@ -82,7 +82,7 @@ struct SMPServers: View {
saveUserSMPServers()
}
.alert(isPresented: $showBadServersAlert) {
- Alert(title: Text("Error saving SMP servers"), message: Text("Make sure SMP server addresses are in correct format, line separated and are not duplicated"))
+ Alert(title: Text("Error saving SMP servers"), message: Text("Make sure SMP server addresses are in correct format, line separated and are not duplicated."))
}
Spacer()
howToButton()
diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift
index feb7ec85f..933f5f95b 100644
--- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift
+++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift
@@ -100,7 +100,7 @@ struct SettingsView: View {
UIApplication.shared.open(simplexTeamURL)
}
} label: {
- Text("Chat with the founder")
+ Text("Chat with the developers")
}
}
HStack {
diff --git a/apps/ios/Shared/Views/UserSettings/UserAddress.swift b/apps/ios/Shared/Views/UserSettings/UserAddress.swift
index e15bd167c..c1ff70823 100644
--- a/apps/ios/Shared/Views/UserSettings/UserAddress.swift
+++ b/apps/ios/Shared/Views/UserSettings/UserAddress.swift
@@ -14,7 +14,7 @@ struct UserAddress: View {
var body: some View {
VStack (alignment: .leading) {
- Text("You can share your address as a link or as a QR code - anybody will be able to connect to you, and if you later delete it - you won't lose your contacts.")
+ Text("You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it.")
.padding(.bottom)
if let userAdress = chatModel.userAddress {
QRCode(uri: userAdress)
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 000000000..d0ffdd59b
--- /dev/null
+++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal",
+ "locale" : "en"
+ }
+ ],
+ "properties" : {
+ "localizable" : true
+ },
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/Contents.json b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..73c00596a
--- /dev/null
+++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/Shared/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
new file mode 100644
index 000000000..6cea986b3
--- /dev/null
+++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff
@@ -0,0 +1,801 @@
+
+
+
+
+
+
+
+
+
+
+ No comment provided by engineer.
+
+
+ (
+ (
+ No comment provided by engineer.
+
+
+ (can be copied)
+ (can be copied)
+ No comment provided by engineer.
+
+
+ !1 colored!
+ !1 colored!
+ No comment provided by engineer.
+
+
+ #secret#
+ #secret#
+ No comment provided by engineer.
+
+
+ %@ is connected!
+ %@ is connected!
+ notification title
+
+
+ %@ wants to connect!
+ %@ wants to connect!
+ notification title
+
+
+ %lld
+ %lld
+ No comment provided by engineer.
+
+
+ %lldk
+ %lldk
+ No comment provided by engineer.
+
+
+ (shared only with your contacts)
+ (shared only with your contacts)
+ No comment provided by engineer.
+
+
+ )
+ )
+ No comment provided by engineer.
+
+
+ **Add new contact**: to create your one-time QR Code for your contact.
+ **Add new contact**: to create your one-time QR Code for your contact.
+ No comment provided by engineer.
+
+
+ **Scan QR code**: to connect to your contact who shows QR code to you.
+ **Scan QR code**: to connect to your contact who shows QR code to you.
+ No comment provided by engineer.
+
+
+ *bold*
+ *bold*
+ No comment provided by engineer.
+
+
+ ,
+ ,
+ No comment provided by engineer.
+
+
+ 6
+ 6
+ No comment provided by engineer.
+
+
+ :
+ :
+ No comment provided by engineer.
+
+
+ : %@
+ : %@
+ No comment provided by engineer.
+
+
+ Accept
+ Accept
+ accept contact request via notification
+
+
+ Accept contact
+ Accept contact
+ No comment provided by engineer.
+
+
+ Accept contact request from %@?
+ Accept contact request from %@?
+ notification body
+
+
+ Add contact
+ Add contact
+ No comment provided by engineer.
+
+
+ All your contacts will remain connected
+ All your contacts will remain connected
+ No comment provided by engineer.
+
+
+ Cancel
+ Cancel
+ No comment provided by engineer.
+
+
+ Chat console
+ Chat console
+ No comment provided by engineer.
+
+
+ Chat with the developers
+ Chat with the developers
+ No comment provided by engineer.
+
+
+ Chats
+ Chats
+ back button to return to chats list
+
+
+ Choose from library
+ Choose from library
+ No comment provided by engineer.
+
+
+ Configure SMP servers
+ Configure SMP servers
+ No comment provided by engineer.
+
+
+ Confirm
+ Confirm
+ No comment provided by engineer.
+
+
+ Connect
+ Connect
+ No comment provided by engineer.
+
+
+ Connect via contact link?
+ Connect via contact link?
+ No comment provided by engineer.
+
+
+ Connect via invitation link?
+ Connect via invitation link?
+ No comment provided by engineer.
+
+
+ Connecting server…
+ Connecting server…
+ No comment provided by engineer.
+
+
+ Connecting server… (error: %@)
+ Connecting server… (error: %@)
+ No comment provided by engineer.
+
+
+ Connecting...
+ Connecting...
+ No comment provided by engineer.
+
+
+ Connection error
+ Connection error
+ No comment provided by engineer.
+
+
+ Connection request
+ Connection request
+ No comment provided by engineer.
+
+
+ Connection request sent!
+ Connection request sent!
+ No comment provided by engineer.
+
+
+ Connection timeout
+ Connection timeout
+ No comment provided by engineer.
+
+
+ Contact already exists
+ Contact already exists
+ No comment provided by engineer.
+
+
+ Contact and all messages will be deleted - this cannot be undone!
+ Contact and all messages will be deleted - this cannot be undone!
+ No comment provided by engineer.
+
+
+ Contact is connected
+ Contact is connected
+ notification
+
+
+ Copy
+ Copy
+ No comment provided by engineer.
+
+
+ Create
+ Create
+ No comment provided by engineer.
+
+
+ Create address
+ Create address
+ No comment provided by engineer.
+
+
+ Create group
+ Create group
+ No comment provided by engineer.
+
+
+ Create profile
+ Create profile
+ No comment provided by engineer.
+
+
+ Delete
+ Delete
+ No comment provided by engineer.
+
+
+ Delete address
+ Delete address
+ No comment provided by engineer.
+
+
+ Delete address?
+ Delete address?
+ No comment provided by engineer.
+
+
+ Delete contact
+ Delete contact
+ No comment provided by engineer.
+
+
+ Delete contact?
+ Delete contact?
+ No comment provided by engineer.
+
+
+ Delete for me
+ Delete for me
+ No comment provided by engineer.
+
+
+ Delete group
+ Delete group
+ No comment provided by engineer.
+
+
+ Delete message?
+ Delete message?
+ No comment provided by engineer.
+
+
+ Develop
+ Develop
+ No comment provided by engineer.
+
+
+ Display name
+ Display name
+ No comment provided by engineer.
+
+
+ Edit
+ Edit
+ No comment provided by engineer.
+
+
+ Enter one SMP server per line:
+ Enter one SMP server per line:
+ No comment provided by engineer.
+
+
+ Error saving SMP servers
+ Error saving SMP servers
+ No comment provided by engineer.
+
+
+ Error: %@
+ Error: %@
+ No comment provided by engineer.
+
+
+ Error: URL is invalid
+ Error: URL is invalid
+ No comment provided by engineer.
+
+
+ Full name (optional)
+ Full name (optional)
+ No comment provided by engineer.
+
+
+ Group deletion is not supported
+ Group deletion is not supported
+ No comment provided by engineer.
+
+
+ Help
+ Help
+ No comment provided by engineer.
+
+
+ How to
+ How to
+ No comment provided by engineer.
+
+
+ How to use SimpleX Chat
+ How to use SimpleX Chat
+ No comment provided by engineer.
+
+
+ How to use markdown
+ How to use markdown
+ No comment provided by engineer.
+
+
+ If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link.
+ If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link.
+ No comment provided by engineer.
+
+
+ If you cannot meet in person, you can **show QR code in the video call**, or you can share the invitation link via any other channel.
+ If you cannot meet in person, you can **show QR code in the video call**, or you can share the invitation link via any other channel.
+ No comment provided by engineer.
+
+
+ If you received SimpleX Chat invitation link you can open it in your browser:
+ If you received SimpleX Chat invitation link you can open it in your browser:
+ No comment provided by engineer.
+
+
+ Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat)
+ Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat)
+ No comment provided by engineer.
+
+
+ Invalid connection link
+ Invalid connection link
+ No comment provided by engineer.
+
+
+ Make sure SMP server addresses are in correct format, line separated and are not duplicated.
+ Make sure SMP server addresses are in correct format, line separated and are not duplicated.
+ No comment provided by engineer.
+
+
+ Markdown in messages
+ Markdown in messages
+ No comment provided by engineer.
+
+
+ Message delivery error
+ Message delivery error
+ No comment provided by engineer.
+
+
+ Most likely this contact has deleted the connection with you.
+ Most likely this contact has deleted the connection with you.
+ No comment provided by engineer.
+
+
+ New contact request
+ New contact request
+ notification
+
+
+ New message
+ New message
+ notifications
+
+
+ Notifications are disabled!
+ Notifications are disabled!
+ No comment provided by engineer.
+
+
+ Open Settings
+ Open Settings
+ No comment provided by engineer.
+
+
+ Please check that you used the correct link or ask your contact to send you another one.
+ Please check that you used the correct link or ask your contact to send you another one.
+ No comment provided by engineer.
+
+
+ Please check your network connection and try again.
+ Please check your network connection and try again.
+ No comment provided by engineer.
+
+
+ Profile image
+ Profile image
+ No comment provided by engineer.
+
+
+ Read
+ Read
+ No comment provided by engineer.
+
+
+ Reject
+ Reject
+ No comment provided by engineer.
+
+
+ Reject contact (sender NOT notified)
+ Reject contact (sender NOT notified)
+ No comment provided by engineer.
+
+
+ Reject contact request
+ Reject contact request
+ No comment provided by engineer.
+
+
+ Reply
+ Reply
+ No comment provided by engineer.
+
+
+ SMP servers
+ SMP servers
+ No comment provided by engineer.
+
+
+ Save
+ Save
+ No comment provided by engineer.
+
+
+ Save (and notify contacts)
+ Save (and notify contacts)
+ No comment provided by engineer.
+
+
+ Saved SMP servers will be removed
+ Saved SMP servers will be removed
+ No comment provided by engineer.
+
+
+ Scan QR code
+ Scan QR code
+ No comment provided by engineer.
+
+
+ Server connected
+ Server connected
+ No comment provided by engineer.
+
+
+ Settings
+ Settings
+ No comment provided by engineer.
+
+
+ Share
+ Share
+ No comment provided by engineer.
+
+
+ Share invitation link
+ Share invitation link
+ No comment provided by engineer.
+
+
+ Share link
+ Share link
+ No comment provided by engineer.
+
+
+ Show QR code to your contact
+to scan from the app
+ Show QR code to your contact
+to scan from the app
+ No comment provided by engineer.
+
+
+ Start new chat
+ Start new chat
+ No comment provided by engineer.
+
+
+ Take picture
+ Take picture
+ No comment provided by engineer.
+
+
+ Tap button
+ Tap button
+ No comment provided by engineer.
+
+
+ Thank you for installing SimpleX Chat!
+ Thank you for installing SimpleX Chat!
+ No comment provided by engineer.
+
+
+ The app can notify you when you receive messages or contact requests - please open settings to enable.
+ The app can notify you when you receive messages or contact requests - please open settings to enable.
+ No comment provided by engineer.
+
+
+ The messaging and application platform 100% private by design!
+ The messaging and application platform 100% private by design!
+ No comment provided by engineer.
+
+
+ The sender will NOT be notified
+ The sender will NOT be notified
+ No comment provided by engineer.
+
+
+ To ask any questions and to receive updates:
+ To ask any questions and to receive updates:
+ No comment provided by engineer.
+
+
+ To connect via link
+ To connect via link
+ No comment provided by engineer.
+
+
+ To start a new chat
+ To start a new chat
+ No comment provided by engineer.
+
+
+ Trying to connect to the server used to receive messages from this contact (error: %@).
+ Trying to connect to the server used to receive messages from this contact (error: %@).
+ No comment provided by engineer.
+
+
+ Trying to connect to the server used to receive messages from this contact.
+ Trying to connect to the server used to receive messages from this contact.
+ No comment provided by engineer.
+
+
+ Unexpected error: %@
+ Unexpected error: %@
+ No comment provided by engineer.
+
+
+ Use SimpleX Chat servers?
+ Use SimpleX Chat servers?
+ No comment provided by engineer.
+
+
+ Using SimpleX Chat servers.
+ Using SimpleX Chat servers.
+ No comment provided by engineer.
+
+
+ Welcome %@!
+ Welcome %@!
+ No comment provided by engineer.
+
+
+ You
+ You
+ No comment provided by engineer.
+
+
+ You are already connected to %@ via this link.
+ You are already connected to %@ via this link.
+ No comment provided by engineer.
+
+
+ You are connected to the server used to receive messages from this contact.
+ You are connected to the server used to receive messages from this contact.
+ No comment provided by engineer.
+
+
+ You can now send messages to %@
+ You can now send messages to %@
+ notification body
+
+
+ You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it.
+ You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it.
+ No comment provided by engineer.
+
+
+ You can use markdown to format messages:
+ You can use markdown to format messages:
+ No comment provided by engineer.
+
+
+ You control your chat!
+ You control your chat!
+ No comment provided by engineer.
+
+
+ You will be connected when your connection request is accepted, please wait or check later!
+ You will be connected when your connection request is accepted, please wait or check later!
+ No comment provided by engineer.
+
+
+ You will be connected when your contact's device is online, please wait or check later!
+ You will be connected when your contact's device is online, please wait or check later!
+ No comment provided by engineer.
+
+
+ Your SMP servers
+ Your SMP servers
+ No comment provided by engineer.
+
+
+ Your SimpleX contact address
+ Your SimpleX contact address
+ No comment provided by engineer.
+
+
+ Your chat address
+ Your chat address
+ No comment provided by engineer.
+
+
+ Your chat profile
+ Your chat profile
+ No comment provided by engineer.
+
+
+ Your chat profile will be sent to your contact
+ Your chat profile will be sent to your contact
+ No comment provided by engineer.
+
+
+ Your chats
+ Your chats
+ No comment provided by engineer.
+
+
+ Your profile is stored on your device and shared only with your contacts.
+SimpleX servers cannot see your profile.
+ Your profile is stored on your device and shared only with your contacts.
+SimpleX servers cannot see your profile.
+ No comment provided by engineer.
+
+
+ Your profile will be sent to the contact that you received this link from
+ Your profile will be sent to the contact that you received this link from
+ No comment provided by engineer.
+
+
+ Your profile, contacts and messages (once delivered) are only stored locally on your device.
+ Your profile, contacts and messages (once delivered) are only stored locally on your device.
+ No comment provided by engineer.
+
+
+ Your settings
+ Your settings
+ No comment provided by engineer.
+
+
+ [Send us email](mailto:chat@simplex.chat)
+ [Send us email](mailto:chat@simplex.chat)
+ No comment provided by engineer.
+
+
+ _italic_
+ _italic_
+ No comment provided by engineer.
+
+
+ `a + b`
+ `a + b`
+ No comment provided by engineer.
+
+
+ above, then:
+ above, then:
+ No comment provided by engineer.
+
+
+ bold
+ bold
+ No comment provided by engineer.
+
+
+ colored
+ colored
+ No comment provided by engineer.
+
+
+ connect to SimpleX Chat developers.
+ connect to SimpleX Chat developers.
+ No comment provided by engineer.
+
+
+ deleted
+ deleted
+ deleted chat item
+
+
+ italic
+ italic
+ No comment provided by engineer.
+
+
+ receiving files is not supported yet
+ receiving files is not supported yet
+ to be removed
+
+
+ secret
+ secret
+ No comment provided by engineer.
+
+
+ sending files is not supported yet
+ sending files is not supported yet
+ to be removed
+
+
+ strike
+ strike
+ No comment provided by engineer.
+
+
+ v%@ (%@)
+ v%@ (%@)
+ No comment provided by engineer.
+
+
+ wants to connect to you!
+ wants to connect to you!
+ No comment provided by engineer.
+
+
+ ~strike~
+ ~strike~
+ No comment provided by engineer.
+
+
+ 💻 desktop: scan displayed QR code from the app, via **Scan QR code**.
+ 💻 desktop: scan displayed QR code from the app, via **Scan QR code**.
+ No comment provided by engineer.
+
+
+ 📱 mobile: tap **Open in mobile app**, then tap **Connect** in the app.
+ 📱 mobile: tap **Open in mobile app**, then tap **Connect** in the app.
+ No comment provided by engineer.
+
+
+
+
+
+
+
+
+
+ SimpleX
+ SimpleX
+ Bundle name
+
+
+ SimpleX needs camera access to scan QR codes to connect to other app users
+ SimpleX needs camera access to scan QR codes to connect to other app users
+ Privacy - Camera Usage Description
+
+
+
+
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 000000000..aaa7f79bc
--- /dev/null
+++ b/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.000",
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "0.533"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "properties" : {
+ "localizable" : true
+ },
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json b/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..73c00596a
--- /dev/null
+++ b/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/en.lproj/Localizable.strings b/apps/ios/SimpleX Localizations/en.xcloc/Source Contents/en.lproj/Localizable.strings
new file mode 100644
index 0000000000000000000000000000000000000000..8a3092dda65330a4b5cb82313b5aa45120322b7e
GIT binary patch
literal 1678
zcmb`HO-{ow5QS&mQy3&R-Shwm0b8uFM%T;q2pXRQ8&{X6F^UQ|+`ubI6M@)xqX1SgKaWBt_Cl8^0Fh52a3
zYlKWPvZWPm>s9@F?P^|YT4fpu$Ep9;TOP_o{OL?N)Mu=muwuK%d)%)kZ!PwH3=8d)
zA&&w+HD4k-c4NE4`_PW`
+
+
+
+
+
+
+
+
+
+ No comment provided by engineer.
+
+
+ (
+ (
+ No comment provided by engineer.
+
+
+ (can be copied)
+ (можно скопировать)
+ No comment provided by engineer.
+
+
+ !1 colored!
+ !1 цвет!
+ No comment provided by engineer.
+
+
+ #secret#
+ #секрет#
+ No comment provided by engineer.
+
+
+ %@ is connected!
+ Установлено соединение с %@!
+ notification title
+
+
+ %@ wants to connect!
+ %@ хочет соединиться!
+ notification title
+
+
+ %lld
+ %lld
+ No comment provided by engineer.
+
+
+ %lldk
+ %lldk
+ No comment provided by engineer.
+
+
+ (shared only with your contacts)
+ (отправляется только вашим контактам)
+ No comment provided by engineer.
+
+
+ )
+ )
+ No comment provided by engineer.
+
+
+ **Add new contact**: to create your one-time QR Code for your contact.
+ **Добавить новый контакт**: чтобы создать одноразовый QR код или ссылку для вашего контакта.
+ No comment provided by engineer.
+
+
+ **Scan QR code**: to connect to your contact who shows QR code to you.
+ **Сканировать QR код**: чтобы соединиться с вашим контактом (который показывает вам QR код).
+ No comment provided by engineer.
+
+
+ *bold*
+ \*жирный*
+ No comment provided by engineer.
+
+
+ ,
+ ,
+ No comment provided by engineer.
+
+
+ 6
+ 6
+ No comment provided by engineer.
+
+
+ :
+ :
+ No comment provided by engineer.
+
+
+ : %@
+ : %@
+ No comment provided by engineer.
+
+
+ Accept
+ Принять
+ accept contact request via notification
+
+
+ Accept contact
+ Принять запрос
+ No comment provided by engineer.
+
+
+ Accept contact request from %@?
+ Принять запрос на соединение от %@?
+ notification body
+
+
+ Add contact
+ Добавить контакт
+ No comment provided by engineer.
+
+
+ All your contacts will remain connected
+ Все контакты, которые соединились через этот адрес, сохранятся.
+ No comment provided by engineer.
+
+
+ Cancel
+ Отменить
+ No comment provided by engineer.
+
+
+ Chat console
+ Консоль
+ No comment provided by engineer.
+
+
+ Chat with the developers
+ Соединиться с разработчиками
+ No comment provided by engineer.
+
+
+ Chats
+ Назад
+ back button to return to chats list
+
+
+ Choose from library
+ Выбрать из библиотеки
+ No comment provided by engineer.
+
+
+ Configure SMP servers
+ Настройка SMP серверов
+ No comment provided by engineer.
+
+
+ Confirm
+ Подтвердить
+ No comment provided by engineer.
+
+
+ Connect
+ Соединиться
+ No comment provided by engineer.
+
+
+ Connect via contact link?
+ Соединиться через ссылку-контакт?
+ No comment provided by engineer.
+
+
+ Connect via invitation link?
+ Соединиться через ссылку-приглашение?
+ No comment provided by engineer.
+
+
+ Connecting server…
+ Устанавливается соединение с сервером…
+ No comment provided by engineer.
+
+
+ Connecting server… (error: %@)
+ Устанавливается соединение с сервером… (ошибка: %@)
+ No comment provided by engineer.
+
+
+ Connecting...
+ Устанавливается соединение…
+ No comment provided by engineer.
+
+
+ Connection error
+ Ошибка соединения
+ No comment provided by engineer.
+
+
+ Connection request
+ Запрос на соединение
+ No comment provided by engineer.
+
+
+ Connection request sent!
+ Запрос на соединение отправлен!
+ No comment provided by engineer.
+
+
+ Connection timeout
+ Превышено время соединения
+ No comment provided by engineer.
+
+
+ Contact already exists
+ Существующий контакт
+ No comment provided by engineer.
+
+
+ Contact and all messages will be deleted - this cannot be undone!
+ Контакт и все сообщения будут удалены - это действие нельзя отменить!
+ No comment provided by engineer.
+
+
+ Contact is connected
+ Соединение с контактом установлено
+ notification
+
+
+ Copy
+ Скопировать
+ No comment provided by engineer.
+
+
+ Create
+ Создать
+ No comment provided by engineer.
+
+
+ Create address
+ Создать адрес
+ No comment provided by engineer.
+
+
+ Create group
+ Создать группу
+ No comment provided by engineer.
+
+
+ Create profile
+ Создать профиль
+ No comment provided by engineer.
+
+
+ Delete
+ Удалить
+ No comment provided by engineer.
+
+
+ Delete address
+ Удалить адрес
+ No comment provided by engineer.
+
+
+ Delete address?
+ Удалить адрес?
+ No comment provided by engineer.
+
+
+ Delete contact
+ Удалить контакт
+ No comment provided by engineer.
+
+
+ Delete contact?
+ Удалить контакт?
+ No comment provided by engineer.
+
+
+ Delete for me
+ Удалить для меня
+ No comment provided by engineer.
+
+
+ Delete group
+ Удалить группу
+ No comment provided by engineer.
+
+
+ Delete message?
+ Удалить сообщение?
+ No comment provided by engineer.
+
+
+ Develop
+ Для разработчиков
+ No comment provided by engineer.
+
+
+ Display name
+ Имя профиля
+ No comment provided by engineer.
+
+
+ Edit
+ Редактировать
+ No comment provided by engineer.
+
+
+ Enter one SMP server per line:
+ Введите SMP серверы, каждый на отдельной строке:
+ No comment provided by engineer.
+
+
+ Error saving SMP servers
+ Ошибка при сохранении SMP серверов
+ No comment provided by engineer.
+
+
+ Error: %@
+ Ошибка: %@
+ No comment provided by engineer.
+
+
+ Error: URL is invalid
+ Ошибка: неверная ссылка
+ No comment provided by engineer.
+
+
+ Full name (optional)
+ Полное имя (не обязательно)
+ No comment provided by engineer.
+
+
+ Group deletion is not supported
+ Удаление групп не поддерживается
+ No comment provided by engineer.
+
+
+ Help
+ Помощь
+ No comment provided by engineer.
+
+
+ How to
+ Информация
+ No comment provided by engineer.
+
+
+ How to use SimpleX Chat
+ Как использовать SimpleX Chat
+ No comment provided by engineer.
+
+
+ How to use markdown
+ Как форматировать
+ No comment provided by engineer.
+
+
+ If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link.
+ Если вы не можете встретиться лично, вы можете **сосканировать QR код во время видеозвонка**, или ваш контакт может отправить вам ссылку.
+ No comment provided by engineer.
+
+
+ If you cannot meet in person, you can **show QR code in the video call**, or you can share the invitation link via any other channel.
+ Если вы не можете встретиться лично, вы можете **показать QR код во время видеозвонка** или отправить ссылку через любой другой канал связи.
+ No comment provided by engineer.
+
+
+ If you received SimpleX Chat invitation link you can open it in your browser:
+ Если вы получили ссылку с приглашением из SimpleX Chat, вы можете открыть её в браузере:
+ No comment provided by engineer.
+
+
+ Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat)
+ [SimpleX Chat для терминала](https://github.com/simplex-chat/simplex-chat)
+ No comment provided by engineer.
+
+
+ Invalid connection link
+ Ошибка в ссылке контакта
+ No comment provided by engineer.
+
+
+ Make sure SMP server addresses are in correct format, line separated and are not duplicated.
+ Пожалуйста, проверьте, что адреса SMP серверов имеют правильный формат, каждый адрес на отдельной строке и не повторяется.
+ No comment provided by engineer.
+
+
+ Markdown in messages
+ Форматирование сообщений
+ No comment provided by engineer.
+
+
+ Message delivery error
+ Ошибка доставки сообщения
+ No comment provided by engineer.
+
+
+ Most likely this contact has deleted the connection with you.
+ Скорее всего, этот контакт удалил соединение с вами.
+ No comment provided by engineer.
+
+
+ New contact request
+ Новый запрос на соединение
+ notification
+
+
+ New message
+ Новое сообщение
+ notifications
+
+
+ Notifications are disabled!
+ Уведомления выключены
+ No comment provided by engineer.
+
+
+ Open Settings
+ Открыть Настройки
+ No comment provided by engineer.
+
+
+ Please check that you used the correct link or ask your contact to send you another one.
+ Пожалуйста, проверьте, что вы использовали правильную ссылку или попросите, чтобы ваш контакт отправил вам другую ссылку.
+ No comment provided by engineer.
+
+
+ Please check your network connection and try again.
+ Пожалуйста, проверьте ваше соединение с сетью и попробуйте еще раз.
+ No comment provided by engineer.
+
+
+ Profile image
+ Аватар
+ No comment provided by engineer.
+
+
+ Read
+ Прочитано
+ No comment provided by engineer.
+
+
+ Reject
+ Отклонить
+ No comment provided by engineer.
+
+
+ Reject contact (sender NOT notified)
+ Отклонить (не уведомляя отправителя)
+ No comment provided by engineer.
+
+
+ Reject contact request
+ Отклонить запрос
+ No comment provided by engineer.
+
+
+ Reply
+ Ответить
+ No comment provided by engineer.
+
+
+ SMP servers
+ SMP серверы
+ No comment provided by engineer.
+
+
+ Save
+ Сохранить
+ No comment provided by engineer.
+
+
+ Save (and notify contacts)
+ Сохранить (и уведомить контакты)
+ No comment provided by engineer.
+
+
+ Saved SMP servers will be removed
+ Сохраненные SMP серверы будут удалены
+ No comment provided by engineer.
+
+
+ Scan QR code
+ Сканировать QR код
+ No comment provided by engineer.
+
+
+ Server connected
+ Установлено соединение с сервером
+ No comment provided by engineer.
+
+
+ Settings
+ Настройки
+ No comment provided by engineer.
+
+
+ Share
+ Поделиться
+ No comment provided by engineer.
+
+
+ Share invitation link
+ Поделиться ссылкой
+ No comment provided by engineer.
+
+
+ Share link
+ Поделиться ссылкой
+ No comment provided by engineer.
+
+
+ Show QR code to your contact
+to scan from the app
+ Покажите QR код вашему контакту для сканирования в приложении
+ No comment provided by engineer.
+
+
+ Start new chat
+ Начать новый разговор
+ No comment provided by engineer.
+
+
+ Take picture
+ Сделать фото
+ No comment provided by engineer.
+
+
+ Tap button
+ Нажмите кнопку
+ No comment provided by engineer.
+
+
+ Thank you for installing SimpleX Chat!
+ Спасибо, что Вы установили SimpleX Chat!
+ No comment provided by engineer.
+
+
+ The app can notify you when you receive messages or contact requests - please open settings to enable.
+ Приложение может посылать вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.
+ No comment provided by engineer.
+
+
+ The messaging and application platform 100% private by design!
+ Платформа для сообщений и приложений, которая защищает вашу личную информацию и безопасность.
+ No comment provided by engineer.
+
+
+ The sender will NOT be notified
+ Отправитель не будет уведомлён
+ No comment provided by engineer.
+
+
+ To ask any questions and to receive updates:
+ Задать вопросы и получать уведомления о новых версиях:
+ No comment provided by engineer.
+
+
+ To connect via link
+ Соединиться через ссылку
+ No comment provided by engineer.
+
+
+ To start a new chat
+ Начать новый разговор
+ No comment provided by engineer.
+
+
+ Trying to connect to the server used to receive messages from this contact (error: %@).
+ Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта (ошибка: %@).
+ No comment provided by engineer.
+
+
+ Trying to connect to the server used to receive messages from this contact.
+ Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта.
+ No comment provided by engineer.
+
+
+ Unexpected error: %@
+ Неожиданная ошибка: %@
+ No comment provided by engineer.
+
+
+ Use SimpleX Chat servers?
+ Использовать серверы предосталенные SimpleX Chat?
+ No comment provided by engineer.
+
+
+ Using SimpleX Chat servers.
+ Используются серверы, предоставленные SimpleX Chat.
+ No comment provided by engineer.
+
+
+ Welcome %@!
+ Здравствуйте %@!
+ No comment provided by engineer.
+
+
+ You
+ Вы
+ No comment provided by engineer.
+
+
+ You are already connected to %@ via this link.
+ Вы уже соединены с %@ через эту ссылку.
+ No comment provided by engineer.
+
+
+ You are connected to the server used to receive messages from this contact.
+ Установлено соединение с сервером, через который вы получается сообщения от этого контакта.
+ No comment provided by engineer.
+
+
+ You can now send messages to %@
+ Вы теперь можете отправлять сообщения %@
+ notification body
+
+
+ You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it.
+ Вы можете использовать ваш адрес как ссылку или как QR код - кто угодно сможет соединиться с вами. Вы сможете удалить адрес, сохранив контакты, которые через него соединились.
+ No comment provided by engineer.
+
+
+ You can use markdown to format messages:
+ Вы можете форматировать сообщения:
+ No comment provided by engineer.
+
+
+ You control your chat!
+ Вы котролируете Ваш чат!
+ No comment provided by engineer.
+
+
+ You will be connected when your connection request is accepted, please wait or check later!
+ Соединение будет установлено, когда ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!
+ No comment provided by engineer.
+
+
+ You will be connected when your contact's device is online, please wait or check later!
+ Соединение будет установлено, когда ваш контакт будет онлайн. Пожалуйста, подождите или проверьте позже!
+ No comment provided by engineer.
+
+
+ Your SMP servers
+ Ваши SMP серверы
+ No comment provided by engineer.
+
+
+ Your SimpleX contact address
+ Ваш SimpleX адрес
+ No comment provided by engineer.
+
+
+ Your chat address
+ Ваш SimpleX адрес
+ No comment provided by engineer.
+
+
+ Your chat profile
+ Ваш профиль
+ No comment provided by engineer.
+
+
+ Your chat profile will be sent to your contact
+ Ваш профиль будет отправлен вашему контакту
+ No comment provided by engineer.
+
+
+ Your chats
+ Ваши чаты
+ No comment provided by engineer.
+
+
+ Your profile is stored on your device and shared only with your contacts.
+SimpleX servers cannot see your profile.
+ Ваш профиль хранится на вашем устройстве и отправляется только вашим контактам.
+SimpleX серверы не могут получить доступ к вашему профилю.
+ No comment provided by engineer.
+
+
+ Your profile will be sent to the contact that you received this link from
+ Ваш профиль будет отправлен контакту, от которого вы получили эту ссылку.
+ No comment provided by engineer.
+
+
+ Your profile, contacts and messages (once delivered) are only stored locally on your device.
+ Ваш профиль, контакты и сообщения (после доставки) хранятся только на вашем устройстве.
+ No comment provided by engineer.
+
+
+ Your settings
+ Настройки
+ No comment provided by engineer.
+
+
+ [Send us email](mailto:chat@simplex.chat)
+ [Отправить email](mailto:chat@simplex.chat)
+ No comment provided by engineer.
+
+
+ _italic_
+ \_курсив_
+ No comment provided by engineer.
+
+
+ `a + b`
+ \`a + b`
+ No comment provided by engineer.
+
+
+ above, then:
+ наверху, затем:
+ No comment provided by engineer.
+
+
+ bold
+ жирный
+ No comment provided by engineer.
+
+
+ colored
+ цвет
+ No comment provided by engineer.
+
+
+ connect to SimpleX Chat developers.
+ соединиться с разработчиками.
+ No comment provided by engineer.
+
+
+ deleted
+ удалено
+ deleted chat item
+
+
+ italic
+ курсив
+ No comment provided by engineer.
+
+
+ receiving files is not supported yet
+ получение файлов не поддерживается
+ to be removed
+
+
+ secret
+ секрет
+ No comment provided by engineer.
+
+
+ sending files is not supported yet
+ отправка файлов не поддерживается
+ to be removed
+
+
+ strike
+ зачеркнуть
+ No comment provided by engineer.
+
+
+ v%@ (%@)
+ v%@ (%@)
+ No comment provided by engineer.
+
+
+ wants to connect to you!
+ хочет соединиться с вами!
+ No comment provided by engineer.
+
+
+ ~strike~
+ \~зачеркнуть~
+ No comment provided by engineer.
+
+
+ 💻 desktop: scan displayed QR code from the app, via **Scan QR code**.
+ 💻 на компьютере: сосканируйте QR код из приложения через **Сканировать QR код**.
+ No comment provided by engineer.
+
+
+ 📱 mobile: tap **Open in mobile app**, then tap **Connect** in the app.
+ 📱 на мобильном: намжите кнопку **Open in mobile app** на веб странице, затем нажмите **Соединиться** в приложении.
+ No comment provided by engineer.
+
+
+
+
+
+
+
+
+
+ SimpleX
+ SimpleX
+ Bundle name
+
+
+ SimpleX needs camera access to scan QR codes to connect to other app users
+ SimpleX использует камеру для сканирования QR кодов при соединении с другими пользователями
+ Privacy - Camera Usage Description
+
+
+
+
diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 000000000..aaa7f79bc
--- /dev/null
+++ b/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "red" : "0.000",
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "0.533"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "properties" : {
+ "localizable" : true
+ },
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json b/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..73c00596a
--- /dev/null
+++ b/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/Shared/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/en.lproj/Localizable.strings b/apps/ios/SimpleX Localizations/ru.xcloc/Source Contents/en.lproj/Localizable.strings
new file mode 100644
index 0000000000000000000000000000000000000000..8a3092dda65330a4b5cb82313b5aa45120322b7e
GIT binary patch
literal 1678
zcmb`HO-{ow5QS&mQy3&R-Shwm0b8uFM%T;q2pXRQ8&{X6F^UQ|+`ubI6M@)xqX1SgKaWBt_Cl8^0Fh52a3
zYlKWPvZWPm>s9@F?P^|YT4fpu$Ep9;TOP_o{OL?N)Mu=muwuK%d)%)kZ!PwH3=8d)
zA&&w+HD4k-c4NE4`_PW`
-
-
-
-
diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj
index 21fdbe7d7..230ca7890 100644
--- a/apps/ios/SimpleX.xcodeproj/project.pbxproj
+++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj
@@ -8,120 +8,65 @@
/* Begin PBXBuildFile section */
3CDBCF4227FAE51000354CDD /* ComposeLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */; };
- 3CDBCF4327FAE51000354CDD /* ComposeLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */; };
3CDBCF4827FF621E00354CDD /* ChatItemLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4727FF621E00354CDD /* ChatItemLinkView.swift */; };
- 3CDBCF4927FF621E00354CDD /* ChatItemLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4727FF621E00354CDD /* ChatItemLinkView.swift */; };
5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */; };
- 5C063D2827A4564100AEC577 /* ChatPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */; };
5C116CDC27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; };
- 5C116CDD27AABE0400E66D01 /* ContactRequestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C116CDB27AABE0400E66D01 /* ContactRequestView.swift */; };
5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; };
- 5C1A4C1F27A715B700EAD5AD /* ChatItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C1A4C1D27A715B700EAD5AD /* ChatItemView.swift */; };
5C2E260727A2941F00F70299 /* SimpleXAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260627A2941F00F70299 /* SimpleXAPI.swift */; };
- 5C2E260827A2941F00F70299 /* SimpleXAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260627A2941F00F70299 /* SimpleXAPI.swift */; };
5C2E260B27A30CFA00F70299 /* ChatListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260A27A30CFA00F70299 /* ChatListView.swift */; };
- 5C2E260C27A30CFA00F70299 /* ChatListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260A27A30CFA00F70299 /* ChatListView.swift */; };
5C2E260F27A30FDC00F70299 /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260E27A30FDC00F70299 /* ChatView.swift */; };
- 5C2E261027A30FDC00F70299 /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E260E27A30FDC00F70299 /* ChatView.swift */; };
5C2E261227A30FEA00F70299 /* TerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E261127A30FEA00F70299 /* TerminalView.swift */; };
- 5C2E261327A30FEA00F70299 /* TerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2E261127A30FEA00F70299 /* TerminalView.swift */; };
5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFC727B2782E00FB6C6D /* BGManager.swift */; };
- 5C35CFC927B2782E00FB6C6D /* BGManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFC727B2782E00FB6C6D /* BGManager.swift */; };
5C35CFCB27B2E91D00FB6C6D /* NtfManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */; };
- 5C35CFCC27B2E91D00FB6C6D /* NtfManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C35CFCA27B2E91D00FB6C6D /* NtfManager.swift */; };
5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */; };
- 5C3A88CF27DF50170060F1C2 /* DetermineWidth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */; };
5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; };
- 5C3A88D227DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; };
5C411598280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411593280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx.a */; };
- 5C411599280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411593280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx.a */; };
5C41159A280048E90054D6CB /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411594280048E90054D6CB /* libffi.a */; };
- 5C41159B280048E90054D6CB /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411594280048E90054D6CB /* libffi.a */; };
5C41159C280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411595280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx-ghc8.10.7.a */; };
- 5C41159D280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411595280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx-ghc8.10.7.a */; };
5C41159E280048E90054D6CB /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411596280048E90054D6CB /* libgmpxx.a */; };
- 5C41159F280048E90054D6CB /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411596280048E90054D6CB /* libgmpxx.a */; };
5C4115A0280048E90054D6CB /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411597280048E90054D6CB /* libgmp.a */; };
- 5C4115A1280048E90054D6CB /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C411597280048E90054D6CB /* libgmp.a */; };
5C5346A827B59A6A004DF848 /* ChatHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5346A727B59A6A004DF848 /* ChatHelp.swift */; };
- 5C5346A927B59A6A004DF848 /* ChatHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5346A727B59A6A004DF848 /* ChatHelp.swift */; };
5C577F7D27C83AA10006112D /* MarkdownHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C577F7C27C83AA10006112D /* MarkdownHelp.swift */; };
- 5C577F7E27C83AA10006112D /* MarkdownHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C577F7C27C83AA10006112D /* MarkdownHelp.swift */; };
5C5F2B6D27EBC3FE006A9D5F /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */; };
- 5C5F2B6E27EBC3FE006A9D5F /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6C27EBC3FE006A9D5F /* ImagePicker.swift */; };
5C5F2B7027EBC704006A9D5F /* ProfileImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6F27EBC704006A9D5F /* ProfileImage.swift */; };
- 5C5F2B7127EBC704006A9D5F /* ProfileImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6F27EBC704006A9D5F /* ProfileImage.swift */; };
5C6AD81327A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; };
- 5C6AD81427A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; };
5C7505A227B65FDB00BE3227 /* CIMetaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A127B65FDB00BE3227 /* CIMetaView.swift */; };
- 5C7505A327B65FDB00BE3227 /* CIMetaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A127B65FDB00BE3227 /* CIMetaView.swift */; };
5C7505A527B679EE00BE3227 /* NavLinkPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A427B679EE00BE3227 /* NavLinkPlain.swift */; };
- 5C7505A627B679EE00BE3227 /* NavLinkPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A427B679EE00BE3227 /* NavLinkPlain.swift */; };
5C7505A827B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A727B6D34800BE3227 /* ChatInfoToolbar.swift */; };
- 5C7505A927B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A727B6D34800BE3227 /* ChatInfoToolbar.swift */; };
5C764E80279C7276000C6508 /* dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E7F279C7276000C6508 /* dummy.m */; };
- 5C764E81279C7276000C6508 /* dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E7F279C7276000C6508 /* dummy.m */; };
5C764E82279C748B000C6508 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C764E7B279C71D4000C6508 /* libiconv.tbd */; };
5C764E83279C748B000C6508 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C764E7C279C71DB000C6508 /* libz.tbd */; };
- 5C764E84279C748C000C6508 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C764E7B279C71D4000C6508 /* libiconv.tbd */; };
- 5C764E85279C748C000C6508 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C764E7C279C71DB000C6508 /* libz.tbd */; };
5C764E89279CBCB3000C6508 /* ChatModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E88279CBCB3000C6508 /* ChatModel.swift */; };
- 5C764E8A279CBCB3000C6508 /* ChatModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C764E88279CBCB3000C6508 /* ChatModel.swift */; };
5C8F01CD27A6F0D8007D2C8D /* CodeScanner in Frameworks */ = {isa = PBXBuildFile; productRef = 5C8F01CC27A6F0D8007D2C8D /* CodeScanner */; };
5C971E1D27AEBEF600C8A3CE /* ChatInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C971E1C27AEBEF600C8A3CE /* ChatInfoView.swift */; };
- 5C971E1E27AEBEF600C8A3CE /* ChatInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C971E1C27AEBEF600C8A3CE /* ChatInfoView.swift */; };
5C971E2127AEBF8300C8A3CE /* ChatInfoImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C971E2027AEBF8300C8A3CE /* ChatInfoImage.swift */; };
- 5C971E2227AEBF8300C8A3CE /* ChatInfoImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C971E2027AEBF8300C8A3CE /* ChatInfoImage.swift */; };
5C9FD96B27A56D4D0075386C /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9FD96A27A56D4D0075386C /* JSON.swift */; };
- 5C9FD96C27A56D4D0075386C /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9FD96A27A56D4D0075386C /* JSON.swift */; };
5C9FD96E27A5D6ED0075386C /* SendMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9FD96D27A5D6ED0075386C /* SendMessageView.swift */; };
- 5C9FD96F27A5D6ED0075386C /* SendMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9FD96D27A5D6ED0075386C /* SendMessageView.swift */; };
5CA059DC279559F40002BEB4 /* Tests_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059DB279559F40002BEB4 /* Tests_iOS.swift */; };
5CA059DE279559F40002BEB4 /* Tests_iOSLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059DD279559F40002BEB4 /* Tests_iOSLaunchTests.swift */; };
- 5CA059E8279559F40002BEB4 /* Tests_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059E7279559F40002BEB4 /* Tests_macOS.swift */; };
- 5CA059EA279559F40002BEB4 /* Tests_macOSLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059E9279559F40002BEB4 /* Tests_macOSLaunchTests.swift */; };
5CA059EB279559F40002BEB4 /* SimpleXApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C3279559F40002BEB4 /* SimpleXApp.swift */; };
- 5CA059EC279559F40002BEB4 /* SimpleXApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C3279559F40002BEB4 /* SimpleXApp.swift */; };
5CA059ED279559F40002BEB4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C4279559F40002BEB4 /* ContentView.swift */; };
- 5CA059EE279559F40002BEB4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059C4279559F40002BEB4 /* ContentView.swift */; };
5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CA059C5279559F40002BEB4 /* Assets.xcassets */; };
- 5CA059F0279559F40002BEB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CA059C5279559F40002BEB4 /* Assets.xcassets */; };
5CA05A4C27974EB60002BEB4 /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA05A4B27974EB60002BEB4 /* WelcomeView.swift */; };
- 5CA05A4D27974EB60002BEB4 /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA05A4B27974EB60002BEB4 /* WelcomeView.swift */; };
5CB924D427A853F100ACCCDD /* SettingsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924D327A853F100ACCCDD /* SettingsButton.swift */; };
- 5CB924D527A853F100ACCCDD /* SettingsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924D327A853F100ACCCDD /* SettingsButton.swift */; };
5CB924D727A8563F00ACCCDD /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924D627A8563F00ACCCDD /* SettingsView.swift */; };
- 5CB924D827A8563F00ACCCDD /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924D627A8563F00ACCCDD /* SettingsView.swift */; };
5CB924E127A867BA00ACCCDD /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924E027A867BA00ACCCDD /* UserProfile.swift */; };
- 5CB924E227A867BA00ACCCDD /* UserProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924E027A867BA00ACCCDD /* UserProfile.swift */; };
5CB924E427A8683A00ACCCDD /* UserAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924E327A8683A00ACCCDD /* UserAddress.swift */; };
- 5CB924E527A8683A00ACCCDD /* UserAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB924E327A8683A00ACCCDD /* UserAddress.swift */; };
5CB9250D27A9432000ACCCDD /* ChatListNavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */; };
- 5CB9250E27A9432000ACCCDD /* ChatListNavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */; };
5CC1C99227A6C7F5000D9FF6 /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */; };
- 5CC1C99327A6C7F5000D9FF6 /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */; };
5CC1C99527A6CF7F000D9FF6 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */; };
- 5CC1C99627A6CF7F000D9FF6 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */; };
+ 5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */; };
+ 5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */; };
5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; };
- 5CCD403527A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; };
5CCD403727A5F9A200368C90 /* ConnectContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403627A5F9A200368C90 /* ConnectContactView.swift */; };
- 5CCD403827A5F9A200368C90 /* ConnectContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403627A5F9A200368C90 /* ConnectContactView.swift */; };
5CCD403A27A5F9BE00368C90 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403927A5F9BE00368C90 /* CreateGroupView.swift */; };
- 5CCD403B27A5F9BE00368C90 /* CreateGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403927A5F9BE00368C90 /* CreateGroupView.swift */; };
5CE4407227ADB1D0007B033A /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407127ADB1D0007B033A /* Emoji.swift */; };
- 5CE4407327ADB1D0007B033A /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407127ADB1D0007B033A /* Emoji.swift */; };
5CE4407927ADB701007B033A /* EmojiItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407827ADB701007B033A /* EmojiItemView.swift */; };
- 5CE4407A27ADB701007B033A /* EmojiItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407827ADB701007B033A /* EmojiItemView.swift */; };
5CEACCE327DE9246000BD591 /* ComposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCE227DE9246000BD591 /* ComposeView.swift */; };
- 5CEACCE427DE9246000BD591 /* ComposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCE227DE9246000BD591 /* ComposeView.swift */; };
5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; };
- 5CEACCEE27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; };
640F50E327CF991C001E05C2 /* SMPServers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640F50E227CF991C001E05C2 /* SMPServers.swift */; };
- 640F50E427CF991C001E05C2 /* SMPServers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640F50E227CF991C001E05C2 /* SMPServers.swift */; };
64AA1C6927EE10C800AC7277 /* ContextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6827EE10C800AC7277 /* ContextItemView.swift */; };
- 64AA1C6A27EE10C800AC7277 /* ContextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6827EE10C800AC7277 /* ContextItemView.swift */; };
64AA1C6C27F3537400AC7277 /* DeletedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */; };
- 64AA1C6D27F3537400AC7277 /* DeletedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -132,13 +77,6 @@
remoteGlobalIDString = 5CA059C9279559F40002BEB4;
remoteInfo = "SimpleX (iOS)";
};
- 5CA059E4279559F40002BEB4 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 5CA059BE279559F40002BEB4 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5CA059CF279559F40002BEB4;
- remoteInfo = "SimpleX (macOS)";
- };
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
@@ -172,7 +110,6 @@
5C764E7B279C71D4000C6508 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib/libiconv.tbd; sourceTree = DEVELOPER_DIR; };
5C764E7C279C71DB000C6508 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; };
5C764E7D279C7275000C6508 /* SimpleX (iOS)-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleX (iOS)-Bridging-Header.h"; sourceTree = ""; };
- 5C764E7E279C7275000C6508 /* SimpleX (macOS)-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimpleX (macOS)-Bridging-Header.h"; sourceTree = ""; };
5C764E7F279C7276000C6508 /* dummy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = dummy.m; sourceTree = ""; };
5C764E88279CBCB3000C6508 /* ChatModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatModel.swift; sourceTree = ""; };
5C971E1C27AEBEF600C8A3CE /* ChatInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatInfoView.swift; sourceTree = ""; };
@@ -183,13 +120,10 @@
5CA059C4279559F40002BEB4 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
5CA059C5279559F40002BEB4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
5CA059CA279559F40002BEB4 /* SimpleX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleX.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 5CA059D0279559F40002BEB4 /* SimpleX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleX.app; sourceTree = BUILT_PRODUCTS_DIR; };
5CA059D7279559F40002BEB4 /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
5CA059DB279559F40002BEB4 /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = ""; };
5CA059DD279559F40002BEB4 /* Tests_iOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOSLaunchTests.swift; sourceTree = ""; };
5CA059E3279559F40002BEB4 /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
- 5CA059E7279559F40002BEB4 /* Tests_macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOS.swift; sourceTree = ""; };
- 5CA059E9279559F40002BEB4 /* Tests_macOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOSLaunchTests.swift; sourceTree = ""; };
5CA05A4B27974EB60002BEB4 /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = ""; };
5CB924D327A853F100ACCCDD /* SettingsButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsButton.swift; sourceTree = ""; };
5CB924D627A8563F00ACCCDD /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; };
@@ -198,6 +132,8 @@
5CB9250C27A9432000ACCCDD /* ChatListNavLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListNavLink.swift; sourceTree = ""; };
5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCode.swift; sourceTree = ""; };
5CC1C99427A6CF7F000D9FF6 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = ""; };
+ 5CC2C0FB2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
+ 5CC2C0FE2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = "ru.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = ""; };
5CCD403327A5F6DF00368C90 /* AddContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContactView.swift; sourceTree = ""; };
5CCD403627A5F9A200368C90 /* ConnectContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectContactView.swift; sourceTree = ""; };
5CCD403927A5F9BE00368C90 /* CreateGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateGroupView.swift; sourceTree = ""; };
@@ -226,20 +162,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- 5CA059CD279559F40002BEB4 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5C41159F280048E90054D6CB /* libgmpxx.a in Frameworks */,
- 5C4115A1280048E90054D6CB /* libgmp.a in Frameworks */,
- 5C764E85279C748C000C6508 /* libz.tbd in Frameworks */,
- 5C41159D280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx-ghc8.10.7.a in Frameworks */,
- 5C764E84279C748C000C6508 /* libiconv.tbd in Frameworks */,
- 5C411599280048E90054D6CB /* libHSsimplex-chat-1.5.0-3uBn0HoMpg08OGLfasXsOx.a in Frameworks */,
- 5C41159B280048E90054D6CB /* libffi.a in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
5CA059D4279559F40002BEB4 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -336,12 +258,12 @@
5CA059BD279559F40002BEB4 = {
isa = PBXGroup;
children = (
+ 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */,
+ 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */,
5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */,
5C764E5C279C70B7000C6508 /* Libraries */,
5CA059C2279559F40002BEB4 /* Shared */,
- 5CA059D1279559F40002BEB4 /* macOS */,
5CA059DA279559F40002BEB4 /* Tests iOS */,
- 5CA059E6279559F40002BEB4 /* Tests macOS */,
5CA059CB279559F40002BEB4 /* Products */,
5C764E7A279C71D4000C6508 /* Frameworks */,
);
@@ -356,7 +278,6 @@
5C2E260D27A30E2400F70299 /* Views */,
5CA059C5279559F40002BEB4 /* Assets.xcassets */,
5C764E7D279C7275000C6508 /* SimpleX (iOS)-Bridging-Header.h */,
- 5C764E7E279C7275000C6508 /* SimpleX (macOS)-Bridging-Header.h */,
5C764E7F279C7276000C6508 /* dummy.m */,
);
path = Shared;
@@ -366,20 +287,12 @@
isa = PBXGroup;
children = (
5CA059CA279559F40002BEB4 /* SimpleX.app */,
- 5CA059D0279559F40002BEB4 /* SimpleX.app */,
5CA059D7279559F40002BEB4 /* Tests iOS.xctest */,
5CA059E3279559F40002BEB4 /* Tests macOS.xctest */,
);
name = Products;
sourceTree = "";
};
- 5CA059D1279559F40002BEB4 /* macOS */ = {
- isa = PBXGroup;
- children = (
- );
- path = macOS;
- sourceTree = "";
- };
5CA059DA279559F40002BEB4 /* Tests iOS */ = {
isa = PBXGroup;
children = (
@@ -389,15 +302,6 @@
path = "Tests iOS";
sourceTree = "";
};
- 5CA059E6279559F40002BEB4 /* Tests macOS */ = {
- isa = PBXGroup;
- children = (
- 5CA059E7279559F40002BEB4 /* Tests_macOS.swift */,
- 5CA059E9279559F40002BEB4 /* Tests_macOSLaunchTests.swift */,
- );
- path = "Tests macOS";
- sourceTree = "";
- };
5CB924DD27A8622200ACCCDD /* NewChat */ = {
isa = PBXGroup;
children = (
@@ -480,23 +384,6 @@
productReference = 5CA059CA279559F40002BEB4 /* SimpleX.app */;
productType = "com.apple.product-type.application";
};
- 5CA059CF279559F40002BEB4 /* SimpleX (macOS) */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 5CA059F6279559F40002BEB4 /* Build configuration list for PBXNativeTarget "SimpleX (macOS)" */;
- buildPhases = (
- 5CA059CC279559F40002BEB4 /* Sources */,
- 5CA059CD279559F40002BEB4 /* Frameworks */,
- 5CA059CE279559F40002BEB4 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = "SimpleX (macOS)";
- productName = "SimpleX (macOS)";
- productReference = 5CA059D0279559F40002BEB4 /* SimpleX.app */;
- productType = "com.apple.product-type.application";
- };
5CA059D6279559F40002BEB4 /* Tests iOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5CA059F9279559F40002BEB4 /* Build configuration list for PBXNativeTarget "Tests iOS" */;
@@ -526,7 +413,6 @@
buildRules = (
);
dependencies = (
- 5CA059E5279559F40002BEB4 /* PBXTargetDependency */,
);
name = "Tests macOS";
productName = "Tests macOS";
@@ -548,10 +434,6 @@
CreatedOnToolsVersion = 13.2.1;
LastSwiftMigration = 1320;
};
- 5CA059CF279559F40002BEB4 = {
- CreatedOnToolsVersion = 13.2.1;
- LastSwiftMigration = 1320;
- };
5CA059D6279559F40002BEB4 = {
CreatedOnToolsVersion = 13.2.1;
TestTargetID = 5CA059C9279559F40002BEB4;
@@ -569,6 +451,7 @@
knownRegions = (
en,
Base,
+ ru,
);
mainGroup = 5CA059BD279559F40002BEB4;
packageReferences = (
@@ -579,7 +462,6 @@
projectRoot = "";
targets = (
5CA059C9279559F40002BEB4 /* SimpleX (iOS) */,
- 5CA059CF279559F40002BEB4 /* SimpleX (macOS) */,
5CA059D6279559F40002BEB4 /* Tests iOS */,
5CA059E2279559F40002BEB4 /* Tests macOS */,
);
@@ -592,14 +474,8 @@
buildActionMask = 2147483647;
files = (
5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5CA059CE279559F40002BEB4 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5CA059F0279559F40002BEB4 /* Assets.xcassets in Resources */,
+ 5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */,
+ 5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -674,60 +550,6 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
- 5CA059CC279559F40002BEB4 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5C6AD81427A834E300348BD7 /* NewChatButton.swift in Sources */,
- 5CB924D827A8563F00ACCCDD /* SettingsView.swift in Sources */,
- 5CEACCE427DE9246000BD591 /* ComposeView.swift in Sources */,
- 5CB924E227A867BA00ACCCDD /* UserProfile.swift in Sources */,
- 5CE4407A27ADB701007B033A /* EmojiItemView.swift in Sources */,
- 5C5346A927B59A6A004DF848 /* ChatHelp.swift in Sources */,
- 3CDBCF4327FAE51000354CDD /* ComposeLinkView.swift in Sources */,
- 3CDBCF4927FF621E00354CDD /* ChatItemLinkView.swift in Sources */,
- 5C764E81279C7276000C6508 /* dummy.m in Sources */,
- 5C7505A927B6D34800BE3227 /* ChatInfoToolbar.swift in Sources */,
- 5C3A88D227DF57800060F1C2 /* FramedItemView.swift in Sources */,
- 5CB924E527A8683A00ACCCDD /* UserAddress.swift in Sources */,
- 640F50E427CF991C001E05C2 /* SMPServers.swift in Sources */,
- 5C063D2827A4564100AEC577 /* ChatPreviewView.swift in Sources */,
- 5C35CFCC27B2E91D00FB6C6D /* NtfManager.swift in Sources */,
- 5C2E261327A30FEA00F70299 /* TerminalView.swift in Sources */,
- 5C9FD96C27A56D4D0075386C /* JSON.swift in Sources */,
- 5C9FD96F27A5D6ED0075386C /* SendMessageView.swift in Sources */,
- 5CC1C99327A6C7F5000D9FF6 /* QRCode.swift in Sources */,
- 5C116CDD27AABE0400E66D01 /* ContactRequestView.swift in Sources */,
- 5CB9250E27A9432000ACCCDD /* ChatListNavLink.swift in Sources */,
- 5CA059EE279559F40002BEB4 /* ContentView.swift in Sources */,
- 5CCD403527A5F6DF00368C90 /* AddContactView.swift in Sources */,
- 5C3A88CF27DF50170060F1C2 /* DetermineWidth.swift in Sources */,
- 5C7505A627B679EE00BE3227 /* NavLinkPlain.swift in Sources */,
- 5C7505A327B65FDB00BE3227 /* CIMetaView.swift in Sources */,
- 5C35CFC927B2782E00FB6C6D /* BGManager.swift in Sources */,
- 5CA05A4D27974EB60002BEB4 /* WelcomeView.swift in Sources */,
- 5C2E261027A30FDC00F70299 /* ChatView.swift in Sources */,
- 5C2E260C27A30CFA00F70299 /* ChatListView.swift in Sources */,
- 5C971E2227AEBF8300C8A3CE /* ChatInfoImage.swift in Sources */,
- 5C5F2B6E27EBC3FE006A9D5F /* ImagePicker.swift in Sources */,
- 5C577F7E27C83AA10006112D /* MarkdownHelp.swift in Sources */,
- 5CA059EC279559F40002BEB4 /* SimpleXApp.swift in Sources */,
- 5CCD403827A5F9A200368C90 /* ConnectContactView.swift in Sources */,
- 5CCD403B27A5F9BE00368C90 /* CreateGroupView.swift in Sources */,
- 5CEACCEE27DEA495000BD591 /* MsgContentView.swift in Sources */,
- 5C764E8A279CBCB3000C6508 /* ChatModel.swift in Sources */,
- 5C971E1E27AEBEF600C8A3CE /* ChatInfoView.swift in Sources */,
- 5CC1C99627A6CF7F000D9FF6 /* ShareSheet.swift in Sources */,
- 5C2E260827A2941F00F70299 /* SimpleXAPI.swift in Sources */,
- 5CB924D527A853F100ACCCDD /* SettingsButton.swift in Sources */,
- 5C5F2B7127EBC704006A9D5F /* ProfileImage.swift in Sources */,
- 64AA1C6D27F3537400AC7277 /* DeletedItemView.swift in Sources */,
- 5CE4407327ADB1D0007B033A /* Emoji.swift in Sources */,
- 5C1A4C1F27A715B700EAD5AD /* ChatItemView.swift in Sources */,
- 64AA1C6A27EE10C800AC7277 /* ContextItemView.swift in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
5CA059D3279559F40002BEB4 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -741,8 +563,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 5CA059EA279559F40002BEB4 /* Tests_macOSLaunchTests.swift in Sources */,
- 5CA059E8279559F40002BEB4 /* Tests_macOS.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -754,13 +574,27 @@
target = 5CA059C9279559F40002BEB4 /* SimpleX (iOS) */;
targetProxy = 5CA059D8279559F40002BEB4 /* PBXContainerItemProxy */;
};
- 5CA059E5279559F40002BEB4 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5CA059CF279559F40002BEB4 /* SimpleX (macOS) */;
- targetProxy = 5CA059E4279559F40002BEB4 /* PBXContainerItemProxy */;
- };
/* End PBXTargetDependency section */
+/* Begin PBXVariantGroup section */
+ 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 5CC2C0FB2809BF11000C35E3 /* ru */,
+ );
+ name = Localizable.strings;
+ sourceTree = "";
+ };
+ 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 5CC2C0FE2809BF11000C35E3 /* ru */,
+ );
+ name = "SimpleX--iOS--InfoPlist.strings";
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
/* Begin XCBuildConfiguration section */
5CA059F1279559F40002BEB4 /* Debug */ = {
isa = XCBuildConfiguration;
@@ -817,6 +651,7 @@
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
@@ -869,6 +704,7 @@
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
name = Release;
@@ -953,83 +789,6 @@
};
name = Release;
};
- 5CA059F7279559F40002BEB4 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = "SimpleX (macOS)Debug.entitlements";
- CODE_SIGN_IDENTITY = "-";
- CODE_SIGN_STYLE = Automatic;
- COMBINE_HIDPI_IMAGES = YES;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = 5NN7GUYB6T;
- ENABLE_HARDENED_RUNTIME = YES;
- ENABLE_PREVIEWS = YES;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_FILE = "SimpleX--macOS--Info.plist";
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/../Frameworks",
- );
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Libraries",
- "$(PROJECT_DIR)/Libraries/ios",
- "$(PROJECT_DIR)/Libraries/sim",
- );
- MACOSX_DEPLOYMENT_TARGET = 12.1;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
- PRODUCT_NAME = SimpleX;
- SDKROOT = macosx;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_OBJC_BRIDGING_HEADER = "Shared/SimpleX (macOS)-Bridging-Header.h";
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- };
- name = Debug;
- };
- 5CA059F8279559F40002BEB4 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- CLANG_ENABLE_MODULES = YES;
- CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
- CODE_SIGN_IDENTITY = "-";
- CODE_SIGN_STYLE = Automatic;
- COMBINE_HIDPI_IMAGES = YES;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = 5NN7GUYB6T;
- ENABLE_HARDENED_RUNTIME = YES;
- ENABLE_PREVIEWS = YES;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_FILE = "SimpleX--macOS--Info.plist";
- INFOPLIST_KEY_NSHumanReadableCopyright = "";
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/../Frameworks",
- );
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Libraries",
- "$(PROJECT_DIR)/Libraries/ios",
- "$(PROJECT_DIR)/Libraries/sim",
- );
- MACOSX_DEPLOYMENT_TARGET = 12.1;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
- PRODUCT_NAME = SimpleX;
- SDKROOT = macosx;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_OBJC_BRIDGING_HEADER = "Shared/SimpleX (macOS)-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- };
- name = Release;
- };
5CA059FA279559F40002BEB4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -1130,15 +889,6 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 5CA059F6279559F40002BEB4 /* Build configuration list for PBXNativeTarget "SimpleX (macOS)" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 5CA059F7279559F40002BEB4 /* Debug */,
- 5CA059F8279559F40002BEB4 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
5CA059F9279559F40002BEB4 /* Build configuration list for PBXNativeTarget "Tests iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/apps/ios/SimpleX.xcodeproj/xcshareddata/xcschemes/SimpleX (iOS).xcscheme b/apps/ios/SimpleX.xcodeproj/xcshareddata/xcschemes/SimpleX (iOS).xcscheme
new file mode 100644
index 000000000..a90949ee3
--- /dev/null
+++ b/apps/ios/SimpleX.xcodeproj/xcshareddata/xcschemes/SimpleX (iOS).xcscheme
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/ios/Tests macOS/Tests_macOS.swift b/apps/ios/Tests macOS/Tests_macOS.swift
deleted file mode 100644
index ee05450dc..000000000
--- a/apps/ios/Tests macOS/Tests_macOS.swift
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-// Tests_macOS.swift
-// Tests macOS
-//
-// Created by Evgeny Poberezkin on 17/01/2022.
-//
-
-import XCTest
-
-class Tests_macOS: XCTestCase {
-
- override func setUpWithError() throws {
- // Put setup code here. This method is called before the invocation of each test method in the class.
-
- // In UI tests it is usually best to stop immediately when a failure occurs.
- continueAfterFailure = false
-
- // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
- }
-
- override func tearDownWithError() throws {
- // Put teardown code here. This method is called after the invocation of each test method in the class.
- }
-
- func testExample() throws {
- // UI tests must launch the application that they test.
- let app = XCUIApplication()
- app.launch()
-
- // Use recording to get started writing UI tests.
- // Use XCTAssert and related functions to verify your tests produce the correct results.
- }
-
- func testLaunchPerformance() throws {
- if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
- // This measures how long it takes to launch your application.
- measure(metrics: [XCTApplicationLaunchMetric()]) {
- XCUIApplication().launch()
- }
- }
- }
-}
diff --git a/apps/ios/Tests macOS/Tests_macOSLaunchTests.swift b/apps/ios/Tests macOS/Tests_macOSLaunchTests.swift
deleted file mode 100644
index 84d51dadb..000000000
--- a/apps/ios/Tests macOS/Tests_macOSLaunchTests.swift
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// Tests_macOSLaunchTests.swift
-// Tests macOS
-//
-// Created by Evgeny Poberezkin on 17/01/2022.
-//
-
-import XCTest
-
-class Tests_macOSLaunchTests: XCTestCase {
-
- override class var runsForEachTargetApplicationUIConfiguration: Bool {
- true
- }
-
- override func setUpWithError() throws {
- continueAfterFailure = false
- }
-
- func testLaunch() throws {
- let app = XCUIApplication()
- app.launch()
-
- // Insert steps here to perform after app launch but before taking a screenshot,
- // such as logging into a test account or navigating somewhere in the app
-
- let attachment = XCTAttachment(screenshot: app.screenshot())
- attachment.name = "Launch Screen"
- attachment.lifetime = .keepAlways
- add(attachment)
- }
-}
diff --git a/apps/ios/macOS/macOS.entitlements b/apps/ios/macOS/macOS.entitlements
deleted file mode 100644
index f2ef3ae02..000000000
--- a/apps/ios/macOS/macOS.entitlements
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- com.apple.security.app-sandbox
-
- com.apple.security.files.user-selected.read-only
-
-
-
diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings
new file mode 100644
index 000000000..2ceedaa68
--- /dev/null
+++ b/apps/ios/ru.lproj/Localizable.strings
@@ -0,0 +1,462 @@
+/* No comment provided by engineer. */
+" " = " ";
+
+/* No comment provided by engineer. */
+" (" = " (";
+
+/* No comment provided by engineer. */
+" (can be copied)" = " (можно скопировать)";
+
+/* No comment provided by engineer. */
+"_italic_" = "\\_курсив_";
+
+/* No comment provided by engineer. */
+", " = ", ";
+
+/* No comment provided by engineer. */
+": " = ": ";
+
+/* No comment provided by engineer. */
+": %@" = ": %@";
+
+/* No comment provided by engineer. */
+"!1 colored!" = "!1 цвет!";
+
+/* No comment provided by engineer. */
+"(shared only with your contacts)" = "(отправляется только вашим контактам)";
+
+/* No comment provided by engineer. */
+")" = ")";
+
+/* No comment provided by engineer. */
+"[Send us email](mailto:chat@simplex.chat)" = "[Отправить email](mailto:chat@simplex.chat)";
+
+/* No comment provided by engineer. */
+"**Add new contact**: to create your one-time QR Code for your contact." = "**Добавить новый контакт**: чтобы создать одноразовый QR код или ссылку для вашего контакта.";
+
+/* No comment provided by engineer. */
+"**Scan QR code**: to connect to your contact who shows QR code to you." = "**Сканировать QR код**: чтобы соединиться с вашим контактом (который показывает вам QR код).";
+
+/* No comment provided by engineer. */
+"*bold*" = "\\*жирный*";
+
+/* No comment provided by engineer. */
+"#secret#" = "#секрет#";
+
+/* notification title */
+"%@ is connected!" = "Установлено соединение с %@!";
+
+/* notification title */
+"%@ wants to connect!" = "%@ хочет соединиться!";
+
+/* No comment provided by engineer. */
+"%lld" = "%lld";
+
+/* No comment provided by engineer. */
+"%lldk" = "%lldk";
+
+/* No comment provided by engineer. */
+"`a + b`" = "\\`a + b`";
+
+/* No comment provided by engineer. */
+"~strike~" = "\\~зачеркнуть~";
+
+/* No comment provided by engineer. */
+"💻 desktop: scan displayed QR code from the app, via **Scan QR code**." = "💻 на компьютере: сосканируйте QR код из приложения через **Сканировать QR код**.";
+
+/* No comment provided by engineer. */
+"📱 mobile: tap **Open in mobile app**, then tap **Connect** in the app." = "📱 на мобильном: намжите кнопку **Open in mobile app** на веб странице, затем нажмите **Соединиться** в приложении.";
+
+/* No comment provided by engineer. */
+"6" = "6";
+
+/* No comment provided by engineer. */
+"above, then:" = "наверху, затем:";
+
+/* accept contact request via notification */
+"Accept" = "Принять";
+
+/* No comment provided by engineer. */
+"Accept contact" = "Принять запрос";
+
+/* notification body */
+"Accept contact request from %@?" = "Принять запрос на соединение от %@?";
+
+/* No comment provided by engineer. */
+"Add contact" = "Добавить контакт";
+
+/* No comment provided by engineer. */
+"All your contacts will remain connected" = "Все контакты, которые соединились через этот адрес, сохранятся.";
+
+/* No comment provided by engineer. */
+"bold" = "жирный";
+
+/* No comment provided by engineer. */
+"Cancel" = "Отменить";
+
+/* No comment provided by engineer. */
+"Chat console" = "Консоль";
+
+/* No comment provided by engineer. */
+"Chat with the developers" = "Соединиться с разработчиками";
+
+/* back button to return to chats list */
+"Chats" = "Назад";
+
+/* No comment provided by engineer. */
+"Choose from library" = "Выбрать из библиотеки";
+
+/* No comment provided by engineer. */
+"colored" = "цвет";
+
+/* No comment provided by engineer. */
+"Configure SMP servers" = "Настройка SMP серверов";
+
+/* No comment provided by engineer. */
+"Confirm" = "Подтвердить";
+
+/* No comment provided by engineer. */
+"Connect" = "Соединиться";
+
+/* No comment provided by engineer. */
+"connect to SimpleX Chat developers." = "соединиться с разработчиками.";
+
+/* No comment provided by engineer. */
+"Connect via contact link?" = "Соединиться через ссылку-контакт?";
+
+/* No comment provided by engineer. */
+"Connect via invitation link?" = "Соединиться через ссылку-приглашение?";
+
+/* No comment provided by engineer. */
+"Connecting server…" = "Устанавливается соединение с сервером…";
+
+/* No comment provided by engineer. */
+"Connecting server… (error: %@)" = "Устанавливается соединение с сервером… (ошибка: %@)";
+
+/* No comment provided by engineer. */
+"Connecting..." = "Устанавливается соединение…";
+
+/* No comment provided by engineer. */
+"Connection error" = "Ошибка соединения";
+
+/* No comment provided by engineer. */
+"Connection request" = "Запрос на соединение";
+
+/* No comment provided by engineer. */
+"Connection request sent!" = "Запрос на соединение отправлен!";
+
+/* No comment provided by engineer. */
+"Connection timeout" = "Превышено время соединения";
+
+/* No comment provided by engineer. */
+"Contact already exists" = "Существующий контакт";
+
+/* No comment provided by engineer. */
+"Contact and all messages will be deleted - this cannot be undone!" = "Контакт и все сообщения будут удалены - это действие нельзя отменить!";
+
+/* notification */
+"Contact is connected" = "Соединение с контактом установлено";
+
+/* No comment provided by engineer. */
+"Copy" = "Скопировать";
+
+/* No comment provided by engineer. */
+"Create" = "Создать";
+
+/* No comment provided by engineer. */
+"Create address" = "Создать адрес";
+
+/* No comment provided by engineer. */
+"Create group" = "Создать группу";
+
+/* No comment provided by engineer. */
+"Create profile" = "Создать профиль";
+
+/* No comment provided by engineer. */
+"Delete" = "Удалить";
+
+/* No comment provided by engineer. */
+"Delete address" = "Удалить адрес";
+
+/* No comment provided by engineer. */
+"Delete address?" = "Удалить адрес?";
+
+/* No comment provided by engineer. */
+"Delete contact" = "Удалить контакт";
+
+/* No comment provided by engineer. */
+"Delete contact?" = "Удалить контакт?";
+
+/* No comment provided by engineer. */
+"Delete for me" = "Удалить для меня";
+
+/* No comment provided by engineer. */
+"Delete group" = "Удалить группу";
+
+/* No comment provided by engineer. */
+"Delete message?" = "Удалить сообщение?";
+
+/* deleted chat item */
+"deleted" = "удалено";
+
+/* No comment provided by engineer. */
+"Develop" = "Для разработчиков";
+
+/* No comment provided by engineer. */
+"Display name" = "Имя профиля";
+
+/* No comment provided by engineer. */
+"Edit" = "Редактировать";
+
+/* No comment provided by engineer. */
+"Enter one SMP server per line:" = "Введите SMP серверы, каждый на отдельной строке:";
+
+/* No comment provided by engineer. */
+"Error saving SMP servers" = "Ошибка при сохранении SMP серверов";
+
+/* No comment provided by engineer. */
+"Error: %@" = "Ошибка: %@";
+
+/* No comment provided by engineer. */
+"Error: URL is invalid" = "Ошибка: неверная ссылка";
+
+/* No comment provided by engineer. */
+"Full name (optional)" = "Полное имя (не обязательно)";
+
+/* No comment provided by engineer. */
+"Group deletion is not supported" = "Удаление групп не поддерживается";
+
+/* No comment provided by engineer. */
+"Help" = "Помощь";
+
+/* No comment provided by engineer. */
+"How to" = "Информация";
+
+/* No comment provided by engineer. */
+"How to use markdown" = "Как форматировать";
+
+/* No comment provided by engineer. */
+"How to use SimpleX Chat" = "Как использовать SimpleX Chat";
+
+/* No comment provided by engineer. */
+"If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link." = "Если вы не можете встретиться лично, вы можете **сосканировать QR код во время видеозвонка**, или ваш контакт может отправить вам ссылку.";
+
+/* No comment provided by engineer. */
+"If you cannot meet in person, you can **show QR code in the video call**, or you can share the invitation link via any other channel." = "Если вы не можете встретиться лично, вы можете **показать QR код во время видеозвонка** или отправить ссылку через любой другой канал связи.";
+
+/* No comment provided by engineer. */
+"If you received SimpleX Chat invitation link you can open it in your browser:" = "Если вы получили ссылку с приглашением из SimpleX Chat, вы можете открыть её в браузере:";
+
+/* No comment provided by engineer. */
+"Install [SimpleX Chat for terminal](https://github.com/simplex-chat/simplex-chat)" = "[SimpleX Chat для терминала](https://github.com/simplex-chat/simplex-chat)";
+
+/* No comment provided by engineer. */
+"Invalid connection link" = "Ошибка в ссылке контакта";
+
+/* No comment provided by engineer. */
+"italic" = "курсив";
+
+/* No comment provided by engineer. */
+"Make sure SMP server addresses are in correct format, line separated and are not duplicated." = "Пожалуйста, проверьте, что адреса SMP серверов имеют правильный формат, каждый адрес на отдельной строке и не повторяется.";
+
+/* No comment provided by engineer. */
+"Markdown in messages" = "Форматирование сообщений";
+
+/* No comment provided by engineer. */
+"Message delivery error" = "Ошибка доставки сообщения";
+
+/* No comment provided by engineer. */
+"Most likely this contact has deleted the connection with you." = "Скорее всего, этот контакт удалил соединение с вами.";
+
+/* notification */
+"New contact request" = "Новый запрос на соединение";
+
+/* notifications */
+"New message" = "Новое сообщение";
+
+/* No comment provided by engineer. */
+"Notifications are disabled!" = "Уведомления выключены";
+
+/* No comment provided by engineer. */
+"Open Settings" = "Открыть Настройки";
+
+/* No comment provided by engineer. */
+"Please check that you used the correct link or ask your contact to send you another one." = "Пожалуйста, проверьте, что вы использовали правильную ссылку или попросите, чтобы ваш контакт отправил вам другую ссылку.";
+
+/* No comment provided by engineer. */
+"Please check your network connection and try again." = "Пожалуйста, проверьте ваше соединение с сетью и попробуйте еще раз.";
+
+/* No comment provided by engineer. */
+"Profile image" = "Аватар";
+
+/* No comment provided by engineer. */
+"Read" = "Прочитано";
+
+/* to be removed */
+"receiving files is not supported yet" = "получение файлов не поддерживается";
+
+/* No comment provided by engineer. */
+"Reject" = "Отклонить";
+
+/* No comment provided by engineer. */
+"Reject contact (sender NOT notified)" = "Отклонить (не уведомляя отправителя)";
+
+/* No comment provided by engineer. */
+"Reject contact request" = "Отклонить запрос";
+
+/* No comment provided by engineer. */
+"Reply" = "Ответить";
+
+/* No comment provided by engineer. */
+"Save" = "Сохранить";
+
+/* No comment provided by engineer. */
+"Save (and notify contacts)" = "Сохранить (и уведомить контакты)";
+
+/* No comment provided by engineer. */
+"Saved SMP servers will be removed" = "Сохраненные SMP серверы будут удалены";
+
+/* No comment provided by engineer. */
+"Scan QR code" = "Сканировать QR код";
+
+/* No comment provided by engineer. */
+"secret" = "секрет";
+
+/* to be removed */
+"sending files is not supported yet" = "отправка файлов не поддерживается";
+
+/* No comment provided by engineer. */
+"Server connected" = "Установлено соединение с сервером";
+
+/* No comment provided by engineer. */
+"Settings" = "Настройки";
+
+/* No comment provided by engineer. */
+"Share" = "Поделиться";
+
+/* No comment provided by engineer. */
+"Share invitation link" = "Поделиться ссылкой";
+
+/* No comment provided by engineer. */
+"Share link" = "Поделиться ссылкой";
+
+/* No comment provided by engineer. */
+"Show QR code to your contact\nto scan from the app" = "Покажите QR код вашему контакту для сканирования в приложении";
+
+/* No comment provided by engineer. */
+"SMP servers" = "SMP серверы";
+
+/* No comment provided by engineer. */
+"Start new chat" = "Начать новый разговор";
+
+/* No comment provided by engineer. */
+"strike" = "зачеркнуть";
+
+/* No comment provided by engineer. */
+"Take picture" = "Сделать фото";
+
+/* No comment provided by engineer. */
+"Tap button " = "Нажмите кнопку";
+
+/* No comment provided by engineer. */
+"Thank you for installing SimpleX Chat!" = "Спасибо, что Вы установили SimpleX Chat!";
+
+/* No comment provided by engineer. */
+"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Приложение может посылать вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.";
+
+/* No comment provided by engineer. */
+"The messaging and application platform 100% private by design!" = "Платформа для сообщений и приложений, которая защищает вашу личную информацию и безопасность.";
+
+/* No comment provided by engineer. */
+"The sender will NOT be notified" = "Отправитель не будет уведомлён";
+
+/* No comment provided by engineer. */
+"To ask any questions and to receive updates:" = "Задать вопросы и получать уведомления о новых версиях:";
+
+/* No comment provided by engineer. */
+"To connect via link" = "Соединиться через ссылку";
+
+/* No comment provided by engineer. */
+"To start a new chat" = "Начать новый разговор";
+
+/* No comment provided by engineer. */
+"Trying to connect to the server used to receive messages from this contact (error: %@)." = "Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта (ошибка: %@).";
+
+/* No comment provided by engineer. */
+"Trying to connect to the server used to receive messages from this contact." = "Устанавливается соединение с сервером, через который вы получаете сообщения от этого контакта.";
+
+/* No comment provided by engineer. */
+"Unexpected error: %@" = "Неожиданная ошибка: %@";
+
+/* No comment provided by engineer. */
+"Use SimpleX Chat servers?" = "Использовать серверы предосталенные SimpleX Chat?";
+
+/* No comment provided by engineer. */
+"Using SimpleX Chat servers." = "Используются серверы, предоставленные SimpleX Chat.";
+
+/* No comment provided by engineer. */
+"v%@ (%@)" = "v%@ (%@)";
+
+/* No comment provided by engineer. */
+"wants to connect to you!" = "хочет соединиться с вами!";
+
+/* No comment provided by engineer. */
+"Welcome %@!" = "Здравствуйте %@!";
+
+/* No comment provided by engineer. */
+"You" = "Вы";
+
+/* No comment provided by engineer. */
+"You are already connected to %@ via this link." = "Вы уже соединены с %@ через эту ссылку.";
+
+/* No comment provided by engineer. */
+"You are connected to the server used to receive messages from this contact." = "Установлено соединение с сервером, через который вы получается сообщения от этого контакта.";
+
+/* notification body */
+"You can now send messages to %@" = "Вы теперь можете отправлять сообщения %@";
+
+/* No comment provided by engineer. */
+"You can share your address as a link or as a QR code - anybody will be able to connect to you. You won't lose your contacts if you later delete it." = "Вы можете использовать ваш адрес как ссылку или как QR код - кто угодно сможет соединиться с вами. Вы сможете удалить адрес, сохранив контакты, которые через него соединились.";
+
+/* No comment provided by engineer. */
+"You can use markdown to format messages:" = "Вы можете форматировать сообщения:";
+
+/* No comment provided by engineer. */
+"You control your chat!" = "Вы котролируете Ваш чат!";
+
+/* No comment provided by engineer. */
+"You will be connected when your connection request is accepted, please wait or check later!" = "Соединение будет установлено, когда ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!";
+
+/* No comment provided by engineer. */
+"You will be connected when your contact's device is online, please wait or check later!" = "Соединение будет установлено, когда ваш контакт будет онлайн. Пожалуйста, подождите или проверьте позже!";
+
+/* No comment provided by engineer. */
+"Your chat address" = "Ваш SimpleX адрес";
+
+/* No comment provided by engineer. */
+"Your chat profile" = "Ваш профиль";
+
+/* No comment provided by engineer. */
+"Your chat profile will be sent to your contact" = "Ваш профиль будет отправлен вашему контакту";
+
+/* No comment provided by engineer. */
+"Your chats" = "Ваши чаты";
+
+/* No comment provided by engineer. */
+"Your profile is stored on your device and shared only with your contacts.\nSimpleX servers cannot see your profile." = "Ваш профиль хранится на вашем устройстве и отправляется только вашим контактам.\nSimpleX серверы не могут получить доступ к вашему профилю.";
+
+/* No comment provided by engineer. */
+"Your profile will be sent to the contact that you received this link from" = "Ваш профиль будет отправлен контакту, от которого вы получили эту ссылку.";
+
+/* No comment provided by engineer. */
+"Your profile, contacts and messages (once delivered) are only stored locally on your device." = "Ваш профиль, контакты и сообщения (после доставки) хранятся только на вашем устройстве.";
+
+/* No comment provided by engineer. */
+"Your settings" = "Настройки";
+
+/* No comment provided by engineer. */
+"Your SimpleX contact address" = "Ваш SimpleX адрес";
+
+/* No comment provided by engineer. */
+"Your SMP servers" = "Ваши SMP серверы";
+
diff --git a/apps/ios/ru.lproj/SimpleX--iOS--InfoPlist.strings b/apps/ios/ru.lproj/SimpleX--iOS--InfoPlist.strings
new file mode 100644
index 000000000..a8fa77d9f
--- /dev/null
+++ b/apps/ios/ru.lproj/SimpleX--iOS--InfoPlist.strings
@@ -0,0 +1,6 @@
+/* Bundle name */
+"CFBundleName" = "SimpleX";
+
+/* Privacy - Camera Usage Description */
+"NSCameraUsageDescription" = "SimpleX использует камеру для сканирования QR кодов при соединении с другими пользователями";
+