new Tips for users

This commit is contained in:
True Zhuanjia
2026-08-01 21:09:02 +08:00
parent 516648cf34
commit f0043a763b
4 changed files with 336 additions and 187 deletions
+266 -179
View File
@@ -1063,35 +1063,6 @@
}
}
},
"=deselect" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deselect"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消选择"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消選取"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消選取"
}
}
}
},
"=del" : {
"extractionState" : "manual",
"localizations" : {
@@ -1121,6 +1092,35 @@
}
}
},
"=deselect" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Deselect"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消选择"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消選取"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "取消選取"
}
}
}
},
"=desktop" : {
"extractionState" : "manual",
"localizations" : {
@@ -1672,35 +1672,6 @@
}
}
},
"=labeledFolder" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Labeled Folder"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "带标签的控件夹"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "帶標籤的控制項夾"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "帶標籤的控制項夾"
}
}
}
},
"=functions" : {
"extractionState" : "manual",
"localizations" : {
@@ -1730,35 +1701,6 @@
}
}
},
"=groupLayers" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Group Layers"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "组合图层"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "群組圖層"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "群組圖層"
}
}
}
},
"=GamepadOverlayOff" : {
"extractionState" : "manual",
"localizations" : {
@@ -1846,6 +1788,35 @@
}
}
},
"=groupLayers" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Group Layers"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "组合图层"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "群組圖層"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "群組圖層"
}
}
}
},
"=gyro" : {
"extractionState" : "manual",
"localizations" : {
@@ -2136,6 +2107,35 @@
}
}
},
"=labeledFolder" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Labeled Folder"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "带标签的控件夹"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "帶標籤的控制項夾"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "帶標籤的控制項夾"
}
}
}
},
"=lang" : {
"extractionState" : "manual",
"localizations" : {
@@ -2194,6 +2194,35 @@
}
}
},
"=lasso" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lasso"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "套索"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "套索"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "套索"
}
}
}
},
"=left" : {
"extractionState" : "manual",
"localizations" : {
@@ -2281,35 +2310,6 @@
}
}
},
"=lasso" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Lasso"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "套索"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "套索"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "套索"
}
}
}
},
"=lock" : {
"extractionState" : "manual",
"localizations" : {
@@ -2513,35 +2513,6 @@
}
}
},
"=move" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Move"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "移动"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "移動"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "移動"
}
}
}
},
"=mouseM" : {
"extractionState" : "manual",
"localizations" : {
@@ -2658,6 +2629,35 @@
}
}
},
"=move" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Move"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "移动"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "移動"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "移動"
}
}
}
},
"=navigation" : {
"extractionState" : "manual",
"localizations" : {
@@ -2919,35 +2919,6 @@
}
}
},
"=pencilHover" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hover"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "手动悬浮"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "手動懸浮"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "手動懸浮"
}
}
}
},
"=pen" : {
"extractionState" : "manual",
"localizations" : {
@@ -2977,6 +2948,35 @@
}
}
},
"=pencilHover" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Hover"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "手动悬浮"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "手動懸浮"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "手動懸浮"
}
}
}
},
"=pgdn" : {
"extractionState" : "manual",
"localizations" : {
@@ -5309,6 +5309,35 @@
}
}
},
"awdlTipLink" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/hpxq8qrp141nd79t"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/kb1zrydulh8uweca"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/kb1zrydulh8uweca"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "https://voidlink.yuque.com/org-wiki-voidlink-znirha/fa3tgr/kb1zrydulh8uweca"
}
}
}
},
"Back" : {
"extractionState" : "manual",
"localizations" : {
@@ -9724,25 +9753,25 @@
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "\n- The on-screen widget layout (including the virtual gamepad, virtual buttons, etc.), as well as the options in the settings menu marked with a [gamepad icon] (such as motion control settings), are all saved in the game profile.\n\n- To switch game profile during streaming, swipe inward from the %@ edge of the screen by %@ of screen width, open [Switch Game Profile] in the toolbox menu"
"value" : "- Long press a game profile to reorder.\n\n- The on-screen widget layout (including the virtual gamepad, virtual buttons, etc.), as well as the options in the settings menu marked with a [gamepad icon] (such as motion control settings), are all saved in the game profile.\n\n- To switch game profile during streaming, swipe inward from the %@ edge of the screen by %@ of screen width, open [Switch Game Profile] in the toolbox menu"
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "\n- 屏显控件布局(包含虚拟手柄、虚拟按键等),以及设置菜单中标记 [手柄图标] 的选项(如体感控制参数),皆保存在游戏配置中。\n\n- 串流过程中, 由屏幕 %@ 边缘向内滑动 %@ 屏宽,即可在工具箱菜单中打开 [切换游戏配置]"
"value" : "- 长按可以重新排序游戏配置。\n\n- 屏显控件布局(包含虚拟手柄、虚拟按键等),以及设置菜单中标记 [手柄图标] 的选项(如体感控制参数),皆保存在游戏配置中。\n\n- 串流过程中, 由屏幕 %@ 边缘向内滑动 %@ 屏宽,即可在工具箱菜单中打开 [切换游戏配置]。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "\n- 螢幕控制項佈局(包含虛擬手把、虛擬按鍵等),以及設定選單中標記 [手把圖示] 的選項(如體感控制參數),皆保存在遊戲配置中。\n\n- 串流過程中,由螢幕 %@ 邊緣向內滑動 %@ 螢幕寬度,即可在工具箱選單中開啟[切換遊戲配置]"
"value" : "- 長按可以重新排序遊戲設定檔。\n\n- 螢幕控制項佈局(包含虛擬手把、虛擬按鍵等),以及設定選單中標記 [手把圖示] 的選項(如體感控制參數),皆保存在遊戲配置中。\n\n- 串流過程中,由螢幕 %@ 邊緣向內滑動 %@ 螢幕寬度,即可在工具箱選單中開啟[切換遊戲配置]"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "\n- 螢幕控制項佈局(包含虛擬手把、虛擬按鍵等),以及設定選單中標記 [手把圖示] 的選項(如體感控制參數),皆保存在遊戲配置中。\n\n- 串流過程中,由螢幕 %@ 邊緣向內滑動 %@ 螢幕寬度,即可在工具箱選單中開啟[切換遊戲配置]"
"value" : "- 長按可以重新排序遊戲設定檔。\n\n- 螢幕控制項佈局(包含虛擬手把、虛擬按鍵等),以及設定選單中標記 [手把圖示] 的選項(如體感控制參數),皆保存在遊戲配置中。\n\n- 串流過程中,由螢幕 %@ 邊緣向內滑動 %@ 螢幕寬度,即可在工具箱選單中開啟[切換遊戲配置]"
}
}
}
@@ -10220,6 +10249,35 @@
}
}
},
"highBitrateTip" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "You have just set a high streaming bitrate.\nHigh-bitrate streaming requires the following essential conditions to achieve the best streaming experience:\n\n1. Separate the 2.4GHz and 5GHz Wi-Fi networks to ensure that your device connects to 5GHz Wi-Fi.\n\n2. Connect the PC host to a wired LAN connection.\n\n3. If connecting the PC to wired Ethernet is not possible, you can still achieve a good streaming experience in non-gaming scenarios such as drawing and office work. However, please lower the bitrate to avoid exceeding the wireless duplex throughput capacity of your Wi-Fi AP/router.\n\n4. If you are unfamiliar with how Apple Wireless Direct Link may cause streaming stuttering, click \"Learn More\"."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "needs_review",
"value" : "您刚刚设置了较高的串流码率。高码率串流需要满足以下必要条件,以期获得最佳串流体验:\n\n1. 将 2.4GHz 与 5GHz 热点分开,以确保设备连接 5GHz Wi-Fi。 \n\n2. PC主机接入有线局域网。 \n\n3. 如果PC没有接入网线的条件, 您依然可以在绘画、办公等非游戏类场景下获得良好串流体验,但请降低码率避免超出 WiFi AP/路由器 的无线双工吞吐能力。 \n\n4. 如果您不了解 Apple Wireless Direct Link 可能造成的串流卡顿,请点击“了解更多”。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "您剛剛設定了較高的串流位元速率。\n高位元速率串流需要滿足以下必要條件,以期獲得最佳串流體驗:\n\n1. 將 2.4GHz 與 5GHz Wi-Fi 網路分開,以確保裝置連接至 5GHz Wi-Fi。\n\n2. 將 PC 主機接入有線區域網路。\n\n3. 如果 PC 無法接入網線,您仍然可以在繪畫、辦公等非遊戲類場景下獲得良好的串流體驗,但請降低位元率,避免超出 Wi-Fi AP/路由器的無線雙工吞吐能力。\n\n4. 如果您不了解 Apple Wireless Direct Link 可能造成串流卡頓的原因,請點擊「了解更多」。"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "您剛剛設定了較高的串流位元速率。\n高位元速率串流需要滿足以下必要條件,以期獲得最佳串流體驗:\n\n1. 將 2.4GHz 與 5GHz Wi-Fi 網路分開,以確保裝置連接至 5GHz Wi-Fi。\n\n2. 將 PC 主機接入有線區域網路。\n\n3. 如果 PC 無法接入網線,您仍然可以在繪畫、辦公等非遊戲類場景下獲得良好的串流體驗,但請降低位元率,避免超出 Wi-Fi AP/路由器的無線雙工吞吐能力。\n\n4. 如果您不了解 Apple Wireless Direct Link 可能造成串流卡頓的原因,請點擊「了解更多」。"
}
}
}
},
"Highlight alpha" : {
"extractionState" : "manual",
"localizations" : {
@@ -12573,6 +12631,35 @@
}
}
},
"newToolboxTip" : {
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Enter the Toolbox edit mode and long press a card to reorder it. Controller users can follow the on-screen instructions in the bottom-right corner."
}
},
"zh-Hans" : {
"stringUnit" : {
"state" : "translated",
"value" : "进入工具箱编辑模式后,长按即可重新排序卡片。手柄用户请直接按右下角提示操作。"
}
},
"zh-Hant" : {
"stringUnit" : {
"state" : "translated",
"value" : "進入工具箱編輯模式後,長按即可重新排序卡片。手把使用者請直接依照右下角提示操作。"
}
},
"zh-HK" : {
"stringUnit" : {
"state" : "translated",
"value" : "進入工具箱編輯模式後,長按即可重新排序卡片。手把使用者請直接依照右下角提示操作。"
}
}
}
},
"nextItem" : {
"extractionState" : "manual",
"localizations" : {
@@ -19701,4 +19788,4 @@
}
},
"version" : "1.1"
}
}
+50 -1
View File
@@ -467,8 +467,57 @@ import UIKit
)
}
}
@objc public static func isFirstSettingHighBitrate() -> Bool {
let key = "isFirstSettingHighBitrate123"
let defaults = UserDefaults.standard
let launchedBefore = defaults.bool(forKey: key)
if !launchedBefore {
defaults.set(true, forKey: key)
return true
}
return false
}
@objc public static func handleFirstSettingHighBitrate(in vc: UIViewController?, handler: @escaping () -> Void) {
if isFirstSettingHighBitrate() {
AlertControllerUtil.cancelButtonString = "Learn More".localized
AlertControllerUtil.showAlert(
in: vc,
title: "Tips".localized,
message: "highBitrateTip".localized,
withCancel: true,
buttonTitle: "Got it!".localized,
countdown: 6,
completion: {
handler()
}
)
}
}
@objc public static func isFirstOpeningNewToolbox() -> Bool {
let key = "isFirstOpeningNewToolbox6"
let defaults = UserDefaults.standard
let launchedBefore = defaults.bool(forKey: key)
if !launchedBefore {
defaults.set(true, forKey: key)
return true
}
return false
}
@objc public static func handleFirstOpeningNewToolbox(in vc: UIViewController?, handler: @escaping () -> Void) {
AlertControllerUtil.showAlert(
in: vc,
title: "Tips".localized,
message: "newToolboxTip".localized,
withCancel: false,
buttonTitle: "Got it!".localized,
countdown: 4,
completion: {
handler()
}
)
}
@objc public static func isFirstStreamingOnMac() -> Bool {
if !PublicUtils.isRunningOnMacAsiPadApp {return false}
@@ -129,7 +129,6 @@ static const int bitrateTable[] = {
48000,
49000,
50000,
50000,
51000,
52000,
53000,
@@ -4340,7 +4339,7 @@ BOOL isCustomResolution(int resolutionSelected) {
BOOL globeAsEscape = self.globeAsEscapeSwitch.isOn;
CGFloat streamingRadialMenuDelay = self.streamingRadialMenuDelaySlider.value;
NSInteger backgroundSessionTimer = self.backgroundSessionTimerSlider.value == self.backgroundSessionTimerSlider.maximumValue ? (uint32_t) INT16_MAX : (uint32_t)self.backgroundSessionTimerSlider.value;
[dataMan saveSettings:currentSettings
withBitrate:_bitrate
framerate:framerate
@@ -4419,6 +4418,17 @@ BOOL isCustomResolution(int resolutionSelected) {
globeAsEscape:globeAsEscape
streamingRadialMenuDelay:streamingRadialMenuDelay
backgroundSessionTimer:backgroundSessionTimer];
if(_bitrate >= 50000) {
dispatch_async(dispatch_get_main_queue(), ^{
[GenericUtils handleFirstSettingHighBitrateIn:self handler:^{
if(AlertControllerUtil.actionCancelled){
[PublicUtils openUrl:[LocalizationHelper localizedStringForKey:@"awdlTipLink"]];
}
}];
});
}
}
- (void)didReceiveMemoryWarning {
@@ -316,17 +316,20 @@ static __weak StreamFrameViewController *VLSharedStreamFrameViewController = nil
[self bringUpToolboxMenuWithoutWidgetLayoutTool:YES];
}
- (void)bringUpToolboxMenuWithoutWidgetLayoutTool:(BOOL)hideWidgetLayoutTool{
- (void)bringUpToolboxMenuWithoutWidgetLayoutTool:(BOOL)hideWidgetLayoutToolEntry{
[self prepareGameProfileSelector];
ToolboxViewController* oldToolboxVC = toolBoxViewController;
toolBoxViewController = [[ToolboxViewController alloc] init];
toolBoxViewController.specialEntryDelegate = self;
toolBoxViewController.specialEntries = [oldToolboxVC.specialEntries mutableCopy];
if(hideWidgetLayoutTool) [toolBoxViewController.specialEntries removeObject:@"widgetLayoutTool"];
if(hideWidgetLayoutToolEntry) [toolBoxViewController.specialEntries removeObject:@"widgetLayoutTool"];
toolBoxViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[self presentViewController:toolBoxViewController animated:YES completion:^{
//[self->toolBoxViewController setupConstraints];
}];
if([GenericUtils isFirstOpeningNewToolbox]){
[GenericUtils handleFirstOpeningNewToolboxIn:self handler:^{
[self presentViewController:self->toolBoxViewController animated:YES completion:^{}];
}];
}
else [self presentViewController:toolBoxViewController animated:YES completion:^{}];
}
- (void)configGestures{