移除公共房间管理器中的配置更新通知逻辑,新增 RtcManager 的代理更新方法以支持动态代理切换,优化 StageViewManager 的清理逻辑,确保在清理过程中正确处理视图层级和内存管理,同时更新本地化字符串以提升用户体验。

This commit is contained in:
edwinQQQ
2025-09-22 15:22:07 +08:00
parent 024936570c
commit ae0f1993e3
8 changed files with 269 additions and 208 deletions

View File

@@ -106,9 +106,6 @@
self.configInfo = model;
//
[[PublicRoomManager sharedManager] updateConfig];
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadAfterLoadConfig" object:nil];
[self requestFaceTabNewList];

View File

@@ -139,6 +139,10 @@ typedef NS_ENUM(NSInteger, BackMusicPlayState) {
- (NSInteger)loadUserSound;
@property (nonatomic,assign) BOOL broadcast;
// MARK: 指向实际使用的 stageView
- (void)updateDelegate:(id<RtcDelegate> _Nullable)delegate;
@end
NS_ASSUME_NONNULL_END

View File

@@ -194,6 +194,10 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey;
_engineDelegate = delegate;
}
- (void)updateDelegate:(id<RtcDelegate> _Nullable)delegate {
_engineDelegate = delegate;
}
- (id<RtcInterface>)engine {
if (!_engine) {
_engine = [[TRTCRtcImpl alloc] initWithDelegate:self];

View File

@@ -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) \

View File

@@ -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]; //

View File

@@ -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;

View File

@@ -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<RtcDelegate>)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<RtcDelegate>)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: 返回 StageViewManagercurrentStageView | 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<StageView *> *stageViews = [NSMutableArray array];
NSMutableArray<StageView *> *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 {

View File

@@ -77,7 +77,7 @@
"XPSessionFindNewGreetListView0" = "Отправлено успешно";
"XPSessionFindNewGreetListView1" = "Пожалуйста, выберите";
"XPSessionFindNewGreetListView2" = "Изменить пакет";
"XPSessionFindNewGreetListView3" = "Отправить";
"XPSessionFindNewGreetListView3" = "Отпр.";
"XPSessionFindNewAlertView0" = "Игнорировать";
"XPSessionFindNewAlertView1" = "Идти искать";
@@ -157,7 +157,7 @@
"PKIDLoginViewController2" = "Пожалуйста, обратитесь в службу поддержки";
"PKIDLoginViewController3" = "LINEpekoyuyin";
"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" = "Включение/выключение эффектов";