feat: 添加 E-Parti 启动画面及情绪颜色引导功能
主要变更: 1. 新增 ep_splash.png 作为应用启动时的展示图像。 2. 更新 Info.plist 中的应用名称和相关描述,替换为 "E-Parti"。 3. 引入 EPSignatureColorGuideView 和 EPEmotionColorStorage,支持用户选择和保存专属情绪颜色。 4. 在 AppDelegate 中集成情绪颜色引导逻辑,确保用户首次登录时能够选择专属颜色。 此更新旨在提升用户体验,增强应用的品牌识别度,并提供个性化的情绪表达功能。
This commit is contained in:
@@ -177,6 +177,8 @@ UIKIT_EXTERN NSString * adImageName;
|
||||
设置广告页
|
||||
*/
|
||||
- (void)setupLaunchADView {
|
||||
return;
|
||||
|
||||
NSUserDefaults * kUserDefaults = NSUserDefaults.standardUserDefaults;
|
||||
// 判断沙盒中是否存在广告图片,如果存在,直接显示
|
||||
NSString *adName = [kUserDefaults stringForKey:adImageName];
|
||||
|
@@ -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];
|
||||
|
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="24128" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||
<device id="retina5_9" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24063"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
@@ -16,46 +16,26 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="pi_app_logo_new_bg.png" translatesAutoresizingMaskIntoConstraints="NO" id="sON-N7-5Wv">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="355"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="355" id="BrK-cy-oiN"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Meet your exclusive voice~" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o5T-sv-tDU">
|
||||
<rect key="frame" x="79.333333333333329" y="312" width="216.66666666666669" height="22"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="18"/>
|
||||
<color key="textColor" red="0.023529411760000001" green="0.043137254899999998" blue="0.090196078430000007" alpha="1" colorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="pi_login_new_logo.png" translatesAutoresizingMaskIntoConstraints="NO" id="v2t-MR-31f">
|
||||
<rect key="frame" x="122.66666666666669" y="140" width="130" height="148"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="130" id="mQh-M0-hFI"/>
|
||||
<constraint firstAttribute="height" constant="148" id="tX3-Va-dub"/>
|
||||
</constraints>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ep_splash.png" translatesAutoresizingMaskIntoConstraints="NO" id="sON-N7-5Wv">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<viewLayoutGuide key="safeArea" id="r4O-Vu-IrR"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstItem="sON-N7-5Wv" firstAttribute="leading" secondItem="r4O-Vu-IrR" secondAttribute="leading" id="CEl-rE-BeK"/>
|
||||
<constraint firstItem="o5T-sv-tDU" firstAttribute="top" secondItem="v2t-MR-31f" secondAttribute="bottom" constant="24" id="GEv-XM-qev"/>
|
||||
<constraint firstItem="sON-N7-5Wv" firstAttribute="trailing" secondItem="r4O-Vu-IrR" secondAttribute="trailing" id="MsB-m5-LHI"/>
|
||||
<constraint firstItem="sON-N7-5Wv" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="SM6-2S-etM"/>
|
||||
<constraint firstItem="v2t-MR-31f" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" constant="140" id="YA3-7E-mLb"/>
|
||||
<constraint firstItem="o5T-sv-tDU" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="Yej-IY-emP"/>
|
||||
<constraint firstItem="v2t-MR-31f" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="x8C-D7-WvQ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="sON-N7-5Wv" secondAttribute="bottom" id="0zO-vt-zzT"/>
|
||||
<constraint firstItem="sON-N7-5Wv" firstAttribute="trailing" secondItem="r4O-Vu-IrR" secondAttribute="trailing" id="MAy-os-QAw"/>
|
||||
<constraint firstItem="sON-N7-5Wv" firstAttribute="leading" secondItem="r4O-Vu-IrR" secondAttribute="leading" id="Onc-xX-tha"/>
|
||||
<constraint firstItem="sON-N7-5Wv" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="vhU-0c-IHX"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="52.671755725190835" y="374.64788732394368"/>
|
||||
<point key="canvasLocation" x="52" y="374.6305418719212"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="pi_app_logo_new_bg.png" width="1125" height="273"/>
|
||||
<image name="pi_login_new_logo.png" width="486" height="96"/>
|
||||
<image name="ep_splash.png" width="1125" height="2436"/>
|
||||
</resources>
|
||||
</document>
|
||||
|
@@ -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: 显示提示
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -9,6 +9,7 @@
|
||||
#import "EPMineHeaderView.h"
|
||||
#import <Masonry/Masonry.h>
|
||||
#import <SDWebImage/SDWebImage.h>
|
||||
#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 {
|
||||
|
@@ -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];
|
||||
|
@@ -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 设置完成");
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -6,7 +6,7 @@
|
||||
//
|
||||
|
||||
#import "EPEmotionColorPicker.h"
|
||||
#import "EPEmotionColorStorage.h"
|
||||
#import "EPEmotionColorWheelView.h"
|
||||
#import <Masonry/Masonry.h>
|
||||
|
||||
@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<UIButton *> *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<NSString *> *colors = [EPEmotionColorStorage allEmotionColors];
|
||||
NSArray<NSString *> *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<NSString *> *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<UIButton *> *)colorButtons {
|
||||
if (!_colorButtons) {
|
||||
_colorButtons = [NSMutableArray array];
|
||||
}
|
||||
return _colorButtons;
|
||||
return _colorWheelView;
|
||||
}
|
||||
|
||||
@end
|
||||
|
42
YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.h
Normal file
42
YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.h
Normal file
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// EPEmotionColorWheelView.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by AI on 2025-10-15.
|
||||
// 共享情绪色轮组件 - 纯渲染逻辑,不包含容器和外部交互
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
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
|
||||
|
148
YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.m
Normal file
148
YuMi/E-P/NewMoments/Views/EPEmotionColorWheelView.m
Normal file
@@ -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<UIButton *> *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<NSString *> *colors = [EPEmotionColorStorage allEmotionColors];
|
||||
NSArray<NSString *> *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<NSString *> *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
|
||||
|
@@ -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;
|
||||
|
36
YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.h
Normal file
36
YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.h
Normal file
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// EPSignatureColorGuideView.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by AI on 2025-10-15.
|
||||
// 用户专属情绪颜色首次引导页
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
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
|
||||
|
260
YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.m
Normal file
260
YuMi/E-P/NewMoments/Views/EPSignatureColorGuideView.m
Normal file
@@ -0,0 +1,260 @@
|
||||
//
|
||||
// EPSignatureColorGuideView.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by AI on 2025-10-15.
|
||||
//
|
||||
|
||||
#import "EPSignatureColorGuideView.h"
|
||||
#import "EPEmotionColorWheelView.h"
|
||||
#import <Masonry/Masonry.h>
|
||||
|
||||
@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
|
||||
|
@@ -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",///夺宝达人
|
||||
|
@@ -57,7 +57,7 @@
|
||||
<key>FacebookClientToken</key>
|
||||
<string>189d1a90712cc61cedded4cf1372cb21</string>
|
||||
<key>FacebookDisplayName</key>
|
||||
<string>MoliStar</string>
|
||||
<string>E-Parti</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
@@ -96,17 +96,17 @@
|
||||
<true/>
|
||||
</dict>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>“MoliStar”需要您的同意,才可以访问进行拍照并上传您的图片,然后展示在您的个人主页上,便于他人查看</string>
|
||||
<string>"E-Parti"需要您的同意,才可以访问进行拍照并上传您的图片,然后展示在您的个人主页上,便于他人查看</string>
|
||||
<key>NSLocalNetworkUsageDescription</key>
|
||||
<string>此App将可发现和连接到您所用网络上的设备。</string>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>“MoliStar”需要您的同意,才可以进行定位服务,推荐附近好友</string>
|
||||
<string>"E-Parti"需要您的同意,才可以进行定位服务,推荐附近好友</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>“MoliStar”需要您的同意,才可以进行语音聊天</string>
|
||||
<string>"E-Parti"需要您的同意,才可以进行语音聊天</string>
|
||||
<key>NSPhotoLibraryAddUsageDescription</key>
|
||||
<string>“MoliStar”需要您的同意,才可以存储相片到相册</string>
|
||||
<string>"E-Parti"需要您的同意,才可以存储相片到相册</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>“MoliStar”需要您的同意,才可以访问相册并选择您需要上传的图片,然后展示在您的个人主页上,便于他人查看</string>
|
||||
<string>"E-Parti"需要您的同意,才可以访问相册并选择您需要上传的图片,然后展示在您的个人主页上,便于他人查看</string>
|
||||
<key>NSUserTrackingUsageDescription</key>
|
||||
<string>請允許我們獲取您的IDFA權限,可以為您提供個性化活動和服務。未經您的允許,您的信息將不作其他用途。</string>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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];
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -21,7 +21,7 @@
|
||||
if (self) {
|
||||
_title = title ?: @"";
|
||||
_subtitle = subtitle ?: @"";
|
||||
_appName = appName ?: @"MoliStar";
|
||||
_appName = appName ?: @"E-Parti";
|
||||
_url = url;
|
||||
_image = image;
|
||||
_appIcon = appIcon;
|
||||
|
@@ -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包
|
||||
}
|
||||
|
@@ -23,6 +23,10 @@
|
||||
#import "EPMomentCell.h"
|
||||
#import "EPMineHeaderView.h"
|
||||
|
||||
// MARK: - Emotion Color System
|
||||
#import "EPEmotionColorStorage.h"
|
||||
#import "EPSignatureColorGuideView.h"
|
||||
|
||||
// MARK: - QCloud SDK
|
||||
#import <QCloudCOSXML/QCloudCOSXML.h>
|
||||
|
||||
@@ -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"
|
||||
|
@@ -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" = "يرجى إدخال رمز التحقق";
|
||||
|
@@ -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";
|
||||
|
@@ -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";
|
||||
|
BIN
YuMi/ep_splash.png
Normal file
BIN
YuMi/ep_splash.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 MiB |
@@ -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";
|
||||
|
@@ -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";
|
||||
|
@@ -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" : {
|
||||
|
@@ -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";
|
||||
|
@@ -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";
|
||||
|
@@ -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, чтобы предоставить вам персонализированные мероприятия и услуги. ваша информация не будет использоваться для других целей без вашего разрешения";
|
||||
|
@@ -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" = "Пожалуйста, введите код подтверждения";
|
||||
|
@@ -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";
|
||||
|
@@ -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";
|
||||
|
@@ -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";
|
||||
|
@@ -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";
|
||||
|
@@ -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權限,可以為您提供個性化活動和服務。未經您的允許,您的信息將不作其他用途。";
|
||||
|
@@ -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" = "請輸入驗證碼";
|
||||
|
Reference in New Issue
Block a user