From eac8d152407f8ca169264309c69e901a42ab0fc0 Mon Sep 17 00:00:00 2001 From: True Zhuanjia Date: Sat, 21 Mar 2026 19:45:21 +0800 Subject: [PATCH] feat: designate soft keyboard height manually --- VoidLink/Base.lproj/iPad.storyboard | 26 +++++- VoidLink/Base.lproj/iPhone.storyboard | 36 ++++++-- VoidLink/Database/DataManager.h | 1 + VoidLink/Database/DataManager.m | 2 + VoidLink/Database/TemporarySettings.h | 1 + VoidLink/Database/TemporarySettings.m | 1 + VoidLink/Input/StreamView.m | 27 ++++-- .../VoidLink v1.0.xcdatamodel/contents | 1 + VoidLink/Localization/Localizable.xcstrings | 52 ++++++++++++ VoidLink/Utility/GenericUtils.swift | 82 +++++++++++++++++++ .../ViewControllers/SettingsViewController.h | 6 +- .../ViewControllers/SettingsViewController.m | 64 +++++++++++++++ VoidLink/mul.lproj/iPad.xcstrings | 39 ++++++++- VoidLink/mul.lproj/iPhone.xcstrings | 30 +++++++ 14 files changed, 348 insertions(+), 20 deletions(-) diff --git a/VoidLink/Base.lproj/iPad.storyboard b/VoidLink/Base.lproj/iPad.storyboard index 0e877a85..ba59c702 100644 --- a/VoidLink/Base.lproj/iPad.storyboard +++ b/VoidLink/Base.lproj/iPad.storyboard @@ -1791,7 +1791,7 @@ - + - + + + + + + + + + + + + + + + + @@ -2280,6 +2300,8 @@ + + diff --git a/VoidLink/Base.lproj/iPhone.storyboard b/VoidLink/Base.lproj/iPhone.storyboard index 6b56c9cc..95055c18 100644 --- a/VoidLink/Base.lproj/iPhone.storyboard +++ b/VoidLink/Base.lproj/iPhone.storyboard @@ -1903,7 +1903,7 @@ - + - + - + + + + + + + + + + + + + + + + @@ -3062,6 +3082,8 @@ + + @@ -3112,16 +3134,16 @@ - + - + - + - + diff --git a/VoidLink/Database/DataManager.h b/VoidLink/Database/DataManager.h index ee88a655..e297370c 100644 --- a/VoidLink/Database/DataManager.h +++ b/VoidLink/Database/DataManager.h @@ -153,6 +153,7 @@ typedef NS_ENUM(NSInteger, PencilTickMode) { enableFrameTimebase:(BOOL)enableFrameTimebase asyncFrameDequeue:(BOOL)asyncFrameDequeue sdrPerformanceWorkaround:(BOOL)sdrPerformanceWorkaround + softKeyboardHeight:(CGFloat)softKeyboardHeight backgroundSessionTimer:(NSInteger)backgroundSessionTimer; - (NSArray*) getHosts; diff --git a/VoidLink/Database/DataManager.m b/VoidLink/Database/DataManager.m index be5570a2..02675d90 100644 --- a/VoidLink/Database/DataManager.m +++ b/VoidLink/Database/DataManager.m @@ -130,6 +130,7 @@ enableFrameTimebase:(BOOL)enableFrameTimebase asyncFrameDequeue:(BOOL)asyncFrameDequeue sdrPerformanceWorkaround:(BOOL)sdrPerformanceWorkaround + softKeyboardHeight:(CGFloat)softKeyboardHeight backgroundSessionTimer:(NSInteger)backgroundSessionTimer{ __block Settings* settingsToSave = settings; @@ -209,6 +210,7 @@ settingsToSave.mapControllerToMouse = mapControllerToMouse; settingsToSave.controllerMousePointerVelocity = [NSNumber numberWithFloat:controllerMousePointerVelocity]; settingsToSave.controllerMouseExpo = [NSNumber numberWithFloat:controllerMouseExpo]; + settingsToSave.softKeyboardHeight = softKeyboardHeight; settingsToSave.rememberFoldState = rememberFoldState; [self saveData]; }]; diff --git a/VoidLink/Database/TemporarySettings.h b/VoidLink/Database/TemporarySettings.h index 213b40da..4847c18c 100644 --- a/VoidLink/Database/TemporarySettings.h +++ b/VoidLink/Database/TemporarySettings.h @@ -74,6 +74,7 @@ @property (nonatomic) BOOL statsOverlayEnabled; @property (nonatomic) BOOL liftStreamViewForKeyboard; @property (nonatomic) BOOL showKeyboardToolbar; +@property (nonatomic) CGFloat softKeyboardHeight; @property (nonatomic) BOOL unlockDisplayOrientation; @property (nonatomic) BOOL enableGraphs; @property (nonatomic) BOOL enableFrameTimebase; diff --git a/VoidLink/Database/TemporarySettings.m b/VoidLink/Database/TemporarySettings.m index e2d2158e..1328d6c6 100644 --- a/VoidLink/Database/TemporarySettings.m +++ b/VoidLink/Database/TemporarySettings.m @@ -119,6 +119,7 @@ self.slideToSettingsDistance = settings.slideToSettingsDistance; self.liftStreamViewForKeyboard = settings.liftStreamViewForKeyboard; self.showKeyboardToolbar = settings.showKeyboardToolbar; + self.softKeyboardHeight = settings.softKeyboardHeight; self.touchMoveEventInterval = settings.touchMoveEventInterval; self.touchPointerVelocityFactor = settings.touchPointerVelocityFactor; self.mousePointerVelocityFactor = settings.mousePointerVelocityFactor; diff --git a/VoidLink/Input/StreamView.m b/VoidLink/Input/StreamView.m index 61e5a1f0..f97e8c45 100644 --- a/VoidLink/Input/StreamView.m +++ b/VoidLink/Input/StreamView.m @@ -69,6 +69,8 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; #if defined(__IPHONE_16_1) || defined(__TVOS_16_1) UIHoverGestureRecognizer *stylusHoverRecognizer; #endif + CGFloat designatedSoftKeyboardHeight; + bool keyboardHeightDesignatedForLandscape; CGFloat HeightViewLiftedTo; UILabel* keyboardToggleTip; @@ -116,6 +118,9 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; keyboardToggleTip.layer.cornerRadius = 10; keyboardToggleTip.clipsToBounds = true; + designatedSoftKeyboardHeight = settings.softKeyboardHeight * GenericUtils.screenHeight; + keyboardHeightDesignatedForLandscape = designatedSoftKeyboardHeight != 0; + // if(settings.touchMode.intValue == NativeTouchOnly) [self addGestureRecognizer:keyboardToggleRecognizer]; //keep legacy approach in pure native mode // else [self->streamFrameTopLayerView addGestureRecognizer:keyboardToggleRecognizer]; //add to the superview in other modes @@ -254,13 +259,13 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; NSDictionary *userInfo = notification.userInfo; // Get the keyboard size from the notification CGRect keyboardFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; - CGFloat screenHeight = CGRectGetHeight([[UIScreen mainScreen] bounds]); - CGFloat keyboardHeight = keyboardFrame.size.height; + CGFloat screenHeight = GenericUtils.screenHeight; + CGFloat totalKeyboardHeight = keyboardFrame.size.height; CGFloat toolbarHeight = settings.showKeyboardToolbar ? GenericUtils.legacyToolbarHeight : 0; - if(keyboardHeight < screenHeight * 0.33333333333 + toolbarHeight - || keyboardHeight > screenHeight*0.8 + toolbarHeight){ - keyboardHeight = screenHeight*0.5 + toolbarHeight; + if(totalKeyboardHeight < screenHeight * 0.33333333333 + toolbarHeight + || totalKeyboardHeight > screenHeight*0.8 + toolbarHeight){ + totalKeyboardHeight = screenHeight*0.5 + toolbarHeight; // [self toggleKeyboard]; /* if(keyboardToggleRecognizer.lowestTouchPointHeight < screenHeight/2){ @@ -272,7 +277,17 @@ static const double X1_MOUSE_SPEED_DIVISOR = 2.5; }*/ } - HeightViewLiftedTo = keyboardHeight - keyboardToggleRecognizer.lowestTouchPointHeight + CGRectGetHeight([[UIScreen mainScreen] bounds]) * 0.15; // lift the StreamView to the height of lowest touch point of multi-finger tap gesture, while reserving the view of 1/10 screen height for remote typing. + bool useDesignatedKeyboardHeight = false; + if (@available(iOS 13.0, *)) { + useDesignatedKeyboardHeight = GenericUtils.isLandscape && keyboardHeightDesignatedForLandscape; + totalKeyboardHeight = useDesignatedKeyboardHeight ? designatedSoftKeyboardHeight+toolbarHeight : totalKeyboardHeight; + } + else { + useDesignatedKeyboardHeight = keyboardHeightDesignatedForLandscape; + totalKeyboardHeight = useDesignatedKeyboardHeight ? designatedSoftKeyboardHeight+toolbarHeight : totalKeyboardHeight; + } + + HeightViewLiftedTo = totalKeyboardHeight - keyboardToggleRecognizer.lowestTouchPointHeight + GenericUtils.screenHeight * (useDesignatedKeyboardHeight ? 0.1 : 0.15); // lift the StreamView to the height of lowest touch point of multi-finger tap gesture, while reserving the view of 1/10 screen height for remote typing. if(HeightViewLiftedTo < 0) HeightViewLiftedTo = 0; // set HeightViewLiftedTo to 0 if it is high enough and not going to be covered by keyboard. CGRect liftedStreamFrame = self.frame; liftedStreamFrame.origin.y -= HeightViewLiftedTo; diff --git a/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents b/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents index c6ae1e3c..069cb3e9 100644 --- a/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents +++ b/VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents @@ -98,6 +98,7 @@ + diff --git a/VoidLink/Localization/Localizable.xcstrings b/VoidLink/Localization/Localizable.xcstrings index acfa5490..100671d3 100644 --- a/VoidLink/Localization/Localizable.xcstrings +++ b/VoidLink/Localization/Localizable.xcstrings @@ -3167,6 +3167,29 @@ } } }, + "Enter the relative height of the soft keyboard according to the scale (make sure app is in landscape fullscreen mode):" : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "按刻度输入软键盘的相对高度(请确保 App 运行在横向全屏状态):" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "按刻度輸入軟鍵盤的相對高度(請確保 App 運行於橫向全螢幕狀態):" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "按刻度輸入軟鍵盤的相對高度(請確保 App 運行於橫向全螢幕狀態):" + } + } + } + }, "Enter_PIN_Msg" : { "extractionState" : "manual", "localizations" : { @@ -7961,6 +7984,35 @@ } } }, + "softKeyboardHeightStackTip" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The soft keyboard height obtained automatically by the system may be unreliable (especially with third-party keyboards), which can prevent the streaming view from being properly raised. Specifying the keyboard height can resolve this issue." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "通过系统自动获取的软键盘高度可能不可靠(尤其是第三方输入法), 导致串流画面无法正确抬升,指定软键盘高度可解决此问题。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過系統自動取得的軟鍵盤高度可能不可靠(尤其是第三方輸入法),可能導致串流畫面無法正確抬升,指定軟鍵盤高度可解決此問題。" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "透過系統自動取得的軟鍵盤高度可能不可靠(尤其是第三方輸入法),可能導致串流畫面無法正確抬升,指定軟鍵盤高度可解決此問題。" + } + } + } + }, "Squeeze Shortcut" : { "extractionState" : "manual", "localizations" : { diff --git a/VoidLink/Utility/GenericUtils.swift b/VoidLink/Utility/GenericUtils.swift index 41ce9b1a..47bc71fe 100644 --- a/VoidLink/Utility/GenericUtils.swift +++ b/VoidLink/Utility/GenericUtils.swift @@ -105,4 +105,86 @@ import Foundation applyOffTintColor(sub) } } + + static var kScaleLayerKey: UInt8 = 0 + @objc static func setVerticalScale(view: UIView, show: Bool) { + // 移除旧的 + if let oldLayer = objc_getAssociatedObject(view, &kScaleLayerKey) as? CALayer { + oldLayer.removeFromSuperlayer() + objc_setAssociatedObject(view, &kScaleLayerKey, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + + guard show else { return } + + let container = CALayer() + container.frame = view.bounds + container.contentsScale = UIScreen.main.scale + + let step: CGFloat = 0.05 + let totalSteps = Int(1.0 / step) + + let path = UIBezierPath() + + for i in 0...totalSteps { + let value = CGFloat(i) * step + let y = view.bounds.height * (1.0 - value) + + let isMajor = i % 2 == 0 + let lineLength: CGFloat = isMajor ? 10 : 5 + + // 刻度线 + path.move(to: CGPoint(x: 0, y: y)) + path.addLine(to: CGPoint(x: lineLength, y: y)) + + // 数值 + if true { + let t = CATextLayer() + t.contentsScale = UIScreen.main.scale + t.font = UIFont.systemFont(ofSize: 13, weight: .medium) + t.fontSize = 13 + t.foregroundColor = UIColor.red.cgColor + t.backgroundColor = ThemeManager.menuBackgroundColor.cgColor + t.alignmentMode = .left + t.string = String(format: "%.2f", value) + t.frame = CGRect(x: lineLength + 2, y: y - 7, width: 30, height: 14) + + container.addSublayer(t) + } + } + + let shape = CAShapeLayer() + shape.path = path.cgPath + shape.strokeColor = UIColor.red.cgColor + shape.lineWidth = 1 + + container.addSublayer(shape) + + view.layer.addSublayer(container) + + objc_setAssociatedObject(view, &kScaleLayerKey, container, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + + @objc static func toCGFloat(_ str: String) -> CGFloat { + return CGFloat(Double(str) ?? 0) + } + + @available(iOS 13.0, *) + @objc static func isLandscape() -> Bool { + guard let windowScene = UIApplication.shared.connectedScenes + .compactMap({ $0 as? UIWindowScene }) + .first(where: { $0.activationState == .foregroundActive }) + else { + return false + } + + return windowScene.interfaceOrientation.isLandscape + } + + @objc static var screenWidth: CGFloat { + return UIScreen.main.bounds.width + } + + @objc static var screenHeight: CGFloat { + return UIScreen.main.bounds.height + } } diff --git a/VoidLink/ViewControllers/SettingsViewController.h b/VoidLink/ViewControllers/SettingsViewController.h index ba1fcec3..ef5e9179 100644 --- a/VoidLink/ViewControllers/SettingsViewController.h +++ b/VoidLink/ViewControllers/SettingsViewController.h @@ -16,7 +16,7 @@ #import "CustomEdgeSlideGestureRecognizer.h" #import "MenuSectionView.h" -@interface SettingsViewController : UIViewController +@interface SettingsViewController : UIViewController @property (strong, nonatomic) IBOutlet UINavigationBar *navigationBar; @property (strong, nonatomic) UIStackView *parentStack; @@ -216,6 +216,9 @@ @property (strong, nonatomic) IBOutlet UIStackView *passthroughGesturesStack; @property (strong, nonatomic) IBOutlet UISwitch *passthroughGesturesSwitch; +@property (weak, nonatomic) IBOutlet UIStackView *softKeyboardHeightStack; +@property (weak, nonatomic) IBOutlet UISwitch *softKeyboardHeightSwitch; + @property (strong, nonatomic) IBOutlet UIStackView *controllerToMouseStack; @property (strong, nonatomic) IBOutlet UISwitch *controllerToMouseSwitch; @@ -255,7 +258,6 @@ @property (weak, nonatomic) IBOutlet UIStackView *trackTouchPointStack; @property (weak, nonatomic) IBOutlet UISwitch *trackTouchPointSwitch; - @property (strong, nonatomic) IBOutlet UIStackView *testStack; diff --git a/VoidLink/ViewControllers/SettingsViewController.m b/VoidLink/ViewControllers/SettingsViewController.m index dc253838..94772cde 100644 --- a/VoidLink/ViewControllers/SettingsViewController.m +++ b/VoidLink/ViewControllers/SettingsViewController.m @@ -33,9 +33,11 @@ NSInteger _bitrate; NSInteger _lastSelectedResolutionIndex; + CGFloat softKeyboardHeight; bool settingsViewJustLoaded; bool settingsViewJustExpanded; bool settingsViewAlreadyAppeared; + bool autoPopKeyboard; uint16_t oswLayoutFingers; CustomEdgeSlideGestureRecognizer *slideToCloseSettingsViewRecognizer; NSMutableDictionary *_settingStackDict; @@ -568,6 +570,7 @@ BOOL isCustomResolution(int resolutionSelected) { settingsViewJustExpanded = false; settingsViewAlreadyAppeared = true; + autoPopKeyboard = true; } - (void)viewWillDisappear:(BOOL)animated{ @@ -959,6 +962,7 @@ BOOL isCustomResolution(int resolutionSelected) { [self addSetting:self.optimizeGamesStack ofId:@"optimizeGamesStack" withInfoTag:YES withDynamicLabel:NO to:otherSection]; [self addSetting:self.multiControllerStack ofId:@"multiControllerStack" withInfoTag:NO withDynamicLabel:NO to:otherSection]; [self addSetting:self.softKeyboardToolbarStack ofId:@"softKeyboardToolbarStack" withInfoTag:NO withDynamicLabel:NO to:otherSection]; + [self addSetting:self.softKeyboardHeightStack ofId:@"softKeyboardHeightStack" withInfoTag:YES withDynamicLabel:NO to:otherSection]; [self addSetting:self.rememberFoldStateStack ofId:@"rememberFoldStateStack" withInfoTag:NO withDynamicLabel:NO to:otherSection]; [otherSection addToParentStack:_parentStack]; @@ -1527,6 +1531,10 @@ BOOL isCustomResolution(int resolutionSelected) { showOnlineDocAction = true; onlineDocLink = [LocalizationHelper localizedStringForKey:@"PencilProPackURL"]; } + if([sender.superview.accessibilityIdentifier isEqualToString: @"softKeyboardHeightStack"]){ + tipText = [LocalizationHelper localizedStringForKey:@"softKeyboardHeightStackTip"]; + showOnlineDocAction = false; + } UIAlertController *tipsAlertController = [UIAlertController alertControllerWithTitle: [LocalizationHelper localizedStringForKey:@"Tips"] message:tipText preferredStyle:UIAlertControllerStyleAlert]; @@ -2070,6 +2078,11 @@ BOOL isCustomResolution(int resolutionSelected) { // showkeyboard toolbar setting [self.softKeyboardToolbarSwitch setOn:self->tempSettings.showKeyboardToolbar];// Load old setting + + self->softKeyboardHeight = self->tempSettings.softKeyboardHeight; + [self.softKeyboardHeightSwitch setOn:self->softKeyboardHeight!=0];// Load old setting + [self.softKeyboardHeightSwitch addTarget:self action:@selector(softKeyboardHeightSwitchFlipped:) forControlEvents:UIControlEventValueChanged]; + // reverse mouse wheel direction setting [self.reverseMouseWheelDirectionSelector setSelectedSegmentIndex:self->tempSettings.reverseMouseWheelDirection ? 1 : 0];// Load old setting @@ -2982,6 +2995,55 @@ BOOL isCustomResolution(int resolutionSelected) { else [self pinchGestureSwitchFlipped:_pinchGestureSwitch]; } +- (void)softKeyboardHeightSwitchFlipped:(UISwitch* )sender{ + if(sender.isOn && !settingsViewJustLoaded){ + autoPopKeyboard = false; + [GenericUtils setVerticalScaleWithView:self.view show:true]; + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[LocalizationHelper localizedStringForKey:@""] + message:[LocalizationHelper localizedStringForKey:@"Enter the relative height of the soft keyboard according to the scale (make sure app is in landscape fullscreen mode):"] + preferredStyle:UIAlertControllerStyleAlert]; + + [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { + textField.placeholder = [LocalizationHelper localizedStringForKey:@"e.g. 0.45"]; + textField.keyboardType = UIKeyboardTypeASCIICapable; + textField.autocorrectionType = UITextAutocorrectionTypeNo; + textField.spellCheckingType = UITextSpellCheckingTypeNo; + textField.delegate = self; + textField.text = self->softKeyboardHeight == 0 ? nil : [NSString stringWithFormat:@"%.2f", self->softKeyboardHeight]; + }]; + + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:[LocalizationHelper localizedStringForKey:@"Cancel"] + style:UIAlertActionStyleCancel + handler:^(UIAlertAction *action) { + [GenericUtils setVerticalScaleWithView:self.view show:false]; + [sender setOn:self->softKeyboardHeight!=0]; + self->autoPopKeyboard = true; + }]; + + UIAlertAction *okAction = [UIAlertAction actionWithTitle:[LocalizationHelper localizedStringForKey:@"OK"] + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action) { + self->softKeyboardHeight = [GenericUtils toCGFloat:alertController.textFields[0].text]; + [GenericUtils setVerticalScaleWithView:self.view show:false]; + [sender setOn:self->softKeyboardHeight!=0]; + self->autoPopKeyboard = true; + }]; + [alertController addAction:cancelAction]; + [alertController addAction:okAction]; + [self presentViewController:alertController animated:YES completion:nil]; + } +} + +// UITextFieldDelegate +- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { + if (autoPopKeyboard) { + return YES; + } else { + autoPopKeyboard = YES; + return NO; + } +} + - (void)pinchGestureSwitchFlipped:(UISwitch* )sender{ [self setHidden:!sender.isOn forStack:_pinchSensitivityStack]; [self setHidden:!sender.isOn forStack:_ctrlDownForPinchStack]; @@ -3690,6 +3752,7 @@ BOOL isCustomResolution(int resolutionSelected) { NSInteger controllerGyroSwitchMode = self.controllerGyroSwitchButtonSetter.selectedSegmentIndex; BOOL enableFrameTimebase = false; BOOL asyncFrameDequeue = self.asyncFrameDequeueSwitch.isOn; + CGFloat softKeyboardHeight = self.softKeyboardHeightSwitch.isOn ? self->softKeyboardHeight : 0; NSInteger backgroundSessionTimer = self.backgroundSessionTimerSlider.value == self.backgroundSessionTimerSlider.maximumValue ? (uint32_t) INT16_MAX : (uint32_t)self.backgroundSessionTimerSlider.value; [dataMan saveSettings:currentSettings @@ -3766,6 +3829,7 @@ BOOL isCustomResolution(int resolutionSelected) { enableFrameTimebase:enableFrameTimebase asyncFrameDequeue:asyncFrameDequeue sdrPerformanceWorkaround:sdrPerformanceWorkaround + softKeyboardHeight:softKeyboardHeight backgroundSessionTimer:backgroundSessionTimer]; } diff --git a/VoidLink/mul.lproj/iPad.xcstrings b/VoidLink/mul.lproj/iPad.xcstrings index 2c46ce61..0d3d34ad 100644 --- a/VoidLink/mul.lproj/iPad.xcstrings +++ b/VoidLink/mul.lproj/iPad.xcstrings @@ -1657,6 +1657,36 @@ } } }, + "Bue-gF-hRI.text" : { + "comment" : "Class = \"UILabel\"; text = \"Designate Soft Keyboard Height\"; ObjectID = \"Bue-gF-hRI\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Designate Soft Keyboard Height" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "指定软键盘高度" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "指定軟鍵盤高度" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "指定軟鍵盤高度" + } + } + } + }, "bVv-CW-kN8.segmentTitles[0]" : { "comment" : "Class = \"UISegmentedControl\"; bVv-CW-kN8.segmentTitles[0] = \"Regular\"; ObjectID = \"bVv-CW-kN8\";", "extractionState" : "extracted_with_value", @@ -2297,7 +2327,8 @@ "value" : "關閉" } } - } + }, + "shouldTranslate" : false }, "dpd-Bw-aHE.segmentTitles[1]" : { "comment" : "Class = \"UISegmentedControl\"; dpd-Bw-aHE.segmentTitles[1] = \"Yes\"; ObjectID = \"dpd-Bw-aHE\";", @@ -2327,7 +2358,8 @@ "value" : "啟用" } } - } + }, + "shouldTranslate" : false }, "dqh-nl-heL.title" : { "comment" : "Class = \"UINavigationItem\"; title = \"Title\"; ObjectID = \"dqh-nl-heL\";", @@ -4768,7 +4800,8 @@ "value" : "螢幕小工具佈局" } } - } + }, + "shouldTranslate" : false }, "q78-aY-mIe.text" : { "comment" : "Class = \"UILabel\"; text = \"Disable Hovering\"; ObjectID = \"q78-aY-mIe\";", diff --git a/VoidLink/mul.lproj/iPhone.xcstrings b/VoidLink/mul.lproj/iPhone.xcstrings index cb636f21..8c90eed4 100644 --- a/VoidLink/mul.lproj/iPhone.xcstrings +++ b/VoidLink/mul.lproj/iPhone.xcstrings @@ -3091,6 +3091,36 @@ } } }, + "Mhe-jU-8hh.text" : { + "comment" : "Class = \"UILabel\"; text = \"Designate Soft Keyboard Height\"; ObjectID = \"Mhe-jU-8hh\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Designate Soft Keyboard Height" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "指定软键盘高度" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "指定軟鍵盤高度" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "指定軟鍵盤高度" + } + } + } + }, "MMc-Yp-e6i.text" : { "comment" : "Class = \"UILabel\"; text = \"Async Native Touch\"; ObjectID = \"MMc-Yp-e6i\";", "extractionState" : "extracted_with_value",