diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index 06deee6..8be1815 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -462,6 +462,9 @@ 4C75CF002D633C27009147A5 /* CP进场.svga in Resources */ = {isa = PBXBuildFile; fileRef = 4C75CEFF2D633C27009147A5 /* CP进场.svga */; }; 4C7989EF2D195277006AE07B /* RoomModeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7989EE2D195277006AE07B /* RoomModeViewController.m */; }; 4C7989F32D1952DA006AE07B /* RoomModePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7989F22D1952DA006AE07B /* RoomModePresenter.m */; }; + 4C7B8F632E9F6E1300A5E236 /* EPSignatureColorGuideView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B8F622E9F6E1300A5E236 /* EPSignatureColorGuideView.m */; }; + 4C7B90982E9F70FC00A5E236 /* ep_splash.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C7B90972E9F70FC00A5E236 /* ep_splash.png */; }; + 4C7B909B2E9F822900A5E236 /* EPEmotionColorWheelView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7B909A2E9F822900A5E236 /* EPEmotionColorWheelView.m */; }; 4C7F2A672E0BE0AB002F5058 /* FirstRechargeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7F2A662E0BE0AB002F5058 /* FirstRechargeModel.m */; }; 4C7F2A6B2E0BE7E7002F5058 /* FirstRechargeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7F2A6A2E0BE7E7002F5058 /* FirstRechargeManager.m */; }; 4C815A172CFEB758002A46A6 /* SuperBlockViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C815A162CFEB758002A46A6 /* SuperBlockViewController.m */; }; @@ -2560,6 +2563,11 @@ 4C7989EE2D195277006AE07B /* RoomModeViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomModeViewController.m; sourceTree = ""; }; 4C7989F12D1952DA006AE07B /* RoomModePresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomModePresenter.h; sourceTree = ""; }; 4C7989F22D1952DA006AE07B /* RoomModePresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomModePresenter.m; sourceTree = ""; }; + 4C7B8F612E9F6E1300A5E236 /* EPSignatureColorGuideView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EPSignatureColorGuideView.h; sourceTree = ""; }; + 4C7B8F622E9F6E1300A5E236 /* EPSignatureColorGuideView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EPSignatureColorGuideView.m; sourceTree = ""; }; + 4C7B90972E9F70FC00A5E236 /* ep_splash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ep_splash.png; sourceTree = ""; }; + 4C7B90992E9F822900A5E236 /* EPEmotionColorWheelView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EPEmotionColorWheelView.h; sourceTree = ""; }; + 4C7B909A2E9F822900A5E236 /* EPEmotionColorWheelView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EPEmotionColorWheelView.m; sourceTree = ""; }; 4C7F2A652E0BE0AB002F5058 /* FirstRechargeModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FirstRechargeModel.h; sourceTree = ""; }; 4C7F2A662E0BE0AB002F5058 /* FirstRechargeModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FirstRechargeModel.m; sourceTree = ""; }; 4C7F2A692E0BE7E7002F5058 /* FirstRechargeManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FirstRechargeManager.h; sourceTree = ""; }; @@ -5081,6 +5089,7 @@ 2368ECD52BC38FDA00EDF4C9 /* Launch Screen.storyboard */, 237700CE2BC697D400D661F1 /* pi_login_new_logo.png */, 237FD35C2C0F187B00B5335C /* pi_app_logo_new_bg.png */, + 4C7B90972E9F70FC00A5E236 /* ep_splash.png */, 2396FCE32B22BE5D0014021D /* pi_area_info.json */, 189DD53D26DE255600AB55B1 /* Info.plist */, 2368ECD72BC38FED00EDF4C9 /* PrivacyInfo.xcprivacy */, @@ -6421,6 +6430,10 @@ 4C06427B2E97BD6D00BAF413 /* Views */ = { isa = PBXGroup; children = ( + 4C7B90992E9F822900A5E236 /* EPEmotionColorWheelView.h */, + 4C7B909A2E9F822900A5E236 /* EPEmotionColorWheelView.m */, + 4C7B8F612E9F6E1300A5E236 /* EPSignatureColorGuideView.h */, + 4C7B8F622E9F6E1300A5E236 /* EPSignatureColorGuideView.m */, 4CDF7F402E9E581900113F54 /* EPEmotionColorPicker.h */, 4CDF7F412E9E581900113F54 /* EPEmotionColorPicker.m */, 4C0642972E98F77900BAF413 /* EPMomentListView.h */, @@ -11688,6 +11701,7 @@ 23CEFC582AFB8FC100576D89 /* pay_on@3x.png in Resources */, 23FF25622ABAE6310064E904 /* pi_room_game_fine_love.svga in Resources */, 23FF42672AA5CFBB0055733C /* home_sound_wave.gif in Resources */, + 4C7B90982E9F70FC00A5E236 /* ep_splash.png in Resources */, 4C1392A12D71675900A6DFB5 /* coincoin.mp4 in Resources */, E80E09A92A40B70100CD2BE7 /* Localizable.strings in Resources */, 4CACCCE42D9A695000CCB135 /* brove_gift.svga in Resources */, @@ -12741,6 +12755,7 @@ 4CD47BC92E61A78D00BCDA46 /* XPRoomSettingAction.m in Sources */, E82D5C7A276B25D100858D6D /* SpriteSheetImageManager.m in Sources */, E85E7BB02A4EC99300B6D00A /* Api+GiveDiamond.m in Sources */, + 4C7B909B2E9F822900A5E236 /* EPEmotionColorWheelView.m in Sources */, E874B88B27215EAF003954B9 /* MicroQueueModel.m in Sources */, 9B1B72B828003772003FACE9 /* XPAnchorPKPresenter.m in Sources */, E8EE827D272B9A2300A17217 /* XPRoomSendTextView.m in Sources */, @@ -12789,6 +12804,7 @@ E8D48250278D68BA003C1D08 /* XPAcrossRoomPKPanelView.m in Sources */, 18F404C3276098F100A6C548 /* Api+Message.m in Sources */, 9B85B6D7279FDABA00A0A1AC /* XPUserCardSkillCardView.m in Sources */, + 4C7B8F632E9F6E1300A5E236 /* EPSignatureColorGuideView.m in Sources */, 9B33E3CB27D85379003B0E62 /* UploadFile.m in Sources */, E8AEAEF327141C7C0017FCE0 /* XPRoomMessageContainerView.m in Sources */, 9B1B729D28002264003FACE9 /* XPMineAnchorFansTeamModel.m in Sources */, @@ -13544,7 +13560,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7DB00EC07F1D0ADFF900B38D /* Pods-YuMi.debug.xcconfig */; buildSettings = { - APP_DISPLAY_NAME = "Moli DEBUG"; + APP_DISPLAY_NAME = "E-Parti DEBUG"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = YuMi/YuMi.entitlements; @@ -13553,7 +13569,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 48UCG35Q9W; + DEVELOPMENT_TEAM = Z7UCRF23F3; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -13787,7 +13803,7 @@ "-weak_framework", "\"AuthenticationServices\"", ); - PRODUCT_BUNDLE_IDENTIFIER = com.peko.enterprise.ios; + PRODUCT_BUNDLE_IDENTIFIER = com.junpeiqi.eparty; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -13805,7 +13821,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = B66633E061B1B34177CD011C /* Pods-YuMi.release.xcconfig */; buildSettings = { - APP_DISPLAY_NAME = MoliStar; + APP_DISPLAY_NAME = "E-Parti"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = YuMi/YuMiRelease.entitlements; diff --git a/YuMi/Appdelegate/AppDelegate+ThirdConfig.m b/YuMi/Appdelegate/AppDelegate+ThirdConfig.m index 2dff5f9..9318261 100644 --- a/YuMi/Appdelegate/AppDelegate+ThirdConfig.m +++ b/YuMi/Appdelegate/AppDelegate+ThirdConfig.m @@ -177,6 +177,8 @@ UIKIT_EXTERN NSString * adImageName; 设置广告页 */ - (void)setupLaunchADView { + return; + NSUserDefaults * kUserDefaults = NSUserDefaults.standardUserDefaults; // 判断沙盒中是否存在广告图片,如果存在,直接显示 NSString *adName = [kUserDefaults stringForKey:adImageName]; diff --git a/YuMi/Appdelegate/AppDelegate.m b/YuMi/Appdelegate/AppDelegate.m index 01edb55..62c37d0 100644 --- a/YuMi/Appdelegate/AppDelegate.m +++ b/YuMi/Appdelegate/AppDelegate.m @@ -25,6 +25,8 @@ #import "LoginFullInfoViewController.h" #import "UIView+VAP.h" #import "SocialShareManager.h" +#import "EPSignatureColorGuideView.h" +#import "EPEmotionColorStorage.h" UIKIT_EXTERN NSString * const kOpenRoomNotification; @@ -130,11 +132,58 @@ void qg_VAP_Logger_handler(VAPLogLevel level, const char* file, int line, const [self toLoginPage]; }else{ [self toHomeTabbarPage]; + + // 延迟检查专属颜色(等待 window 初始化完成) + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self checkAndShowSignatureColorGuide]; + }); } [[ClientConfig shareConfig] clientInit]; } +/// 检查并显示专属颜色引导页 +- (void)checkAndShowSignatureColorGuide { + UIWindow *keyWindow = [self getKeyWindow]; + if (!keyWindow) return; + + BOOL hasSignatureColor = [EPEmotionColorStorage hasUserSignatureColor]; + +#if DEBUG + // Debug 环境:总是显示引导页 + NSLog(@"[AppDelegate] Debug 模式:显示专属颜色引导页(已有颜色: %@)", hasSignatureColor ? @"YES" : @"NO"); + + EPSignatureColorGuideView *guideView = [[EPSignatureColorGuideView alloc] init]; + + // 设置颜色确认回调 + guideView.onColorConfirmed = ^(NSString *hexColor) { + [EPEmotionColorStorage saveUserSignatureColor:hexColor]; + NSLog(@"[AppDelegate] 用户选择专属颜色: %@", hexColor); + }; + + // 如果已有颜色,设置 Skip 回调 + if (hasSignatureColor) { + guideView.onSkipTapped = ^{ + NSLog(@"[AppDelegate] 用户跳过专属颜色选择"); + }; + } + + // 显示引导页,已有颜色时显示 Skip 按钮 + [guideView showInWindow:keyWindow showSkipButton:hasSignatureColor]; + +#else + // Release 环境:仅在未设置专属颜色时显示 + if (!hasSignatureColor) { + EPSignatureColorGuideView *guideView = [[EPSignatureColorGuideView alloc] init]; + guideView.onColorConfirmed = ^(NSString *hexColor) { + [EPEmotionColorStorage saveUserSignatureColor:hexColor]; + NSLog(@"[AppDelegate] 用户选择专属颜色: %@", hexColor); + }; + [guideView showInWindow:keyWindow]; + } +#endif +} + - (void)toLoginPage { // 使用新的 Swift 登录页面 EPLoginViewController *lvc = [[EPLoginViewController alloc] init]; diff --git a/YuMi/Base.lproj/Launch Screen.storyboard b/YuMi/Base.lproj/Launch Screen.storyboard index 39b3fa6..5a6de06 100644 --- a/YuMi/Base.lproj/Launch Screen.storyboard +++ b/YuMi/Base.lproj/Launch Screen.storyboard @@ -1,9 +1,9 @@ - + - + @@ -16,46 +16,26 @@ - - - - - - - - - - - - - + + - - - - - - - + + + + - + - - + diff --git a/YuMi/E-P/NewLogin/Controllers/EPLoginViewController.swift b/YuMi/E-P/NewLogin/Controllers/EPLoginViewController.swift index 59bf780..03d0d0a 100644 --- a/YuMi/E-P/NewLogin/Controllers/EPLoginViewController.swift +++ b/YuMi/E-P/NewLogin/Controllers/EPLoginViewController.swift @@ -134,10 +134,16 @@ import UIKit agreeCheckbox.addTarget(self, action: #selector(togglePolicyCheckbox), for: .touchUpInside) policyLabel.onUserAgreementTapped = { [weak self] in - self?.openPolicy(url: "https://example.com/user-agreement") + print("[EPLogin] User agreement tapped callback triggered") + let url = self?.getUserAgreementURL() ?? "" + print("[EPLogin] User agreement URL: \(url)") + self?.openPolicyInExternalBrowser(url) } policyLabel.onPrivacyPolicyTapped = { [weak self] in - self?.openPolicy(url: "https://example.com/privacy-policy") + print("[EPLogin] Privacy policy tapped callback triggered") + let url = self?.getPrivacyPolicyURL() ?? "" + print("[EPLogin] Privacy policy URL: \(url)") + self?.openPolicyInExternalBrowser(url) } agreeCheckbox.snp.makeConstraints { make in @@ -209,10 +215,35 @@ import UIKit } #endif - private func openPolicy(url: String) { - let webVC = XPWebViewController(roomUID: nil) - webVC.url = url - navigationController?.pushViewController(webVC, animated: true) + private func openPolicyInExternalBrowser(_ urlString: String) { + print("[EPLogin] Original URL: \(urlString)") + + // 如果不是完整 URL,拼接域名(参考 XPWebViewController.m 第 697-698 行) + var fullUrl = urlString + if !urlString.hasPrefix("http") && !urlString.hasPrefix("https") { + let hostUrl = HttpRequestHelper.getHostUrl() + fullUrl = "\(hostUrl)/\(urlString)" + print("[EPLogin] Added host URL, full URL: \(fullUrl)") + } + + print("[EPLogin] Opening URL in external browser: \(fullUrl)") + + guard let url = URL(string: fullUrl) else { + print("[EPLogin] ❌ Invalid URL: \(fullUrl)") + return + } + + print("[EPLogin] URL object created: \(url)") + + // 在外部浏览器中打开 + if UIApplication.shared.canOpenURL(url) { + print("[EPLogin] ✅ Can open URL, attempting to open...") + UIApplication.shared.open(url, options: [:]) { success in + print("[EPLogin] Open external browser: \(success ? "✅ Success" : "❌ Failed")") + } + } else { + print("[EPLogin] ❌ Cannot open URL: \(fullUrl)") + } } // MARK: - Helpers @@ -227,6 +258,22 @@ import UIKit } } + /// 获取用户协议 URL + private func getUserAgreementURL() -> String { + // kUserProtocalURL 对应枚举值 4 + let url = URLWithType(URLType(rawValue: 4)!) as String + print("[EPLogin] User agreement URL from URLWithType: \(url)") + return url + } + + /// 获取隐私政策 URL + private func getPrivacyPolicyURL() -> String { + // kPrivacyURL 对应枚举值 0 + let url = URLWithType(URLType(rawValue: 0)!) as String + print("[EPLogin] Privacy policy URL from URLWithType: \(url)") + return url + } + private func checkPolicyAgreed() -> Bool { if !agreeCheckbox.isSelected { // Phase 2: 显示提示 diff --git a/YuMi/E-P/NewLogin/Services/EPLoginManager.swift b/YuMi/E-P/NewLogin/Services/EPLoginManager.swift index 23f096e..c4fe407 100644 --- a/YuMi/E-P/NewLogin/Services/EPLoginManager.swift +++ b/YuMi/E-P/NewLogin/Services/EPLoginManager.swift @@ -45,6 +45,11 @@ import UIKit if let window = getKeyWindow() { window.rootViewController = epTabBar window.makeKeyAndVisible() + + // 延迟检查专属颜色(登录成功后引导) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { + Self.checkAndShowSignatureColorGuide(in: window) + } } print("[EPLoginManager] 登录成功,已切换到 EPTabBarController") @@ -61,6 +66,11 @@ import UIKit if let window = getKeyWindow() { window.rootViewController = epTabBar window.makeKeyAndVisible() + + // 延迟检查专属颜色(登录成功后引导) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { + Self.checkAndShowSignatureColorGuide(in: window) + } } print("[EPLoginManager] Ticket 请求失败,仍跳转到首页") @@ -98,5 +108,44 @@ import UIKit } return nil } + + /// 检查并显示专属颜色引导页 + private static func checkAndShowSignatureColorGuide(in window: UIWindow) { + let hasSignatureColor = EPEmotionColorStorage.hasUserSignatureColor() + + #if DEBUG + // Debug 环境:总是显示引导页 + print("[EPLoginManager] Debug 模式:显示专属颜色引导页(已有颜色: \(hasSignatureColor))") + + let guideView = EPSignatureColorGuideView() + + // 设置颜色确认回调 + guideView.onColorConfirmed = { (hexColor: String) in + EPEmotionColorStorage.saveUserSignatureColor(hexColor) + print("[EPLoginManager] 用户选择专属颜色: \(hexColor)") + } + + // 如果已有颜色,设置 Skip 回调 + if hasSignatureColor { + guideView.onSkipTapped = { + print("[EPLoginManager] 用户跳过专属颜色选择") + } + } + + // 显示引导页,已有颜色时显示 Skip 按钮 + guideView.show(in: window, showSkipButton: hasSignatureColor) + + #else + // Release 环境:仅在未设置专属颜色时显示 + if !hasSignatureColor { + let guideView = EPSignatureColorGuideView() + guideView.onColorConfirmed = { (hexColor: String) in + EPEmotionColorStorage.saveUserSignatureColor(hexColor) + print("[EPLoginManager] 用户选择专属颜色: \(hexColor)") + } + guideView.show(in: window) + } + #endif + } } diff --git a/YuMi/E-P/NewLogin/Views/EPPolicyLabel.swift b/YuMi/E-P/NewLogin/Views/EPPolicyLabel.swift index 50bc3f4..66ecbf1 100644 --- a/YuMi/E-P/NewLogin/Views/EPPolicyLabel.swift +++ b/YuMi/E-P/NewLogin/Views/EPPolicyLabel.swift @@ -45,17 +45,17 @@ class EPPolicyLabel: UILabel { value: UIFont.systemFont(ofSize: 12), range: NSRange(location: 0, length: fullText.count)) - // 高亮用户协议 + // 高亮用户协议(蓝色) if let userRange = fullText.range(of: userAgreementText) { let nsRange = NSRange(userRange, in: fullText) - attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black, range: nsRange) + attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.systemBlue, range: nsRange) attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: nsRange) } - // 高亮隐私政策 + // 高亮隐私政策(蓝色) if let privacyRange = fullText.range(of: privacyPolicyText) { let nsRange = NSRange(privacyRange, in: fullText) - attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black, range: nsRange) + attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.systemBlue, range: nsRange) attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: nsRange) } @@ -69,14 +69,20 @@ class EPPolicyLabel: UILabel { // MARK: - Actions @objc private func handleTap(_ gesture: UITapGestureRecognizer) { - guard let text = self.text else { return } + guard let attributedText = self.attributedText else { + print("[EPPolicyLabel] No attributed text") + return + } + let text = attributedText.string let userAgreementText = YMLocalizedString("XPLoginViewController7") let privacyPolicyText = YMLocalizedString("XPLoginViewController9") + print("[EPPolicyLabel] Tap detected, text: \(text)") + let layoutManager = NSLayoutManager() let textContainer = NSTextContainer(size: bounds.size) - let textStorage = NSTextStorage(attributedString: attributedText ?? NSAttributedString()) + let textStorage = NSTextStorage(attributedString: attributedText) layoutManager.addTextContainer(textContainer) textStorage.addLayoutManager(layoutManager) @@ -94,10 +100,14 @@ class EPPolicyLabel: UILabel { in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil) + print("[EPPolicyLabel] Character index: \(indexOfCharacter)") + // 检查点击位置 if let userRange = text.range(of: userAgreementText) { let nsRange = NSRange(userRange, in: text) + print("[EPPolicyLabel] User agreement range: \(nsRange)") if NSLocationInRange(indexOfCharacter, nsRange) { + print("[EPPolicyLabel] User agreement tapped!") onUserAgreementTapped?() return } @@ -105,11 +115,15 @@ class EPPolicyLabel: UILabel { if let privacyRange = text.range(of: privacyPolicyText) { let nsRange = NSRange(privacyRange, in: text) + print("[EPPolicyLabel] Privacy policy range: \(nsRange)") if NSLocationInRange(indexOfCharacter, nsRange) { + print("[EPPolicyLabel] Privacy policy tapped!") onPrivacyPolicyTapped?() return } } + + print("[EPPolicyLabel] No link tapped") } } diff --git a/YuMi/E-P/NewMine/Views/EPMineHeaderView.m b/YuMi/E-P/NewMine/Views/EPMineHeaderView.m index b1960f1..ccd14d5 100644 --- a/YuMi/E-P/NewMine/Views/EPMineHeaderView.m +++ b/YuMi/E-P/NewMine/Views/EPMineHeaderView.m @@ -9,6 +9,7 @@ #import "EPMineHeaderView.h" #import #import +#import "EPEmotionColorStorage.h" @interface EPMineHeaderView () @@ -39,11 +40,15 @@ // 大圆形头像 self.avatarImageView = [[UIImageView alloc] init]; self.avatarImageView.layer.cornerRadius = 60; - self.avatarImageView.layer.masksToBounds = YES; + self.avatarImageView.layer.masksToBounds = NO; // 改为 NO 以显示阴影 self.avatarImageView.layer.borderWidth = 3; self.avatarImageView.layer.borderColor = [UIColor whiteColor].CGColor; self.avatarImageView.backgroundColor = [UIColor whiteColor]; self.avatarImageView.contentMode = UIViewContentModeScaleAspectFill; + + // 为了同时显示圆角和阴影,需要设置 clipsToBounds + self.avatarImageView.clipsToBounds = YES; + [self addSubview:self.avatarImageView]; [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { @@ -111,6 +116,53 @@ // 使用默认头像 self.avatarImageView.image = [UIImage imageNamed:@"default_avatar"]; } + + // 应用用户专属情绪颜色 + [self applyUserSignatureColor]; +} + +/// 应用用户专属情绪颜色到头像边框和阴影 +- (void)applyUserSignatureColor { + NSString *signatureColor = [EPEmotionColorStorage userSignatureColor]; + + if (signatureColor) { + // 有专属颜色,使用该颜色 + UIColor *color = [self colorFromHex:signatureColor]; + + // 设置边框颜色 + self.avatarImageView.layer.borderColor = color.CGColor; + self.avatarImageView.layer.borderWidth = 4; // 稍微加粗边框 + + // 设置阴影(使用情绪颜色) + self.avatarImageView.layer.shadowColor = color.CGColor; + self.avatarImageView.layer.shadowOffset = CGSizeMake(0, 4); + self.avatarImageView.layer.shadowOpacity = 0.6; + self.avatarImageView.layer.shadowRadius = 12; + + NSLog(@"[EPMineHeaderView] 应用专属颜色: %@", signatureColor); + } else { + // 没有专属颜色,使用默认白色边框 + self.avatarImageView.layer.borderColor = [UIColor whiteColor].CGColor; + self.avatarImageView.layer.borderWidth = 3; + + // 默认轻微阴影 + self.avatarImageView.layer.shadowColor = [UIColor blackColor].CGColor; + self.avatarImageView.layer.shadowOffset = CGSizeMake(0, 2); + self.avatarImageView.layer.shadowOpacity = 0.2; + self.avatarImageView.layer.shadowRadius = 8; + } +} + +/// Hex 转 UIColor +- (UIColor *)colorFromHex:(NSString *)hexString { + unsigned rgbValue = 0; + NSScanner *scanner = [NSScanner scannerWithString:hexString]; + [scanner setScanLocation:1]; // 跳过 # + [scanner scanHexInt:&rgbValue]; + return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 + green:((rgbValue & 0xFF00) >> 8)/255.0 + blue:(rgbValue & 0xFF)/255.0 + alpha:1.0]; } - (void)settingsButtonTapped { diff --git a/YuMi/E-P/NewMoments/Controllers/EPMomentPublishViewController.m b/YuMi/E-P/NewMoments/Controllers/EPMomentPublishViewController.m index 7dcb63c..1b67b4d 100644 --- a/YuMi/E-P/NewMoments/Controllers/EPMomentPublishViewController.m +++ b/YuMi/E-P/NewMoments/Controllers/EPMomentPublishViewController.m @@ -47,6 +47,19 @@ NSString *const EPMomentPublishSuccessNotification = @"EPMomentPublishSuccessNot [super viewDidLoad]; self.view.backgroundColor = [UIColor colorWithRed:0x0C/255.0 green:0x05/255.0 blue:0x27/255.0 alpha:1.0]; [self setupUI]; + + // 自动加载用户专属颜色 + [self loadUserSignatureColor]; +} + +/// 加载用户专属颜色作为默认选中 +- (void)loadUserSignatureColor { + NSString *signatureColor = [EPEmotionColorStorage userSignatureColor]; + if (signatureColor) { + self.selectedEmotionColor = signatureColor; + [self updateEmotionButtonAppearance]; + NSLog(@"[Publish] 自动选中专属颜色: %@", signatureColor); + } } - (void)setupUI { @@ -131,6 +144,10 @@ NSString *const EPMomentPublishSuccessNotification = @"EPMomentPublishSuccessNot - (void)onEmotionButtonTapped { EPEmotionColorPicker *picker = [[EPEmotionColorPicker alloc] init]; + + // 预选中当前颜色(如果有) + picker.preselectedColor = self.selectedEmotionColor; + __weak typeof(self) weakSelf = self; picker.onColorSelected = ^(NSString *hexColor) { __strong typeof(weakSelf) self = weakSelf; @@ -316,7 +333,15 @@ NSString *const EPMomentPublishSuccessNotification = @"EPMomentPublishSuccessNot - (UIView *)navView { if (!_navView) { _navView = [UIView new]; _navView.backgroundColor = [UIColor clearColor]; } return _navView; } - (UIButton *)backButton { if (!_backButton) { _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_backButton setImage:[UIImage imageNamed:@"common_nav_back"] forState:UIControlStateNormal]; [_backButton addTarget:self action:@selector(onBack) forControlEvents:UIControlEventTouchUpInside]; } return _backButton; } -- (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [UILabel new]; _titleLabel.text = @"图文发布"; _titleLabel.textColor = [DJDKMIMOMColor mainTextColor]; _titleLabel.font = [UIFont systemFontOfSize:17]; } return _titleLabel; } +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [UILabel new]; + _titleLabel.text = @"图文发布"; + _titleLabel.textColor = [UIColor whiteColor]; // 白色适配深色背景 + _titleLabel.font = [UIFont systemFontOfSize:17]; + } + return _titleLabel; +} - (UIButton *)publishButton { if (!_publishButton) { _publishButton = [UIButton buttonWithType:UIButtonTypeCustom]; @@ -338,18 +363,39 @@ NSString *const EPMomentPublishSuccessNotification = @"EPMomentPublishSuccessNot return _publishButton; } - (UIView *)contentView { if (!_contentView) { _contentView = [UIView new]; _contentView.backgroundColor = [UIColor clearColor]; } return _contentView; } -- (SZTextView *)textView { if (!_textView) { _textView = [SZTextView new]; _textView.placeholder = @"Enter Content"; _textView.textColor = [DJDKMIMOMColor mainTextColor]; _textView.placeholderTextColor = [DJDKMIMOMColor secondTextColor]; _textView.font = [UIFont systemFontOfSize:15]; _textView.delegate = self; } return _textView; } -- (UILabel *)limitLabel { if (!_limitLabel) { _limitLabel = [UILabel new]; _limitLabel.text = @"0/500"; _limitLabel.textColor = [DJDKMIMOMColor mainTextColor]; _limitLabel.font = [UIFont systemFontOfSize:12]; } return _limitLabel; } +- (SZTextView *)textView { + if (!_textView) { + _textView = [SZTextView new]; + _textView.placeholder = @"Enter Content"; + _textView.textColor = [UIColor whiteColor]; // 白色文本适配深色背景 + _textView.placeholderTextColor = [[UIColor whiteColor] colorWithAlphaComponent:0.4]; // 半透明白色占位符 + _textView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.08]; // 轻微背景色 + _textView.layer.cornerRadius = 12; + _textView.layer.masksToBounds = YES; + _textView.font = [UIFont systemFontOfSize:15]; + _textView.delegate = self; + } + return _textView; +} +- (UILabel *)limitLabel { + if (!_limitLabel) { + _limitLabel = [UILabel new]; + _limitLabel.text = @"0/500"; + _limitLabel.textColor = [[UIColor whiteColor] colorWithAlphaComponent:0.6]; // 浅色适配深色背景 + _limitLabel.font = [UIFont systemFontOfSize:12]; + } + return _limitLabel; +} - (UIView *)lineView { if (!_lineView) { _lineView = [UIView new]; _lineView.backgroundColor = [DJDKMIMOMColor dividerColor]; } return _lineView; } - (UIButton *)emotionButton { if (!_emotionButton) { _emotionButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_emotionButton setTitle:@"🎨 Add Emotion" forState:UIControlStateNormal]; - [_emotionButton setTitleColor:[DJDKMIMOMColor mainTextColor] forState:UIControlStateNormal]; + [_emotionButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; // 白色文本 _emotionButton.titleLabel.font = [UIFont systemFontOfSize:15]; _emotionButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; _emotionButton.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0); - _emotionButton.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.06]; + _emotionButton.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.08]; // 稍微提亮背景 _emotionButton.layer.cornerRadius = 8; _emotionButton.layer.masksToBounds = YES; [_emotionButton addTarget:self action:@selector(onEmotionButtonTapped) forControlEvents:UIControlEventTouchUpInside]; diff --git a/YuMi/E-P/NewMoments/Controllers/EPMomentViewController.m b/YuMi/E-P/NewMoments/Controllers/EPMomentViewController.m index 826370f..3481c5c 100644 --- a/YuMi/E-P/NewMoments/Controllers/EPMomentViewController.m +++ b/YuMi/E-P/NewMoments/Controllers/EPMomentViewController.m @@ -33,7 +33,12 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.title = @"动态"; + self.title = @"Enjoy your Life Time"; + + // 设置 title 为白色 + [self.navigationController.navigationBar setTitleTextAttributes:@{ + NSForegroundColorAttributeName: [UIColor whiteColor] + }]; [self setupUI]; [self.listView reloadFirstPage]; @@ -77,7 +82,12 @@ }]; // 右上角发布按钮 - UIBarButtonItem *publishItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(onPublishButtonTapped)]; + UIImage *addIcon = [UIImage imageNamed:@"icon_moment_add"]; + UIButton *publishButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [publishButton setImage:addIcon forState:UIControlStateNormal]; + publishButton.frame = CGRectMake(0, 0, 40, 50); + [publishButton addTarget:self action:@selector(onPublishButtonTapped) forControlEvents:UIControlEventTouchUpInside]; + UIBarButtonItem *publishItem = [[UIBarButtonItem alloc] initWithCustomView:publishButton]; self.navigationItem.rightBarButtonItem = publishItem; NSLog(@"[EPMomentViewController] UI 设置完成"); diff --git a/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.h b/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.h index 5b0f367..d8b4d60 100644 --- a/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.h +++ b/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.h @@ -33,6 +33,20 @@ NS_ASSUME_NONNULL_BEGIN /// 获取随机情绪颜色(不持久化) + (NSString *)randomEmotionColor; +#pragma mark - User Signature Color + +/// 保存用户专属颜色 ++ (void)saveUserSignatureColor:(NSString *)hexColor; + +/// 获取用户专属颜色 ++ (nullable NSString *)userSignatureColor; + +/// 是否已设置专属颜色 ++ (BOOL)hasUserSignatureColor; + +/// 清除专属颜色(调试用) ++ (void)clearUserSignatureColor; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.m b/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.m index 2a122d4..f06148f 100644 --- a/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.m +++ b/YuMi/E-P/NewMoments/Services/EPEmotionColorStorage.m @@ -8,6 +8,8 @@ #import "EPEmotionColorStorage.h" static NSString *const kEmotionColorStorageKey = @"EP_Emotion_Colors"; +static NSString *const kUserSignatureColorKey = @"EP_User_Signature_Color"; +static NSString *const kUserSignatureTimestampKey = @"EP_User_Signature_Timestamp"; @implementation EPEmotionColorStorage @@ -66,5 +68,34 @@ static NSString *const kEmotionColorStorageKey = @"EP_Emotion_Colors"; return dict ?: @{}; } +#pragma mark - User Signature Color + ++ (void)saveUserSignatureColor:(NSString *)hexColor { + if (!hexColor) return; + + [[NSUserDefaults standardUserDefaults] setObject:hexColor forKey:kUserSignatureColorKey]; + [[NSUserDefaults standardUserDefaults] setObject:@([[NSDate date] timeIntervalSince1970]) + forKey:kUserSignatureTimestampKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + NSLog(@"[EPEmotionColorStorage] 保存用户专属颜色: %@", hexColor); +} + ++ (NSString *)userSignatureColor { + return [[NSUserDefaults standardUserDefaults] stringForKey:kUserSignatureColorKey]; +} + ++ (BOOL)hasUserSignatureColor { + return [self userSignatureColor] != nil; +} + ++ (void)clearUserSignatureColor { + [[NSUserDefaults standardUserDefaults] removeObjectForKey:kUserSignatureColorKey]; + [[NSUserDefaults standardUserDefaults] removeObjectForKey:kUserSignatureTimestampKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + NSLog(@"[EPEmotionColorStorage] 清除用户专属颜色"); +} + @end diff --git a/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.h b/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.h index 7ad6653..17a99d5 100644 --- a/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.h +++ b/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.h @@ -15,6 +15,9 @@ NS_ASSUME_NONNULL_BEGIN /// 颜色选择回调 @property (nonatomic, copy) void(^onColorSelected)(NSString *hexColor); +/// 预选中的颜色(用于标记默认选中状态) +@property (nonatomic, copy) NSString *preselectedColor; + /// 在指定视图中显示选择器 /// @param parentView 父视图(通常是 ViewController 的 view) - (void)showInView:(UIView *)parentView; diff --git a/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.m b/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.m index 0466291..367ed6c 100644 --- a/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.m +++ b/YuMi/E-P/NewMoments/Views/EPEmotionColorPicker.m @@ -6,7 +6,7 @@ // #import "EPEmotionColorPicker.h" -#import "EPEmotionColorStorage.h" +#import "EPEmotionColorWheelView.h" #import @interface EPEmotionColorPicker () @@ -14,8 +14,7 @@ @property (nonatomic, strong) UIView *backgroundMask; @property (nonatomic, strong) UIView *containerView; @property (nonatomic, strong) UILabel *titleLabel; -@property (nonatomic, strong) UIView *colorWheelContainer; -@property (nonatomic, strong) NSMutableArray *colorButtons; +@property (nonatomic, strong) EPEmotionColorWheelView *colorWheelView; @end @@ -53,91 +52,17 @@ make.centerX.equalTo(self.containerView); }]; - // 色轮容器 - [self.containerView addSubview:self.colorWheelContainer]; - [self.colorWheelContainer mas_makeConstraints:^(MASConstraintMaker *make) { + // 色轮视图(使用共享组件) + [self.containerView addSubview:self.colorWheelView]; + [self.colorWheelView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.containerView); make.top.equalTo(self.titleLabel.mas_bottom).offset(30); make.size.mas_equalTo(CGSizeMake(240, 240)); }]; - - // 创建环形排列的颜色按钮 - [self createColorButtons]; -} - -- (void)createColorButtons { - NSArray *colors = [EPEmotionColorStorage allEmotionColors]; - NSArray *emotions = @[@"Joy", @"Sadness", @"Anger", @"Fear", @"Surprise", @"Disgust", @"Trust", @"Anticipation"]; - - CGFloat radius = 80.0; // 圆周半径 - CGFloat buttonSize = 50.0; // 按钮直径 - CGFloat angleStep = M_PI * 2.0 / colors.count; - CGFloat centerX = 120.0; // 容器中心 X - CGFloat centerY = 120.0; // 容器中心 Y - - for (NSInteger i = 0; i < colors.count; i++) { - // 从顶部开始,顺时针排列 - CGFloat angle = angleStep * i - M_PI_2; - CGFloat x = centerX + radius * cos(angle) - buttonSize / 2.0; - CGFloat y = centerY + radius * sin(angle) - buttonSize / 2.0; - - UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; - button.frame = CGRectMake(x, y, buttonSize, buttonSize); - button.backgroundColor = [self colorFromHex:colors[i]]; - button.layer.cornerRadius = buttonSize / 2.0; - button.layer.masksToBounds = YES; - button.layer.borderWidth = 3.0; - button.layer.borderColor = [UIColor whiteColor].CGColor; - button.tag = i; - [button addTarget:self action:@selector(onColorButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; - - // 添加阴影效果 - button.layer.shadowColor = [self colorFromHex:colors[i]].CGColor; - button.layer.shadowOffset = CGSizeMake(0, 2); - button.layer.shadowOpacity = 0.6; - button.layer.shadowRadius = 8; - button.layer.masksToBounds = NO; - - // 添加情绪标签(可选) - UILabel *emotionLabel = [[UILabel alloc] init]; - emotionLabel.text = emotions[i]; - emotionLabel.textColor = [UIColor whiteColor]; - emotionLabel.font = [UIFont systemFontOfSize:10 weight:UIFontWeightMedium]; - emotionLabel.textAlignment = NSTextAlignmentCenter; - emotionLabel.frame = CGRectMake(0, buttonSize - 2, buttonSize, 12); - emotionLabel.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5]; - emotionLabel.layer.cornerRadius = 6; - emotionLabel.layer.masksToBounds = YES; - [button addSubview:emotionLabel]; - - [self.colorWheelContainer addSubview:button]; - [self.colorButtons addObject:button]; - } } #pragma mark - Actions -- (void)onColorButtonTapped:(UIButton *)sender { - NSInteger index = sender.tag; - NSArray *colors = [EPEmotionColorStorage allEmotionColors]; - NSString *selectedColor = colors[index]; - - // 点击动画 - [UIView animateWithDuration:0.1 animations:^{ - sender.transform = CGAffineTransformMakeScale(0.9, 0.9); - } completion:^(BOOL finished) { - [UIView animateWithDuration:0.1 animations:^{ - sender.transform = CGAffineTransformIdentity; - } completion:^(BOOL finished) { - // 执行回调 - if (self.onColorSelected) { - self.onColorSelected(selectedColor); - } - [self dismiss]; - }]; - }]; -} - - (void)onBackgroundTapped { [self dismiss]; } @@ -170,19 +95,6 @@ }]; } -#pragma mark - Utilities - -- (UIColor *)colorFromHex:(NSString *)hexString { - unsigned rgbValue = 0; - NSScanner *scanner = [NSScanner scannerWithString:hexString]; - [scanner setScanLocation:1]; // 跳过 # - [scanner scanHexInt:&rgbValue]; - return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 - green:((rgbValue & 0xFF00) >> 8)/255.0 - blue:(rgbValue & 0xFF)/255.0 - alpha:1.0]; -} - #pragma mark - Lazy Loading - (UIView *)backgroundMask { @@ -217,19 +129,27 @@ return _titleLabel; } -- (UIView *)colorWheelContainer { - if (!_colorWheelContainer) { - _colorWheelContainer = [[UIView alloc] init]; - _colorWheelContainer.backgroundColor = [UIColor clearColor]; +- (EPEmotionColorWheelView *)colorWheelView { + if (!_colorWheelView) { + _colorWheelView = [[EPEmotionColorWheelView alloc] init]; + _colorWheelView.radius = 80.0; + _colorWheelView.buttonSize = 50.0; + _colorWheelView.preselectedColor = self.preselectedColor; + + __weak typeof(self) weakSelf = self; + _colorWheelView.onColorTapped = ^(NSString *hexColor, NSInteger index) { + __strong typeof(weakSelf) self = weakSelf; + + // 点击动画后关闭 + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (self.onColorSelected) { + self.onColorSelected(hexColor); + } + [self dismiss]; + }); + }; } - return _colorWheelContainer; -} - -- (NSMutableArray *)colorButtons { - if (!_colorButtons) { - _colorButtons = [NSMutableArray array]; - } - return _colorButtons; + return _colorWheelView; } @end diff --git a/YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.h b/YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.h new file mode 100644 index 0000000..ba5e3c3 --- /dev/null +++ b/YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.h @@ -0,0 +1,42 @@ +// +// EPEmotionColorWheelView.h +// YuMi +// +// Created by AI on 2025-10-15. +// 共享情绪色轮组件 - 纯渲染逻辑,不包含容器和外部交互 +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface EPEmotionColorWheelView : UIView + +#pragma mark - Configuration + +/// 圆周半径(默认 80pt) +@property (nonatomic, assign) CGFloat radius; + +/// 按钮直径(默认 50pt) +@property (nonatomic, assign) CGFloat buttonSize; + +/// 预选中的颜色(Hex 格式,如 #FFD700) +@property (nonatomic, copy, nullable) NSString *preselectedColor; + +#pragma mark - Callbacks + +/// 颜色点击回调 +/// @param hexColor 选中的颜色值 +/// @param index 颜色索引 (0-7) +@property (nonatomic, copy) void(^onColorTapped)(NSString *hexColor, NSInteger index); + +#pragma mark - Methods + +/// 刷新色轮(支持动态更新预选中颜色) +/// @param color 新的预选中颜色 +- (void)reloadWithPreselectedColor:(nullable NSString *)color; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.m b/YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.m new file mode 100644 index 0000000..40f66e9 --- /dev/null +++ b/YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.m @@ -0,0 +1,148 @@ +// +// EPEmotionColorWheelView.m +// YuMi +// +// Created by AI on 2025-10-15. +// + +#import "EPEmotionColorWheelView.h" +#import "EPEmotionColorStorage.h" + +@interface EPEmotionColorWheelView () + +@property (nonatomic, strong) NSMutableArray *colorButtons; + +@end + +@implementation EPEmotionColorWheelView + +#pragma mark - Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + // 默认配置 + _radius = 80.0; + _buttonSize = 50.0; + _colorButtons = [NSMutableArray array]; + + self.backgroundColor = [UIColor clearColor]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + + // 如果色轮还未创建,自动创建 + if (self.colorButtons.count == 0) { + [self createColorButtons]; + } +} + +#pragma mark - Public Methods + +- (void)reloadWithPreselectedColor:(NSString *)color { + self.preselectedColor = color; + + // 清除旧按钮 + for (UIButton *btn in self.colorButtons) { + [btn removeFromSuperview]; + } + [self.colorButtons removeAllObjects]; + + // 重新创建 + [self createColorButtons]; +} + +#pragma mark - Private Methods + +- (void)createColorButtons { + NSArray *colors = [EPEmotionColorStorage allEmotionColors]; + NSArray *emotions = @[@"Joy", @"Sadness", @"Anger", @"Fear", @"Surprise", @"Disgust", @"Trust", @"Anticipation"]; + + CGFloat angleStep = M_PI * 2.0 / colors.count; + CGFloat centerX = CGRectGetWidth(self.bounds) / 2.0; + CGFloat centerY = CGRectGetHeight(self.bounds) / 2.0; + + for (NSInteger i = 0; i < colors.count; i++) { + // 从顶部开始,顺时针排列 + CGFloat angle = angleStep * i - M_PI_2; + CGFloat x = centerX + self.radius * cos(angle) - self.buttonSize / 2.0; + CGFloat y = centerY + self.radius * sin(angle) - self.buttonSize / 2.0; + + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.frame = CGRectMake(x, y, self.buttonSize, self.buttonSize); + button.backgroundColor = [self colorFromHex:colors[i]]; + button.layer.cornerRadius = self.buttonSize / 2.0; + button.layer.masksToBounds = YES; + button.layer.borderWidth = 3.0; + button.layer.borderColor = [UIColor whiteColor].CGColor; + button.tag = i; + [button addTarget:self action:@selector(onButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; + + // 如果是预选中颜色,添加选中态标识 + if (self.preselectedColor && [colors[i] isEqualToString:self.preselectedColor]) { + button.layer.borderWidth = 5.0; // 加粗边框 + button.transform = CGAffineTransformMakeScale(1.1, 1.1); // 稍微放大 + } + + // 添加阴影效果 + button.layer.shadowColor = [self colorFromHex:colors[i]].CGColor; + button.layer.shadowOffset = CGSizeMake(0, 2); + button.layer.shadowOpacity = 0.6; + button.layer.shadowRadius = 8; + button.layer.masksToBounds = NO; + + [self addSubview:button]; + [self.colorButtons addObject:button]; + + // 添加情绪标签(作为独立视图,放在按钮下方) + UILabel *emotionLabel = [[UILabel alloc] init]; + emotionLabel.text = emotions[i]; + emotionLabel.textColor = [UIColor whiteColor]; + emotionLabel.font = [UIFont systemFontOfSize:9 weight:UIFontWeightMedium]; + emotionLabel.textAlignment = NSTextAlignmentCenter; + emotionLabel.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.7]; + emotionLabel.layer.cornerRadius = 8; + emotionLabel.layer.masksToBounds = YES; + + // 计算标签尺寸(根据文本长度自适应) + CGSize textSize = [emotions[i] sizeWithAttributes:@{NSFontAttributeName: emotionLabel.font}]; + CGFloat labelWidth = MAX(textSize.width + 12, 50); // 最小宽度 50pt,左右各留 6pt 内边距 + CGFloat labelHeight = 18; + + // 标签位置:按钮中心下方 8pt + CGFloat labelX = x + (self.buttonSize - labelWidth) / 2.0; + CGFloat labelY = y + self.buttonSize + 8; + emotionLabel.frame = CGRectMake(labelX, labelY, labelWidth, labelHeight); + + [self addSubview:emotionLabel]; + } +} + +- (void)onButtonTapped:(UIButton *)sender { + NSInteger index = sender.tag; + NSArray *colors = [EPEmotionColorStorage allEmotionColors]; + NSString *selectedColor = colors[index]; + + // 执行回调 + if (self.onColorTapped) { + self.onColorTapped(selectedColor, index); + } +} + +#pragma mark - Utilities + +- (UIColor *)colorFromHex:(NSString *)hexString { + unsigned rgbValue = 0; + NSScanner *scanner = [NSScanner scannerWithString:hexString]; + [scanner setScanLocation:1]; // 跳过 # + [scanner scanHexInt:&rgbValue]; + return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 + green:((rgbValue & 0xFF00) >> 8)/255.0 + blue:(rgbValue & 0xFF)/255.0 + alpha:1.0]; +} + +@end + diff --git a/YuMi/E-P/NewMoments/Views/EPMomentCell.m b/YuMi/E-P/NewMoments/Views/EPMomentCell.m index 4d69453..81b0c5f 100644 --- a/YuMi/E-P/NewMoments/Views/EPMomentCell.m +++ b/YuMi/E-P/NewMoments/Views/EPMomentCell.m @@ -21,6 +21,9 @@ /// 卡片容器 @property (nonatomic, strong) UIView *cardView; +/// 毛玻璃效果视图 +@property (nonatomic, strong) UIVisualEffectView *blurEffectView; + /// 头像(网络) @property (nonatomic, strong) NetImageView *avatarImageView; @@ -80,8 +83,14 @@ make.bottom.equalTo(self.contentView).offset(-8); }]; - // 头像(圆角矩形,不是圆形!) - [self.cardView addSubview:self.avatarImageView]; + // 毛玻璃效果视图 + [self.cardView addSubview:self.blurEffectView]; + [self.blurEffectView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.cardView); + }]; + + // 头像(圆角矩形,不是圆形!)- 添加到 blurEffectView.contentView + [self.blurEffectView.contentView addSubview:self.avatarImageView]; [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.equalTo(self.cardView).offset(15); make.top.equalTo(self.cardView).offset(15); @@ -89,7 +98,7 @@ }]; // 用户名 - [self.cardView addSubview:self.nameLabel]; + [self.blurEffectView.contentView addSubview:self.nameLabel]; [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.equalTo(self.avatarImageView.mas_trailing).offset(10); make.top.equalTo(self.avatarImageView); @@ -97,7 +106,7 @@ }]; // 时间 - [self.cardView addSubview:self.timeLabel]; + [self.blurEffectView.contentView addSubview:self.timeLabel]; [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.equalTo(self.nameLabel); make.bottom.equalTo(self.avatarImageView); @@ -105,14 +114,14 @@ }]; // 内容 - [self.cardView addSubview:self.contentLabel]; + [self.blurEffectView.contentView addSubview:self.contentLabel]; [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.equalTo(self.cardView).inset(15); make.top.equalTo(self.avatarImageView.mas_bottom).offset(12); }]; // 图片九宫格 - [self.cardView addSubview:self.imagesContainer]; + [self.blurEffectView.contentView addSubview:self.imagesContainer]; [self.imagesContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.equalTo(self.cardView).inset(15); make.top.equalTo(self.contentLabel.mas_bottom).offset(12); @@ -120,7 +129,7 @@ }]; // 底部操作栏 - [self.cardView addSubview:self.actionBar]; + [self.blurEffectView.contentView addSubview:self.actionBar]; [self.actionBar mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.equalTo(self.cardView); make.top.equalTo(self.imagesContainer.mas_bottom).offset(12); @@ -132,7 +141,7 @@ // 点赞按钮(居左显示,评论功能已隐藏) [self.actionBar addSubview:self.likeButton]; [self.likeButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.leading.equalTo(self.actionBar).offset(15); + make.leading.equalTo(self.actionBar); make.centerY.equalTo(self.actionBar); make.width.mas_greaterThanOrEqualTo(80); }]; @@ -146,8 +155,8 @@ // 配置用户名 self.nameLabel.text = model.nick ?: @"匿名用户"; - // 配置时间 - self.timeLabel.text = model.publishTime; + // 配置时间(将时间戳转换为 MM/dd 格式) + self.timeLabel.text = [self formatTimestampToDate:model.publishTime]; // 配置内容 self.contentLabel.text = model.content ?: @""; @@ -264,6 +273,26 @@ }]; } +/// 格式化时间戳为 MM/dd 格式 +- (NSString *)formatTimestampToDate:(NSString *)timestampString { + if (!timestampString || timestampString.length == 0) { + return @""; + } + + // 将字符串转换为时间戳(毫秒) + NSTimeInterval timestamp = [timestampString doubleValue] / 1000.0; + + if (timestamp <= 0) { + return @""; + } + + NSDate *date = [NSDate dateWithTimeIntervalSince1970:timestamp]; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = @"MM/dd"; + + return [formatter stringFromDate:date]; +} + /// 格式化时间戳为相对时间 - (NSString *)formatTimeInterval:(NSInteger)timestamp { if (timestamp <= 0) return @"刚刚"; @@ -315,11 +344,13 @@ long worldId = self.currentModel.worldId; // 使用 Swift API Helper + @kWeakify(self); [self.apiHelper likeMomentWithDynamicId:dynamicId isLike:isLike likedUid:likedUid worldId:worldId completion:^{ + @kStrongify(self); // 更新点赞状态 self.currentModel.isLike = isLike; NSInteger likeCount = [self.currentModel.likeCount integerValue]; @@ -384,7 +415,7 @@ - (UIView *)cardView { if (!_cardView) { _cardView = [[UIView alloc] init]; - _cardView.backgroundColor = [UIColor whiteColor]; + _cardView.backgroundColor = [UIColor clearColor]; // 透明背景,毛玻璃效果由 blurEffectView 提供 _cardView.layer.cornerRadius = 12; // 圆角 // Shadow 和 Border 将由 applyEmotionColorEffect 动态设置 _cardView.layer.masksToBounds = NO; @@ -392,6 +423,16 @@ return _cardView; } +- (UIVisualEffectView *)blurEffectView { + if (!_blurEffectView) { + UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; + _blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; + _blurEffectView.layer.cornerRadius = 12; + _blurEffectView.layer.masksToBounds = YES; + } + return _blurEffectView; +} + - (UIImageView *)avatarImageView { if (!_avatarImageView) { NetImageConfig *config = [[NetImageConfig alloc] init]; @@ -410,7 +451,7 @@ if (!_nameLabel) { _nameLabel = [[UILabel alloc] init]; _nameLabel.font = [UIFont systemFontOfSize:15 weight:UIFontWeightMedium]; - _nameLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.0]; + _nameLabel.textColor = [UIColor whiteColor]; } return _nameLabel; } @@ -428,7 +469,7 @@ if (!_contentLabel) { _contentLabel = [[UILabel alloc] init]; _contentLabel.font = [UIFont systemFontOfSize:15]; - _contentLabel.textColor = [UIColor colorWithWhite:0.3 alpha:1.0]; + _contentLabel.textColor = [UIColor whiteColor]; _contentLabel.numberOfLines = 0; _contentLabel.lineBreakMode = NSLineBreakByWordWrapping; } @@ -438,7 +479,7 @@ - (UIView *)actionBar { if (!_actionBar) { _actionBar = [[UIView alloc] init]; - _actionBar.backgroundColor = [UIColor colorWithWhite:0.98 alpha:1.0]; + _actionBar.backgroundColor = [UIColor clearColor]; // 半透明白色,与毛玻璃效果搭配 } return _actionBar; } @@ -450,8 +491,8 @@ [_likeButton setImage:[UIImage imageNamed:@"monents_info_like_count_select"] forState:UIControlStateSelected]; [_likeButton setTitle:@" 0" forState:UIControlStateNormal]; _likeButton.titleLabel.font = [UIFont systemFontOfSize:13]; - [_likeButton setTitleColor:[UIColor colorWithWhite:0.5 alpha:1.0] forState:UIControlStateNormal]; - [_likeButton setTitleColor:[UIColor colorWithWhite:0.5 alpha:1.0] forState:UIControlStateSelected]; + [_likeButton setTitleColor:[UIColor colorWithWhite:0.6 alpha:1.0] forState:UIControlStateNormal]; + [_likeButton setTitleColor:[UIColor colorWithWhite:0.6 alpha:1.0] forState:UIControlStateSelected]; [_likeButton addTarget:self action:@selector(onLikeButtonTapped) forControlEvents:UIControlEventTouchUpInside]; } return _likeButton; diff --git a/YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.h b/YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.h new file mode 100644 index 0000000..220b391 --- /dev/null +++ b/YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.h @@ -0,0 +1,36 @@ +// +// EPSignatureColorGuideView.h +// YuMi +// +// Created by AI on 2025-10-15. +// 用户专属情绪颜色首次引导页 +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface EPSignatureColorGuideView : UIView + +/// 颜色确认回调 +@property (nonatomic, copy) void(^onColorConfirmed)(NSString *hexColor); + +/// Skip 按钮点击回调(仅 debug 模式且已有颜色时显示) +@property (nonatomic, copy) void(^onSkipTapped)(void); + +/// 在 window 中显示引导页(全屏模态) +/// @param window 应用主 window +- (void)showInWindow:(UIWindow *)window; + +/// 在 window 中显示引导页(带 Skip 按钮) +/// @param window 应用主 window +/// @param showSkip 是否显示 Skip 按钮(用于 debug 模式) +- (void)showInWindow:(UIWindow *)window showSkipButton:(BOOL)showSkip; + +/// 关闭引导页 +- (void)dismiss; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.m b/YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.m new file mode 100644 index 0000000..50cb4d7 --- /dev/null +++ b/YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.m @@ -0,0 +1,260 @@ +// +// EPSignatureColorGuideView.m +// YuMi +// +// Created by AI on 2025-10-15. +// + +#import "EPSignatureColorGuideView.h" +#import "EPEmotionColorWheelView.h" +#import + +@interface EPSignatureColorGuideView () + +@property (nonatomic, strong) CAGradientLayer *gradientLayer; +@property (nonatomic, strong) UIView *contentContainer; +@property (nonatomic, strong) UILabel *titleLabel; +@property (nonatomic, strong) UILabel *subtitleLabel; +@property (nonatomic, strong) EPEmotionColorWheelView *colorWheelView; +@property (nonatomic, strong) UIButton *confirmButton; +@property (nonatomic, strong) UIButton *skipButton; +@property (nonatomic, copy) NSString *selectedColor; // 当前选中的颜色 + +@end + +@implementation EPSignatureColorGuideView + +#pragma mark - Lifecycle + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self setupUI]; + } + return self; +} + +- (void)setupUI { + // 渐变背景 + CAGradientLayer *gradientLayer = [CAGradientLayer layer]; + gradientLayer.colors = @[ + (id)[UIColor colorWithRed:0x1a/255.0 green:0x09/255.0 blue:0x33/255.0 alpha:1.0].CGColor, + (id)[UIColor colorWithRed:0x0d/255.0 green:0x1b/255.0 blue:0x2a/255.0 alpha:1.0].CGColor + ]; + gradientLayer.startPoint = CGPointMake(0.5, 0); + gradientLayer.endPoint = CGPointMake(0.5, 1); + [self.layer insertSublayer:gradientLayer atIndex:0]; + self.gradientLayer = gradientLayer; + + // 内容容器 + [self addSubview:self.contentContainer]; + [self.contentContainer mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.equalTo(self); + make.leading.trailing.equalTo(self).inset(30); + }]; + + // 标题 + [self.contentContainer addSubview:self.titleLabel]; + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.contentContainer); + make.centerX.equalTo(self.contentContainer); + }]; + + // 副标题 + [self.contentContainer addSubview:self.subtitleLabel]; + [self.subtitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.titleLabel.mas_bottom).offset(12); + make.centerX.equalTo(self.contentContainer); + make.leading.trailing.equalTo(self.contentContainer).inset(20); + }]; + + // 色轮视图(使用共享组件) + [self.contentContainer addSubview:self.colorWheelView]; + [self.colorWheelView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.subtitleLabel.mas_bottom).offset(50); + make.centerX.equalTo(self.contentContainer); + make.size.mas_equalTo(CGSizeMake(280, 280)); + }]; + + // 确认按钮 + [self.contentContainer addSubview:self.confirmButton]; + [self.confirmButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.colorWheelView.mas_bottom).offset(50); + make.leading.trailing.equalTo(self.contentContainer).inset(20); + make.height.mas_equalTo(56); + make.bottom.equalTo(self.contentContainer); + }]; + + // Skip 按钮(右上角,初始隐藏) + [self addSubview:self.skipButton]; + [self.skipButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self).offset(60); + make.trailing.equalTo(self).offset(-20); + make.size.mas_equalTo(CGSizeMake(60, 36)); + }]; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + // 更新渐变层 frame + self.gradientLayer.frame = self.bounds; +} + +#pragma mark - Actions + +- (void)onConfirmButtonTapped { + if (!self.selectedColor) return; + + // 执行回调 + if (self.onColorConfirmed) { + self.onColorConfirmed(self.selectedColor); + } + + // 关闭引导页 + [self dismiss]; +} + +- (void)onSkipButtonTapped { + // 执行 skip 回调 + if (self.onSkipTapped) { + self.onSkipTapped(); + } + + // 关闭引导页 + [self dismiss]; +} + +#pragma mark - Public Methods + +- (void)showInWindow:(UIWindow *)window { + [self showInWindow:window showSkipButton:NO]; +} + +- (void)showInWindow:(UIWindow *)window showSkipButton:(BOOL)showSkip { + [window addSubview:self]; + [self mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(window); + }]; + + // 控制 Skip 按钮显示 + self.skipButton.hidden = !showSkip; + + // 初始状态 + self.alpha = 0; + self.contentContainer.transform = CGAffineTransformMakeScale(0.8, 0.8); + + // 显示动画 + [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ + self.alpha = 1.0; + self.contentContainer.transform = CGAffineTransformIdentity; + } completion:nil]; +} + +- (void)dismiss { + [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{ + self.alpha = 0; + self.contentContainer.transform = CGAffineTransformMakeScale(0.95, 0.95); + } completion:^(BOOL finished) { + [self removeFromSuperview]; + }]; +} + +#pragma mark - Lazy Loading + +- (UIView *)contentContainer { + if (!_contentContainer) { + _contentContainer = [[UIView alloc] init]; + _contentContainer.backgroundColor = [UIColor clearColor]; + } + return _contentContainer; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.text = @"Choose your signature emotion"; + _titleLabel.textColor = [UIColor whiteColor]; + _titleLabel.font = [UIFont systemFontOfSize:24 weight:UIFontWeightBold]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + } + return _titleLabel; +} + +- (UILabel *)subtitleLabel { + if (!_subtitleLabel) { + _subtitleLabel = [[UILabel alloc] init]; + _subtitleLabel.text = @"This color represents your emotional identity"; + _subtitleLabel.textColor = [[UIColor whiteColor] colorWithAlphaComponent:0.7]; + _subtitleLabel.font = [UIFont systemFontOfSize:14]; + _subtitleLabel.textAlignment = NSTextAlignmentCenter; + _subtitleLabel.numberOfLines = 0; + } + return _subtitleLabel; +} + +- (EPEmotionColorWheelView *)colorWheelView { + if (!_colorWheelView) { + _colorWheelView = [[EPEmotionColorWheelView alloc] init]; + _colorWheelView.radius = 100.0; + _colorWheelView.buttonSize = 54.0; + + __weak typeof(self) weakSelf = self; + _colorWheelView.onColorTapped = ^(NSString *hexColor, NSInteger index) { + __strong typeof(weakSelf) self = weakSelf; + + // 保存选中的颜色 + self.selectedColor = hexColor; + + // 启用确认按钮 + self.confirmButton.enabled = YES; + self.confirmButton.alpha = 1.0; + }; + } + return _colorWheelView; +} + +- (UIButton *)confirmButton { + if (!_confirmButton) { + _confirmButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_confirmButton setTitle:@"Confirm & Continue" forState:UIControlStateNormal]; + [_confirmButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _confirmButton.titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightSemibold]; + _confirmButton.layer.cornerRadius = 28; + _confirmButton.layer.masksToBounds = YES; + + // 渐变背景 + CAGradientLayer *gradient = [CAGradientLayer layer]; + gradient.colors = @[ + (id)[UIColor colorWithRed:0x9B/255.0 green:0x59/255.0 blue:0xB6/255.0 alpha:1.0].CGColor, + (id)[UIColor colorWithRed:0x6C/255.0 green:0x34/255.0 blue:0x83/255.0 alpha:1.0].CGColor + ]; + gradient.startPoint = CGPointMake(0, 0); + gradient.endPoint = CGPointMake(1, 0); + gradient.frame = CGRectMake(0, 0, 1000, 56); // 宽度设大一点 + [_confirmButton.layer insertSublayer:gradient atIndex:0]; + + [_confirmButton addTarget:self action:@selector(onConfirmButtonTapped) forControlEvents:UIControlEventTouchUpInside]; + + // 初始禁用状态 + _confirmButton.enabled = NO; + _confirmButton.alpha = 0.5; + } + return _confirmButton; +} + +- (UIButton *)skipButton { + if (!_skipButton) { + _skipButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_skipButton setTitle:@"Skip" forState:UIControlStateNormal]; + [_skipButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _skipButton.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; + _skipButton.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.2]; + _skipButton.layer.cornerRadius = 18; + _skipButton.layer.masksToBounds = YES; + [_skipButton addTarget:self action:@selector(onSkipButtonTapped) forControlEvents:UIControlEventTouchUpInside]; + _skipButton.hidden = YES; // 默认隐藏 + } + return _skipButton; +} + +@end + diff --git a/YuMi/Global/YUMIHtmlUrl.m b/YuMi/Global/YUMIHtmlUrl.m index d1b5fb0..6385cfa 100644 --- a/YuMi/Global/YUMIHtmlUrl.m +++ b/YuMi/Global/YUMIHtmlUrl.m @@ -12,7 +12,7 @@ @implementation YUMIHtmlUrl NSString * const URLWithType(URLType type) { - NSString * prefix = @"molistar"; + NSString * prefix = @"eparty"; NSDictionary *newDic = @{ @(kTreasureTicketBuyURL) : @"modules/act-treasureSnatching/index.html",///夺宝购买 @(kTreasureRankListURL) : @"modules/act-treasureSnatching/list.html",///夺宝达人 diff --git a/YuMi/Info.plist b/YuMi/Info.plist index c65ebbb..5f998fa 100644 --- a/YuMi/Info.plist +++ b/YuMi/Info.plist @@ -57,7 +57,7 @@ FacebookClientToken 189d1a90712cc61cedded4cf1372cb21 FacebookDisplayName - MoliStar + E-Parti ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes @@ -96,17 +96,17 @@ NSCameraUsageDescription - “MoliStar”需要您的同意,才可以访问进行拍照并上传您的图片,然后展示在您的个人主页上,便于他人查看 + "E-Parti"需要您的同意,才可以访问进行拍照并上传您的图片,然后展示在您的个人主页上,便于他人查看 NSLocalNetworkUsageDescription 此App将可发现和连接到您所用网络上的设备。 NSLocationWhenInUseUsageDescription - “MoliStar”需要您的同意,才可以进行定位服务,推荐附近好友 + "E-Parti"需要您的同意,才可以进行定位服务,推荐附近好友 NSMicrophoneUsageDescription - “MoliStar”需要您的同意,才可以进行语音聊天 + "E-Parti"需要您的同意,才可以进行语音聊天 NSPhotoLibraryAddUsageDescription - “MoliStar”需要您的同意,才可以存储相片到相册 + "E-Parti"需要您的同意,才可以存储相片到相册 NSPhotoLibraryUsageDescription - “MoliStar”需要您的同意,才可以访问相册并选择您需要上传的图片,然后展示在您的个人主页上,便于他人查看 + "E-Parti"需要您的同意,才可以访问相册并选择您需要上传的图片,然后展示在您的个人主页上,便于他人查看 NSUserTrackingUsageDescription 請允許我們獲取您的IDFA權限,可以為您提供個性化活動和服務。未經您的允許,您的信息將不作其他用途。 UIApplicationSupportsIndirectInputEvents diff --git a/YuMi/Modules/YMLogin/View/NewLogin/XPLoginPhoneViewController.m b/YuMi/Modules/YMLogin/View/NewLogin/XPLoginPhoneViewController.m index c6a1997..4d0041f 100644 --- a/YuMi/Modules/YMLogin/View/NewLogin/XPLoginPhoneViewController.m +++ b/YuMi/Modules/YMLogin/View/NewLogin/XPLoginPhoneViewController.m @@ -274,7 +274,7 @@ - (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [[UILabel alloc] init]; - _titleLabel.text = @"Welcome to MoliStar!"; + _titleLabel.text = @"Welcome to E-Parti!"; _titleLabel.font = kFontBold(28); _titleLabel.textColor = UIColorFromRGB(0x1F1B4F); } diff --git a/YuMi/Modules/YMWeb/XPWebViewController.m b/YuMi/Modules/YMWeb/XPWebViewController.m index a708a43..c8c69fb 100644 --- a/YuMi/Modules/YMWeb/XPWebViewController.m +++ b/YuMi/Modules/YMWeb/XPWebViewController.m @@ -934,8 +934,8 @@ NSString * const kJSShowShareCallBack = @"showShareAction"; [_webview evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) { NSString *userAgent = result; - if (![userAgent containsString:@"molistarAppIos erbanAppIos"]){ - NSString *newUserAgent = [userAgent stringByAppendingString:@" molistarAppIos erbanAppIos"]; + if (![userAgent containsString:@"epartiAppIos erbanAppIos"]){ + NSString *newUserAgent = [userAgent stringByAppendingString:@" epartiAppIos erbanAppIos"]; NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize]; diff --git a/YuMi/Tools/Share/ShareHelder.m b/YuMi/Tools/Share/ShareHelder.m index 1a71a22..5468f2c 100644 --- a/YuMi/Tools/Share/ShareHelder.m +++ b/YuMi/Tools/Share/ShareHelder.m @@ -108,7 +108,7 @@ static __weak UIViewController *_presentingVC = nil; NSMutableArray *shareItems = [NSMutableArray array]; // 1. 添加纯文本(用于备忘录等文本应用) - NSString *plainText = [NSString stringWithFormat:@"🎵 发现精彩内容\n\n%@\n\n🔗 %@\n\n—— 来自 MoliStars ——", + NSString *plainText = [NSString stringWithFormat:@"🎵 发现精彩内容\n\n%@\n\n🔗 %@\n\n—— 来自 E-Parti ——", subtitle, url.absoluteString ?: @""]; [shareItems addObject:plainText]; @@ -219,8 +219,8 @@ static __weak UIViewController *_presentingVC = nil; // 1. 准备分享内容 NSString *title = @"🎵 Apple Music 专辑推荐:Imagine Dragons"; - NSString *subtitle = @"来自MoliStars的精彩推荐"; - NSString *appName = @"MoliStars"; + NSString *subtitle = @"来自E-Parti的精彩推荐"; + NSString *appName = @"E-Parti"; NSURL *albumURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", API_HOST_URL, urlString]]; UIImage *albumImage = image; diff --git a/YuMi/Tools/Share/ShareProvider.m b/YuMi/Tools/Share/ShareProvider.m index 00d8080..0ca77b2 100644 --- a/YuMi/Tools/Share/ShareProvider.m +++ b/YuMi/Tools/Share/ShareProvider.m @@ -21,7 +21,7 @@ if (self) { _title = title ?: @""; _subtitle = subtitle ?: @""; - _appName = appName ?: @"MoliStar"; + _appName = appName ?: @"E-Parti"; _url = url; _image = image; _appIcon = appIcon; diff --git a/YuMi/Tools/YYUtility/YYUtility+App.m b/YuMi/Tools/YYUtility/YYUtility+App.m index 7fd692e..dd54a2a 100644 --- a/YuMi/Tools/YYUtility/YYUtility+App.m +++ b/YuMi/Tools/YYUtility/YYUtility+App.m @@ -39,7 +39,7 @@ if([isProduction isEqualToString:@"YES"]){ return @"youmi"; } - return @"molistar"; + return @"eparti"; #else return @"youmi"; @@ -122,7 +122,7 @@ static NSString *_from = nil; + (NSString *)getAppSource{ if (_from == nil) { if (isEnterprise == NO) { - _from = ISTestFlight ? PI_Test_Flight : @"molistar_enterprise"; // 企业包 + _from = ISTestFlight ? PI_Test_Flight : @"eparti_enterprise"; // 企业包 }else { _from = [ClientConfig shareConfig].isTF == YES ? PI_Test_Flight : PI_App_Source; // Test_Flight包或appstore App Store包 } diff --git a/YuMi/YuMi-Bridging-Header.h b/YuMi/YuMi-Bridging-Header.h index f1f15cd..52b6a5d 100644 --- a/YuMi/YuMi-Bridging-Header.h +++ b/YuMi/YuMi-Bridging-Header.h @@ -23,6 +23,10 @@ #import "EPMomentCell.h" #import "EPMineHeaderView.h" +// MARK: - Emotion Color System +#import "EPEmotionColorStorage.h" +#import "EPSignatureColorGuideView.h" + // MARK: - QCloud SDK #import @@ -63,6 +67,7 @@ #import "YUMIHtmlUrl.h" // URLWithType #import "YUMIConstant.h" // KeyWithType, KeyType_PasswordEncode #import "DESEncrypt.h" // DES加密工具 +#import "HttpRequestHelper.h" // getHostUrl // MARK: - Login - Models (Phase 2 使用,先添加) #import "AccountInfoStorage.h" diff --git a/YuMi/ar.lproj/Localizable.strings b/YuMi/ar.lproj/Localizable.strings index 7e0c877..f2a5c53 100644 --- a/YuMi/ar.lproj/Localizable.strings +++ b/YuMi/ar.lproj/Localizable.strings @@ -689,7 +689,7 @@ "XPLoginPwdViewController4" = "تسجيل الدخول برقم الهاتف"; "XPLoginPwdViewController5" = "نسيت كلمة المرور"; -"XPLoginPwdViewController6" = "الرجاء إدخال حساب MoliStar"; +"XPLoginPwdViewController6" = "الرجاء إدخال حساب E-Parti"; "XPLoginBindPhoneResultViewController0" = "ربط الهاتف"; "XPLoginBindPhoneResultViewController1" = "رقم الهاتف المرتبط حاليًا هو"; @@ -727,7 +727,7 @@ "XPShareView5" = "فشلت عملية المشاركة"; "XPShareView6" = "إلغاء المشاركة"; "XPShareView7" = "إلغاء"; -"XPShareView8" = "تعال إلى MoliStar واكتشف صوتك الخاص"; +"XPShareView8" = "تعال إلى E-Parti واكتشف صوتك الخاص"; "XPShareView9" = "التطبيق غير مثبت، فشلت عملية المشاركة"; ///XPFirstRechargeViewController.m @@ -1904,7 +1904,7 @@ ineHeadView12" = "الحمل"; "RoomHeaderView2" = "متصل: %ld ID: %ld"; "RoomHeaderView3" = "نسخ الرابط"; -"RoomHeaderView4" = "تعال إلى MoliStar، ولنلعب ونتعارف ونلعب ألعابًا"; +"RoomHeaderView4" = "تعال إلى E-Parti، ولنلعب ونتعارف ونلعب ألعابًا"; "RoomHeaderView5" = "شخص جميل وصوت حلو يحقق الانتصارات، هيا لنلعب معًا~"; "RoomHeaderView6" = "تمت الإضافة للمفضلة بنجاح"; "RoomHeaderView7" = "تمت المشاركة بنجاح"; @@ -2883,7 +2883,7 @@ ineHeadView12" = "الحمل"; "XPLoginPwdViewController3" = "من فضلك إدخل الرقم السري"; "XPLoginPwdViewController4" = "تسجيل الدخول باستخدام رقم الهاتف"; "XPLoginPwdViewController5" = "نسيت كلمة المرور"; -"XPLoginPwdViewController6" = "الرجاء إدخال حساب MoliStar الخاص بك"; +"XPLoginPwdViewController6" = "الرجاء إدخال حساب E-Parti الخاص بك"; "XPLoginBindPhoneResultViewController0" = "ربط الهاتف"; "XPLoginBindPhoneResultViewController1" = "رقم الهاتف المرتبط بك حاليًا هو"; @@ -3623,7 +3623,7 @@ ineHeadView12" = "الحمل"; "PIMessageContentServiceReplyView0"="كيفية الشحن:"; "PIMessageContentServiceReplyView1"="نسخ"; -"PIMessageContentServiceReplyView2"="1. للصوت - 【الشحن بالعملات】 للقيام بشحن الرصيد MoliStar اذهب إلى قسم 【الخاص بي】 داخل تطبيق"; +"PIMessageContentServiceReplyView2"="1. للصوت - 【الشحن بالعملات】 للقيام بشحن الرصيد E-Parti اذهب إلى قسم 【الخاص بي】 داخل تطبيق"; "PIMessageContentServiceReplyView3"="2. ٢. اتصل بخدمة العملاء"; "PIMessageContentServiceReplyView4"="WeChat لخدمة العملاء: %@ "; "PIMessageContentServiceReplyView5"="Line لخدمة العملاء: %@ "; @@ -4120,7 +4120,7 @@ ineHeadView12" = "الحمل"; "1.0.37_text_52" = "لا يمكنك استخدام هذه الميزة."; "20.20.51_text_1" = "تسجيل الدخول بالبريد الإلكتروني"; -"20.20.51_text_2" = "Welcome to MoliStar"; +"20.20.51_text_2" = "Welcome to E-Parti"; "20.20.51_text_3" = "الرجاء إدخال المعرف"; "20.20.51_text_4" = "يرجى إدخال البريد الإلكتروني"; "20.20.51_text_7" = "يرجى إدخال رمز التحقق"; diff --git a/YuMi/en.lproj/InfoPlist.strings b/YuMi/en.lproj/InfoPlist.strings index 94e94a4..f3642bb 100644 --- a/YuMi/en.lproj/InfoPlist.strings +++ b/YuMi/en.lproj/InfoPlist.strings @@ -1,9 +1,9 @@ -NSCameraUsageDescription ="\"MoliStar\" needs your consent before you can visit, take photos and upload your pictures, and then display them on your personal homepage for others to view"; +NSCameraUsageDescription ="\"E-Parti\" needs your consent before you can visit, take photos and upload your pictures, and then display them on your personal homepage for others to view"; NSLocalNetworkUsageDescription ="The app will discover and connect to devices on your network"; NSLocationWhenInUseUsageDescription = "Your consent is required before you can use location services and recommend nearby friends"; -NSMicrophoneUsageDescription = "\"MoliStar\" needs your consent before it can conduct voice chat"; -NSPhotoLibraryAddUsageDescription = "\"MoliStar\" needs your consent before it can store photos in the album"; -NSPhotoLibraryUsageDescription = "\"MoliStar\" needs your consent before you can access the album and select the pictures you need to upload, and then display them on your personal homepage for others to view"; +NSMicrophoneUsageDescription = "\"E-Parti\" needs your consent before it can conduct voice chat"; +NSPhotoLibraryAddUsageDescription = "\"E-Parti\" needs your consent before it can store photos in the album"; +NSPhotoLibraryUsageDescription = "\"E-Parti\" needs your consent before you can access the album and select the pictures you need to upload, and then display them on your personal homepage for others to view"; NSUserTrackingUsageDescription = "Please allow us to obtain your idfa permission to provide you with personalized activities and services. your information will not be used for other purposes without your permission"; diff --git a/YuMi/en.lproj/Localizable.strings b/YuMi/en.lproj/Localizable.strings index b4cdf6f..119b40c 100644 --- a/YuMi/en.lproj/Localizable.strings +++ b/YuMi/en.lproj/Localizable.strings @@ -393,7 +393,7 @@ "XPLoginPwdViewController4" = "Phone number login"; "XPLoginPwdViewController5" = "Forgot password"; -"XPLoginPwdViewController6" = "Please enter a MoliStar account"; +"XPLoginPwdViewController6" = "Please enter a E-Parti account"; "XPLoginBindPhoneResultViewController0" = "Bind phone"; "XPLoginBindPhoneResultViewController1" = "Your current bound phone number is"; @@ -455,7 +455,7 @@ "XPShareView5" = "Share failed"; "XPShareView6" = "Cancel sharing"; "XPShareView7" = "Cancel"; -"XPShareView8" = "Come to MoliStar and meet your exclusive voice"; +"XPShareView8" = "Come to E-Parti and meet your exclusive voice"; "XPShareView9" = "Failed to share due to the absence of related apps"; "XPFirstRechargeViewController0" = "1. Each person can only receive the first recharge benefit once\n2. Each ID and device can only participate once."; "XPFirstRechargeViewController1" = "Recharge now"; @@ -511,12 +511,12 @@ "HttpRequestHelper1" = "Please check network connection"; "HttpRequestHelper2" = "Please check network connection"; "HttpRequestHelper3" = "Login session has expired"; -"HttpRequestHelper4" = "MoliStar is taking a break Please try again later"; +"HttpRequestHelper4" = "E-Parti is taking a break Please try again later"; "HttpRequestHelper5" = "Unknown error from server"; "HttpRequestHelper6" = "Please check network connection"; "HttpRequestHelper7" = "Login session has expired."; -"AppDelegate_ThirdConfig0" = "MoliStar"; +"AppDelegate_ThirdConfig0" = "E-Parti"; "XPMineNotificaPresenter0" = "System Notifications"; "XPMineNotificaPresenter1" = "When turned off, system messages and official assistants will no longer prompt"; @@ -932,7 +932,7 @@ "XPIAPRechargeViewController2" = "Confirm Recharge"; "XPIAPRechargeViewController3" = "《User Recharge Agreement》"; "XPIAPRechargeViewController4" = "I have read and agree"; -"XPIAPRechargeViewController5" = "For any questions, please contact customer service, MoliStar ID"; +"XPIAPRechargeViewController5" = "For any questions, please contact customer service, E-Parti ID"; "XPIAPRechargeViewController6" = "My Account"; "XPIAPRechargeViewController7" = "Reminder"; "XPIAPRechargeViewController8" = "Recharge failed. Please contact customer service for assistance."; @@ -1640,7 +1640,7 @@ "RoomHeaderView1" = "Online: %ld   ID: %ld"; "RoomHeaderView2" = "Online: %ld   ID: %ld"; "RoomHeaderView3" = "Copy Link"; -"RoomHeaderView4" = "Come to MoliStar, play games and make friends"; +"RoomHeaderView4" = "Come to E-Parti, play games and make friends"; "RoomHeaderView5" = "Beautiful people with sweet voices win points, let's play together~"; "RoomHeaderView6" = "Bookmark Successful"; "RoomHeaderView7" = "Share Successful"; @@ -2315,7 +2315,7 @@ "XPLoginPwdViewController3" = "Please enter password"; "XPLoginPwdViewController4" = "Phone Number Login"; "XPLoginPwdViewController5" = "Forget Password"; -"XPLoginPwdViewController6" = "Please enter your MoliStar account"; +"XPLoginPwdViewController6" = "Please enter your E-Parti account"; "XPLoginBindPhoneResultViewController0" = "Bind Phone"; "XPLoginBindPhoneResultViewController1" = "The current bound phone number is"; @@ -3418,7 +3418,7 @@ "PIMessageContentServiceReplyView0"="How to Top-Up:"; "PIMessageContentServiceReplyView1"="Copy"; -"PIMessageContentServiceReplyView2"="1. Go to 【My】-- 【Top-Up Coins】 inside MoliStar Voice App to top-up"; +"PIMessageContentServiceReplyView2"="1. Go to 【My】-- 【Top-Up Coins】 inside E-Parti Voice App to top-up"; "PIMessageContentServiceReplyView3"="2. Contact customer service"; "PIMessageContentServiceReplyView4"="Customer Service WeChat: %@ "; "PIMessageContentServiceReplyView5"="Customer Service Line: %@ "; @@ -3908,7 +3908,7 @@ "1.0.37_text_52" = "Your cannot use this feature."; "20.20.51_text_1" = "Email Login"; -"20.20.51_text_2" = "Welcome to MoliStar"; +"20.20.51_text_2" = "Welcome to E-Parti"; "20.20.51_text_3" = "Please enter ID"; "20.20.51_text_4" = "Please enter email"; "20.20.51_text_7" = "Please enter verification code"; diff --git a/YuMi/ep_splash.png b/YuMi/ep_splash.png new file mode 100644 index 0000000..98633f1 Binary files /dev/null and b/YuMi/ep_splash.png differ diff --git a/YuMi/es.lproj/InfoPlist.strings b/YuMi/es.lproj/InfoPlist.strings index a2863bf..14522d8 100644 --- a/YuMi/es.lproj/InfoPlist.strings +++ b/YuMi/es.lproj/InfoPlist.strings @@ -1,7 +1,7 @@ -NSCameraUsageDescription = "\"MoliStar\" necesita su consentimiento para que pueda visitar, tomar fotos y cargar sus imágenes, y luego mostrarlas en su página de inicio personal para que otras personas las vean"; +NSCameraUsageDescription = "\"E-Parti\" necesita su consentimiento para que pueda visitar, tomar fotos y cargar sus imágenes, y luego mostrarlas en su página de inicio personal para que otras personas las vean"; NSLocalNetworkUsageDescription = "La aplicación descubrirá y se conectará a dispositivos en su red"; NSLocationWhenInUseUsageDescription = "Se requiere su consentimiento antes de que pueda usar los servicios de ubicación y recomendar amigos cercanos"; -NSMicrophoneUsageDescription = "\"MoliStar\" necesita su consentimiento antes de poder realizar una conversación de voz"; -NSPhotoLibraryAddUsageDescription = "\"MoliStar\" necesita su consentimiento antes de poder almacenar fotos en el álbum"; -NSPhotoLibraryUsageDescription = "\"MoliStar\" necesita su consentimiento para que pueda acceder al álbum y seleccionar las imágenes que necesita cargar, y luego mostrarlas en su página de inicio personal para que otras personas las vean"; +NSMicrophoneUsageDescription = "\"E-Parti\" necesita su consentimiento antes de poder realizar una conversación de voz"; +NSPhotoLibraryAddUsageDescription = "\"E-Parti\" necesita su consentimiento antes de poder almacenar fotos en el álbum"; +NSPhotoLibraryUsageDescription = "\"E-Parti\" necesita su consentimiento para que pueda acceder al álbum y seleccionar las imágenes que necesita cargar, y luego mostrarlas en su página de inicio personal para que otras personas las vean"; NSUserTrackingUsageDescription = "Permítanos obtener su permiso de idfa para proporcionarle actividades y servicios personalizados. Su información no se utilizará para otros fines sin su permiso"; diff --git a/YuMi/es.lproj/Localizable.strings b/YuMi/es.lproj/Localizable.strings index c33eea4..aa42cea 100644 --- a/YuMi/es.lproj/Localizable.strings +++ b/YuMi/es.lproj/Localizable.strings @@ -391,7 +391,7 @@ "XPLoginPwdViewController4" = "Inicio de sesión con número de teléfono"; "XPLoginPwdViewController5" = "Olvidé la contraseña"; -"XPLoginPwdViewController6" = "Por favor ingresa una cuenta MoliStar"; +"XPLoginPwdViewController6" = "Por favor ingresa una cuenta E-Parti"; "XPLoginBindPhoneResultViewController0" = "Vincular teléfono"; "XPLoginBindPhoneResultViewController1" = "Tu número de teléfono vinculado actual es"; @@ -453,7 +453,7 @@ "XPShareView5" = "Compartir fallido"; "XPShareView6" = "Cancelar compartir"; "XPShareView7" = "Cancelar"; -"XPShareView8" = "Ven a MoliStar y conoce tu voz exclusiva"; +"XPShareView8" = "Ven a E-Parti y conoce tu voz exclusiva"; "XPShareView9" = "Error al compartir debido a la ausencia de aplicaciones relacionadas"; "XPFirstRechargeViewController0" = "1. Cada persona solo puede recibir el beneficio de la primera recarga una vez\n2. Cada ID y dispositivo solo puede participar una vez."; "XPFirstRechargeViewController1" = "Recargar ahora"; @@ -509,12 +509,12 @@ "HttpRequestHelper1" = "Por favor comprueba la conexión a internet"; "HttpRequestHelper2" = "Por favor comprueba la conexión a internet"; "HttpRequestHelper3" = "La sesión de inicio de sesión ha expirado"; -"HttpRequestHelper4" = "MoliStar está descansando Por favor intenta más tarde"; +"HttpRequestHelper4" = "E-Parti está descansando Por favor intenta más tarde"; "HttpRequestHelper5" = "Error desconocido del servidor"; "HttpRequestHelper6" = "Por favor comprueba la conexión a internet"; "HttpRequestHelper7" = "La sesión de inicio de sesión ha expirado."; -"AppDelegate_ThirdConfig0" = "MoliStar"; +"AppDelegate_ThirdConfig0" = "E-Parti"; "XPMineNotificaPresenter0" = "Notificaciones del sistema"; "XPMineNotificaPresenter1" = "Cuando está apagado, los mensajes del sistema y los asistentes oficiales ya no se mostrarán"; @@ -930,7 +930,7 @@ "XPIAPRechargeViewController2" = "Confirmar Recarga"; "XPIAPRechargeViewController3" = "《Acuerdo de Recarga de Usuario》"; "XPIAPRechargeViewController4" = "He leído y acepto"; -"XPIAPRechargeViewController5" = "Para cualquier pregunta, por favor contacte al servicio al cliente, ID MoliStar"; +"XPIAPRechargeViewController5" = "Para cualquier pregunta, por favor contacte al servicio al cliente, ID E-Parti"; "XPIAPRechargeViewController6" = "Mi Cuenta"; "XPIAPRechargeViewController7" = "Recordatorio"; "XPIAPRechargeViewController8" = "Recarga fallida. Por favor contacte al servicio al cliente para obtener ayuda."; @@ -1638,7 +1638,7 @@ "RoomHeaderView1" = "En línea: %ld ID: %ld"; "RoomHeaderView2" = "En línea: %ld ID: %ld"; "RoomHeaderView3" = "Copiar Enlace"; -"RoomHeaderView4" = "Ven a MoliStar, juega y haz amigos"; +"RoomHeaderView4" = "Ven a E-Parti, juega y haz amigos"; "RoomHeaderView5" = "Gente hermosa con voces dulces gana puntos, ¡juguemos juntos~"; "RoomHeaderView6" = "Marcador Guardado"; "RoomHeaderView7" = "Compartido con Éxito"; @@ -2313,7 +2313,7 @@ "XPLoginPwdViewController3" = "Please enter password"; "XPLoginPwdViewController4" = "Phone Number Login"; "XPLoginPwdViewController5" = "Forget Password"; -"XPLoginPwdViewController6" = "Please enter your MoliStar account"; +"XPLoginPwdViewController6" = "Please enter your E-Parti account"; "XPLoginBindPhoneResultViewController0" = "Bind Phone"; "XPLoginBindPhoneResultViewController1" = "The current bound phone number is"; @@ -3416,7 +3416,7 @@ "PIMessageContentServiceReplyView0"="How to Top-Up:"; "PIMessageContentServiceReplyView1"="Copy"; -"PIMessageContentServiceReplyView2"="1. Go to 【My】-- 【Top-Up Coins】 inside MoliStar Voice App to top-up"; +"PIMessageContentServiceReplyView2"="1. Go to 【My】-- 【Top-Up Coins】 inside E-Parti Voice App to top-up"; "PIMessageContentServiceReplyView3"="2. Contact customer service"; "PIMessageContentServiceReplyView4"="Customer Service WeChat: %@ "; "PIMessageContentServiceReplyView5"="Customer Service Line: %@ "; @@ -3930,7 +3930,7 @@ "1.0.37_text_52" = "No puedes usar esta función."; "20.20.51_text_1" = "Inicio de sesión por correo electrónico"; -"20.20.51_text_2" = "Bienvenido a MoliStar"; +"20.20.51_text_2" = "Bienvenido a E-Parti"; "20.20.51_text_3" = "Por favor ingresa ID"; "20.20.51_text_4" = "Por favor ingresa correo electrónico"; "20.20.51_text_7" = "Por favor ingresa el código de verificación"; diff --git a/YuMi/mul.lproj/Launch Screen.xcstrings b/YuMi/mul.lproj/Launch Screen.xcstrings index f03c1d1..9d630f6 100644 --- a/YuMi/mul.lproj/Launch Screen.xcstrings +++ b/YuMi/mul.lproj/Launch Screen.xcstrings @@ -3,6 +3,7 @@ "strings" : { "o5T-sv-tDU.text" : { "comment" : "Class = \"UILabel\"; text = \"Meet your exclusive voice~\"; ObjectID = \"o5T-sv-tDU\";", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { diff --git a/YuMi/pt-BR.lproj/InfoPlist.strings b/YuMi/pt-BR.lproj/InfoPlist.strings index af5155e..7d57f2a 100644 --- a/YuMi/pt-BR.lproj/InfoPlist.strings +++ b/YuMi/pt-BR.lproj/InfoPlist.strings @@ -1,13 +1,13 @@ -NSCameraUsageDescription = "O \"MoliStar\" precisa do seu consentimento antes que você possa visitar, tirar fotos e enviar suas imagens, e depois exibi-las em sua página pessoal para que outros possam visualizar"; +NSCameraUsageDescription = "O \"E-Parti\" precisa do seu consentimento antes que você possa visitar, tirar fotos e enviar suas imagens, e depois exibi-las em sua página pessoal para que outros possam visualizar"; NSLocalNetworkUsageDescription = "O aplicativo irá descobrir e conectar-se a dispositivos em sua rede"; NSLocationWhenInUseUsageDescription = "O seu consentimento é necessário antes que você possa usar os serviços de localização e recomendar amigos próximos"; -NSMicrophoneUsageDescription = "O \"MoliStar\" precisa do seu consentimento antes de poder realizar chat de voz"; +NSMicrophoneUsageDescription = "O \"E-Parti\" precisa do seu consentimento antes de poder realizar chat de voz"; -NSPhotoLibraryAddUsageDescription = "O \"MoliStar\" precisa do seu consentimento antes de poder armazenar fotos no álbum"; +NSPhotoLibraryAddUsageDescription = "O \"E-Parti\" precisa do seu consentimento antes de poder armazenar fotos no álbum"; -NSPhotoLibraryUsageDescription = "O \"MoliStar\" precisa do seu consentimento antes que você possa acessar o álbum e selecionar as imagens que deseja enviar, e depois exibi-las em sua página pessoal para que outros possam visualizar"; +NSPhotoLibraryUsageDescription = "O \"E-Parti\" precisa do seu consentimento antes que você possa acessar o álbum e selecionar as imagens que deseja enviar, e depois exibi-las em sua página pessoal para que outros possam visualizar"; NSUserTrackingUsageDescription = "Por favor, permita-nos obter sua permissão IDFA para fornecer a você atividades e serviços personalizados. Suas informações não serão usadas para outros fins sem a sua permissão"; diff --git a/YuMi/pt-BR.lproj/Localizable.strings b/YuMi/pt-BR.lproj/Localizable.strings index e584ffe..66b9b05 100644 --- a/YuMi/pt-BR.lproj/Localizable.strings +++ b/YuMi/pt-BR.lproj/Localizable.strings @@ -305,7 +305,7 @@ "XPLoginPwdViewController2" = "Por favor insira número de telefone/ID"; "XPLoginPwdViewController4" = "Login com número de telefone"; "XPLoginPwdViewController5" = "Esqueceu a senha"; -"XPLoginPwdViewController6" = "Por favor insira uma conta MoliStar"; +"XPLoginPwdViewController6" = "Por favor insira uma conta E-Parti"; "XPLoginBindPhoneResultViewController0" = "Vincular telefone"; "XPLoginBindPhoneResultViewController1" = "Seu número de telefone vinculado atual é"; "XPLoginBindPhoneResultViewController2" = "Alterar número de telefone"; @@ -363,7 +363,7 @@ "XPShareView5" = "Compartilhamento falhou"; "XPShareView6" = "Cancelar compartilhamento"; "XPShareView7" = "Cancelar"; -"XPShareView8" = "Venha para MoliStar e conheça sua voz exclusiva"; +"XPShareView8" = "Venha para E-Parti e conheça sua voz exclusiva"; "XPShareView9" = "Falha ao compartilhar devido à ausência de aplicativos relacionados"; "XPFirstRechargeViewController0" = "1. Cada pessoa só pode receber o benefício da primeira recarga uma vez\n2. Cada ID e dispositivo só pode participar uma vez."; "XPFirstRechargeViewController1" = "Recarregar agora"; @@ -412,11 +412,11 @@ "HttpRequestHelper1" = "Por favor verifique a conexão de rede"; "HttpRequestHelper2" = "Por favor verifique a conexão de rede"; "HttpRequestHelper3" = "A sessão de login expirou"; -"HttpRequestHelper4" = "MoliStar está fazendo uma pausa Por favor tente novamente mais tarde"; +"HttpRequestHelper4" = "E-Parti está fazendo uma pausa Por favor tente novamente mais tarde"; "HttpRequestHelper5" = "Erro desconhecido do servidor"; "HttpRequestHelper6" = "Por favor verifique a conexão de rede"; "HttpRequestHelper7" = "A sessão de login expirou."; -"AppDelegate_ThirdConfig0" = "MoliStar"; +"AppDelegate_ThirdConfig0" = "E-Parti"; "XPMineNotificaPresenter0" = "Notificações do sistema"; "XPMineNotificaPresenter1" = "Quando desligado, mensagens do sistema e assistentes oficiais não avisarão mais"; "XPMineNotificaPresenter2" = "Notificações ao vivo"; @@ -753,7 +753,7 @@ "XPIAPRechargeViewController2" = "Confirmar Recarga"; "XPIAPRechargeViewController3" = "《Termos de Recarga do Usuário》"; "XPIAPRechargeViewController4" = "Li e concordo"; -"XPIAPRechargeViewController5" = "Para dúvidas, entre em contato com o atendimento, ID MoliStar"; +"XPIAPRechargeViewController5" = "Para dúvidas, entre em contato com o atendimento, ID E-Parti"; "XPIAPRechargeViewController6" = "Minha Conta"; "XPIAPRechargeViewController7" = "Lembrete"; "XPIAPRechargeViewController8" = "Falha na recarga. Entre em contato com o atendimento para assistência."; @@ -1351,7 +1351,7 @@ "RoomHeaderView1" = "Online: %ld   ID: %ld"; "RoomHeaderView2" = "Online: %ld   ID: %ld"; "RoomHeaderView3" = "Copiar Link"; -"RoomHeaderView4" = "Venha para MoliStar, jogue e faça amigos"; +"RoomHeaderView4" = "Venha para E-Parti, jogue e faça amigos"; "RoomHeaderView5" = "Pessoas bonitas com vozes doces ganham pontos, vamos jogar juntos~"; "RoomHeaderView6" = "Favoritado com Sucesso"; "RoomHeaderView7" = "Compartilhado com Sucesso"; @@ -1917,7 +1917,7 @@ "XPLoginPwdViewController3" = "Digite a senha"; "XPLoginPwdViewController4" = "Login com Número de Telefone"; "XPLoginPwdViewController5" = "Esqueci a Senha"; -"XPLoginPwdViewController6" = "Digite sua conta MoliStar"; +"XPLoginPwdViewController6" = "Digite sua conta E-Parti"; "XPLoginBindPhoneResultViewController0" = "Vincular Telefone"; "XPLoginBindPhoneResultViewController1" = "O número de telefone vinculado atualmente é"; "XPLoginBindPhoneResultViewController2" = "Alterar Número de Telefone"; @@ -2748,7 +2748,7 @@ "XPCandyTreeBuyView0"="Por favor, selecione ou insira o número de martelos para comprar"; "PIMessageContentServiceReplyView0"="Como Recarregar:"; "PIMessageContentServiceReplyView1"="Copiar"; -"PIMessageContentServiceReplyView2"="1. Vá para 【Meu】-- 【Recarregar Moedas】 dentro do aplicativo MoliStar Voice para recarregar"; +"PIMessageContentServiceReplyView2"="1. Vá para 【Meu】-- 【Recarregar Moedas】 dentro do aplicativo E-Parti Voice para recarregar"; "PIMessageContentServiceReplyView3"="2. Contate o atendimento ao cliente"; "PIMessageContentServiceReplyView4"="WeChat do Atendimento: %@ "; "PIMessageContentServiceReplyView5"="Linha do Atendimento: %@ "; @@ -3204,7 +3204,7 @@ "1.0.37_text_51" = "Presentes foram colocados na bolsa!"; "1.0.37_text_52" = "Você não pode usar este recurso."; "20.20.51_text_1" = "Login por Email"; -"20.20.51_text_2" = "Bem-vindo ao MoliStar"; +"20.20.51_text_2" = "Bem-vindo ao E-Parti"; "20.20.51_text_3" = "Digite o ID"; "20.20.51_text_4" = "Digite o email"; "20.20.51_text_7" = "Digite o código de verificação"; diff --git a/YuMi/ru.lproj/InfoPlist.strings b/YuMi/ru.lproj/InfoPlist.strings index 6cd12cd..ff9669e 100644 --- a/YuMi/ru.lproj/InfoPlist.strings +++ b/YuMi/ru.lproj/InfoPlist.strings @@ -1,8 +1,8 @@ -NSCameraUsageDescription = "\"MoliStar\" нужен ваш consentimiento перед тем, как вы можете посетить, фотографировать и загружать ваши изображения, а затем отображать их на вашей персональной странице для просмотра другими людьми"; +NSCameraUsageDescription = "\"E-Parti\" нужен ваш consentimiento перед тем, как вы можете посетить, фотографировать и загружать ваши изображения, а затем отображать их на вашей персональной странице для просмотра другими людьми"; NSLocalNetworkUsageDescription = "Приложение обнаружит и подключится к устройствам в вашей сети"; NSLocationWhenInUseUsageDescription = "Вам необходимо дать согласие, прежде чем вы сможете использовать службы определения местоположения и рекомендовать близких друзей"; -NSMicrophoneUsageDescription = "\"MoliStar\" нужен ваш consentimiento перед тем, как он может проводить голосовый чат"; -NSPhotoLibraryAddUsageDescription = "\"MoliStar\" нужен ваш consentimiento перед тем, как он может хранить фотографии в альбоме"; -NSPhotoLibraryUsageDescription = "\"MoliStar\" нужен ваш consentimiento перед тем, как вы можете получить доступ к альбому и выбрать изображения, которые вам нужно загрузить, а затем отобразить их на вашей персональной странице для просмотра другими людьми"; +NSMicrophoneUsageDescription = "\"E-Parti\" нужен ваш consentimiento перед тем, как он может проводить голосовый чат"; +NSPhotoLibraryAddUsageDescription = "\"E-Parti\" нужен ваш consentimiento перед тем, как он может хранить фотографии в альбоме"; +NSPhotoLibraryUsageDescription = "\"E-Parti\" нужен ваш consentimiento перед тем, как вы можете получить доступ к альбому и выбрать изображения, которые вам нужно загрузить, а затем отобразить их на вашей персональной странице для просмотра другими людьми"; NSUserTrackingUsageDescription = "Пожалуйста, разрешите нам получить ваше разрешение на idfa, чтобы предоставить вам персонализированные мероприятия и услуги. ваша информация не будет использоваться для других целей без вашего разрешения"; diff --git a/YuMi/ru.lproj/Localizable.strings b/YuMi/ru.lproj/Localizable.strings index 070e31f..025cb6f 100644 --- a/YuMi/ru.lproj/Localizable.strings +++ b/YuMi/ru.lproj/Localizable.strings @@ -390,7 +390,7 @@ "XPLoginPwdViewController4" = "Вход по номеру телефона"; "XPLoginPwdViewController5" = "Забыли пароль"; -"XPLoginPwdViewController6" = "Пожалуйста, введите аккаунт MoliStar"; +"XPLoginPwdViewController6" = "Пожалуйста, введите аккаунт E-Parti"; "XPLoginBindPhoneResultViewController0" = "Привязать телефон"; "XPLoginBindPhoneResultViewController1" = "Ваш текущий привязанный номер телефона"; @@ -452,7 +452,7 @@ "XPShareView5" = "Ошибка при отправке"; "XPShareView6" = "Отменить отправку"; "XPShareView7" = "Отмена"; -"XPShareView8" = "Приходите в MoliStar и встречайте свой эксклюзивный голос"; +"XPShareView8" = "Приходите в E-Parti и встречайте свой эксклюзивный голос"; "XPShareView9" = "Ошибка при отправке из-за отсутствия связанных приложений"; "XPFirstRechargeViewController0" = "1. Каждый человек может получить преимущество за первый пополнение только один раз\n2. Каждая учетная запись и устройство могут участвовать только один раз."; "XPFirstRechargeViewController1" = "Пополнить сейчас"; @@ -508,12 +508,12 @@ "HttpRequestHelper1" = "Пожалуйста, проверьте интернет-подключение"; "HttpRequestHelper2" = "Пожалуйста, проверьте интернет-подключение"; "HttpRequestHelper3" = "Сессия входа истекла"; -"HttpRequestHelper4" = "MoliStar отдыхает Пожалуйста, попробуйте позже"; +"HttpRequestHelper4" = "E-Parti отдыхает Пожалуйста, попробуйте позже"; "HttpRequestHelper5" = "Неизвестная ошибка сервера"; "HttpRequestHelper6" = "Пожалуйста, проверьте интернет-подключение"; "HttpRequestHelper7" = "Сессия входа истекла."; -"AppDelegate_ThirdConfig0" = "MoliStar"; +"AppDelegate_ThirdConfig0" = "E-Parti"; "XPMineNotificaPresenter0" = "Системные уведомления"; "XPMineNotificaPresenter1" = "При отключении системные сообщения и официальные помощники больше не будут появляться"; @@ -929,7 +929,7 @@ "XPIAPRechargeViewController2" = "Подтвердить пополнение"; "XPIAPRechargeViewController3" = "《Соглашение о пополнении баланса пользователя》"; "XPIAPRechargeViewController4" = "Я прочел(а) и согласен(а)"; -"XPIAPRechargeViewController5" = "По всем вопросам обращайтесь в службу поддержки, MoliStar ID"; +"XPIAPRechargeViewController5" = "По всем вопросам обращайтесь в службу поддержки, E-Parti ID"; "XPIAPRechargeViewController6" = "Мой аккаунт"; "XPIAPRechargeViewController7" = "Напоминание"; "XPIAPRechargeViewController8" = "Пополнение не удалось. Пожалуйста, обратитесь в службу поддержки за помощью."; @@ -1637,7 +1637,7 @@ "RoomHeaderView1" = "Онлайн: %ld   ID: %ld"; "RoomHeaderView2" = "Онлайн: %ld   ID: %ld"; "RoomHeaderView3" = "Копировать ссылку"; -"RoomHeaderView4" = "Приходите на MoliStar, играйте в игры и заводите друзей"; +"RoomHeaderView4" = "Приходите на E-Parti, играйте в игры и заводите друзей"; "RoomHeaderView5" = "Красивые люди с сладкими голосами зарабатывают очки, давайте играть вместе~"; "RoomHeaderView6" = "Закладка успешно создана"; "RoomHeaderView7" = "Поделка успешно выполнена"; @@ -2312,7 +2312,7 @@ "XPLoginPwdViewController3" = "Введите пароль"; "XPLoginPwdViewController4" = "Вход по номеру телефона"; "XPLoginPwdViewController5" = "Забыли пароль"; -"XPLoginPwdViewController6" = "Введите ваш аккаунт MoliStar"; +"XPLoginPwdViewController6" = "Введите ваш аккаунт E-Parti"; "XPLoginBindPhoneResultViewController0" = "Привязать телефон"; "XPLoginBindPhoneResultViewController1" = "Текущий привязанный номер телефона"; @@ -3415,7 +3415,7 @@ "PIMessageContentServiceReplyView0"="Как пополнить баланс:"; "PIMessageContentServiceReplyView1"="Скопировать"; -"PIMessageContentServiceReplyView2"="1. Перейдите в 【Мой】-- 【Пополнить монеты】 внутри приложения MoliStar Voice для пополнения баланса"; +"PIMessageContentServiceReplyView2"="1. Перейдите в 【Мой】-- 【Пополнить монеты】 внутри приложения E-Parti Voice для пополнения баланса"; "PIMessageContentServiceReplyView3"="2. Свяжитесь с поддержкой"; "PIMessageContentServiceReplyView4"="WeChat поддержки: %@ "; "PIMessageContentServiceReplyView5"="Телефон поддержки: %@ "; @@ -3925,7 +3925,7 @@ "1.0.37_text_52" = "Вы не можете использовать эту функцию."; "20.20.51_text_1" = "Вход по электронной почте"; -"20.20.51_text_2" = "Добро пожаловать в MoliStar"; +"20.20.51_text_2" = "Добро пожаловать в E-Parti"; "20.20.51_text_3" = "Пожалуйста, введите ID"; "20.20.51_text_4" = "Пожалуйста, введите электронную почту"; "20.20.51_text_7" = "Пожалуйста, введите код подтверждения"; diff --git a/YuMi/tr.lproj/InfoPlist.strings b/YuMi/tr.lproj/InfoPlist.strings index 63ceefc..cc0358b 100644 --- a/YuMi/tr.lproj/InfoPlist.strings +++ b/YuMi/tr.lproj/InfoPlist.strings @@ -1,7 +1,7 @@ -NSCameraUsageDescription = "\"MoliStar\"'ın ziyaret etmeden önce, fotoğraf çekip yüklemeden önce onayınıza ihtiyacı var, ardından bunlar kişisel ana sayfanızda başkalarının görmesi için görüntülenecektir"; +NSCameraUsageDescription = "\"E-Parti\"'ın ziyaret etmeden önce, fotoğraf çekip yüklemeden önce onayınıza ihtiyacı var, ardından bunlar kişisel ana sayfanızda başkalarının görmesi için görüntülenecektir"; NSLocalNetworkUsageDescription = "Uygulama, ağınızdaki cihazları keşfedecek ve bağlanacaktır"; NSLocationWhenInUseUsageDescription = "Konum hizmetlerini kullanabilmeniz ve yakındaki arkadaşları önerebilmemiz için onayınız gereklidir"; -NSMicrophoneUsageDescription = "\"MoliStar\"'ın sesli sohbet gerçekleştirebilmesi için onayınıza ihtiyacı var"; -NSPhotoLibraryAddUsageDescription = "\"MoliStar\"'ın albüme fotoğraf kaydedebilmesi için onayınıza ihtiyacı var"; -NSPhotoLibraryUsageDescription = "\"MoliStar\"'ın albüme erişebilmesi, yüklemek için gerekli fotoğrafları seçebilmeniz ve ardından bunları kişisel ana sayfanızda başkalarının görmesi için görüntüleyebilmeniz için onayınıza ihtiyacı var"; +NSMicrophoneUsageDescription = "\"E-Parti\"'ın sesli sohbet gerçekleştirebilmesi için onayınıza ihtiyacı var"; +NSPhotoLibraryAddUsageDescription = "\"E-Parti\"'ın albüme fotoğraf kaydedebilmesi için onayınıza ihtiyacı var"; +NSPhotoLibraryUsageDescription = "\"E-Parti\"'ın albüme erişebilmesi, yüklemek için gerekli fotoğrafları seçebilmeniz ve ardından bunları kişisel ana sayfanızda başkalarının görmesi için görüntüleyebilmeniz için onayınıza ihtiyacı var"; NSUserTrackingUsageDescription = "Size kişiselleştirilmiş etkinlikler ve hizmetler sunabilmemiz için lütfen IDFA izninizi vermemize izin verin. İzniniz olmadan bilgileriniz başka amaçlar için kullanılmayacaktır"; diff --git a/YuMi/tr.lproj/Localizable.strings b/YuMi/tr.lproj/Localizable.strings index e761132..85d9b9c 100644 --- a/YuMi/tr.lproj/Localizable.strings +++ b/YuMi/tr.lproj/Localizable.strings @@ -50,7 +50,7 @@ "XPShareView5" = "Paylaşım başarısız oldu"; "XPShareView6" = "Paylaşımı iptal et"; "XPShareView7" = "İptal"; -"XPShareView8" = "MoliStar'a gel, özel sesinle tanış"; +"XPShareView8" = "E-Parti'a gel, özel sesinle tanış"; "XPShareView9" = "İlgili uygulama yüklü değil, paylaşım başarısız oldu"; ///XPFirstRechargeViewController.m "XPFirstRechargeViewController0" = "1. Herkes sadece bir kez ilk yükleme avantajı alabilir\n2. Her ID ve cihaz sadece bir kez katılabilir."; @@ -119,12 +119,12 @@ "HttpRequestHelper1" = "Lütfen internet bağlantınızı kontrol edin"; "HttpRequestHelper2" = "Lütfen internet bağlantınızı kontrol edin"; "HttpRequestHelper3" = "Giriş süresi aşıldı"; -"HttpRequestHelper4" = "MoliStar hata veriyor, lütfen daha sonra tekrar deneyin"; +"HttpRequestHelper4" = "E-Parti hata veriyor, lütfen daha sonra tekrar deneyin"; "HttpRequestHelper5" = "API hatası, bilinmeyen bilgiler"; "HttpRequestHelper6" = "Lütfen internet bağlantınızı kontrol edin"; "HttpRequestHelper7" = "Giriş süresi aşıldı"; -"AppDelegate_ThirdConfig0" = "MoliStar"; +"AppDelegate_ThirdConfig0" = "E-Parti"; "XPMineNotificaPresenter0" = "Sistem bildirimleri"; "XPMineNotificaPresenter1" = "Kapatıldığında, sistem mesajları ve resmi asistan artık size bildirim göstermeyecek"; @@ -531,7 +531,7 @@ "XPIAPRechargeViewController2" = "Şarj Et"; "XPIAPRechargeViewController3" = "Kullanıcı yükleme sözleşmesi"; "XPIAPRechargeViewController4" = "Okudum ve kabul ediyorum"; -"XPIAPRechargeViewController5" = "Herhangi bir sorunuz varsa lütfen müşteri hizmetleri ile iletişime geçin, MoliStar numarası"; +"XPIAPRechargeViewController5" = "Herhangi bir sorunuz varsa lütfen müşteri hizmetleri ile iletişime geçin, E-Parti numarası"; "XPIAPRechargeViewController6" = "Hesabım"; "XPIAPRechargeViewController7" = "Uyarı"; "XPIAPRechargeViewController8" = "Şarj başarısız, lütfen müşteri hizmetleri ile iletişime geçin~"; @@ -1237,7 +1237,7 @@ "RoomHeaderView1" = "Çevrimiçi:%ld ID:%ld"; "RoomHeaderView2" = "Çevrimiçi:%ld ID:%ld"; "RoomHeaderView3" = "Bağlantıyı Kopyala"; -"RoomHeaderView4" = "MoliStar'a gel, oyun oyna ve arkadaş edin"; +"RoomHeaderView4" = "E-Parti'a gel, oyun oyna ve arkadaş edin"; "RoomHeaderView5" = "Güzel ve tatlı sesli, beraber oynayalım~"; "RoomHeaderView6" = "Favorilere Eklendi"; "RoomHeaderView7" = "Paylaşım Başarılı"; @@ -2159,7 +2159,7 @@ "XPLoginPwdViewController3" = "Şifre girin"; "XPLoginPwdViewController4" = "Telefon ile Giriş"; "XPLoginPwdViewController5" = "Şifremi Unuttum"; -"XPLoginPwdViewController6" = "MoliStar hesabınızı girin"; +"XPLoginPwdViewController6" = "E-Parti hesabınızı girin"; "XPLoginBindPhoneResultViewController0" = "Telefon Bağlama Başarılı"; "XPLoginBindPhoneResultViewController1" = "Şu anda bağlı olduğunuz telefon numarası"; @@ -2884,7 +2884,7 @@ "PIMessageContentServiceReplyView0"="Nasıl yüklenir:"; "PIMessageContentServiceReplyView1"="Kopyala"; -"PIMessageContentServiceReplyView2"="1. MoliStar Ses Uygulaması içinde 【Benim】 - 【Parayı Yükle】'ye gidin ve yükleme yapın"; +"PIMessageContentServiceReplyView2"="1. E-Parti Ses Uygulaması içinde 【Benim】 - 【Parayı Yükle】'ye gidin ve yükleme yapın"; "PIMessageContentServiceReplyView3"="2. Müşteri hizmetleri ile iletişime geçin ve yükleme bağlantısını alın"; "PIMessageContentServiceReplyView4"="Müşteri Hizmetleri WeChat: %@ "; "PIMessageContentServiceReplyView5"="Müşteri Hizmetleri Line: %@ "; @@ -3702,7 +3702,7 @@ "1.0.37_text_52" = "Bu özelliği kullanamazsınız."; "20.20.51_text_1" = "E-posta Girişi"; -"20.20.51_text_2" = "Welcome to MoliStar"; +"20.20.51_text_2" = "Welcome to E-Parti"; "20.20.51_text_3" = "Lütfen kimlik girin"; "20.20.51_text_4" = "Lütfen e-posta girin"; "20.20.51_text_7" = "Lütfen doğrulama kodunu girin"; diff --git a/YuMi/uz-UZ.lproj/InfoPlist.strings b/YuMi/uz-UZ.lproj/InfoPlist.strings index 952c4c1..b4daff8 100644 --- a/YuMi/uz-UZ.lproj/InfoPlist.strings +++ b/YuMi/uz-UZ.lproj/InfoPlist.strings @@ -1,7 +1,7 @@ -NSCameraUsageDescription = "\"MoliStar\" sizning rozilingizni talab qiladi, siz tashrif buyurish, fotosurat olish va rasmlaringizni yuklashdan oldin, keyin ularni shaxsiy asosiy sahifangizda boshqalar ko'rishi uchun ko'rsatish"; +NSCameraUsageDescription = "\"E-Parti\" sizning rozilingizni talab qiladi, siz tashrif buyurish, fotosurat olish va rasmlaringizni yuklashdan oldin, keyin ularni shaxsiy asosiy sahifangizda boshqalar ko'rishi uchun ko'rsatish"; NSLocalNetworkUsageDescription = "Ilova tarmog'ingizdagi qurilmalarni topadi va ulanadi"; NSLocationWhenInUseUsageDescription = "Siz joylashuv xizmatlaridan foydalanishingiz va yaqin do'stlarni tavsiya qilishingizdan oldin rozilingiz kerak"; -NSMicrophoneUsageDescription = "\"MoliStar\" ovozli suhbat olib borishdan oldin sizning rozilingizni talab qiladi"; -NSPhotoLibraryAddUsageDescription = "\"MoliStar\" fotosuratlarni albomda saqlashdan oldin sizning rozilingizni talab qiladi"; -NSPhotoLibraryUsageDescription = "\"MoliStar\" albomga kirish va yuklash kerak bo'lgan rasmlarni tanlashdan oldin sizning rozilingizni talab qiladi, keyin ularni shaxsiy asosiy sahifangizda boshqalar ko'rishi uchun ko'rsatish"; +NSMicrophoneUsageDescription = "\"E-Parti\" ovozli suhbat olib borishdan oldin sizning rozilingizni talab qiladi"; +NSPhotoLibraryAddUsageDescription = "\"E-Parti\" fotosuratlarni albomda saqlashdan oldin sizning rozilingizni talab qiladi"; +NSPhotoLibraryUsageDescription = "\"E-Parti\" albomga kirish va yuklash kerak bo'lgan rasmlarni tanlashdan oldin sizning rozilingizni talab qiladi, keyin ularni shaxsiy asosiy sahifangizda boshqalar ko'rishi uchun ko'rsatish"; NSUserTrackingUsageDescription = "Iltimos, sizga shaxsiy aktivlar va xizmatlarni taqdim etish uchun idfa ruxsatini olishimizga ruxsat bering. Sizning ma'lumotlaringiz sizning ruxsatingizsiz boshqa maqsadlar uchun ishlatilmaydi"; diff --git a/YuMi/uz-UZ.lproj/Localizable.strings b/YuMi/uz-UZ.lproj/Localizable.strings index f1209a5..7b8a369 100644 --- a/YuMi/uz-UZ.lproj/Localizable.strings +++ b/YuMi/uz-UZ.lproj/Localizable.strings @@ -393,7 +393,7 @@ "XPLoginPwdViewController4" = "Telefon raqami orqali tizimga kirish"; "XPLoginPwdViewController5" = "Parolni unutdingiz"; -"XPLoginPwdViewController6" = "Iltimos MoliStar hisobini kiriting"; +"XPLoginPwdViewController6" = "Iltimos E-Parti hisobini kiriting"; "XPLoginBindPhoneResultViewController0" = "Telefonni bog'lash"; "XPLoginBindPhoneResultViewController1" = "Sizning hozirgi bog'langan telefon raqamingiz"; @@ -455,7 +455,7 @@ "XPShareView5" = "Ulashish muvaffaqiyatsiz"; "XPShareView6" = "Ulashishni bekor qilish"; "XPShareView7" = "Bekor qilish"; -"XPShareView8" = "MoliStar ga kelib, o'z eksklyuziv ovozingizni toping"; +"XPShareView8" = "E-Parti ga kelib, o'z eksklyuziv ovozingizni toping"; "XPShareView9" = "Tegishli ilovalar yo'qligi sababli ulashish muvaffaqiyatsiz bo'ldi"; "XPFirstRechargeViewController0" = "1. Har bir kishi faqat birinchi to'ldirish afzalligini bir marta olishi mumkin\n2. Har bir ID va qurilma faqat bir marta ishtirok etishi mumkin."; "XPFirstRechargeViewController1" = "Hozir to'ldirish"; @@ -511,12 +511,12 @@ "HttpRequestHelper1" = "Iltimos tarmoq ulanishini tekshiring"; "HttpRequestHelper2" = "Iltimos tarmoq ulanishini tekshiring"; "HttpRequestHelper3" = "Tizimga kirish sessiyasi muddati tugagan"; -"HttpRequestHelper4" = "MoliStar dam olmoqda, iltimos keyinroq urunib ko'ring"; +"HttpRequestHelper4" = "E-Parti dam olmoqda, iltimos keyinroq urunib ko'ring"; "HttpRequestHelper5" = "Serverdan noma'lum xato"; "HttpRequestHelper6" = "Iltimos tarmoq ulanishini tekshiring"; "HttpRequestHelper7" = "Tizimga kirish sessiyasi muddati tugagan."; -"AppDelegate_ThirdConfig0" = "MoliStar"; +"AppDelegate_ThirdConfig0" = "E-Parti"; "XPMineNotificaPresenter0" = "Tizim bildirishnomalari"; "XPMineNotificaPresenter1" = "O'chirilganda, tizim xabarlar va rasmiy yordamchilar endi ogohlantirmaydi"; @@ -911,7 +911,7 @@ "XPIAPRechargeViewController2" = "To'ldirishni tasdiqlash"; "XPIAPRechargeViewController3" = "《Foydalanuvchi To'ldirish Shartnomasi》"; "XPIAPRechargeViewController4" = "Men o'qidim va qabul qildim"; -"XPIAPRechargeViewController5" = "Savollar bo'lsa, iltimos mijozlar xizmatiga murojaat qiling, MoliStar ID"; +"XPIAPRechargeViewController5" = "Savollar bo'lsa, iltimos mijozlar xizmatiga murojaat qiling, E-Parti ID"; "XPIAPRechargeViewController6" = "Mening hisobim"; "XPIAPRechargeViewController7" = "Eslatma"; "XPIAPRechargeViewController8" = "To'ldirish muvaffaqiyatsiz. Iltimos yordam uchun mijozlar xizmatiga murojaat qiling."; @@ -1608,7 +1608,7 @@ "RoomHeaderView1" = "Onlayn: %ld ID: %ld"; "RoomHeaderView2" = "Onlayn: %ld ID: %ld"; "RoomHeaderView3" = "Havolani nusxalash"; -"RoomHeaderView4" = "MoliStar-ga keling, o'yinlar o'ynang va do'stlar orttiring"; +"RoomHeaderView4" = "E-Parti-ga keling, o'yinlar o'ynang va do'stlar orttiring"; "RoomHeaderView5" = "Go'zal ovozli chiroyli odamlar ball yutishadi, birga o'ynaylik~"; "RoomHeaderView6" = "Xatcho'p muvaffaqiyatli yaratildi"; "RoomHeaderView7" = "Ulashish muvaffaqiyatli amalga oshirildi"; @@ -2283,7 +2283,7 @@ Tasdiqlangandan so'ng, sekretar sizga uni chop etishda yordam beradi va sizni xa "XPLoginPwdViewController3" = "Iltimos, parolni kiriting"; "XPLoginPwdViewController4" = "Telefon raqami orqali tizimga kirish"; "XPLoginPwdViewController5" = "Parolni unutdingiz"; -"XPLoginPwdViewController6" = "Iltimos, MoliStar akkauntingizni kiriting"; +"XPLoginPwdViewController6" = "Iltimos, E-Parti akkauntingizni kiriting"; "XPLoginBindPhoneResultViewController0" = "Telefonni bog'lash"; "XPLoginBindPhoneResultViewController1" = "Joriy bog'langan telefon raqami"; @@ -3386,7 +3386,7 @@ Tasdiqlangandan so'ng, sekretar sizga uni chop etishda yordam beradi va sizni xa "PIMessageContentServiceReplyView0"="Qanday to'ldirish kerak:"; "PIMessageContentServiceReplyView1"="Nusxalash"; -"PIMessageContentServiceReplyView2"="1. MoliStar Voice ilovasidagi 【Mening】-- 【Tanga to'ldirish】 bo'limiga o'ting va to'ldiring"; +"PIMessageContentServiceReplyView2"="1. E-Parti Voice ilovasidagi 【Mening】-- 【Tanga to'ldirish】 bo'limiga o'ting va to'ldiring"; "PIMessageContentServiceReplyView3"="2. Xizmat ko'rsatuvchi bilan bog'laning"; "PIMessageContentServiceReplyView4"="Xizmat ko'rsatuvchi WeChat: %@ "; "PIMessageContentServiceReplyView5"="Xizmat ko'rsatuvchi telefon: %@ "; @@ -3896,7 +3896,7 @@ Tasdiqlangandan so'ng, sekretar sizga uni chop etishda yordam beradi va sizni xa "1.0.37_text_52" = "Siz bu funksiyadan foydalan olmaysiz."; "20.20.51_text_1" = "Email Login"; -"20.20.51_text_2" = "MoliStar ga xush kelibsiz"; +"20.20.51_text_2" = "E-Parti ga xush kelibsiz"; "20.20.51_text_3" = "Iltimos ID kiriting"; "20.20.51_text_4" = "Iltimos email kiriting"; "20.20.51_text_7" = "Iltimos tasdiqlash kodi kiriting"; diff --git a/YuMi/zh-Hant.lproj/InfoPlist.strings b/YuMi/zh-Hant.lproj/InfoPlist.strings index 240fd1d..c59e884 100644 --- a/YuMi/zh-Hant.lproj/InfoPlist.strings +++ b/YuMi/zh-Hant.lproj/InfoPlist.strings @@ -1,8 +1,8 @@ -NSCameraUsageDescription = "「MoliStar」需要您的同意,才可以訪問進行拍照並上傳您的圖片,然後展示在您的個人主頁上,便於他人查看"; +NSCameraUsageDescription = "「E-Parti」需要您的同意,才可以訪問進行拍照並上傳您的圖片,然後展示在您的個人主頁上,便於他人查看"; NSLocalNetworkUsageDescription = "此App將可發現和連接到您所用網絡上的設備"; NSLocationWhenInUseUsageDescription = "需要您的同意,才可以進行定位服務,推薦附近好友"; -NSMicrophoneUsageDescription = "「MoliStar」需要您的同意,才可以進行語音聊天"; -NSPhotoLibraryAddUsageDescription = "「MoliStar」需要您的同意,才可以存儲相片到相冊"; -NSPhotoLibraryUsageDescription = "「MoliStar」需要您的同意,才可以訪問相冊並選擇您需要上傳的圖片,然後展示在您的個人主頁上,便於他人查看"; +NSMicrophoneUsageDescription = "「E-Parti」需要您的同意,才可以進行語音聊天"; +NSPhotoLibraryAddUsageDescription = "「E-Parti」需要您的同意,才可以存儲相片到相冊"; +NSPhotoLibraryUsageDescription = "「E-Parti」需要您的同意,才可以訪問相冊並選擇您需要上傳的圖片,然後展示在您的個人主頁上,便於他人查看"; NSUserTrackingUsageDescription = "請允許我們獲取您的IDFA權限,可以為您提供個性化活動和服務。未經您的允許,您的信息將不作其他用途。"; diff --git a/YuMi/zh-Hant.lproj/Localizable.strings b/YuMi/zh-Hant.lproj/Localizable.strings index 28f5ecf..a2a24ac 100644 --- a/YuMi/zh-Hant.lproj/Localizable.strings +++ b/YuMi/zh-Hant.lproj/Localizable.strings @@ -60,7 +60,7 @@ "XPShareView5" = "分享失敗"; "XPShareView6" = "取消分享"; "XPShareView7" = "取消"; -"XPShareView8" = "來MoliStar,邂逅你的專屬聲音"; +"XPShareView8" = "來E-Parti,邂逅你的專屬聲音"; "XPShareView9" = "未安装相关App,分享失败"; ///XPFirstRechargeViewController.m "XPFirstRechargeViewController0" = "1.每人僅可獲得1次首充福利\n2.每個ID、設備僅能參加一次。"; @@ -128,13 +128,13 @@ "HttpRequestHelper1" = "請檢查網絡連接"; "HttpRequestHelper2" = "請檢查網絡連接"; "HttpRequestHelper3" = "登錄已過期"; -"HttpRequestHelper4" = "MoliStar開小差中~請稍後再試"; +"HttpRequestHelper4" = "E-Parti開小差中~請稍後再試"; "HttpRequestHelper5" = "接口報錯信息未知"; "HttpRequestHelper6" = "請檢查網絡連接"; "HttpRequestHelper7" = "登錄已過期。"; -"AppDelegate_ThirdConfig0" = "MoliStar"; +"AppDelegate_ThirdConfig0" = "E-Parti"; "XPMineNotificaPresenter0" = "系統通知"; "XPMineNotificaPresenter1" = "關閉後,系統消息和官方小秘書不再提示"; @@ -545,7 +545,7 @@ "XPIAPRechargeViewController2" = "確定充值"; "XPIAPRechargeViewController3" = "《用戶充值協議》"; "XPIAPRechargeViewController4" = "已閱讀並同意"; -"XPIAPRechargeViewController5" = "如有任何問題請咨詢客服,MoliStar號"; +"XPIAPRechargeViewController5" = "如有任何問題請咨詢客服,E-Parti號"; "XPIAPRechargeViewController6" = "我的賬戶"; "XPIAPRechargeViewController7" = "提示"; "XPIAPRechargeViewController8" = "儲值失敗,請聯系客服處理~"; @@ -1263,7 +1263,7 @@ "RoomHeaderView1" = "在線:%ld ID:%ld"; "RoomHeaderView2" = "在線:%ld ID:%ld"; "RoomHeaderView3" = "複製鏈接"; -"RoomHeaderView4" = "來MoliStar,開黑交友玩遊戲"; +"RoomHeaderView4" = "來E-Parti,開黑交友玩遊戲"; "RoomHeaderView5" = "人美聲甜帶上分,一起來玩吧~"; "RoomHeaderView6" = "收藏成功"; "RoomHeaderView7" = "分享成功"; @@ -2204,7 +2204,7 @@ "XPLoginPwdViewController3" = "請輸入密碼"; "XPLoginPwdViewController4" = "手機號登錄"; "XPLoginPwdViewController5" = "忘記密碼"; -"XPLoginPwdViewController6" = "請輸入MoliStar賬號"; +"XPLoginPwdViewController6" = "請輸入E-Parti賬號"; "XPLoginBindPhoneResultViewController0" = "綁定手機"; "XPLoginBindPhoneResultViewController1" = "您當前綁定的手機號為"; @@ -3075,7 +3075,7 @@ "PIMessageContentServiceReplyView0"="如何儲值:"; "PIMessageContentServiceReplyView1"="復製"; -"PIMessageContentServiceReplyView2"="1.在MoliStar語音App內前往【我的】-- 【儲值金幣】進行儲值"; +"PIMessageContentServiceReplyView2"="1.在E-Parti語音App內前往【我的】-- 【儲值金幣】進行儲值"; "PIMessageContentServiceReplyView3"="2.聯系客服獲取儲值鏈接"; "PIMessageContentServiceReplyView4"="客服WeChat: %@ "; "PIMessageContentServiceReplyView5"="客服Line:%@ "; @@ -3572,7 +3572,7 @@ "20.20.51_text_1" = "Email 登入"; -"20.20.51_text_2" = "Welcome to MoliStar"; +"20.20.51_text_2" = "Welcome to E-Parti"; "20.20.51_text_3" = "請輸入ID"; "20.20.51_text_4" = "請輸入信​​箱"; "20.20.51_text_7" = "請輸入驗證碼";