From ae0f1993e37e07c79e40c67163db9df3dfa3e984 Mon Sep 17 00:00:00 2001 From: edwinQQQ Date: Mon, 22 Sep 2025 15:22:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=85=AC=E5=85=B1=E6=88=BF?= =?UTF-8?q?=E9=97=B4=E7=AE=A1=E7=90=86=E5=99=A8=E4=B8=AD=E7=9A=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=9B=B4=E6=96=B0=E9=80=9A=E7=9F=A5=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=20RtcManager=20=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E6=9B=B4=E6=96=B0=E6=96=B9=E6=B3=95=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8A=A8=E6=80=81=E4=BB=A3=E7=90=86=E5=88=87=E6=8D=A2?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=20StageViewManager=20=E7=9A=84?= =?UTF-8?q?=E6=B8=85=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?=E5=9C=A8=E6=B8=85=E7=90=86=E8=BF=87=E7=A8=8B=E4=B8=AD=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E5=A4=84=E7=90=86=E8=A7=86=E5=9B=BE=E5=B1=82=E7=BA=A7?= =?UTF-8?q?=E5=92=8C=E5=86=85=E5=AD=98=E7=AE=A1=E7=90=86=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E6=9B=B4=E6=96=B0=E6=9C=AC=E5=9C=B0=E5=8C=96=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E4=BB=A5=E6=8F=90=E5=8D=87=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BD=93=E9=AA=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- YuMi/Config/ClientConfig.m | 3 - YuMi/Modules/YMRTC/RtcManager.h | 4 + YuMi/Modules/YMRTC/RtcManager.m | 4 + .../YMRoom/Manager/PublicRoomManager.m | 87 +------ .../View/MoreView/View/XPTurboModeTipsView.m | 2 +- YuMi/Modules/YMRoom/View/StageViewManager.m | 30 ++- .../YMRoom/View/XPRoomViewController.m | 243 +++++++++++++----- YuMi/ru.lproj/Localizable.strings | 104 ++++---- 8 files changed, 269 insertions(+), 208 deletions(-) diff --git a/YuMi/Config/ClientConfig.m b/YuMi/Config/ClientConfig.m index 6706e4b8..9ead1747 100644 --- a/YuMi/Config/ClientConfig.m +++ b/YuMi/Config/ClientConfig.m @@ -106,9 +106,6 @@ self.configInfo = model; - // 通知公共房间管理器配置已更新 - [[PublicRoomManager sharedManager] updateConfig]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadAfterLoadConfig" object:nil]; [self requestFaceTabNewList]; diff --git a/YuMi/Modules/YMRTC/RtcManager.h b/YuMi/Modules/YMRTC/RtcManager.h index 1d7970ed..05bc3d26 100644 --- a/YuMi/Modules/YMRTC/RtcManager.h +++ b/YuMi/Modules/YMRTC/RtcManager.h @@ -139,6 +139,10 @@ typedef NS_ENUM(NSInteger, BackMusicPlayState) { - (NSInteger)loadUserSound; @property (nonatomic,assign) BOOL broadcast; + +// MARK: 指向实际使用的 stageView +- (void)updateDelegate:(id _Nullable)delegate; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRTC/RtcManager.m b/YuMi/Modules/YMRTC/RtcManager.m index 0cc10a3c..ee86131d 100644 --- a/YuMi/Modules/YMRTC/RtcManager.m +++ b/YuMi/Modules/YMRTC/RtcManager.m @@ -194,6 +194,10 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey; _engineDelegate = delegate; } +- (void)updateDelegate:(id _Nullable)delegate { + _engineDelegate = delegate; +} + - (id)engine { if (!_engine) { _engine = [[TRTCRtcImpl alloc] initWithDelegate:self]; diff --git a/YuMi/Modules/YMRoom/Manager/PublicRoomManager.m b/YuMi/Modules/YMRoom/Manager/PublicRoomManager.m index eb026fb8..a7c44b9b 100644 --- a/YuMi/Modules/YMRoom/Manager/PublicRoomManager.m +++ b/YuMi/Modules/YMRoom/Manager/PublicRoomManager.m @@ -125,19 +125,11 @@ #pragma mark - 私有方法 - (void)tryEnterPublicRoom { - NSLog(@"PublicRoomManager: 开始尝试进入公共房间"); - NSLog(@"PublicRoomManager: 当前状态 - isInitialized: %@, isInPublicRoom: %@, currentPublicRoomId: %@", - self.isInitialized ? @"YES" : @"NO", - self.isInPublicRoom ? @"YES" : @"NO", - self.currentPublicRoomId ?: @"nil"); - if (!self.isInitialized) { - NSLog(@"PublicRoomManager: 管理器未初始化,无法进入公共房间"); return; } if (!self.userInfo) { - NSLog(@"PublicRoomManager: 用户信息缺失,无法进入公共房间"); return; } @@ -146,29 +138,19 @@ ClientDataModel *configInfo = [ClientConfig shareConfig].configInfo; NSDictionary *publicChatRoomIdMap = configInfo.publicChatRoomIdMap; - NSLog(@"PublicRoomManager: 配置信息 - partitionId: %@, configInfo: %@, publicChatRoomIdMap: %@", - partitionId ?: @"nil", - configInfo ? @"存在" : @"nil", - publicChatRoomIdMap ? @"存在" : @"nil"); - if (!publicChatRoomIdMap) { - NSLog(@"PublicRoomManager: 公共房间配置缺失"); return; } if (!partitionId) { - NSLog(@"PublicRoomManager: 分区ID缺失"); return; } NSNumber *roomId = publicChatRoomIdMap[partitionId]; if (!roomId) { - NSLog(@"PublicRoomManager: 未找到分区 %@ 对应的公共房间ID", partitionId); return; } - - NSLog(@"PublicRoomManager: 尝试进入公共房间,分区ID: %@, 房间ID: %@", partitionId, roomId); - + // 进入公共房间 [self enterPublicRoomWithRoomId:roomId.stringValue completion:^(NSError * _Nullable error) { if (error) { @@ -227,12 +209,10 @@ @kStrongify(self); dispatch_async(dispatch_get_main_queue(), ^{ if (error) { - NSLog(@"PublicRoomManager: 进入公共房间失败: %@", error); if (completion) { completion(error); } } else { - NSLog(@"PublicRoomManager: 进入公共房间成功,房间ID: %@", roomId); self.isInPublicRoom = YES; self.currentPublicRoomId = roomId; if (completion) { @@ -253,20 +233,15 @@ if (completion) { completion(error); } - return; - } - - if (self.isInPublicRoom) { - NSLog(@"PublicRoomManager: 已在公共房间中"); + } else if (self.isInPublicRoom) { if (completion) { completion(nil); } - return; + } else { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self tryEnterPublicRoom]; + }); } - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self tryEnterPublicRoom]; - }); } - (void)exitPublicRoomWithCompletion:(void(^)(NSError * _Nullable error))completion { @@ -285,9 +260,9 @@ @kStrongify(self); dispatch_async(dispatch_get_main_queue(), ^{ if (error) { - NSLog(@"PublicRoomManager: 退出公共房间失败: %@", error); +// NSLog(@"PublicRoomManager: 退出公共房间失败: %@", error); } else { - NSLog(@"PublicRoomManager: 退出公共房间成功"); +// NSLog(@"PublicRoomManager: 退出公共房间成功"); self.isInPublicRoom = NO; self.currentPublicRoomId = nil; } @@ -301,69 +276,23 @@ #pragma mark - 用户信息更新处理 - (void)updateUserInfo:(UserInfoModel *)userInfo { - NSLog(@"PublicRoomManager: 开始更新用户信息"); - NSLog(@"PublicRoomManager: 用户信息 - uid: %ld, partitionId: %@", - userInfo.uid, userInfo.partitionId ?: @"nil"); - if (!userInfo) { - NSLog(@"PublicRoomManager: 用户信息为空,更新失败"); return; } if (!userInfo.partitionId) { - NSLog(@"PublicRoomManager: 用户分区ID缺失,更新失败"); return; } // 检查用户是否切换 if (self.currentUserId && ![self.currentUserId isEqualToString:[NSString stringWithFormat:@"%ld", userInfo.uid]]) { - NSLog(@"PublicRoomManager: 检测到用户切换,重置管理器"); [self reset]; } self.userInfo = userInfo; self.currentUserId = [NSString stringWithFormat:@"%ld", userInfo.uid]; - if (![self checkConfigPublicRoomID:@(userInfo.uid).stringValue]) { - return; - } - - NSLog(@"PublicRoomManager: 用户信息更新完成 - currentUserId: %@, isInitialized: %@, isInPublicRoom: %@", - self.currentUserId, - self.isInitialized ? @"YES" : @"NO", - self.isInPublicRoom ? @"YES" : @"NO"); - - // 注释掉自动进入房间逻辑,改为统一入口控制 - // 如果已初始化但未在公共房间,尝试进入 - // if (self.isInitialized && !self.isInPublicRoom) { - // NSLog(@"PublicRoomManager: 条件满足,开始尝试进入公共房间"); - // [self tryEnterPublicRoom]; - // } else { - // NSLog(@"PublicRoomManager: 条件不满足,跳过进入公共房间 - isInitialized: %@, isInPublicRoom: %@", - // self.isInitialized ? @"YES" : @"NO", - // self.isInPublicRoom ? @"YES" : @"NO"); - // } } -#pragma mark - 配置更新处理 - -- (void)updateConfig { - if (!self.isInitialized) { - NSLog(@"PublicRoomManager: 未初始化,跳过配置更新"); - return; - } - - ClientDataModel *configInfo = [ClientConfig shareConfig].configInfo; - if (!configInfo || !configInfo.publicChatRoomIdMap) { - NSLog(@"PublicRoomManager: 配置信息不完整,跳过配置更新"); - return; - } - - // 注释掉自动进入房间逻辑,改为统一入口控制 - // 如果未在公共房间,尝试进入 - // if (!self.isInPublicRoom) { - // [self tryEnterPublicRoom]; - // } -} #pragma mark - NIMChatRoomManagerDelegate #define ConnectionStateStyleString(enum) \ diff --git a/YuMi/Modules/YMRoom/View/MoreView/View/XPTurboModeTipsView.m b/YuMi/Modules/YMRoom/View/MoreView/View/XPTurboModeTipsView.m index 7e4aa3b8..27a94c6f 100644 --- a/YuMi/Modules/YMRoom/View/MoreView/View/XPTurboModeTipsView.m +++ b/YuMi/Modules/YMRoom/View/MoreView/View/XPTurboModeTipsView.m @@ -160,7 +160,7 @@ - (void)setupUnderstandButton { self.understandButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [self.understandButton setTitle:@"I understand" forState:UIControlStateNormal]; + [self.understandButton setTitle:YMLocalizedString(@"PKIDLoginViewController4") forState:UIControlStateNormal]; [self.understandButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; self.understandButton.titleLabel.font = [UIFont boldSystemFontOfSize:18.0]; self.understandButton.backgroundColor = [UIColor colorWithRed:1.0 green:0.5 blue:0.0 alpha:1.0]; // 橙色 diff --git a/YuMi/Modules/YMRoom/View/StageViewManager.m b/YuMi/Modules/YMRoom/View/StageViewManager.m index 293414cf..bf650a16 100644 --- a/YuMi/Modules/YMRoom/View/StageViewManager.m +++ b/YuMi/Modules/YMRoom/View/StageViewManager.m @@ -75,10 +75,31 @@ - (void)cleanup { if (self.currentStageView) { - [self.currentStageView removeFromSuperview]; + NSLog(@"🧹 StageViewManager: 开始清理 stageView | Type: %ld | Class: %@", + (long)self.currentRoomType, NSStringFromClass([self.currentStageView class])); + + // 1. 通知 stageView 进行清理操作 + if ([self.currentStageView respondsToSelector:@selector(exitNIMRoom)]) { + [self.currentStageView exitNIMRoom]; + NSLog(@"🧹 StageViewManager: 已调用 stageView.exitNIMRoom"); + } + + // 2. 移除所有子视图引用 + if (self.currentStageView.superview) { + [self.currentStageView removeFromSuperview]; + NSLog(@"🧹 StageViewManager: stageView 已从 superview 移除"); + } + + // 3. 清空所有子视图 + [self.currentStageView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + + // 4. 释放 stageView 实例 self.currentStageView = nil; - NSLog(@"🧹 StageViewManager: 清理 stageView"); + NSLog(@"🧹 StageViewManager: stageView 清理完成"); } + + // 5. 清空容器引用 + self.container = nil; } - (BOOL)shouldChangeStageViewType:(RoomType)newType { @@ -127,7 +148,10 @@ self.currentStageView = [[TenMicStageView alloc] initWithDelegate:delegate]; break; } - case RoomType_Room: // RoomType_Game + case RoomType_Room: { // RoomType_Game + self.currentStageView = [[SocialStageView alloc] initWithDelegate:delegate]; + break; + } default: { self.currentStageView = [[SocialStageView alloc] initWithDelegate:delegate]; break; diff --git a/YuMi/Modules/YMRoom/View/XPRoomViewController.m b/YuMi/Modules/YMRoom/View/XPRoomViewController.m index 21d0766a..92c5168f 100644 --- a/YuMi/Modules/YMRoom/View/XPRoomViewController.m +++ b/YuMi/Modules/YMRoom/View/XPRoomViewController.m @@ -138,10 +138,10 @@ XPCandyTreeInsufficientBalanceViewDelegate> ///坑位信息 @property (nonatomic,strong) StageView *stageView; @property (nonatomic,strong) StageViewManager *stageViewManager; -@property (nonatomic,strong) TenMicStageView *tenMicStageView; -@property (nonatomic,strong) FifteenMicStageView *fifteenMicStageView; -@property (nonatomic,strong) TwentyMicStageView *twentyMicStageView; -@property(nonatomic, strong) NineteenMicStageView *nineteenMicStageView; +//@property (nonatomic,strong) TenMicStageView *tenMicStageView; +//@property (nonatomic,strong) FifteenMicStageView *fifteenMicStageView; +//@property (nonatomic,strong) TwentyMicStageView *twentyMicStageView; +//@property(nonatomic, strong) NineteenMicStageView *nineteenMicStageView; ///公屏 @property (nonatomic,strong) MsRoomMessageMainView *messageContainerView; ///快捷发言 @@ -483,7 +483,7 @@ XPCandyTreeInsufficientBalanceViewDelegate> // 添加公共房间消息转发通知监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePublicRoomMessageForward:) - name:@"MessageFromPublicRoomWithAttachmentNotification" + name:kMessageFromPublicRoomWithAttachmentNotification object:nil]; // 添加应用生命周期保护 @@ -958,6 +958,7 @@ XPCandyTreeInsufficientBalanceViewDelegate> delegate:self]; if (success) { self.stageView = self.stageViewManager.currentStageView; + [[RtcManager instance] updateDelegate:self.stageView]; if (self.stageView) { NSLog(@"🔧 updateStageView: StageViewManager 设置 alpha = 0 (之前 = %.2f)", self.stageView.alpha); self.stageView.alpha = 0; @@ -1025,8 +1026,11 @@ XPCandyTreeInsufficientBalanceViewDelegate> NSLog(@"❌ changeStageViewOnRoomUpdate: updateStageView 失败"); return; } - + NSLog(@"✅ changeStageViewOnRoomUpdate: updateStageView 成功,当前 alpha = %.2f", self.stageView.alpha); + + // 🔧 新增:检查是否有重复的 StageView 实例 + [self checkForDuplicateStageViews]; // 🔧 新增:发送房间类型变化通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"RoomTypeChanged" @@ -1058,6 +1062,7 @@ XPCandyTreeInsufficientBalanceViewDelegate> NSLog(@"🔧 changeStageViewOnRoomUpdate: 设置 stageView.alpha = 1 (之前 = %.2f)", self.stageView.alpha); self.stageView.alpha = 1; + [[RtcManager instance] updateDelegate:(id)self.stageView]; NSLog(@"✅ changeStageViewOnRoomUpdate: stageView.alpha 已设置为 1"); // 调试:检查最终状态 @@ -1144,6 +1149,51 @@ XPCandyTreeInsufficientBalanceViewDelegate> } - (void)changeStageViewOnAnchorRoom { + // 🔧 内存管理:清理旧的 stageView 实例 + if (self.stageView && self.stageView.superview && self.stageViewManager.currentStageView != self.stageView) { + NSLog(@"🧹 changeStageViewOnAnchorRoom: 清理旧的 stageView 实例"); + [self.stageView removeFromSuperview]; + self.stageView = nil; + } + + // 使用 StageViewManager 来管理个播房间的 stageView 切换 + if (self.stageViewManager) { + NSLog(@"🔧 changeStageViewOnAnchorRoom: 使用 StageViewManager 进行个播房间切换"); + BOOL success = [self.stageViewManager updateStageViewForRoomType:RoomType_Anchor + roomInfo:self.roomInfo + container:self.anchorScrollView + delegate:self]; + if (success) { + self.stageView = self.stageViewManager.currentStageView; + if (self.stageView) { + NSLog(@"✅ changeStageViewOnAnchorRoom: StageViewManager 成功切换 stageView: %@", NSStringFromClass([self.stageView class])); + + // 确保 stageView 添加到正确的位置 + if (!self.stageView.superview) { + [self.anchorScrollView insertSubview:self.stageView belowSubview:self.roomHeaderView]; + } + + // 重新设置约束 + [self.stageView mas_remakeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.anchorScrollView.middleImageView); + make.top.mas_equalTo(self.roomHeaderView.mas_bottom); + make.height.mas_equalTo(self.stageView.hightForStageView); + }]; + + // 重新设置其他相关视图的约束 + [self updateAnchorRoomLayout]; + [[RtcManager instance] updateDelegate:(id)self.stageView]; + return; + } + } + NSLog(@"⚠️ changeStageViewOnAnchorRoom: StageViewManager 切换失败,尝试降级逻辑"); + } + + // 🔧 新增:检查是否有重复的 StageView 实例 + [self checkForDuplicateStageViews]; + + // 降级逻辑:直接创建 stageView(保持原有逻辑作为兜底) + NSLog(@"🔧 changeStageViewOnAnchorRoom: 使用降级逻辑创建 stageView"); if (self.roomInfo.roomModeType == RoomModeType_Open_AcrossRoomPK_mode && ![self.stageView isKindOfClass:[AnchorPKStageView class]]) { [self.stageView removeFromSuperview]; self.stageView = nil; @@ -1156,19 +1206,25 @@ XPCandyTreeInsufficientBalanceViewDelegate> if (!self.stageView.superview) { [self.anchorScrollView insertSubview:self.stageView belowSubview:self.roomHeaderView]; } - + [self.stageView mas_remakeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.mas_equalTo(self.anchorScrollView.middleImageView); make.top.mas_equalTo(self.roomHeaderView.mas_bottom); make.height.mas_equalTo(self.stageView.hightForStageView); }]; + + [self updateAnchorRoomLayout]; +} + +// 提取个播房间的布局更新逻辑,便于复用 +- (void)updateAnchorRoomLayout { [self.messageContainerView mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.stageView.mas_bottom); make.bottom.mas_equalTo(self.quickMessageContainerView.mas_top).mas_offset(-5); make.leading.mas_equalTo(self.anchorScrollView.middleImageView); make.trailing.mas_equalTo(self.sideMenu.mas_leading).offset(-10); }]; - + CGFloat quickMsgHeight = 30; //记录最后关闭时间 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; @@ -2096,22 +2152,6 @@ XPCandyTreeInsufficientBalanceViewDelegate> NSLog(@"[Recv] --- Message Raw Attach Content: %@, %@, %ld", @(message.senderClientType), message.rawAttachContent, (long)message.messageType); - // 全服礼物/游戏飘屏按 TurboModeStateManager 的房间开关控制 - NSString *currentRoomIdForTurbo = @(self.roomInfo.roomId).stringValue; - BOOL containsAllRoomMsg = [message.rawAttachContent containsString:@"\"allRoomMsg\":1"]; // 全服礼物飘屏标记 - BOOL containsAllGameMsg = [message.rawAttachContent containsString:@"\"allGameMsg\":1"]; // 预留:全服游戏飘屏标记 - if (containsAllRoomMsg || containsAllGameMsg) { - BOOL allowGiftScreen = [[TurboModeStateManager sharedManager] isGlobalGiftScreenEnabledForRoom:currentRoomIdForTurbo]; - BOOL allowGameScreen = [[TurboModeStateManager sharedManager] isGlobalGameScreenEnabledForRoom:currentRoomIdForTurbo]; - if ((containsAllRoomMsg && !allowGiftScreen) || (containsAllGameMsg && !allowGameScreen)) { - NSLog(@"[Recv] ⛔️ 按 TurboMode 屏蔽全服飘屏 | gift=%@ game=%@ | roomId=%@", - allowGiftScreen ? @"ON" : @"OFF", - allowGameScreen ? @"ON" : @"OFF", - currentRoomIdForTurbo); - continue; - } - } - if (message.messageType == NIMMessageTypeNotification) { [self handleNIMNotificationTypeMessage:message]; } else if (message.messageType == NIMMessageTypeCustom) { @@ -2364,19 +2404,19 @@ XPCandyTreeInsufficientBalanceViewDelegate> } else if (self.roomInfo.type == RoomType_20Mic) { [self __layoutTwentyMicStage]; [self changeStageViewOnRoomUpdate]; - [self.twentyMicStageView onRoomUpdate]; +// [self.twentyMicStageView onRoomUpdate]; } else if (self.roomInfo.type == RoomType_19Mic) { [self __layoutNineteenMicStage]; [self changeStageViewOnRoomUpdate]; - [self.nineteenMicStageView onRoomUpdate]; +// [self.nineteenMicStageView onRoomUpdate]; } else if (self.roomInfo.type == RoomType_15Mic) { [self __layoutFifteenMicStage]; [self changeStageViewOnRoomUpdate]; - [self.fifteenMicStageView onRoomUpdate]; +// [self.fifteenMicStageView onRoomUpdate]; } else if (self.roomInfo.type == RoomType_10Mic) { [self __layoutTenMicStage]; [self changeStageViewOnRoomUpdate]; - [self.tenMicStageView onRoomUpdate]; +// [self.tenMicStageView onRoomUpdate]; } else { [self changeStageViewOnRoomUpdate]; } @@ -3612,48 +3652,52 @@ XPCandyTreeInsufficientBalanceViewDelegate> return _functionView; } -- (StageView *)stageView { - // 🔧 修改:如果 StageViewManager 已初始化,返回其管理的 stageView - if (self.stageViewManager && self.stageViewManager.currentStageView) { - return self.stageViewManager.currentStageView; - } - - // 🔧 降级:只有在 StageViewManager 不可用时才创建默认的 SocialStageView - if (!_stageView) { - _stageView = [[SocialStageView alloc] initWithDelegate:self]; - _stageView.alpha = 0; - NSLog(@"⚠️ 使用降级 stageView: SocialStageView"); - } - return _stageView; -} +//- (StageView *)stageView { +// // 🔧 修改:如果 StageViewManager 已初始化,返回其管理的 stageView +// if (self.stageViewManager && self.stageViewManager.currentStageView) { +// NSLog(@"🔍 stageView getter: 返回 StageViewManager 的 currentStageView | Class: %@", +// NSStringFromClass([self.stageViewManager.currentStageView class])); +// return self.stageViewManager.currentStageView; +// } +// +// // 🔧 降级:只有在 StageViewManager 不可用时才创建默认的 SocialStageView +// if (!_stageView) { +// NSLog(@"🔍 stageView getter: 创建降级 SocialStageView"); +// _stageView = [[SocialStageView alloc] initWithDelegate:self]; +// _stageView.alpha = 0; +// NSLog(@"⚠️ stageView getter: 降级 SocialStageView 创建完成 | Class: %@", +// NSStringFromClass([_stageView class])); +// } +// return _stageView; +//} -- (TenMicStageView *)tenMicStageView { - if (!_tenMicStageView) { - _tenMicStageView = [[TenMicStageView alloc] initWithDelegate:self]; - } - return _tenMicStageView; -} - -- (NineteenMicStageView *)nineteenMicStageView { - if (!_nineteenMicStageView) { - _nineteenMicStageView = [[NineteenMicStageView alloc] initWithDelegate:self]; - } - return _nineteenMicStageView; -} - -- (TwentyMicStageView *)twentyMicStageView { - if (!_twentyMicStageView) { - _twentyMicStageView = [[TwentyMicStageView alloc] initWithDelegate:self]; - } - return _twentyMicStageView; -} - -- (FifteenMicStageView *)fifteenMicStageView { - if (!_fifteenMicStageView) { - _fifteenMicStageView = [[FifteenMicStageView alloc] initWithDelegate:self]; - } - return _fifteenMicStageView; -} +//- (TenMicStageView *)tenMicStageView { +// if (!_tenMicStageView) { +// _tenMicStageView = [[TenMicStageView alloc] initWithDelegate:self]; +// } +// return _tenMicStageView; +//} +// +//- (NineteenMicStageView *)nineteenMicStageView { +// if (!_nineteenMicStageView) { +// _nineteenMicStageView = [[NineteenMicStageView alloc] initWithDelegate:self]; +// } +// return _nineteenMicStageView; +//} +// +//- (TwentyMicStageView *)twentyMicStageView { +// if (!_twentyMicStageView) { +// _twentyMicStageView = [[TwentyMicStageView alloc] initWithDelegate:self]; +// } +// return _twentyMicStageView; +//} +// +//- (FifteenMicStageView *)fifteenMicStageView { +// if (!_fifteenMicStageView) { +// _fifteenMicStageView = [[FifteenMicStageView alloc] initWithDelegate:self]; +// } +// return _fifteenMicStageView; +//} - (XPRoomLittleGameContainerView *)littleGameView { if (!_littleGameView) { @@ -3724,12 +3768,18 @@ XPCandyTreeInsufficientBalanceViewDelegate> NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject; if ([notiMsg respondsToSelector:@selector(content)]) { NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content; - + // 忽略离房事件 if (content.eventType == NIMChatroomEventTypeExit || content.eventType == NIMChatroomEventTypeKicked) { return; } } } + + if ([message.rawAttachContent.lowercaseString containsString:@"allroommsg"]) { + // 忽略与公聊房的重复事件 + NSLog(@"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + return; + } switch (message.messageType) { case NIMMessageTypeNotification: @@ -3779,6 +3829,59 @@ XPCandyTreeInsufficientBalanceViewDelegate> NSLog(@" - stageView.class: %@", NSStringFromClass([self.stageView class])); } +// 检查是否有多余的 StageView 实例 +- (void)checkForDuplicateStageViews { + NSMutableArray *stageViews = [NSMutableArray array]; + NSMutableArray *duplicateViews = [NSMutableArray array]; + + // 收集所有 StageView 实例 + NSArray *allViews = [self.view subviews]; + for (UIView *view in allViews) { + if ([view isKindOfClass:[StageView class]]) { + [stageViews addObject:(StageView *)view]; + } + + // 递归检查子视图 + NSArray *subViews = [view subviews]; + for (UIView *subView in subViews) { + if ([subView isKindOfClass:[StageView class]]) { + [stageViews addObject:(StageView *)subView]; + } + } + } + + // 检查重复实例 + if (stageViews.count > 1) { + NSLog(@"⚠️ 检测到多个 StageView 实例 (总计: %lu 个)", (unsigned long)stageViews.count); + for (StageView *stageView in stageViews) { + NSLog(@" - StageView: %@ | Frame: %@ | Superview: %@", + NSStringFromClass([stageView class]), + NSStringFromCGRect(stageView.frame), + NSStringFromClass([stageView.superview class])); + } + + // 找出当前主实例之外的重复实例 + for (StageView *stageView in stageViews) { + if (stageView != self.stageView && stageView.superview) { + [duplicateViews addObject:stageView]; + } + } + + if (duplicateViews.count > 0) { + NSLog(@"⚠️ 发现重复的 StageView 实例,正在清理..."); + for (StageView *duplicateView in duplicateViews) { + NSLog(@"🧹 清理重复的 StageView: %@ | Superview: %@", + NSStringFromClass([duplicateView class]), + NSStringFromClass([duplicateView.superview class])); + [duplicateView removeFromSuperview]; + } + NSLog(@"✅ 重复 StageView 实例清理完成"); + } + } else { + NSLog(@"✅ StageView 实例检查通过:只有 1 个实例"); + } +} + /// 在 StageView 上绘制符合条件的相邻麦位中点矩形 - (void)drawSocialStageMidpointRects { diff --git a/YuMi/ru.lproj/Localizable.strings b/YuMi/ru.lproj/Localizable.strings index 6611d610..cfb65620 100644 --- a/YuMi/ru.lproj/Localizable.strings +++ b/YuMi/ru.lproj/Localizable.strings @@ -77,7 +77,7 @@ "XPSessionFindNewGreetListView0" = "Отправлено успешно"; "XPSessionFindNewGreetListView1" = "Пожалуйста, выберите"; "XPSessionFindNewGreetListView2" = "Изменить пакет"; -"XPSessionFindNewGreetListView3" = "Отправить"; +"XPSessionFindNewGreetListView3" = "Отпр."; "XPSessionFindNewAlertView0" = "Игнорировать"; "XPSessionFindNewAlertView1" = "Идти искать"; @@ -157,7 +157,7 @@ "PKIDLoginViewController2" = "Пожалуйста, обратитесь в службу поддержки"; "PKIDLoginViewController3" = "LINE:pekoyuyin"; -"PKIDLoginViewController4" = "Я понял"; +"PKIDLoginViewController4" = "OK"; "MessageLevelUpgradeModel0" = "Поздравляем! Ваш уровень очарования достиг %@"; "MessageLevelUpgradeModel1" = "Поздравляем! Ваш уровень достиг %@"; @@ -292,7 +292,7 @@ "XPMonentsTooBarView8" = "Блокировать динамику"; "XPMonentPublishSuccessView0" = "На рассмотрении"; -"XPMonentPublishSuccessView1" = "Фух, получили вашу милую динамику~\nПосле одобрения секретарь поможет вам отправить и уведомит вас"; +"XPMonentPublishSuccessView1" = "Фух, получили вашу милую динамику~\nПосле одобрения секретарь поможет вам Отпр. и уведомит вас"; "XPMonentsInteractiveTableViewCell0" = "Прокомментировал вас"; "XPMonentsInteractiveTableViewCell1" = "Пригласить"; @@ -356,7 +356,7 @@ "XPLoginInputView0" = "Получить код подтверждения"; -"XPLoginInputView1" = "Отправить снова"; +"XPLoginInputView1" = "Отпр. снова"; "XPLoginViewController0" = "Автоматический вход не удался, проверьте состояние мобильной сети"; "XPLoginViewController1" = "Автоматический вход"; @@ -407,7 +407,7 @@ "XPLoginVerifBindPhoneViewController8" = "Код подтверждения отправлен успешно"; "XPLoginVerifBindPhoneViewController9" = "Подтверждение прошло успешно"; "XPLoginVerifBindPhoneViewController10" = "Повторите через %ds"; -"XPLoginVerifBindPhoneViewController11" = "Отправить снова"; +"XPLoginVerifBindPhoneViewController11" = "Отпр. снова"; "XPLoginVerifBindPhoneViewController12" = "Страна и регион"; "XPLoginVerifBindPhoneViewController13" = "Китай"; "XPLoginVerifBindPhoneViewController14" = "Привязать"; @@ -483,7 +483,7 @@ "NSString_Utils2" = "Только что"; "NSString_Utils3" = "%ld минут назад"; "NSString_Utils4" = "%@0K"; -"QEmotionBoardView0" = "Отправить"; +"QEmotionBoardView0" = "Отпр."; "QInputBarView0" = "Удерживайте, чтобы говорить"; "QInputBarView1" = "Отпустите, чтобы закончить"; "QInputBarView2" = "Потяните вверх, чтобы отменить отправку"; @@ -493,7 +493,7 @@ "QinputPhotoView0" = "Можно выбрать до 9 изображений"; "QinputPhotoView1" = "Альбом"; "QinputPhotoView2" = "Оригинал"; -"QinputPhotoView3" = "Отправить"; +"QinputPhotoView3" = "Отпр."; "XPAdvertiseView0" = "Пропустить"; "XPAdvertiseView1" = "Пропустить"; @@ -696,7 +696,7 @@ "XPMineCollectPartyRoomViewController2" = "Еще нет сохраненных комнат"; "XPMinePayPwdInputView0" = "Повторите через %ld"; -"XPMinePayPwdInputView1" = "Отправить снова"; +"XPMinePayPwdInputView1" = "Отпр. снова"; "XPMinePayPwdInputView2" = "Установить платежный пароль"; "XPMinePayPwdInputView3" = "Введите платежный пароль еще раз"; "XPMinePayPwdInputView4" = "Введите код подтверждения"; @@ -709,7 +709,7 @@ "XPMineAccountView0" = "Баланс монет"; -"XPMineVerifIdentityView0" = "Отправить код подтверждения"; +"XPMineVerifIdentityView0" = "Отпр. код подтверждения"; "AnchorLevelTimeView0" = "час(ов)"; "AnchorLevelTimeView1" = "минут(ы)"; @@ -993,7 +993,7 @@ "XPMineFeedbackViewController2" = "Описание проблемы"; "XPMineFeedbackViewController3" = "Пожалуйста, подробно опишите проблемы и ситуации, с которыми вы столкнулись. Спасибо за ваши ценные отзывы."; "XPMineFeedbackViewController4" = "Пожалуйста, введите ваши контактные данные"; -"XPMineFeedbackViewController5" = "Отправить отзыв"; +"XPMineFeedbackViewController5" = "Отпр. отзыв"; "XPMineAboutUsViewController0" = "О приложении "; "XPMineNotificaViewController0" = "Настройки уведомлений"; @@ -1002,7 +1002,7 @@ "XPMineResetLoginPwdViewController2" = "Код подтверждения отправлен успешно"; "XPMineResetLoginPwdViewController3" = "Сброс пароля успешно выполнен, пожалуйста, войдите снова"; "XPMineResetLoginPwdViewController4" = "Повторите через %ds"; -"XPMineResetLoginPwdViewController5" = "Отправить снова"; +"XPMineResetLoginPwdViewController5" = "Отпр. снова"; "XPMineResetLoginPwdViewController6" = "Далее"; "XPMineResetLoginPwdViewController7" = "Пожалуйста, введите ваш номер телефона"; "XPMineResetLoginPwdViewController8" = "Пожалуйста, введите код подтверждения, который вы получили"; @@ -1027,7 +1027,7 @@ "XPMineVerifIdentityViewController2" = "Код подтверждения отправлен успешно"; "XPMineVerifIdentityViewController3" = "Проверка прошла успешно"; "XPMineVerifIdentityViewController4" = "Повторите через %ds"; -"XPMineVerifIdentityViewController5" = "Отправить снова"; +"XPMineVerifIdentityViewController5" = "Отпр. снова"; "XPMineVerifIdentityViewController6" = "Далее"; "XPMineVerifIdentityViewController7" = "Пожалуйста, введите ваш номер телефона"; "XPMineVerifIdentityViewController8" = "Пожалуйста, введите код подтверждения, который вы получили"; @@ -1258,7 +1258,7 @@ "XPRoomPKTypeTableViewCell1" = "Командное PK"; "XPRoomPKVoteTableViewCell0" = "Тип голосования"; -"XPRoomPKVoteTableViewCell1" = "По стоимости подарков"; +"XPRoomPKVoteTableViewCell1" = "Стоим. подар."; "XPRoomPKVoteTableViewCell2" = "По количеству отправителей подарков"; "XPRoomPKRecordTableViewCell0" = "Ничья"; @@ -1267,7 +1267,7 @@ "XPRoomPKRecordTableViewCell3" = "Поражение"; "XPRoomPKRecordTableViewCell4" = "Поражение"; "XPRoomPKRecordTableViewCell5" = "Победа"; -"XPRoomPKRecordTableViewCell6" = "По стоимости подарков"; +"XPRoomPKRecordTableViewCell6" = "Стоим. подар."; "XPRoomPKRecordTableViewCell7" = "По количеству отправителей подарков"; "XPRoomPKEmptyTableViewCell0" = "Нет данных"; @@ -1375,7 +1375,7 @@ "XPUserCardPresenter11" = "Разблокировать"; "XPUserCardPresenter10" = "Заблокировать микрофон"; "XPUserCardPresenter12" = "Очистить значение подарка"; -"XPUserCardPresenter13" = "Отправить подарок"; +"XPUserCardPresenter13" = "Отпр. подарок"; "XPUserCardPresenter14" = "Личный чат"; "XPUserCardPresenter15" = "Подписаться"; "XPUserCardPresenter16" = "Подписан"; @@ -1546,7 +1546,7 @@ "XPRoomMenuContainerView3" = "Поприветствуйте всех"; "XPRoomSendTextView0" = "Введите сообщение..."; -"XPRoomSendTextView1" = "Отправить"; +"XPRoomSendTextView1" = "Отпр."; "DatingStageView0" = "Вы уже на микрофоне"; "DatingStageView1" = "Чтобы выйти на микрофон, вам нужно встать в очередь"; @@ -1839,14 +1839,14 @@ "XPGiftBarView0" = "Баланс: %@"; "XPGiftBarView1" = "Пополнить"; -"XPGiftBarView2" = "Отправить"; +"XPGiftBarView2" = "Отпр."; "XPGiftBarView3" = "Отправка..."; -"XPGiftBarView4" = "Отправить"; +"XPGiftBarView4" = "Отпр."; "XPGiftBarView5" = "Пожалуйста, введите количество подарков"; -"XPGiftUsersView0" = "Отправить всем"; -"XPGiftUsersView1" = "Отправить всем"; +"XPGiftUsersView0" = "Отпр. всем"; +"XPGiftUsersView1" = "Отпр. всем"; "XPGiftHeadTypeView0" = "Бонус за первый пополнение"; "XPGiftHeadTypeView1" = "Бонус за первый пополнение"; @@ -1858,8 +1858,8 @@ "XPGiftLuckyGiftBroadcastCell1" = "Открыл %@, получил "; "XPGiftLuckyGiftBroadcastView0" = "Правила игры"; -"XPSendGiftView0" = "Можно отправить всем только одному человеку"; -"XPSendGiftView1" = "Можно отправить всем только одному человеку"; +"XPSendGiftView0" = "Можно Отпр. всем только одному человеку"; +"XPSendGiftView1" = "Можно Отпр. всем только одному человеку"; "XPSendGiftView2" = "Пожалуйста, выберите хотя бы одного человека"; "XPSendGiftView3" = "Успешно отправлен граффити-подарок: %@"; "XPSendGiftView4" = "Еще не достигнут уровень VIP, необходимый для отправки %@\nТребуемый уровень VIP: %@"; @@ -2026,7 +2026,7 @@ "XPReceiveRedPacketView4" = "Забрано %@/%@"; "XPReceiveRedPacketView5" = "Все взяли, приходите раньше в следующий раз"; "XPReceiveRedPacketView6" = "Открывается через"; -"XPReceiveRedPacketView7" = "Отправить Данмаки\nХватить красный пакет"; +"XPReceiveRedPacketView7" = "Отпр. Данмаки\nХватить красный пакет"; "XPReceiveRedPacketView8" = "-ов красный пакет"; "XPReceiveRedPacketView9" = "Быстрее приходите, чтобы хватить красный пакет, кто первый тот и забрал!"; "XPReceiveRedPacketView10" = "Подпишитесь на ведущего, чтобы хватить красные пакеты!"; @@ -2034,7 +2034,7 @@ "XPReceiveRedPacketView12" = "Отправьте Данмаки %@, чтобы хватить красные пакеты!"; "XPReceiveRedPacketView13" = "Подписаться на ведущего\nХватить красный пакет"; "XPReceiveRedPacketView14" = "Поделиться комнатой\nХватить красный пакет"; -"XPReceiveRedPacketView15" = "Отправить Данмаки\nХватить красный пакет"; +"XPReceiveRedPacketView15" = "Отпр. Данмаки\nХватить красный пакет"; "XPReceiveRedPacketView16" = "Не участвую\nв мероприятии"; "XPReceiveRedPacketView17" = "Условия выполнены, хватайте красные пакеты сейчас"; "XPReceiveRedPacketView18" = "Не участвуете в мероприятии, не можете хватить этот красный пакет"; @@ -2102,18 +2102,18 @@ "XPRoomLotteryPrizeView16" = "Поздравляем с выигрышем приза!"; "XPRoomLotteryPrizeView17" = "Извините, фонд призов пуст!"; -"XPRoomSendGiftViewController0" = "Отправить %@"; +"XPRoomSendGiftViewController0" = "Отпр. %@"; "XPRoomSendGiftViewController1" = "Получено %@ от %@"; "XPRoomSendGiftViewController2" = "Получено %@ от %@"; "XPRoomSendGiftViewController3" = "Получен красный пакет"; -"XPRoomSendGiftViewController4" = "Отправить"; +"XPRoomSendGiftViewController4" = "Отпр."; "XPRoomMessageView0" = "Комната включена и готова к приему сообщений"; "XPRoomMessageView1" = "Введите текст для отправки"; -"XPRoomMessageView2" = "Комната заглушена, невозможно отправить сообщения"; -"XPRoomMessageView3" = "Комната заблокирована, невозможно отправить сообщения"; +"XPRoomMessageView2" = "Комната заглушена, невозможно Отпр. сообщения"; +"XPRoomMessageView3" = "Комната заблокирована, невозможно Отпр. сообщения"; "XPRoomMessageView4" = "Вам запрещено отправлять сообщения в этой комнате"; -"XPRoomMessageView5" = "Вы были заглушены, невозможно отправить сообщения"; +"XPRoomMessageView5" = "Вы были заглушены, невозможно Отпр. сообщения"; "XPRoomMessageView6" = "Подарков пока не получено"; "XPRoomEnterTimeView0" = "Войти в комнату"; @@ -2123,7 +2123,7 @@ "XPRoomReceiveGiftView2" = "Получен красный пакет от"; "XPRoomSendRedPacketView0" = "Открыть красный пакет"; -"XPRoomSendRedPacketView1" = "Отправить красный пакет"; +"XPRoomSendRedPacketView1" = "Отпр. красный пакет"; "XPRoomSendRedPacketView2" = "Примечание к красному пакету"; "XPRoomSendRedPacketView3" = "Количество красных пакетов"; "XPRoomSendRedPacketView4" = "Общее количество алмазов"; @@ -2277,7 +2277,7 @@ "XPLoginInputView0" = "Получить код подтверждения"; -"XPLoginInputView1" = "Отправить повторно"; +"XPLoginInputView1" = "Отпр. повторно"; "XPLoginViewController0" = "Авторизация одним кликом не удалась. Проверьте состояние мобильной сети"; "XPLoginViewController1" = "Авторизация одним кликом"; @@ -2417,7 +2417,7 @@ "XPFeedBackViewController2" = "Введите содержание обратной связи"; "XPFeedBackViewController3" = "Контактная информация"; "XPFeedBackViewController4" = "Введите вашу контактную информацию"; -"XPFeedBackViewController5" = "Отправить"; +"XPFeedBackViewController5" = "Отпр."; "XPFeedBackViewController6" = "Введите тип обратной связи"; @@ -2517,7 +2517,7 @@ "LoginVerifCodeViewController1" = "Вход выполнен успешно"; "LoginVerifCodeViewController2" = "Код подтверждения отправлен на"; "LoginVerifCodeViewController3" = "Введите код подтверждения"; -"LoginVerifCodeViewController4" = "Отправить код подтверждения повторно"; +"LoginVerifCodeViewController4" = "Отпр. код подтверждения повторно"; "UserPrivacyView0" = "Политика конфиденциальности “%@”"; "UserPrivacyView1" = "Добро пожаловать в %@. Мы поможем вам понять сбор, использование, хранение и обмен личной информацией с помощью “Политики конфиденциальности” и “Пользовательского соглашения”, особенно соответствие между типами и целями сбора личной информации.\n\nДля обеспечения нормальной работы продукта мы можем собирать от вас некоторую необходимую информацию. Мы можем собирать личные чувствительные данные, такие как контактная информация, и у вас есть право отказаться от предоставления нам этой информации. Мы не будем делиться, предоставлять, передавать или получать вашу личную информацию от третьих лиц без вашего согласия."; @@ -2561,7 +2561,7 @@ "PKIDLoginViewController11" = "SMS отправлено успешно"; "LoginVerifCodeViewController3" = "Код подтверждения"; -"LoginVerifCodeViewController4" = "Отправить повторно"; +"LoginVerifCodeViewController4" = "Отпр. повторно"; "XPLoginViewController11" = "Прежде чем зарегистрироваться и войти в систему, вам нужно согласиться с политикой конфиденциальности и пользовательским соглашением~"; @@ -2578,9 +2578,9 @@ ///XPMineGuildListCell "XPMineGuildListCell0" = "Подать заявку на вступление"; "XPMineGuildListCell1" = "Заявка подана"; -"XPMineGuildListCell2" = "Нельзя отправить повторную заявку в течение 3 дней"; +"XPMineGuildListCell2" = "Нельзя Отпр. повторную заявку в течение 3 дней"; "XPMineGuildListCell3" = "ID комнаты: %ld"; -"XPMineGuildListCell4" = "Нельзя отправить повторную заявку в течение 7 дней"; +"XPMineGuildListCell4" = "Нельзя Отпр. повторную заявку в течение 7 дней"; "XPMineGuildListCell5" = "На рассмотрении"; "XPMineGuildListCell6" = "Приглашено"; @@ -3077,7 +3077,7 @@ "LoginForgetPasswordViewController3" = "%ds до повторной попытки"; "LoginForgetPasswordViewController4" = "Повторить отправку"; "LoginForgetPasswordViewController5" = "Пожалуйста, введите правильный номер телефона"; -"LoginForgetPasswordViewController6" = "Отправить"; +"LoginForgetPasswordViewController6" = "Отпр."; "LoginForgetPasswordViewController7" = "Пожалуйста, введите номер телефона"; "LoginForgetPasswordViewController8" = "код подтверждения"; "LoginForgetPasswordViewController9" = "Пожалуйста, введите пароль (6-16 символов)"; @@ -3149,9 +3149,9 @@ "XPTreasureFairyFriendView1"="Поиск друзей"; "XPTreasureFairyMessageSendView0"="Отправлено успешно"; -"XPTreasureFairyMessageSendView1"="Вы уверены, что хотите отправить 1 карту феи '%@' для \"%@\"?"; +"XPTreasureFairyMessageSendView1"="Вы уверены, что хотите Отпр. 1 карту феи '%@' для \"%@\"?"; "XPTreasureFairyMessageSendView2"="Закрыть"; -"XPTreasureFairyMessageSendView3"="Отправить"; +"XPTreasureFairyMessageSendView3"="Отпр."; "XPTreasureFairyMoreView0"="Пояснение к правилам"; "XPTreasureFairyMoreView1"="Хранитель сокровищ"; @@ -3169,9 +3169,9 @@ "XPTreasureFairySendView0"="Отправлено успешно"; "XPTreasureFairySendView1"="Отправлен запрос другу"; -"XPTreasureFairySendView2"="Вы уверены, что хотите отправить 1 карту феи '%@' для \"%@\"?"; +"XPTreasureFairySendView2"="Вы уверены, что хотите Отпр. 1 карту феи '%@' для \"%@\"?"; "XPTreasureFairySendView3"="Вы уверены, что хотите запросить 1 карту феи '%@' у \"%@\"?"; -"XPTreasureFairySendView4"="Отправить"; +"XPTreasureFairySendView4"="Отпр."; "XPTreasureFairySendView5"="Запрос"; "XPTreasureFairySendView6"="Закрыть"; @@ -3460,7 +3460,7 @@ "PIRoomPhotoAlbumItemVC2"="Пожалуйста, выберите фотографии комнаты для загрузки"; "PIRoomPhotoAlbumItemVC3"="Загрузка успешна"; "PIRoomPhotoAlbumItemVC4"="Вы уверены, что хотите удалить эту фотографию?"; -"PIRoomPhotoAlbumItemVC5"="Вы уверены, что хотите отправить эту фотографию на публичный экран?"; +"PIRoomPhotoAlbumItemVC5"="Вы уверены, что хотите Отпр. эту фотографию на публичный экран?"; ///PIRoomPhotoAlbumChoosePhotoCell "PIRoomPhotoAlbumChoosePhotoCell0"="Максимум 6 фотографий за одну загрузку"; ///PIRoomPhotoAlbumChoosePhotoTypeView @@ -3483,7 +3483,7 @@ "PIRoomMessageUnlockPhotoAlbumView0"="Подарок для разблокировки фотографии"; "PIRoomMessageUnlockPhotoAlbumView1"="Разблокировать сейчас"; ///PIRoomPhotoAlbumOperateView -"PIRoomPhotoAlbumOperateView0"="Отправить на публичный экран"; +"PIRoomPhotoAlbumOperateView0"="Отпр. на публичный экран"; "PIRoomPhotoAlbumOperateView1"="Удалить фотографию"; "PIRoomPhotoAlbumOperateView2"="Просмотреть крупное изображение"; ///XPMaskManagerVC @@ -3550,7 +3550,7 @@ "App_Commont_Week" = "Неделя"; "App_Commont_Month" = "Месяц"; "App_Commont_Hour" = "Час"; -"App_Commont_Minute" = "Минута"; +"App_Commont_Minute" = "мин."; "App_Commont_Day" = "День"; "App_Common_To" = "В"; "App_Common_Number" = "Номер"; @@ -3674,10 +3674,10 @@ "VipCenter_6" = "Истекает: %@"; "VipCenter_7" = "VIP%ld доступен только по акции"; -"Combo_0" = "Отправить"; +"Combo_0" = "Отпр."; "Combo_1" = "Все микрофоны"; "Combo_2" = "Многопользовательский"; -"Combo_3" = "Отправить %@"; +"Combo_3" = "Отпр. %@"; "Combo_4" = "Выиграть"; "Combo_5" = "Монеты"; "Combo_6" = "Поздравляем!"; @@ -3757,7 +3757,7 @@ "1.0.18_12" = "Вы уверены, что хотите использовать это изображение в качестве вашего фона?"; "1.0.18_13" = "Вы уверены, что хотите купить?"; "1.0.18_14" = "1000/15Дней"; -"1.0.18_15" = "Отправить"; +"1.0.18_15" = "Отпр."; "1.0.18_16" = "Подтвердить"; "1.0.18_17" = "Оригинальный"; "1.0.18_18" = "На рассмотрении"; @@ -3854,18 +3854,18 @@ "1.0.37_text_3" = "Выбрать подарок"; "1.0.37_text_4" = "Числа удачного мешка"; "1.0.37_text_5" = "Время ожидания"; -"1.0.37_text_6" = "Отправить подарочный удачный мешок"; +"1.0.37_text_6" = "Отпр. подарочный удачный мешок"; "1.0.37_text_7" = "%@Мин"; "1.0.37_text_8" = "Числа удачного мешка"; "1.0.37_text_9" = "Всего потрачено %@ монет"; "1.0.37_text_10" = "Подарок"; -"1.0.37_text_11" = "Отправить %@ подарков, потратить %@ монет"; +"1.0.37_text_11" = "Отпр. %@ подарков, потратить %@ монет"; "1.0.37_text_12" = "Изменить "; "1.0.37_text_13" = "Время ожидания %@ минут"; "1.0.37_text_14" = "Полученный удачный мешок"; "1.0.37_text_15" = "Отправленный удачный мешок"; -"1.0.37_text_15.1" = "Отправить подарочный удачный мешок"; -"1.0.37_text_15.2" = "Отправить мешок удачи с монетами"; +"1.0.37_text_15.1" = "Отпр. подарочный удачный мешок"; +"1.0.37_text_15.2" = "Отпр. мешок удачи с монетами"; "1.0.37_text_17.1" = "Подарочный удачный мешок %@!"; "1.0.37_text_17.2" = "Мешок удачи с монетами %@!"; "1.0.37_text_18" = "Скоро"; @@ -4019,7 +4019,7 @@ "20.20.62_text_5" = "Пользователь ушел, приглашение не удалось."; "20.20.62_text_6" = "Микрофон занят. Пожалуйста, попробуйте позже."; "20.20.62_text_7" = "У вас нет разрешения приглашать пользователя на микрофон."; -"20.20.62_text_8" = "Не удалось отправить приглашение. Пожалуйста, проверьте сеть."; +"20.20.62_text_8" = "Не удалось Отпр. приглашение. Пожалуйста, проверьте сеть."; "20.20.62_text_9" = "Включение/выключение эффектов";