From edcb9cf2757c6b7d5c0dcc9fb2eda24438b42723 Mon Sep 17 00:00:00 2001 From: TrueZhuangjia Date: Sat, 1 Feb 2025 19:29:45 +0800 Subject: [PATCH] add simplified statsOverlay, stage manager version --- Limelight/Base.lproj/iPad.storyboard | 7 +-- Limelight/Base.lproj/iPhone.storyboard | 7 +-- Limelight/Database/DataManager.h | 3 +- Limelight/Database/DataManager.m | 6 ++- Limelight/Database/TemporarySettings.h | 3 +- Limelight/Database/TemporarySettings.m | 3 +- Limelight/Limelight-Info.plist | 2 +- .../Moonlight v1.10.xcdatamodel/contents | 3 +- .../Moonlight v1.6.xcdatamodel/contents | 9 +--- .../Moonlight v1.7.xcdatamodel/contents | 9 +--- .../Moonlight v1.8.xcdatamodel/contents | 9 +--- .../Moonlight v1.9.xcdatamodel/contents | 9 +--- Limelight/Localization/Localizable.xcstrings | 37 ++++++++++---- Limelight/Stream/StreamManager.h | 2 +- Limelight/Stream/StreamManager.m | 11 +++- .../ViewControllers/SettingsViewController.m | 8 +-- .../StreamFrameViewController.m | 20 +++++--- Limelight/mul.lproj/iPad.xcstrings | 50 +++++++++++++++---- Limelight/mul.lproj/iPhone.xcstrings | 50 +++++++++++++++---- 19 files changed, 165 insertions(+), 83 deletions(-) diff --git a/Limelight/Base.lproj/iPad.storyboard b/Limelight/Base.lproj/iPad.storyboard index 43338ddc..783d4ac7 100644 --- a/Limelight/Base.lproj/iPad.storyboard +++ b/Limelight/Base.lproj/iPad.storyboard @@ -445,11 +445,12 @@ ICAgICAgICAgICAgICA - + - - + + + diff --git a/Limelight/Base.lproj/iPhone.storyboard b/Limelight/Base.lproj/iPhone.storyboard index 5b74ce52..e2e24e17 100644 --- a/Limelight/Base.lproj/iPhone.storyboard +++ b/Limelight/Base.lproj/iPhone.storyboard @@ -407,11 +407,12 @@ ICAgICAgICAgICAgIA - + - - + + + diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index b852b5cc..d250fa94 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -41,7 +41,8 @@ btMouseSupport:(BOOL)btMouseSupport // absoluteTouchMode:(BOOL)absoluteTouchMode touchMode:(NSInteger)touchMode - statsOverlay:(BOOL)statsOverlay + statsOverlayLevel:(NSInteger)statsOverlayLevel + statsOverlayEnabled:(BOOL)statsOverlayEnabled unlockDisplayOrientation:(BOOL)unlockDisplayOrientation resolutionSelected:(NSInteger)resolutionSelected externalDisplayMode:(NSInteger)externalDisplayMode diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index 8fa7f0e2..7e2975f9 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -80,7 +80,8 @@ btMouseSupport:(BOOL)btMouseSupport // absoluteTouchMode:(BOOL)absoluteTouchMode touchMode:(NSInteger)touchMode - statsOverlay:(BOOL)statsOverlay + statsOverlayLevel:(NSInteger)statsOverlayLevel + statsOverlayEnabled:(BOOL)statsOverlayEnabled unlockDisplayOrientation:(BOOL)unlockDisplayOrientation resolutionSelected:(NSInteger)resolutionSelected externalDisplayMode:(NSInteger)externalDisplayMode @@ -116,7 +117,8 @@ settingsToSave.btMouseSupport = btMouseSupport; // settingsToSave.absoluteTouchMode = absoluteTouchMode; settingsToSave.touchMode = [NSNumber numberWithInteger:(uint16_t)touchMode]; - settingsToSave.statsOverlay = statsOverlay; + settingsToSave.statsOverlayEnabled = statsOverlayEnabled; + settingsToSave.statsOverlayLevel = [NSNumber numberWithInteger:(uint16_t)statsOverlayLevel]; settingsToSave.unlockDisplayOrientation = unlockDisplayOrientation; settingsToSave.resolutionSelected = [NSNumber numberWithInteger:resolutionSelected]; settingsToSave.externalDisplayMode = [NSNumber numberWithInteger:externalDisplayMode]; diff --git a/Limelight/Database/TemporarySettings.h b/Limelight/Database/TemporarySettings.h index d0cc6da9..5dbe9e65 100644 --- a/Limelight/Database/TemporarySettings.h +++ b/Limelight/Database/TemporarySettings.h @@ -53,7 +53,8 @@ @property (nonatomic) BOOL btMouseSupport; // @property (nonatomic) BOOL absoluteTouchMode; @property (nonatomic, retain) NSNumber * touchMode; -@property (nonatomic) BOOL statsOverlay; +@property (nonatomic, retain) NSNumber * statsOverlayLevel; +@property (nonatomic) BOOL statsOverlayEnabled; @property (nonatomic) BOOL liftStreamViewForKeyboard; @property (nonatomic) BOOL showKeyboardToolbar; @property (nonatomic) BOOL unlockDisplayOrientation; diff --git a/Limelight/Database/TemporarySettings.m b/Limelight/Database/TemporarySettings.m index 87e010c5..dbc78d7c 100644 --- a/Limelight/Database/TemporarySettings.m +++ b/Limelight/Database/TemporarySettings.m @@ -87,7 +87,8 @@ self.btMouseSupport = settings.btMouseSupport; // self.absoluteTouchMode = settings.absoluteTouchMode; self.touchMode = settings.touchMode; - self.statsOverlay = settings.statsOverlay; + self.statsOverlayLevel = settings.statsOverlayLevel; + self.statsOverlayEnabled = settings.statsOverlayEnabled; self.keyboardToggleFingers = settings.keyboardToggleFingers; self.oscLayoutToolFingers = settings.oscLayoutToolFingers; self.slideToSettingsScreenEdge = settings.slideToSettingsScreenEdge; diff --git a/Limelight/Limelight-Info.plist b/Limelight/Limelight-Info.plist index f29ea4d0..541e31d5 100644 --- a/Limelight/Limelight-Info.plist +++ b/Limelight/Limelight-Info.plist @@ -74,7 +74,7 @@ armv7 UIRequiresFullScreen - + UIStatusBarHidden UISupportedInterfaceOrientations diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents index c6733dac..e716f972 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.10.xcdatamodel/contents @@ -47,7 +47,8 @@ - + + diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents index 39de9e94..aa610d21 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.6.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -31,14 +31,9 @@ - + - - - - - \ No newline at end of file diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.7.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.7.xcdatamodel/contents index 712c76a7..2f29198e 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.7.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.7.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -32,15 +32,10 @@ - + - - - - - \ No newline at end of file diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.8.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.8.xcdatamodel/contents index 19d6d78a..c1d0a1e2 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.8.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.8.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -32,16 +32,11 @@ - + - - - - - \ No newline at end of file diff --git a/Limelight/Limelight.xcdatamodeld/Moonlight v1.9.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Moonlight v1.9.xcdatamodel/contents index 30a96bc0..33e91c66 100644 --- a/Limelight/Limelight.xcdatamodeld/Moonlight v1.9.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Moonlight v1.9.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -32,16 +32,11 @@ - + - - - - - \ No newline at end of file diff --git a/Limelight/Localization/Localizable.xcstrings b/Limelight/Localization/Localizable.xcstrings index 74ae4514..14708128 100644 --- a/Limelight/Localization/Localizable.xcstrings +++ b/Limelight/Localization/Localizable.xcstrings @@ -870,6 +870,29 @@ } } }, + "FPS: %5.2f Network dropped frames: %.2f%% Network latency: %@" : { + "extractionState" : "manual", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "帧率: %5.2f 网络丢帧: %.2f%% 网络延迟: %@" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "帧率: %5.2f 网络丢帧: %.2f%% 网络延迟: %@" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "帧率: %5.2f 网络丢帧: %.2f%% 网络延迟: %@" + } + } + } + }, "Got it!" : { "extractionState" : "manual", "localizations" : { @@ -2660,31 +2683,25 @@ } } }, - "Video stream: %dx%d %.2f FPS (Codec: %@)\nFrames dropped by your network connection: %.2f%%\nAverage network latency: %@%@" : { + "Video stream: %dx%d %.2f FPS (Codec: %@)\nNetwork dropped frames: %.2f%%\nAverage network latency: %@%@" : { "extractionState" : "manual", "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Video stream: %dx%d %.2f FPS (Codec: %@)\nFrames dropped by your network connection: %.2f%%\nAverage network latency: %@%@" - } - }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "视频流: %dx%d %.2f FPS (编码格式: %@)\n网络造成的丢帧: %.2f%%\n平均网络延迟: %@%@" + "value" : "视频流: %dx%d %.2f FPS (编解码: %@)\n网络丢帧: %.2f%%\n平均网络延迟: %@%@" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "视频流: %dx%d %.2f FPS (编码格式: %@)\n网络造成的丢帧: %.2f%%\n平均网络延迟: %@%@" + "value" : "视频流: %dx%d %.2f FPS (编解码: %@)\n网络丢帧: %.2f%%\n平均网络延迟: %@%@" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "视频流: %dx%d %.2f FPS (编码格式: %@)\n网络造成的丢帧: %.2f%%\n平均网络延迟: %@%@" + "value" : "视频流: %dx%d %.2f FPS (编解码: %@)\n网络丢帧: %.2f%%\n平均网络延迟: %@%@" } } } diff --git a/Limelight/Stream/StreamManager.h b/Limelight/Stream/StreamManager.h index 277d6fe4..1cef0a45 100644 --- a/Limelight/Stream/StreamManager.h +++ b/Limelight/Stream/StreamManager.h @@ -15,6 +15,6 @@ - (void) stopStream; -- (NSString*) getStatsOverlayText; +- (NSString*) getStatsOverlayText: (uint16_t) overlayLevel; @end diff --git a/Limelight/Stream/StreamManager.m b/Limelight/Stream/StreamManager.m index a1c39a22..e4ce8c91 100644 --- a/Limelight/Stream/StreamManager.m +++ b/Limelight/Stream/StreamManager.m @@ -148,9 +148,11 @@ return TRUE; } -- (NSString*) getStatsOverlayText { +- (NSString*) getStatsOverlayText: (uint16_t) overlayLevel { video_stats_t stats; + // NSLog(@"overlayLevel: %d", overlayLevel); + if (!_connection) { return nil; } @@ -169,6 +171,7 @@ } NSString* hostProcessingString; + // overlayLevel 2: detailed if (stats.framesWithHostProcessingLatency != 0) { hostProcessingString = [LocalizationHelper localizedStringForKey:@"\nHost processing latency min/max/avg: %.1f/%.1f/%.1f ms", stats.minHostProcessingLatency / 10.f, @@ -180,7 +183,7 @@ } float interval = stats.endTime - stats.startTime; - return [LocalizationHelper localizedStringForKey:@"Video stream: %dx%d %.2f FPS (Codec: %@)\nFrames dropped by your network connection: %.2f%%\nAverage network latency: %@%@", + if(overlayLevel == 2) return [LocalizationHelper localizedStringForKey:@"Video stream: %dx%d %.2f FPS (Codec: %@)\nNetwork dropped frames: %.2f%%\nAverage network latency: %@%@", _config.width, _config.height, stats.totalFrames / interval, @@ -188,6 +191,10 @@ stats.networkDroppedFrames / interval, latencyString, hostProcessingString]; + else return [LocalizationHelper localizedStringForKey:@"FPS: %5.2f Network dropped frames: %.2f%% Network latency: %@", + stats.totalFrames / interval, + stats.networkDroppedFrames / interval, + latencyString]; } @end diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index 4a46a85a..a7b10cab 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -452,7 +452,7 @@ BOOL isCustomResolution(CGSize res) { [self.hdrSelector setSelectedSegmentIndex:currentSettings.enableHdr ? 1 : 0]; } - [self.statsOverlaySelector setSelectedSegmentIndex:currentSettings.statsOverlay ? 1 : 0]; + [self.statsOverlaySelector setSelectedSegmentIndex:currentSettings.statsOverlayLevel.intValue]; [self.btMouseSelector setSelectedSegmentIndex:currentSettings.btMouseSupport ? 1 : 0]; [self.optimizeSettingsSelector setSelectedSegmentIndex:currentSettings.optimizeGames ? 1 : 0]; [self.framePacingSelector setSelectedSegmentIndex:currentSettings.useFramePacing ? 1 : 0]; @@ -1063,7 +1063,8 @@ BOOL isCustomResolution(CGSize res) { BOOL useFramePacing = [self.framePacingSelector selectedSegmentIndex] == 1; // BOOL absoluteTouchMode = [self.touchModeSelector selectedSegmentIndex] == 1; NSInteger touchMode = [self.touchModeSelector selectedSegmentIndex]; - BOOL statsOverlay = [self.statsOverlaySelector selectedSegmentIndex] == 1; + NSInteger statsOverlayLevel = [self.statsOverlaySelector selectedSegmentIndex]; + BOOL statsOverlayEnabled = statsOverlayLevel != 0; BOOL enableHdr = [self.hdrSelector selectedSegmentIndex] == 1; BOOL unlockDisplayOrientation = [self.unlockDisplayOrientationSelector selectedSegmentIndex] == 1; NSInteger resolutionSelected = [self.resolutionSelector selectedSegmentIndex]; @@ -1097,7 +1098,8 @@ BOOL isCustomResolution(CGSize res) { btMouseSupport:btMouseSupport // absoluteTouchMode:absoluteTouchMode touchMode:touchMode - statsOverlay:statsOverlay + statsOverlayLevel:statsOverlayLevel + statsOverlayEnabled:statsOverlayEnabled unlockDisplayOrientation:unlockDisplayOrientation resolutionSelected:resolutionSelected externalDisplayMode:externalDisplayMode diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index d46e5714..f7277533 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -47,6 +47,7 @@ UITapGestureRecognizer *_menuDoubleTapGestureRecognizer; UITapGestureRecognizer *_playPauseTapGestureRecognizer; UITextView *_overlayView; + uint16_t overlayLevel; UILabel *_stageLabel; UILabel *_tipLabel; UIActivityIndicatorView *_spinner; @@ -160,6 +161,7 @@ } _settings = [[[DataManager alloc] init] getSettings]; //StreamFrameViewController retrieve the settings here. + overlayLevel = _settings.statsOverlayLevel.intValue; [self configOscLayoutTool]; [self configSwipeGestures]; [self configZoomGestureAndAddStreamView]; @@ -180,7 +182,7 @@ target:self selector:@selector(updateStatsOverlay) userInfo:nil - repeats:_settings.statsOverlay]; + repeats:_settings.statsOverlayEnabled]; NSLog(@"frameview gestures: %d", (uint32_t)[self.view.gestureRecognizers count]); NSLog(@"streamview gestures: %d", (uint32_t)[_streamView.gestureRecognizers count]); @@ -447,13 +449,13 @@ #endif - (void)updateStatsOverlay { - if(!_settings.statsOverlay){ + if(!_settings.statsOverlayEnabled){ [_overlayView removeFromSuperview]; return; // add this for realtime streamview reconfig } else [self.view addSubview:_overlayView]; // don't know why but this is necessary for reactivating overlay. - NSString* overlayText = [self->_streamMan getStatsOverlayText]; + NSString* overlayText = [self->_streamMan getStatsOverlayText:overlayLevel]; dispatch_async(dispatch_get_main_queue(), ^{ [self updateOverlayText:overlayText]; }); @@ -479,7 +481,13 @@ #if TARGET_OS_TV [_overlayView setFont:[UIFont systemFontOfSize:24]]; #else - [_overlayView setFont:[UIFont systemFontOfSize:12]]; + if (@available(iOS 13.0, *)) { + [_overlayView setFont:[UIFont monospacedSystemFontOfSize:12 weight:UIFontWeightRegular]]; + } else { + [_overlayView setFont:[UIFont systemFontOfSize:12]];// Fallback on earlier versions + } + //[_overlayView setFont:[UIFont fontWithName:@"Menlo" size:12]]; + #endif [_overlayView setAlpha:0.5]; [self.view addSubview:_overlayView]; @@ -675,7 +683,7 @@ [self->_controllerSupport connectionEstablished]; - if (self->_settings.statsOverlay) { + if (self->_settings.statsOverlayEnabled) { self->_statsUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateStatsOverlay) @@ -976,7 +984,7 @@ DataManager* dataMan = [[DataManager alloc] init]; Settings *currentSettings = [dataMan retrieveSettings]; - currentSettings.statsOverlay = !currentSettings.statsOverlay; + currentSettings.statsOverlayEnabled = !currentSettings.statsOverlayEnabled; [dataMan saveData]; [self reConfigStreamViewRealtime]; diff --git a/Limelight/mul.lproj/iPad.xcstrings b/Limelight/mul.lproj/iPad.xcstrings index fc16b19c..00cff39c 100644 --- a/Limelight/mul.lproj/iPad.xcstrings +++ b/Limelight/mul.lproj/iPad.xcstrings @@ -1718,61 +1718,91 @@ } }, "NLH-qN-qCo.segmentTitles[0]" : { - "comment" : "Class = \"UISegmentedControl\"; NLH-qN-qCo.segmentTitles[0] = \"No\"; ObjectID = \"NLH-qN-qCo\";", + "comment" : "Class = \"UISegmentedControl\"; NLH-qN-qCo.segmentTitles[0] = \"Off\"; ObjectID = \"NLH-qN-qCo\";", "extractionState" : "extracted_with_value", "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "No" + "value" : "Off" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "关闭" } }, "zh-Hant" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "关闭" } }, "zh-HK" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "关闭" } } } }, "NLH-qN-qCo.segmentTitles[1]" : { - "comment" : "Class = \"UISegmentedControl\"; NLH-qN-qCo.segmentTitles[1] = \"Yes\"; ObjectID = \"NLH-qN-qCo\";", + "comment" : "Class = \"UISegmentedControl\"; NLH-qN-qCo.segmentTitles[1] = \"Simplified\"; ObjectID = \"NLH-qN-qCo\";", "extractionState" : "extracted_with_value", "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "Yes" + "value" : "Simplified" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "精简" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "精简" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "精简" + } + } + } + }, + "NLH-qN-qCo.segmentTitles[2]" : { + "comment" : "Class = \"UISegmentedControl\"; NLH-qN-qCo.segmentTitles[2] = \"Detailed\"; ObjectID = \"NLH-qN-qCo\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Detailed" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整" } } } diff --git a/Limelight/mul.lproj/iPhone.xcstrings b/Limelight/mul.lproj/iPhone.xcstrings index 17c9efd7..28cdd79b 100644 --- a/Limelight/mul.lproj/iPhone.xcstrings +++ b/Limelight/mul.lproj/iPhone.xcstrings @@ -1940,61 +1940,91 @@ } }, "rdz-eg-2oR.segmentTitles[0]" : { - "comment" : "Class = \"UISegmentedControl\"; rdz-eg-2oR.segmentTitles[0] = \"No\"; ObjectID = \"rdz-eg-2oR\";", + "comment" : "Class = \"UISegmentedControl\"; rdz-eg-2oR.segmentTitles[0] = \"Off\"; ObjectID = \"rdz-eg-2oR\";", "extractionState" : "extracted_with_value", "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "No" + "value" : "Off" } }, "zh-Hans" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "关闭" } }, "zh-Hant" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "关闭" } }, "zh-HK" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "关闭" } } } }, "rdz-eg-2oR.segmentTitles[1]" : { - "comment" : "Class = \"UISegmentedControl\"; rdz-eg-2oR.segmentTitles[1] = \"Yes\"; ObjectID = \"rdz-eg-2oR\";", + "comment" : "Class = \"UISegmentedControl\"; rdz-eg-2oR.segmentTitles[1] = \"Simplified\"; ObjectID = \"rdz-eg-2oR\";", "extractionState" : "extracted_with_value", "localizations" : { "en" : { "stringUnit" : { "state" : "new", - "value" : "Yes" + "value" : "Simplified" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "精简" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "精简" } }, "zh-HK" : { "stringUnit" : { "state" : "translated", - "value" : "启用" + "value" : "精简" + } + } + } + }, + "rdz-eg-2oR.segmentTitles[2]" : { + "comment" : "Class = \"UISegmentedControl\"; rdz-eg-2oR.segmentTitles[2] = \"Detailed\"; ObjectID = \"rdz-eg-2oR\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Detailed" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整" + } + }, + "zh-HK" : { + "stringUnit" : { + "state" : "translated", + "value" : "完整" } } }