From 30aa9a6b8d65ec5bad3e328a2fd79c85f1e0c097 Mon Sep 17 00:00:00 2001 From: True Zhuanjia Date: Sun, 12 Apr 2026 20:03:06 +0800 Subject: [PATCH] - update UI string - minor improvements --- .../AbstractGamepadOverlayWidgetView.swift | 14 ++-- VoidLink/Input/OnScreenWidgetView.swift | 8 +- VoidLink/Localization/Localizable.xcstrings | 78 ++++++++++++++++--- .../StreamFrameViewController.m | 6 +- 4 files changed, 82 insertions(+), 24 deletions(-) diff --git a/VoidLink/Input/AbstractGamepadOverlayWidgetView.swift b/VoidLink/Input/AbstractGamepadOverlayWidgetView.swift index 92d337cc..c58f398f 100644 --- a/VoidLink/Input/AbstractGamepadOverlayWidgetView.swift +++ b/VoidLink/Input/AbstractGamepadOverlayWidgetView.swift @@ -358,18 +358,14 @@ final class AbstractGamepadOverlayView: UIView { guard GenericUtils.isFirstLaunchGamepadOverlayFeature() else { return } guard let presentingViewController = nearestViewController() else { return } - let alertController = UIAlertController( + AlertControllerUtil.showAlert( + in: presentingViewController, title: GenericUtils.gamepadOverlayFeatureTipTitle(), message: GenericUtils.gamepadOverlayFeatureTipMessage(), - preferredStyle: .alert - ) - alertController.addAction( - UIAlertAction( - title: GenericUtils.gamepadOverlayFeatureTipButtonTitle(), - style: .default + withCancel: false, + buttonTitle: SwiftLocalizationHelper.localizedString(forKey: "This tip won't be shown again"), + countdown: 6 ) - ) - presentingViewController.present(alertController, animated: true) } private func nearestViewController() -> UIViewController? { diff --git a/VoidLink/Input/OnScreenWidgetView.swift b/VoidLink/Input/OnScreenWidgetView.swift index 6c799182..afa44ee1 100644 --- a/VoidLink/Input/OnScreenWidgetView.swift +++ b/VoidLink/Input/OnScreenWidgetView.swift @@ -2642,9 +2642,13 @@ import ObjectiveC.runtime self.functionalButtonDelegate?.expandSettingsView() } case "DISCONNECT": - self.functionalButtonDelegate?.disconnectRemoteSession() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + self.functionalButtonDelegate?.disconnectRemoteSession() + } case "QUITAPP": - self.functionalButtonDelegate?.disconnectAndQuitApp() + DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { + self.functionalButtonDelegate?.disconnectAndQuitApp() + } case "TOOLBOX": self.functionalButtonDelegate?.bringUpToolboxMenu() case "PIP": diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings index 83548894..ed24cce5 100644 --- a/VoidLink/Localization/Localizable.xcstrings +++ b/VoidLink/Localization/Localizable.xcstrings @@ -692,6 +692,35 @@ } } }, + "=disconnect" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Disconnect" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "断开" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "斷開" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "斷開" + } + } + } + }, "=EnableTouch" : { "extractionState" : "manual", "localizations" : { @@ -1034,6 +1063,35 @@ } } }, + "=quitApp" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quit app" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出app" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出app" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "退出app" + } + } + } + }, "=reload" : { "extractionState" : "manual", "localizations" : { @@ -4791,25 +4849,25 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "\n1. By default, The widget menu button will be automatically docked to edge, then become almost transparent after staying idle for 10 seconds.\n\n2. From %@ edge, slide %d%% screen width to open settings menu\n\n3. Slide from top 40%% of screen edge to avoid sending touch events to PC side" + "value" : "\n1. By default, The widget menu button will be automatically docked to edge, then become almost transparent after staying idle for 10 seconds. \nThis timeout can be changed by entering “Edit” in the widget menu.\n\n2. From %@ edge, slide %d%% screen width to open settings menu\n\n3. From %@ edge, slide %d%% screen width to open toolbox menu\n\n4. Slide from top 40%% of screen edge to avoid sending touch events to PC side" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "\n1. 默认状态下,控件菜单按键在闲置10秒后将自动吸附屏幕右边缘,并进入高透明状态。\n\n2. 展开设置菜单: 从%@边缘滑动%d%%屏幕宽度\n\n3. 从40%%上半边缘滑动避免触控事件影响PC端" + "value" : "\n1. 默认状态下,控件菜单按键在闲置10秒后将自动吸附屏幕右边缘,并进入高透明状态。\n可展开控件菜单,进入“修改布局”修改该延迟。\n\n2. 展开设置菜单: 从%@边缘滑动%d%%屏幕宽度\n\n3. 展开工具箱菜单: 从%@边缘滑动%d%%屏幕宽度\n\n4. 从40%%上半边缘滑动避免触控事件影响PC端\n" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "\n1. 預設狀態下,控件選單按鍵在閒置 10 秒後將自動吸附螢幕右邊緣,並進入高透明狀態\n\n2. 展開設定選單:從%@邊緣滑動%d%%的螢幕寬度\n\n3. 從螢幕邊緣上方40%%處滑動以避免將觸控事件傳送到電腦端" + "value" : "\n1. 預設狀態下,控件選單按鍵在閒置10秒後將自動吸附至螢幕右邊緣,並進入高透明狀態。\n可展開控件選單,進入「修改佈局」修改該延遲。\n\n2. 展開設定選單: 從%@邊緣滑動%d%%螢幕寬度\n\n3. 展開工具箱選單: 從%@邊緣滑動%d%%螢幕寬度\n\n4. 從40%%上半邊緣滑動避免觸控事件影響PC端" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "\n1. 預設狀態下,控件選單按鍵在閒置 10 秒後將自動吸附螢幕右邊緣,並進入高透明狀態\n\n2. 展開設定選單:從%@邊緣滑動%d%%的螢幕寬度\n\n3. 從螢幕邊緣上方40%%處滑動以避免將觸控事件傳送到電腦端" + "value" : "\n1. 預設狀態下,控件選單按鍵在閒置10秒後將自動吸附至螢幕右邊緣,並進入高透明狀態。\n可展開控件選單,進入「修改佈局」修改該延遲。\n\n2. 展開設定選單: 從%@邊緣滑動%d%%螢幕寬度\n\n3. 展開工具箱選單: 從%@邊緣滑動%d%%螢幕寬度\n\n4. 從40%%上半邊緣滑動避免觸控事件影響PC端" } } } @@ -5292,25 +5350,25 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Hello! I'm the VoidLink gamepad live feedback overlay. You can use the \"🎮\" button in the widget menu to turn me on or off.\nI can be resized by double-tap or two-finger pinch, and moved by dragging directly." + "value" : "Hello! I'm the VoidLink gamepad live feedback overlay. \n\n1. You can use the \"🎮 overlay” button in the widget menu to turn me on or off.\n\n2. I can be resized by double-tap or two-finger pinch, and moved by dragging directly." } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "你好!我是 VoidLink 手柄实时反馈叠加层。控件菜单中的 \"🎮\" 按键可以打开或关闭我。\n我可以由双击或双指捏合改变大小、直接拖动改变位置。" + "value" : "你好!我是 VoidLink 手柄实时反馈叠加层。\n\n1. 控件菜单中的 \"🎮叠加” 按键可以打开或关闭我。\n\n2. 我可以由双击或双指捏合改变大小、直接拖动改变位置。" } }, "zh-Hant" : { "stringUnit" : { - "state" : "needs_review", - "value" : "你好!我是 VoidLink 手把即時反饋疊加層。控制選單中的「🎮」按鍵可以開啟或關閉我。\n我可以透過雙擊或雙指捏合改變大小,也可以直接拖曳改變位置。" + "state" : "translated", + "value" : "你好!我是 VoidLink 手把即時反饋疊加層。\n\n1. 控制選單中的「🎮疊加」按鍵可以開啟或關閉我。\n\n2. 我可以透過雙擊或雙指捏合改變大小,也可以直接拖曳改變位置。" } }, "zh-HK" : { "stringUnit" : { - "state" : "needs_review", - "value" : "你好!我是 VoidLink 手把即時反饋疊加層。控制選單中的「🎮」按鍵可以開啟或關閉我。\n我可以透過雙擊或雙指捏合改變大小,也可以直接拖曳改變位置。" + "state" : "translated", + "value" : "你好!我是 VoidLink 手把即時反饋疊加層。\n\n1. 控制選單中的「🎮疊加」按鍵可以開啟或關閉我。\n\n2. 我可以透過雙擊或雙指捏合改變大小,也可以直接拖曳改變位置。" } } } diff --git a/VoidLink/ViewControllers/StreamFrameViewController.m b/VoidLink/ViewControllers/StreamFrameViewController.m index a53b9933..680565ea 100644 --- a/VoidLink/ViewControllers/StreamFrameViewController.m +++ b/VoidLink/ViewControllers/StreamFrameViewController.m @@ -570,14 +570,14 @@ NSString* cmdToolEdgeSide = _settings.slideToSettingsScreenEdge.intValue == UIRectEdgeLeft ? [LocalizationHelper localizedStringForKey:@"right"] : [LocalizationHelper localizedStringForKey:@"left"]; uint8_t slideDist = (uint8_t)(_settings.slideToSettingsDistance.floatValue * 100); // 创建弹窗 - NSString* tipText = [LocalizationHelper localizedStringForKey:@"firstLaunchTip", settingsEdgeSide, slideDist]; - + NSString* tipText = [LocalizationHelper localizedStringForKey:@"firstLaunchTip", settingsEdgeSide, slideDist, cmdToolEdgeSide, slideDist]; + [AlertControllerUtil showAlertIn:self title:[LocalizationHelper localizedStringForKey:@"First Launch Tips"] message:tipText withCancel:NO buttonTitle:[LocalizationHelper localizedStringForKey:@"Got it!"] - countdown:11 + countdown:16 action:^{} completion:^{}];