更新 LoginViewController 和 XPRoomViewController,调整布局约束和新增 CP 逻辑处理,优化数据解析和错误处理。为 MicMidpointRectManager 增加有效配对逻辑,确保中点矩形绘制的准确性。同时,更新多语言支持,补充缺失的翻译字符串,提升用户体验和代码可维护性。

This commit is contained in:
edwinQQQ
2025-09-15 17:35:16 +08:00
parent 6470c642eb
commit 644639dd9a
7 changed files with 327 additions and 64 deletions

View File

@@ -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())) {

View File

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

View File

@@ -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<NSArray<NSNumber *> *> *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<NSNumber *> *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<MicroViewProtocol> *firstView = [stageView findMicroViewByIndex:firstIndex];
UIView<MicroViewProtocol> *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 ?: @[]];
}

View File

@@ -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;
// 🔧 退CPCP SVGA
if (content.source && content.source.userId.length > 0) {
NSInteger exitUid = content.source.userId.integerValue;
if (exitUid > 0) {
[self removeCpDataForUids:@[@(exitUid)]];
// CP
NSMutableDictionary<NSString *,MicroQueueModel *> *currentQueue = [self.stageView getMicroQueue];
if (currentQueue) {
NSMutableArray<NSString *> *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<MicCpInfoModel *> *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 10011CP
NSMutableDictionary<NSString *,MicroQueueModel *> *currentQueue = [self.stageView getMicroQueue];
if (currentQueue) {
[self callMicCpListByUidListWithQueue:currentQueue];
}
// CP SVGA
[self drawSocialStageMidpointRects];
NSLog(@"🔧 麦位关系CP消息处理完成");
}

View File

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

View File

@@ -2285,7 +2285,7 @@
"XPLoginViewController3" = "Согласитесь по умолчанию и авторизуйте %@ для доступа к текущему номеру телефона";
"XPLoginViewController4" = "Вход выполнен успешно";
"XPLoginViewController5" = "Вход по номеру телефона";
"XPLoginViewController6" = "Согласиться с Условиями обслуживания и Политикой конфиденциальности";
"XPLoginViewController6" = "Согласиться с Условия обслуживания и Политика конфиденциальности";
"XPLoginViewController7" = "Условия обслуживания";
"XPLoginViewController8" = " и ";
"XPLoginViewController9" = "Политика конфиденциальности";

View File

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