From 41caec7c9096868134715f796a3f2a6dafaaaf05 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 2 Apr 2026 17:21:36 -0700 Subject: [PATCH 1/2] Add home screen long-press shortcuts for iOS and Android Add two static quick actions visible on long-press of the app icon: 1. "Save 2FA First!" - warns users to preserve credentials before uninstalling, links to the support article on getting a new phone. 2. "Contact Support" - opens the support chat page. On iOS, shortcuts are defined in Info.plist with localized titles via InfoPlist.strings, and handled in AppDelegate with the canonical return-false pattern to prevent double-delivery on cold start. On Android, shortcuts are declared in res/xml/shortcuts.xml and referenced from AndroidManifest.xml. URLs that aren't registered deep link hosts are routed to the default browser via maybeOpenInBrowser. Made-with: Cursor --- CHANGELOG.md | 3 ++ android/app/src/main/AndroidManifest.xml | 3 ++ .../java/co/edgesecure/app/MainActivity.kt | 38 ++++++++++++++++++ android/app/src/main/res/values/strings.xml | 4 ++ android/app/src/main/res/xml/shortcuts.xml | 23 +++++++++++ ios/edge/AppDelegate.swift | 40 ++++++++++++++++++- ios/edge/Info.plist | 33 +++++++++++++++ ios/edge/en.lproj/InfoPlist.strings | 7 ++++ 8 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 android/app/src/main/res/xml/shortcuts.xml create mode 100644 ios/edge/en.lproj/InfoPlist.strings diff --git a/CHANGELOG.md b/CHANGELOG.md index 3494d9e8417..c58b0ae9b1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased (develop) +- added: Home screen long-press shortcut to contact support +- added: Home screen long-press shortcut warning about 2FA and credentials needed after uninstall + ## 4.47.0 (staging) - added: Include Zano sweep private key support for ZANO and tokens. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 33e6b4cb839..4b5e0c6e9a9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -92,6 +92,9 @@ + diff --git a/android/app/src/main/java/co/edgesecure/app/MainActivity.kt b/android/app/src/main/java/co/edgesecure/app/MainActivity.kt index 178abd63ef8..d297f2b40db 100644 --- a/android/app/src/main/java/co/edgesecure/app/MainActivity.kt +++ b/android/app/src/main/java/co/edgesecure/app/MainActivity.kt @@ -1,5 +1,6 @@ package co.edgesecure.app +import android.content.Intent import android.content.pm.ActivityInfo import android.os.Build import android.os.Bundle @@ -38,6 +39,43 @@ class MainActivity : ReactActivity() { if (resources.getBoolean(R.bool.portrait_only)) { requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } + + if (maybeOpenInBrowser(intent)) { + intent.data = null + } + } + + override fun onNewIntent(intent: Intent) { + if (!maybeOpenInBrowser(intent)) { + super.onNewIntent(intent) + } + } + + /** + * Opens https/http URLs in the default browser when they aren't + * registered deep link hosts handled by React Native. This prevents + * shortcut intents from being misrouted through the deep link handler. + * Returns true if the URL was opened in the browser. + */ + private fun maybeOpenInBrowser(intent: Intent?): Boolean { + val data = intent?.data ?: return false + val scheme = data.scheme + if (scheme != "https" && scheme != "http") return false + + val host = data.host + if (DEEP_LINK_HOSTS.contains(host)) return false + + val browserIntent = Intent(Intent.ACTION_VIEW, data) + startActivity(browserIntent) + return true + } + + companion object { + private val DEEP_LINK_HOSTS = setOf( + "deep.edge.app", + "dl.edge.app", + "return.edge.app" + ) } // Edge addition diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 806da384537..7ccc4c6d6bc 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,3 +1,7 @@ Edge + Contact Support + Contact support for help from a live agent + ⚠️ Save 2FA First! + ⚠️ Login requires 2FA & credentials! diff --git a/android/app/src/main/res/xml/shortcuts.xml b/android/app/src/main/res/xml/shortcuts.xml new file mode 100644 index 00000000000..327fd8e48c2 --- /dev/null +++ b/android/app/src/main/res/xml/shortcuts.xml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/ios/edge/AppDelegate.swift b/ios/edge/AppDelegate.swift index 9483d70d2ba..ebe2eccf4b4 100644 --- a/ios/edge/AppDelegate.swift +++ b/ios/edge/AppDelegate.swift @@ -12,6 +12,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var securityView: UIView? + // Deferred until React Native is fully initialized in didFinishLaunchingWithOptions + private var pendingShortcutItem: UIApplicationShortcutItem? + var reactNativeDelegate: ReactNativeDelegate? var reactNativeFactory: RCTReactNativeFactory? @@ -49,6 +52,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil ) -> Bool { + let launchedFromShortcut = launchOptions?[.shortcutItem] is UIApplicationShortcutItem + if let shortcutItem = launchOptions?[.shortcutItem] as? UIApplicationShortcutItem { + pendingShortcutItem = shortcutItem + } + // Initialize SDK's: initializeSentry() FirebaseApp.configure() @@ -72,7 +80,37 @@ class AppDelegate: UIResponder, UIApplicationDelegate { launchOptions: launchOptions ) - return true + if let shortcutItem = pendingShortcutItem { + _ = handleShortcutItem(shortcutItem) + pendingShortcutItem = nil + } + + return !launchedFromShortcut + } + + func application( + _ application: UIApplication, + performActionFor shortcutItem: UIApplicationShortcutItem, + completionHandler: @escaping (Bool) -> Void + ) { + let handled = handleShortcutItem(shortcutItem) + completionHandler(handled) + } + + private func handleShortcutItem(_ shortcutItem: UIApplicationShortcutItem) -> Bool { + guard let urlString = shortcutItem.userInfo?["url"] as? String, + let url = URL(string: urlString) else { return false } + + if url.scheme == "https" || url.scheme == "http" { + UIApplication.shared.open(url, options: [:]) { success in + if !success { + print("Failed to open shortcut URL: \(urlString)") + } + } + return true + } + + return RCTLinkingManager.application(UIApplication.shared, open: url, options: [:]) } /** diff --git a/ios/edge/Info.plist b/ios/edge/Info.plist index 2a9afea9725..9245d52dcd8 100644 --- a/ios/edge/Info.plist +++ b/ios/edge/Info.plist @@ -57,6 +57,39 @@ CFBundleVersion 99999999 + UIApplicationShortcutItems + + + UIApplicationShortcutItemTitle + SHORTCUT_UNINSTALL_TITLE + UIApplicationShortcutItemSubtitle + SHORTCUT_UNINSTALL_SUBTITLE + UIApplicationShortcutItemIconSymbolName + nosign + UIApplicationShortcutItemType + co.edgesecure.app.do_not_uninstall + UIApplicationShortcutItemUserInfo + + url + https://support.edge.app/en/articles/14439418-warning-don-t-uninstall-edge-without-your-login-credentials + + + + UIApplicationShortcutItemTitle + SHORTCUT_SUPPORT_TITLE + UIApplicationShortcutItemSubtitle + SHORTCUT_SUPPORT_SUBTITLE + UIApplicationShortcutItemIconSymbolName + message.fill + UIApplicationShortcutItemType + co.edgesecure.app.contact_support + UIApplicationShortcutItemUserInfo + + url + https://support.edge.app/en/articles/14054649-need-help-reach-out-via-our-chat-bubble?chat=open + + + LSApplicationQueriesSchemes https diff --git a/ios/edge/en.lproj/InfoPlist.strings b/ios/edge/en.lproj/InfoPlist.strings new file mode 100644 index 00000000000..712ad082046 --- /dev/null +++ b/ios/edge/en.lproj/InfoPlist.strings @@ -0,0 +1,7 @@ +/* Home screen shortcut: uninstall warning */ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ Save 2FA First!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Login requires 2FA & credentials!"; + +/* Home screen shortcut: contact support */ +"SHORTCUT_SUPPORT_TITLE" = "Contact Support"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Get help from our live support agents"; From 40001b37c00fff0f66a27f0b4cd5a218eaa08cf9 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 2 Apr 2026 17:22:25 -0700 Subject: [PATCH 2/2] Add localized shortcut strings for all supported locales Add translated shortcut labels for de, es, es-MX, fr, it, ja, ko, pt, ru, vi, and zh-Hans on both iOS (InfoPlist.strings) and Android (res/values-*/strings.xml). Register the locale .lproj bundles in the Xcode project. Made-with: Cursor --- .../app/src/main/res/values-de/strings.xml | 6 +++ .../src/main/res/values-es-rMX/strings.xml | 6 +++ .../app/src/main/res/values-es/strings.xml | 6 +++ .../app/src/main/res/values-fr/strings.xml | 6 +++ .../app/src/main/res/values-it/strings.xml | 6 +++ .../app/src/main/res/values-ja/strings.xml | 6 +++ .../app/src/main/res/values-ko/strings.xml | 6 +++ .../app/src/main/res/values-pt/strings.xml | 6 +++ .../app/src/main/res/values-ru/strings.xml | 6 +++ .../app/src/main/res/values-vi/strings.xml | 6 +++ .../app/src/main/res/values-zh/strings.xml | 6 +++ ios/edge.xcodeproj/project.pbxproj | 48 +++++++++++++++++++ ios/edge/de.lproj/InfoPlist.strings | 4 ++ ios/edge/es-MX.lproj/InfoPlist.strings | 4 ++ ios/edge/es.lproj/InfoPlist.strings | 4 ++ ios/edge/fr.lproj/InfoPlist.strings | 4 ++ ios/edge/it.lproj/InfoPlist.strings | 4 ++ ios/edge/ja.lproj/InfoPlist.strings | 4 ++ ios/edge/ko.lproj/InfoPlist.strings | 4 ++ ios/edge/pt.lproj/InfoPlist.strings | 4 ++ ios/edge/ru.lproj/InfoPlist.strings | 4 ++ ios/edge/vi.lproj/InfoPlist.strings | 4 ++ ios/edge/zh-Hans.lproj/InfoPlist.strings | 4 ++ 23 files changed, 158 insertions(+) create mode 100644 android/app/src/main/res/values-de/strings.xml create mode 100644 android/app/src/main/res/values-es-rMX/strings.xml create mode 100644 android/app/src/main/res/values-es/strings.xml create mode 100644 android/app/src/main/res/values-fr/strings.xml create mode 100644 android/app/src/main/res/values-it/strings.xml create mode 100644 android/app/src/main/res/values-ja/strings.xml create mode 100644 android/app/src/main/res/values-ko/strings.xml create mode 100644 android/app/src/main/res/values-pt/strings.xml create mode 100644 android/app/src/main/res/values-ru/strings.xml create mode 100644 android/app/src/main/res/values-vi/strings.xml create mode 100644 android/app/src/main/res/values-zh/strings.xml create mode 100644 ios/edge/de.lproj/InfoPlist.strings create mode 100644 ios/edge/es-MX.lproj/InfoPlist.strings create mode 100644 ios/edge/es.lproj/InfoPlist.strings create mode 100644 ios/edge/fr.lproj/InfoPlist.strings create mode 100644 ios/edge/it.lproj/InfoPlist.strings create mode 100644 ios/edge/ja.lproj/InfoPlist.strings create mode 100644 ios/edge/ko.lproj/InfoPlist.strings create mode 100644 ios/edge/pt.lproj/InfoPlist.strings create mode 100644 ios/edge/ru.lproj/InfoPlist.strings create mode 100644 ios/edge/vi.lproj/InfoPlist.strings create mode 100644 ios/edge/zh-Hans.lproj/InfoPlist.strings diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml new file mode 100644 index 00000000000..c841902efae --- /dev/null +++ b/android/app/src/main/res/values-de/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ 2FA sichern! + ⚠️ Login erfordert 2FA & Zugangsdaten! + Support kontakt. + Hilfe von unseren Live-Support-Mitarbeitern + diff --git a/android/app/src/main/res/values-es-rMX/strings.xml b/android/app/src/main/res/values-es-rMX/strings.xml new file mode 100644 index 00000000000..1c1f0ed0de0 --- /dev/null +++ b/android/app/src/main/res/values-es-rMX/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ ¡Guarda tu 2FA! + ⚠️ Inicio requiere 2FA y credenciales! + Contactar soporte + Obtén ayuda de nuestros agentes en vivo + diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml new file mode 100644 index 00000000000..1c1f0ed0de0 --- /dev/null +++ b/android/app/src/main/res/values-es/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ ¡Guarda tu 2FA! + ⚠️ Inicio requiere 2FA y credenciales! + Contactar soporte + Obtén ayuda de nuestros agentes en vivo + diff --git a/android/app/src/main/res/values-fr/strings.xml b/android/app/src/main/res/values-fr/strings.xml new file mode 100644 index 00000000000..6a9d1353e89 --- /dev/null +++ b/android/app/src/main/res/values-fr/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ Sauvez le 2FA ! + ⚠️ Connexion nécessite 2FA & identifiants ! + Nous contacter + Aide de nos agents de support en direct + diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml new file mode 100644 index 00000000000..ab1aed5d4f3 --- /dev/null +++ b/android/app/src/main/res/values-it/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ Salva il 2FA! + ⚠️ Il login richiede 2FA & credenziali! + Contatta supporto + Aiuto dai nostri agenti di supporto live + diff --git a/android/app/src/main/res/values-ja/strings.xml b/android/app/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000000..608f0e2f434 --- /dev/null +++ b/android/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ 2FAを先に保存! + ⚠️ ログインには2FAと認証情報が必要です! + サポートに連絡 + ライブサポートスタッフに相談する + diff --git a/android/app/src/main/res/values-ko/strings.xml b/android/app/src/main/res/values-ko/strings.xml new file mode 100644 index 00000000000..80b5cd3b495 --- /dev/null +++ b/android/app/src/main/res/values-ko/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ 2FA 먼저 저장! + ⚠️ 로그인에 2FA 및 자격 증명이 필요합니다! + 지원 문의 + 실시간 지원 상담원에게 도움 받기 + diff --git a/android/app/src/main/res/values-pt/strings.xml b/android/app/src/main/res/values-pt/strings.xml new file mode 100644 index 00000000000..faecd404c48 --- /dev/null +++ b/android/app/src/main/res/values-pt/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ Salve o 2FA! + ⚠️ Login requer 2FA & credenciais! + Contatar suporte + Obtenha ajuda dos nossos agentes ao vivo + diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000000..dcb2ff5486d --- /dev/null +++ b/android/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ Сохрани 2FA! + ⚠️ Для входа нужны 2FA & учётные данные! + Связаться + Помощь от наших агентов поддержки + diff --git a/android/app/src/main/res/values-vi/strings.xml b/android/app/src/main/res/values-vi/strings.xml new file mode 100644 index 00000000000..12cf116e76d --- /dev/null +++ b/android/app/src/main/res/values-vi/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ Lưu 2FA trước! + ⚠️ Đăng nhập cần 2FA & mật khẩu! + Liên hệ hỗ trợ + Nhận hỗ trợ từ nhân viên trực tuyến + diff --git a/android/app/src/main/res/values-zh/strings.xml b/android/app/src/main/res/values-zh/strings.xml new file mode 100644 index 00000000000..9794c13a9fa --- /dev/null +++ b/android/app/src/main/res/values-zh/strings.xml @@ -0,0 +1,6 @@ + + ⚠️ 先保存2FA! + ⚠️ 登录需要2FA和凭证! + 联系客服 + 从我们的在线客服获取帮助 + diff --git a/ios/edge.xcodeproj/project.pbxproj b/ios/edge.xcodeproj/project.pbxproj index e72c14c8d8b..25776fbc5ed 100644 --- a/ios/edge.xcodeproj/project.pbxproj +++ b/ios/edge.xcodeproj/project.pbxproj @@ -42,6 +42,7 @@ 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; BF115CD26A29F1C032E30289 /* Pods_edge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E261C56FB78E202F218C2DCA /* Pods_edge.framework */; }; E469AC702DC43791006A2530 /* AdServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E469AC6F2DC43791006A2530 /* AdServices.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + F0A1B2C32E8A100000000001 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F0A1B2C32E8A100000000003 /* InfoPlist.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -87,6 +88,18 @@ E261C56FB78E202F218C2DCA /* Pods_edge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_edge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E469AC6F2DC43791006A2530 /* AdServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdServices.framework; path = System/Library/Frameworks/AdServices.framework; sourceTree = SDKROOT; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + F0A1B2C32E8A100000000002 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = edge/en.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000010 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = edge/de.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000011 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = edge/es.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000012 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "edge/es-MX.lproj/InfoPlist.strings"; sourceTree = ""; }; + F0A1B2C32E8A100000000013 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = edge/fr.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000014 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = edge/it.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000015 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = edge/ja.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000016 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = edge/ko.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000017 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = edge/pt.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000018 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = edge/ru.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A100000000019 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = edge/vi.lproj/InfoPlist.strings; sourceTree = ""; }; + F0A1B2C32E8A10000000001A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "edge/zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -110,6 +123,7 @@ 3D5BD9892A4CF04C00590088 /* GoogleService-Info.plist */, 13B07FB51A68108700A75B9A /* Images.xcassets */, 13B07FB61A68108700A75B9A /* Info.plist */, + F0A1B2C32E8A100000000003 /* InfoPlist.strings */, 3DB299A52BCEF2A600D867B0 /* PrivacyInfo.xcprivacy */, 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, ); @@ -265,6 +279,17 @@ knownRegions = ( en, Base, + de, + es, + "es-MX", + fr, + it, + ja, + ko, + pt, + ru, + vi, + "zh-Hans", ); mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; @@ -308,6 +333,7 @@ 3D5BD9C12A4D27C400590088 /* SourceSansPro-LightItalic.ttf in Resources */, 3D5BD9C22A4D27C400590088 /* SourceSansPro-BoldItalic.ttf in Resources */, 3D5BD9CF2A4D27F300590088 /* custom.ttf in Resources */, + F0A1B2C32E8A100000000001 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -469,6 +495,28 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXVariantGroup section */ + F0A1B2C32E8A100000000003 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + F0A1B2C32E8A100000000002 /* en */, + F0A1B2C32E8A100000000010 /* de */, + F0A1B2C32E8A100000000011 /* es */, + F0A1B2C32E8A100000000012 /* es-MX */, + F0A1B2C32E8A100000000013 /* fr */, + F0A1B2C32E8A100000000014 /* it */, + F0A1B2C32E8A100000000015 /* ja */, + F0A1B2C32E8A100000000016 /* ko */, + F0A1B2C32E8A100000000017 /* pt */, + F0A1B2C32E8A100000000018 /* ru */, + F0A1B2C32E8A100000000019 /* vi */, + F0A1B2C32E8A10000000001A /* zh-Hans */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; diff --git a/ios/edge/de.lproj/InfoPlist.strings b/ios/edge/de.lproj/InfoPlist.strings new file mode 100644 index 00000000000..77f923dcdf8 --- /dev/null +++ b/ios/edge/de.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ 2FA sichern!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Login erfordert 2FA & Zugangsdaten!"; +"SHORTCUT_SUPPORT_TITLE" = "Support anfragen"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Hilfe von unseren Live-Support-Mitarbeitern"; diff --git a/ios/edge/es-MX.lproj/InfoPlist.strings b/ios/edge/es-MX.lproj/InfoPlist.strings new file mode 100644 index 00000000000..b58717c71c2 --- /dev/null +++ b/ios/edge/es-MX.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ ¡Guarda tu 2FA!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Inicio requiere 2FA y credenciales!"; +"SHORTCUT_SUPPORT_TITLE" = "Contactar ayuda"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Obtén ayuda de nuestros agentes en vivo"; diff --git a/ios/edge/es.lproj/InfoPlist.strings b/ios/edge/es.lproj/InfoPlist.strings new file mode 100644 index 00000000000..b58717c71c2 --- /dev/null +++ b/ios/edge/es.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ ¡Guarda tu 2FA!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Inicio requiere 2FA y credenciales!"; +"SHORTCUT_SUPPORT_TITLE" = "Contactar ayuda"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Obtén ayuda de nuestros agentes en vivo"; diff --git a/ios/edge/fr.lproj/InfoPlist.strings b/ios/edge/fr.lproj/InfoPlist.strings new file mode 100644 index 00000000000..bb9e792e0cc --- /dev/null +++ b/ios/edge/fr.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ Sauvez le 2FA !"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Connexion nécessite 2FA & identifiants !"; +"SHORTCUT_SUPPORT_TITLE" = "Nous contacter"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Aide de nos agents de support en direct"; diff --git a/ios/edge/it.lproj/InfoPlist.strings b/ios/edge/it.lproj/InfoPlist.strings new file mode 100644 index 00000000000..e58a5d309bf --- /dev/null +++ b/ios/edge/it.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ Salva il 2FA!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Il login richiede 2FA & credenziali!"; +"SHORTCUT_SUPPORT_TITLE" = "Contattaci"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Aiuto dai nostri agenti di supporto live"; diff --git a/ios/edge/ja.lproj/InfoPlist.strings b/ios/edge/ja.lproj/InfoPlist.strings new file mode 100644 index 00000000000..8e0d656aa5e --- /dev/null +++ b/ios/edge/ja.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ 2FAを先に保存!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "ログインには2FAと認証情報が必要です!"; +"SHORTCUT_SUPPORT_TITLE" = "サポートに連絡"; +"SHORTCUT_SUPPORT_SUBTITLE" = "ライブサポートスタッフに相談する"; diff --git a/ios/edge/ko.lproj/InfoPlist.strings b/ios/edge/ko.lproj/InfoPlist.strings new file mode 100644 index 00000000000..00e6a30e77a --- /dev/null +++ b/ios/edge/ko.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ 2FA 먼저 저장!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "로그인에 2FA 및 자격 증명이 필요합니다!"; +"SHORTCUT_SUPPORT_TITLE" = "지원 문의"; +"SHORTCUT_SUPPORT_SUBTITLE" = "실시간 지원 상담원에게 도움 받기"; diff --git a/ios/edge/pt.lproj/InfoPlist.strings b/ios/edge/pt.lproj/InfoPlist.strings new file mode 100644 index 00000000000..58a0a326729 --- /dev/null +++ b/ios/edge/pt.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ Salve o 2FA!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Login requer 2FA & credenciais!"; +"SHORTCUT_SUPPORT_TITLE" = "Contatar suporte"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Obtenha ajuda dos nossos agentes ao vivo"; diff --git a/ios/edge/ru.lproj/InfoPlist.strings b/ios/edge/ru.lproj/InfoPlist.strings new file mode 100644 index 00000000000..953c8e18e0a --- /dev/null +++ b/ios/edge/ru.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ Сохрани 2FA!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Для входа нужны 2FA & учётные данные!"; +"SHORTCUT_SUPPORT_TITLE" = "Поддержка"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Помощь от наших агентов поддержки"; diff --git a/ios/edge/vi.lproj/InfoPlist.strings b/ios/edge/vi.lproj/InfoPlist.strings new file mode 100644 index 00000000000..d9cab3c84e6 --- /dev/null +++ b/ios/edge/vi.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ Lưu 2FA trước!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "Đăng nhập cần 2FA & mật khẩu!"; +"SHORTCUT_SUPPORT_TITLE" = "Liên hệ hỗ trợ"; +"SHORTCUT_SUPPORT_SUBTITLE" = "Nhận hỗ trợ từ nhân viên trực tuyến"; diff --git a/ios/edge/zh-Hans.lproj/InfoPlist.strings b/ios/edge/zh-Hans.lproj/InfoPlist.strings new file mode 100644 index 00000000000..c2195396200 --- /dev/null +++ b/ios/edge/zh-Hans.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"SHORTCUT_UNINSTALL_TITLE" = "⚠️ 先保存2FA!"; +"SHORTCUT_UNINSTALL_SUBTITLE" = "登录需要2FA和凭证!"; +"SHORTCUT_SUPPORT_TITLE" = "联系客服"; +"SHORTCUT_SUPPORT_SUBTITLE" = "从我们的在线客服获取帮助";