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-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/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.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/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/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/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";
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" = "从我们的在线客服获取帮助";