From 644639dd9a0a2b6d67ea75f619ff3150068b8758 Mon Sep 17 00:00:00 2001 From: edwinQQQ Date: Mon, 15 Sep 2025 17:35:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20LoginViewController=20?= =?UTF-8?q?=E5=92=8C=20XPRoomViewController=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E7=BA=A6=E6=9D=9F=E5=92=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20CP=20=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE=E8=A7=A3=E6=9E=90=E5=92=8C=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=A4=84=E7=90=86=E3=80=82=E4=B8=BA=20MicMidpointRect?= =?UTF-8?q?Manager=20=E5=A2=9E=E5=8A=A0=E6=9C=89=E6=95=88=E9=85=8D?= =?UTF-8?q?=E5=AF=B9=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9D=E4=B8=AD?= =?UTF-8?q?=E7=82=B9=E7=9F=A9=E5=BD=A2=E7=BB=98=E5=88=B6=E7=9A=84=E5=87=86?= =?UTF-8?q?=E7=A1=AE=E6=80=A7=E3=80=82=E5=90=8C=E6=97=B6=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=A4=9A=E8=AF=AD=E8=A8=80=E6=94=AF=E6=8C=81=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=BC=BA=E5=A4=B1=E7=9A=84=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=EF=BC=8C=E6=8F=90=E5=8D=87=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=BD=93=E9=AA=8C=E5=92=8C=E4=BB=A3=E7=A0=81=E5=8F=AF?= =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../YMLogin/View/LoginViewController.m | 3 +- .../View/XPRoomLittleGameContainerView.m | 1 + .../View/StageView/MicMidpointRectManager.m | 94 +++++---- .../YMRoom/View/XPRoomViewController.m | 91 +++++++-- YuMi/Modules/YMWeb/MSRoomGameWebVC.m | 7 + YuMi/ru.lproj/Localizable.strings | 2 +- YuMi/uz-UZ.lproj/Localizable.strings | 193 +++++++++++++++++- 7 files changed, 327 insertions(+), 64 deletions(-) diff --git a/YuMi/Modules/YMLogin/View/LoginViewController.m b/YuMi/Modules/YMLogin/View/LoginViewController.m index d93a6c73..a372e3d0 100644 --- a/YuMi/Modules/YMLogin/View/LoginViewController.m +++ b/YuMi/Modules/YMLogin/View/LoginViewController.m @@ -137,7 +137,7 @@ typedef NS_ENUM(NSUInteger, LoginType) { make.centerX.mas_equalTo(self.view); make.bottom.mas_equalTo(self.view).offset(-44); make.width.mas_lessThanOrEqualTo(self.view).offset(-32); - make.height.mas_equalTo(60); +// make.height.mas_equalTo(60); }]; [self.agreeButton mas_makeConstraints:^(MASConstraintMaker *make) { @@ -358,6 +358,7 @@ typedef NS_ENUM(NSUInteger, LoginType) { _policyLabel = [[YYLabel alloc] init]; _policyLabel.font = kFontRegular(12); _policyLabel.numberOfLines = 0; + _policyLabel.preferredMaxLayoutWidth = KScreenWidth-40; NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:YMLocalizedString(@"XPLoginViewController6")]; if ([[UIScreen mainScreen] bounds].size.width < 450 && (isMSPT() || isMSTR())) { diff --git a/YuMi/Modules/YMRoom/View/LittleGame/View/XPRoomLittleGameContainerView.m b/YuMi/Modules/YMRoom/View/LittleGame/View/XPRoomLittleGameContainerView.m index 216058d4..1793c3eb 100644 --- a/YuMi/Modules/YMRoom/View/LittleGame/View/XPRoomLittleGameContainerView.m +++ b/YuMi/Modules/YMRoom/View/LittleGame/View/XPRoomLittleGameContainerView.m @@ -127,6 +127,7 @@ NSString * roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid]; // NSLog(@"用户ID:%@,房间ID:%@, 游戏ID:%lld, code:%@", userId, roomId, self.currentmgId, self.code); + // TODO: 补充多语言 NSString *language = @"en-US"; if (isMSZH()) { language = @"zh-TW"; diff --git a/YuMi/Modules/YMRoom/View/StageView/MicMidpointRectManager.m b/YuMi/Modules/YMRoom/View/StageView/MicMidpointRectManager.m index 910d63f4..90cd534c 100644 --- a/YuMi/Modules/YMRoom/View/StageView/MicMidpointRectManager.m +++ b/YuMi/Modules/YMRoom/View/StageView/MicMidpointRectManager.m @@ -92,7 +92,7 @@ @"rightUid": @(rightUid) }; - if (cpList.count < 2) { + if (cpList.count == 0) { return; } @@ -615,54 +615,60 @@ return; } - // 遍历所有相邻的麦位对 - for (NSInteger i = 0; i < micCount - 1; i++) { - NSInteger firstIndex = i; - NSInteger secondIndex = i + 1; - - // 获取两个麦位的视图 + // 依据 stageView 类型获取有效的配对集合 + NSArray *> *validPairs = nil; + if ([stageView isKindOfClass:NSClassFromString(@"SocialStageView")]) { + validPairs = @[@[@1,@2], @[@2,@3], @[@3,@4], @[@5,@6], @[@6,@7], @[@7,@8]]; + } else if ([stageView isKindOfClass:NSClassFromString(@"TenMicStageView")]) { + validPairs = @[@[@0,@1], @[@1,@2], @[@2,@3], @[@3,@4], @[@5,@6], @[@6,@7], @[@7,@8], @[@8,@9]]; + } else if ([stageView isKindOfClass:NSClassFromString(@"FifteenMicStageView")]) { + validPairs = @[@[@0,@1], @[@1,@2], @[@2,@3], @[@3,@4], @[@5,@6], @[@6,@7], @[@7,@8], @[@8,@9], @[@10,@11], @[@11,@12], @[@12,@13], @[@13,@14]]; + } else if ([stageView isKindOfClass:NSClassFromString(@"NineteenMicStageView")]) { + validPairs = @[@[@0,@1], @[@1,@2], @[@2,@3], @[@3,@4], @[@5,@6], @[@8,@9], @[@10,@11], @[@12,@13], @[@14,@15], @[@15,@16], @[@16,@17], @[@17,@18]]; + } else if ([stageView isKindOfClass:NSClassFromString(@"TwentyMicStageView")]) { + validPairs = @[@[@0,@1], @[@1,@2], @[@2,@3], @[@3,@4], @[@5,@6], @[@6,@7], @[@7,@8], @[@8,@9], @[@10,@11], @[@11,@12], @[@12,@13], @[@13,@14], @[@15,@16], @[@16,@17], @[@17,@18], @[@18,@19]]; + } else if ([stageView isKindOfClass:NSClassFromString(@"AnchorStageView")]) { + validPairs = @[@[@1,@2], @[@2,@3]]; + } else if ([stageView isKindOfClass:NSClassFromString(@"DatingStageView")]) { + validPairs = @[@[@1,@2], @[@3,@4], @[@5,@6], @[@7,@8]]; + } else if ([stageView isKindOfClass:NSClassFromString(@"LittleGameStageView")] + || [stageView isKindOfClass:NSClassFromString(@"LittleGameScrollStageView")]) { + NSMutableArray *pairs = [NSMutableArray array]; + for (NSInteger i = 0; i < micCount - 1; i++) { [pairs addObject:@[@(i), @(i+1)]]; } + validPairs = pairs; + } else if ([stageView isKindOfClass:NSClassFromString(@"AnchorPKStageView")]) { + validPairs = @[@[@0,@1]]; + } else { + NSMutableArray *pairs = [NSMutableArray array]; + for (NSInteger i = 0; i < micCount - 1; i++) { [pairs addObject:@[@(i), @(i+1)]]; } + validPairs = pairs; + } + + // 遍历所有有效配对 + for (NSArray *pair in validPairs) { + NSInteger firstIndex = pair[0].integerValue; + NSInteger secondIndex = pair[1].integerValue; + + // 权威几何:从 stageView 获取中点矩形 + CGRect rect = CGRectZero; + if ([stageView respondsToSelector:@selector(rectForMidpointBetweenMicAtIndex:andIndex:)]) { + rect = (CGRect)[stageView rectForMidpointBetweenMicAtIndex:firstIndex andIndex:secondIndex]; + } + if (CGRectIsEmpty(rect)) { continue; } + UIView *firstView = [stageView findMicroViewByIndex:firstIndex]; UIView *secondView = [stageView findMicroViewByIndex:secondIndex]; - - if (!firstView || !secondView) { - continue; - } - - // 获取两个麦位的用户信息 + if (!firstView || !secondView) { continue; } + UserInfoModel *firstUser = [firstView getUser]; UserInfoModel *secondUser = [secondView getUser]; - - if (!firstUser || !secondUser || firstUser.uid <= 0 || secondUser.uid <= 0) { - continue; - } - - // 计算中点矩形的位置和大小 - CGRect firstFrame = firstView.frame; - CGRect secondFrame = secondView.frame; - - CGFloat midX = (firstFrame.origin.x + firstFrame.size.width + secondFrame.origin.x) / 2.0; - CGFloat midY = (firstFrame.origin.y + secondFrame.origin.y) / 2.0; - CGFloat width = kGetScaleWidth(75); - CGFloat height = width; - - CGRect rect = CGRectMake(midX - width/2, midY - height/4, width, height); - - // 创建关系视图 - UIView *micRelationshipView = [[UIView alloc] initWithFrame:rect]; - micRelationshipView.backgroundColor = [UIColor clearColor]; - micRelationshipView.userInteractionEnabled = NO; - micRelationshipView.tag = 56002; - - // 添加关系视图到容器 - [self.containerView addSubview:micRelationshipView]; - [self.midpointRects addObject:micRelationshipView]; - - // 添加关系并播放SVGA + if (!firstUser || !secondUser || firstUser.uid <= 0 || secondUser.uid <= 0) { continue; } + NSString *micPairText = [NSString stringWithFormat:@"%ld-%ld", (long)firstIndex, (long)secondIndex]; - [self addRelationshipAtFrame:rect - micPairText:micPairText - leftUid:firstUser.uid - rightUid:secondUser.uid + [self addRelationshipAtFrame:rect + micPairText:micPairText + leftUid:firstUser.uid + rightUid:secondUser.uid cpList:self.cachedCpListInternal ?: @[]]; } diff --git a/YuMi/Modules/YMRoom/View/XPRoomViewController.m b/YuMi/Modules/YMRoom/View/XPRoomViewController.m index 36cffcf5..d8a7bd9a 100644 --- a/YuMi/Modules/YMRoom/View/XPRoomViewController.m +++ b/YuMi/Modules/YMRoom/View/XPRoomViewController.m @@ -1779,6 +1779,7 @@ XPCandyTreeInsufficientBalanceViewDelegate> } [self dismissViewControllerAnimated:YES completion:nil]; } + -(void)getOnlineCount{ @kWeakify(self); [Api requestRoomOnlineUserList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { @@ -2154,6 +2155,29 @@ XPCandyTreeInsufficientBalanceViewDelegate> case NIMChatroomEventTypeKicked: case NIMChatroomEventTypeExit: onLineNumber -= 1; + // 🔧 新增:若退出用户与CP相关,移除其CP SVGA并重绘 + if (content.source && content.source.userId.length > 0) { + NSInteger exitUid = content.source.userId.integerValue; + if (exitUid > 0) { + [self removeCpDataForUids:@[@(exitUid)]]; + // 构造剩余在麦用户列表,触发一次 CP 刷新,等价于补充一次“下麦”的逻辑 + NSMutableDictionary *currentQueue = [self.stageView getMicroQueue]; + if (currentQueue) { + NSMutableArray *remainingUids = [NSMutableArray array]; + for (NSString *positionKey in currentQueue.allKeys) { + MicroQueueModel *micModel = currentQueue[positionKey]; + NSInteger uid = micModel.userInfo.uid; + if (uid > 0 && uid != exitUid) { + [remainingUids addObject:[NSString stringWithFormat:@"%ld", (long)uid]]; + } + } + if (remainingUids.count > 0) { + [self.presenter micCpListByUidList:remainingUids]; + } + } + [self drawSocialStageMidpointRects]; + } + } break; case NIMChatroomEventTypeQueueChange: // 麦序上下麦 { @@ -2652,26 +2676,49 @@ XPCandyTreeInsufficientBalanceViewDelegate> return; } - NSDictionary *jsonDic = (NSDictionary *)attachment.data; - NSString *jsonString = [jsonDic objectForKey:@"data"]; - NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; - - NSError *error = nil; - NSArray *dataArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; - if (error) { - NSLog(@"❌ 麦位关系CP消息:JSON解析失败 - %@", error.localizedDescription); - return; + // 兼容多种数据结构: + // 1) attachment.data 为 NSDictionary,包含 key "data",其值可能为 NSString(JSON) 或 NSArray + // 2) attachment.data 直接为 NSArray + // 3) attachment.data 直接为 NSString(JSON) + NSArray *dataArray = nil; + id raw = attachment.data; + if ([raw isKindOfClass:[NSDictionary class]]) { + id inner = [(NSDictionary *)raw objectForKey:@"data"]; + if ([inner isKindOfClass:[NSArray class]]) { + dataArray = (NSArray *)inner; + } else if ([inner isKindOfClass:[NSString class]]) { + NSData *jsonData = [(NSString *)inner dataUsingEncoding:NSUTF8StringEncoding]; + if (jsonData) { + NSError *err = nil; + id parsed = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&err]; + if (!err && [parsed isKindOfClass:[NSArray class]]) { + dataArray = (NSArray *)parsed; + } + } + } + } else if ([raw isKindOfClass:[NSArray class]]) { + dataArray = (NSArray *)raw; + } else if ([raw isKindOfClass:[NSString class]]) { + NSData *jsonData = [(NSString *)raw dataUsingEncoding:NSUTF8StringEncoding]; + if (jsonData) { + NSError *err = nil; + id parsed = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&err]; + if (!err && [parsed isKindOfClass:[NSArray class]]) { + dataArray = (NSArray *)parsed; + } + } } if (![dataArray isKindOfClass:[NSArray class]]) { - NSLog(@"⚠️ 麦位关系CP消息:消息格式错误,跳过处理"); + NSLog(@"⚠️ 麦位关系CP消息:未能解析为数组,跳过处理"); return; } // 解析CP数据 NSMutableArray *cpList = [NSMutableArray array]; - for (NSDictionary *cpDict in dataArray) { - if ([cpDict isKindOfClass:[NSDictionary class]]) { + for (id item in dataArray) { + if ([item isKindOfClass:[NSDictionary class]]) { + NSDictionary *cpDict = (NSDictionary *)item; MicCpInfoModel *cpInfo = [[MicCpInfoModel alloc] init]; cpInfo.uid = [cpDict[@"uid"] integerValue]; cpInfo.loverUid = [cpDict[@"loverUid"] integerValue]; @@ -2685,14 +2732,24 @@ XPCandyTreeInsufficientBalanceViewDelegate> // 更新当前CP列表 self.currentCpList = cpList.copy; - // 使用 MicMidpointRectManager 处理麦位关系CP消息 + // 使用 MicMidpointRectManager 更新缓存并重绘 MicMidpointRectManager *manager = (MicMidpointRectManager *)[self.stageView performSelector:@selector(midpointRectManager)]; if (manager) { - [manager handleMicRelationshipCPMessage:cpList]; + NSInteger micCount = [self getMicCountForRoomType:self.roomInfo.type]; + [manager updateCpListCacheAndRedraw:cpList + stageView:self.stageView + micCount:micCount + roomType:self.roomInfo.type]; + } else { + // 退化:仅更新本地并重绘 + [self drawSocialStageMidpointRects]; + } + + // 🔧 补强:为了确保不遗漏其他CP(例如 a-b 与 b-c 同时存在),在接收10011后再拉一次当前麦上的完整CP + NSMutableDictionary *currentQueue = [self.stageView getMicroQueue]; + if (currentQueue) { + [self callMicCpListByUidListWithQueue:currentQueue]; } - - // 刷新CP SVGA显示 - [self drawSocialStageMidpointRects]; NSLog(@"🔧 麦位关系CP消息处理完成"); } diff --git a/YuMi/Modules/YMWeb/MSRoomGameWebVC.m b/YuMi/Modules/YMWeb/MSRoomGameWebVC.m index 3d075ceb..dd7ae2e7 100644 --- a/YuMi/Modules/YMWeb/MSRoomGameWebVC.m +++ b/YuMi/Modules/YMWeb/MSRoomGameWebVC.m @@ -340,7 +340,14 @@ NSString * const kJPClose = @"newTppClose"; lang = @"ar-EG"; } else if (isMSPT()) { lang = @"pt-BR"; + } else if (isMSES()) { + lang = @"pt-BR"; + } else if (isMSRU()) { + lang = @"pt-BR"; + } else if (isMSUZ()) { + lang = @"pt-BR"; } + // TODO: 补充多语言 url = [url stringByAppendingFormat:@"%@lang=%@", mark, lang]; return url; } diff --git a/YuMi/ru.lproj/Localizable.strings b/YuMi/ru.lproj/Localizable.strings index 88806610..9d7ba610 100644 --- a/YuMi/ru.lproj/Localizable.strings +++ b/YuMi/ru.lproj/Localizable.strings @@ -2285,7 +2285,7 @@ "XPLoginViewController3" = "Согласитесь по умолчанию и авторизуйте %@ для доступа к текущему номеру телефона"; "XPLoginViewController4" = "Вход выполнен успешно"; "XPLoginViewController5" = "Вход по номеру телефона"; -"XPLoginViewController6" = "Согласиться с Условиями обслуживания и Политикой конфиденциальности"; +"XPLoginViewController6" = "Согласиться с Условия обслуживания и Политика конфиденциальности"; "XPLoginViewController7" = "Условия обслуживания"; "XPLoginViewController8" = " и "; "XPLoginViewController9" = "Политика конфиденциальности"; diff --git a/YuMi/uz-UZ.lproj/Localizable.strings b/YuMi/uz-UZ.lproj/Localizable.strings index 88d693a9..623e0641 100644 --- a/YuMi/uz-UZ.lproj/Localizable.strings +++ b/YuMi/uz-UZ.lproj/Localizable.strings @@ -808,6 +808,197 @@ "XPMineDataClanTableViewCell5" = "Hali hech qanday guildga a'zo emas"; "XPMineDataClanTableViewCell6" = "Profil"; "XPMineDataClanTableViewCell7" = "Burjalar:"; +// TODO: 漏的翻译 start +"XPMineDataClanTableViewCell8" = "Birthday:"; +"XPMineDataClanTableViewCell9" = "Room:"; +"XPMineDataClanTableViewCell10" = "Guild:"; +"XPMineDataClanTableViewCell11" = "This user has not joined any room yet"; +"XPMineDataClanTableViewCell12" = "Not joined any room yet"; +"XPMineDataClanTableViewCell13" = "Region:"; +"XPMineDataClanTableViewCell14" = "More"; + +"XPMineUserInfoGiftWallViewController0" = "Gifts"; +"XPMineUserInfoGiftWallViewController1" = "Normal gifts"; +"XPMineUserInfoGiftWallViewController2" = "Lucky gifts"; +"XPMineUserInfoGiftWallViewController3" = "No photos yet"; +"XPMineUserInfoGiftWallViewController4" = "No gifts yet"; + +"XPMineUserInfoTableViewCell1" = "I am a default signature"; +"XPMineUserInfoTableViewCell2" = "Live"; + + +"XPMineVisitorEmptyTableViewCell0" = "No data"; + +"XPMineVisitorTableViewCell0" = "User nickname"; + +"XPMineRechargeTableViewCell0" = "Coins"; + +"XPMineUserInfoViewController0" = "Report"; +"XPMineUserInfoViewController1" = "Block User"; +"XPMineUserInfoViewController2" = "Remove from Blacklist"; +"XPMineUserInfoViewController3" = "By removing from blacklist, you will receive messages from this user as usual"; +"XPMineUserInfoViewController4" = "Add to Blacklist"; +"XPMineUserInfoViewController5" = "By adding to blacklist, you will no longer receive messages from this user"; +"XPMineUserInfoViewController6" = "Removed from blacklist successfully"; +"XPMineUserInfoViewController7" = "Added to blacklist successfully"; +"XPMineUserInfoViewController8" = "Chat"; +"XPMineUserInfoViewController9" = "Follow"; +"XPMineUserInfoViewController10" = "Following"; +"XPMineUserInfoViewController11" = "Profile"; +"XPMineUserInfoViewController12" = "Posts"; +"XPMineUserInfoViewController13" = "Gift Wall"; + +"XPMineUserInfoAlbumViewController0" = "My Albums"; +"XPMineUserInfoAlbumViewController1" = "Upload from Camera"; +"XPMineUserInfoAlbumViewController3" = "Camera access restricted. Tap OK to go to system settings"; +"XPMineUserInfoAlbumViewController5" = "Photo library access restricted. Tap OK to go to system settings"; +"XPMineUserInfoAlbumViewController6" = "Local Album"; +"XPMineUserInfoAlbumViewController8" = "Photo library access restricted. Tap OK to go to system settings"; +"XPMineUserInfoAlbumViewController10" = "Photo library access restricted. Tap OK to go to system settings"; +"XPMineUserInfoAlbumViewController11" = "You can only upload up to 8 photos"; +"XPMineUserInfoAlbumViewController12" = "Deletion is irreversible"; +"XPMineUserInfoAlbumViewController13" = "Do you want to delete?"; +"XPMineUserInfoAlbumViewController14" = "Photo under review, will be uploaded automatically after approval"; +"XPMineUserInfoAlbumViewController15" = "Deleted successfully"; +"XPMineUserInfoAlbumViewController16" = "Edit"; +"XPMineUserInfoAlbumViewController17" = "Done"; + +"XPMineUserDataViewController0" = "Application submitted, waiting for admin approval"; +"XPMineUserDataViewController1" = "Posts"; +"XPMineUserDataViewController2" = "Default posts cannot be liked"; +"XPMineUserDataViewController3" = "Default posts cannot be commented"; + +"XPMineSimpleUserInfoViewController0" = "Report"; +"XPMineSimpleUserInfoViewController1" = "We have received your request and will process it as soon as possible"; +"XPMineSimpleUserInfoViewController2" = "Block"; +"XPMineSimpleUserInfoViewController3" = "Remove from Blacklist"; +"XPMineSimpleUserInfoViewController4" = "By removing from blacklist, you will receive messages from this user as usual"; +"XPMineSimpleUserInfoViewController5" = "Add to Blacklist"; +"XPMineSimpleUserInfoViewController6" = "By adding to blacklist, you will no longer receive messages from this user"; +"XPMineSimpleUserInfoViewController7" = "Removed from blacklist successfully"; +"XPMineSimpleUserInfoViewController8" = "Added to blacklist successfully"; +"XPMineSimpleUserInfoViewController9" = "Chat with them"; +"XPMineSimpleUserInfoViewController10" = "Follow"; +"XPMineSimpleUserInfoViewController11" = "Following"; + +"XPMineUserInfoDesViewController0" = "Edit Personal Introduction"; +"XPMineUserInfoDesViewController1" = "Maximum %ld characters"; +"XPMineUserInfoDesViewController2" = "Write a self-introduction to let others know more about you~"; +"XPMineUserInfoDesViewController3" = "Done"; + +"XPMineUserInfoEditViewController0" = "Edit Profile"; +"XPMineUserInfoEditViewController1" = "Upload from Camera"; +"XPMineUserInfoEditViewController2" = "Camera unavailable"; +"XPMineUserInfoEditViewController3" = "Camera access restricted. Tap OK to go to system settings"; +"XPMineUserInfoEditViewController4" = "Camera unavailable"; +"XPMineUserInfoEditViewController5" = "Photo library access restricted. Tap OK to go to system settings"; +"XPMineUserInfoEditViewController6" = "Local Album"; +"XPMineUserInfoEditViewController7" = "Photo library access restricted. Tap OK to go to system settings"; +"XPMineUserInfoEditViewController8" = "Photo library access restricted. Tap OK to go to system settings"; +"XPMineUserInfoEditViewController9" = "Profile under review"; +"XPMineUserInfoEditViewController10" = "Profile under review, will be applied automatically after approval"; +"XPMineUserInfoEditViewController11" = "Updated successfully"; +"XPMineUserInfoEditViewController12" = "Avatar has been submitted for review, it will be automatically applied upon approval"; +"XPMineUserInfoEditViewController13" = "Update successful"; + + +"XPMineUserInfoNickViewController0" = "Edit Nickname"; +"XPMineUserInfoNickViewController1" = "Maximum character limit reached"; +"XPMineUserInfoNickViewController2" = "Maximum character limit reached"; +"XPMineUserInfoNickViewController3" = "Done"; + +"XPMineUserInfoGiftWallViewController0" = "Gifts"; + + +"XPMineVisitorViewController0" = "No more visitor records"; +"XPMineVisitorViewController1" = "Visitor records"; +"XPMineVisitorViewController2" = "No visitor records yet"; + +"XPMineViewController0" = "To create a safer online environment and protect your and others' property security, please complete real-name authentication first."; + +"XPMineViewController2" = "Real-name Authentication"; + +"XPSimpleMineViewController0" = "You don't have any guild yet"; +"XPSimpleMineViewController1" = "My Guild"; +"XPSimpleMineViewController2" = "Personalize"; +"XPSimpleMineViewController3" = "Fan Clubs"; +"XPSimpleMineViewController4" = "Teen Mode"; +"XPSimpleMineViewController5" = "Feedback"; +"XPSimpleMineViewController6" = "Settings"; + +"XPIAPRechargeHeaderView0" = "My Coins"; + +"XPIAPRechargeViewController0" = "Purchase Failed"; +"XPIAPRechargeViewController1" = "Unknown error occurred, please try again"; +"XPIAPRechargeViewController2" = "Confirm Recharge"; +"XPIAPRechargeViewController3" = "《User Recharge Agreement》"; +"XPIAPRechargeViewController4" = "I have read and agree"; +"XPIAPRechargeViewController5" = "For any questions, please contact customer service, MoliStar ID"; +"XPIAPRechargeViewController6" = "My Account"; +"XPIAPRechargeViewController7" = "Reminder"; +"XPIAPRechargeViewController8" = "Recharge failed. Please contact customer service for assistance."; +"XPIAPRechargeViewController9" = "Contact Customer Service"; +"XPIAPRechargeViewController10" = "Recharge failed. Currently only devices running iOS 15 and above can recharge. Please upgrade your system and try again."; +"XPIAPRechargeViewController11" = "Please select the number of Coins to be recharged"; + + +"XPMineRechargeViewController0" = "Purchase Failed"; +"XPMineRechargeViewController1" = "Unknown error occurred, please try again"; +"XPMineRechargeViewController2" = "《User Recharge Agreement"; +"XPMineRechargeViewController3" = "I have read and agree"; + +"XPMinePayPwdViewController0" = "Set Payment Password"; +"XPMinePayPwdViewController1" = "Failed to get phone number"; +"XPMinePayPwdViewController2" = "Verification code sent successfully"; +"XPMinePayPwdViewController3" = "Payment password set successfully"; +"XPMinePayPwdViewController4" = "Payment password must be 6-digit number"; +"XPMinePayPwdViewController5" = "Payment password must be numeric"; +"XPMinePayPwdViewController6" = "Passwords entered do not match"; +"XPMinePayPwdViewController7" = "Enter verification code"; + +"XPMinePayPwdViewController9" = "Verification code sent to your bound phone %@****%@"; +"XPMinePayPwdViewController10" = "Enter payment password"; +"XPMinePayPwdViewController11" = "Confirm payment password"; + +"XPMineBlackListViewController0" = "Blacklist"; +"XPMineBlackListViewController1" = "Remove"; + +"XPMineResetPayPwdViewController0" = "Reset Payment Password"; +"XPMineResetPayPwdViewController1" = "Payment password reset successfully"; +"XPMineResetPayPwdViewController2" = "Passwords entered do not match"; +"XPMineResetPayPwdViewController3" = "Enter payment password"; +"XPMineResetPayPwdViewController4" = "Confirm payment password"; + + +"XPMineSettingViewController0" = "Settings"; +"XPMineSettingViewController1" = "Please bind your phone number first"; +"XPMineSettingViewController2" = "Clear Cache"; +"XPMineSettingViewController3" = "Do you want to clear cache?"; +"XPMineSettingViewController4" = "Cache cleared"; +"XPMineSettingViewController5" = "Currently updated to the latest version"; +"XPMineSettingViewController6" = "Currently updated to the latest version"; +"XPMineSettingViewController7" = "Log out of current account"; +"XPMineSettingViewController8" = "Log out"; +"XPMineSettingViewController9" = "Set Login Password"; +"XPMineSettingViewController10" = "To facilitate your next login, please set a login password first"; + +"XPMineModifPayPwdViewController0" = "Modify Payment Password"; +"XPMineModifPayPwdViewController1" = "Payment password modified successfully"; +"XPMineModifPayPwdViewController2" = "Passwords entered do not match"; +"XPMineModifPayPwdViewController3" = "New payment password must be numeric"; +"XPMineModifPayPwdViewController4" = "Enter current payment password"; +"XPMineModifPayPwdViewController5" = "Enter payment password"; +"XPMineModifPayPwdViewController6" = "Confirm payment password"; + +"XPMineModifPayPwdViewController8" = "Forgot Password"; + +"XPMineFeedbackViewController0" = "Feedback"; +"XPMineFeedbackViewController1" = "Thank you for your valuable feedback, let's work together to create a better"; +"XPMineFeedbackViewController2" = "Problem Description"; +"XPMineFeedbackViewController3" = "Please describe in detail the problems and situations you encountered. Thank you for your valuable feedback."; +"XPMineFeedbackViewController4" = "Please enter your contact information"; +"XPMineFeedbackViewController5" = "Submit Feedback"; +// TODO: 漏的翻译 end "XPMineAboutUsViewController0" = "Haqida"; "XPMineNotificaViewController0" = "Bildirishnoma sozlamalari"; @@ -2099,7 +2290,7 @@ Tasdiqlangandan so'ng, sekretar sizga uni chop etishda yordam beradi va sizni xa "XPLoginViewController3" = "Standartga rozi bo'ling va %@ ga joriy telefon raqamiga kirishga ruxsat bering"; "XPLoginViewController4" = "Login successful"; "XPLoginViewController5" = "Phone Number Login"; -"XPLoginViewController6" = "Foydalanuvchi xizmatlari shartlari va maxfiylik siyosatiga rozilik berish"; +"XPLoginViewController6" = "Foydalanuvchi xizmatlari shartlari va Maxfiylik siyosati rozilik berish"; "XPLoginViewController7" = "Foydalanuvchi xizmatlari shartlari"; "XPLoginViewController8" = " va "; "XPLoginViewController9" = "Maxfiylik siyosati";