87f92987b2
前端: - 集成 in_app_purchase 插件,实现 IAP 支付流程 - 添加支付模块 (payments/) 处理产品获取、购买、验证 - 积分中心页面集成 Apple Pay 购买入口 - 设置页面重构: 关于/隐私/协议直接展示,删除 legal_center 子页面 - 修复欢迎引导页滚动检测阈值问题 - 修复解卦结果页 iOS 侧滑返回手势被阻止的问题 - 邀请码绑定按钮临时禁用(待后端实现) 后端: - 新增 apple_iap_transactions 表记录交易 - 实现 Apple 服务器端验证 (App Store Server API) - 支付成功后自动发放积分 - 支持 Sandbox/Production 环境切换 - 添加退款处理和交易状态机 协议: - 更新积分流水协议,支持 purchase/refund 类型 - 新增 PAYMENT_* 错误码
1306 lines
38 KiB
Dart
1306 lines
38 KiB
Dart
// ignore: unused_import
|
|
import 'package:intl/intl.dart' as intl;
|
|
import 'app_localizations.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
|
|
/// The translations for English (`en`).
|
|
class AppLocalizationsEn extends AppLocalizations {
|
|
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
|
|
|
@override
|
|
String get appTitle => 'MeiYao Divination';
|
|
|
|
@override
|
|
String get welcomeLogin => 'Welcome Back';
|
|
|
|
@override
|
|
String get loginSubtitle => 'Sign in with your email';
|
|
|
|
@override
|
|
String get loginSubtitleEmail => 'Sign in with your email';
|
|
|
|
@override
|
|
String get emailHint => 'Enter email address';
|
|
|
|
@override
|
|
String get codeHint => 'Enter verification code';
|
|
|
|
@override
|
|
String get sendCode => 'Get Code';
|
|
|
|
@override
|
|
String get sending => 'Sending...';
|
|
|
|
@override
|
|
String retryAfter(int seconds) {
|
|
return 'Retry in ${seconds}s';
|
|
}
|
|
|
|
@override
|
|
String get login => 'Login';
|
|
|
|
@override
|
|
String get agreementPrefix => 'I have read and agree to ';
|
|
|
|
@override
|
|
String get aboutUs => 'About Us';
|
|
|
|
@override
|
|
String get aboutUsSubtitle =>
|
|
'Learn about the product vision of MeiYao Divination';
|
|
|
|
@override
|
|
String get privacyPolicy => 'Privacy Policy';
|
|
|
|
@override
|
|
String get privacyPolicySubtitle => 'Learn how we protect user privacy';
|
|
|
|
@override
|
|
String get termsOfService => 'Terms of Service';
|
|
|
|
@override
|
|
String get termsOfServiceSubtitle => 'Learn the service agreement for users';
|
|
|
|
@override
|
|
String get legalDocumentLoadFailedTitle => 'Failed to load document';
|
|
|
|
@override
|
|
String get legalDocumentLoadFailedPathPrefix => 'Path';
|
|
|
|
@override
|
|
String get legalDocumentLoadFailedErrorPrefix => 'Error';
|
|
|
|
@override
|
|
String get disclaimer => 'Disclaimer';
|
|
|
|
@override
|
|
String get icp => 'Yue ICP 2025428416-1A';
|
|
|
|
@override
|
|
String get invalidPhone => 'Please enter a valid phone number';
|
|
|
|
@override
|
|
String get invalidEmail => 'Please enter a valid email address';
|
|
|
|
@override
|
|
String get invalidCode => 'Please enter a 6-digit code';
|
|
|
|
@override
|
|
String get agreementRequired => 'Please accept the agreements first';
|
|
|
|
@override
|
|
String get codeSent => 'Code sent successfully';
|
|
|
|
@override
|
|
String get loginSuccess => 'Login success';
|
|
|
|
@override
|
|
String helloUser(String name) {
|
|
return 'Hi, $name';
|
|
}
|
|
|
|
@override
|
|
String get startJourney => 'Start Your Divination Journey';
|
|
|
|
@override
|
|
String get journeySubtitle => 'Explore possibilities with AI';
|
|
|
|
@override
|
|
String get startNow => 'Start Now';
|
|
|
|
@override
|
|
String get historyTitle => 'History';
|
|
|
|
@override
|
|
String get more => 'More';
|
|
|
|
@override
|
|
String get noRecords => 'No records yet';
|
|
|
|
@override
|
|
String get noRecordsSubtitle => 'You have not saved any records';
|
|
|
|
@override
|
|
String get homeTab => 'Home';
|
|
|
|
@override
|
|
String get profileTab => 'Me';
|
|
|
|
@override
|
|
String get notify => 'Message Notifications';
|
|
|
|
@override
|
|
String get featurePending => 'This feature is not connected yet';
|
|
|
|
@override
|
|
String get logout => 'Logout';
|
|
|
|
@override
|
|
String get defaultUserName => 'User';
|
|
|
|
@override
|
|
String get historyQuestion1 => 'Is this year a good time to change jobs?';
|
|
|
|
@override
|
|
String get historyQuestion2 => 'Can my relationship progress soon?';
|
|
|
|
@override
|
|
String get historyQuestion3 =>
|
|
'What pace should I keep for investments this quarter?';
|
|
|
|
@override
|
|
String get guaName1 => 'Wuwang';
|
|
|
|
@override
|
|
String get guaName2 => 'Ge';
|
|
|
|
@override
|
|
String get guaName3 => 'Guan';
|
|
|
|
@override
|
|
String get welcomeDialogTitle => 'Welcome to MeiYao Divination';
|
|
|
|
@override
|
|
String get welcomeParagraph1 =>
|
|
'Welcome to MeiYao Divination, an AI-assisted platform for interpreting traditional Six-Line divination and exploring Chinese classic wisdom.';
|
|
|
|
@override
|
|
String get welcomeParagraph2 =>
|
|
'Six-Line divination comes from the profound philosophy of the I Ching. It reflects how intention and timing are mapped into symbolic patterns.';
|
|
|
|
@override
|
|
String get welcomeParagraph3 =>
|
|
'MeiYao Divination helps you look beyond narrow thinking, see opportunities and risks from a broader trend perspective, and make clearer decisions.';
|
|
|
|
@override
|
|
String get warningTitle => 'Important Notice';
|
|
|
|
@override
|
|
String get warningBody =>
|
|
'All interpretations are AI-generated for entertainment only. Do not use them as professional advice for business, medical, or legal decisions.';
|
|
|
|
@override
|
|
String get scrollHint => 'Scroll down to read all';
|
|
|
|
@override
|
|
String get understood => 'Got It';
|
|
|
|
@override
|
|
String get readAllFirst => 'Please read all first';
|
|
|
|
@override
|
|
String get signBest => 'Supremely Auspicious';
|
|
|
|
@override
|
|
String get signGood => 'Auspicious';
|
|
|
|
@override
|
|
String get signNormal => 'Cautionary';
|
|
|
|
@override
|
|
String get signBad => 'Inauspicious';
|
|
|
|
@override
|
|
String get language => 'Language';
|
|
|
|
@override
|
|
String get settingsTitle => 'Settings';
|
|
|
|
@override
|
|
String get settingsSectionGeneral => 'Preferences';
|
|
|
|
@override
|
|
String get settingsSectionQuickAccess => 'Primary Menu';
|
|
|
|
@override
|
|
String get settingsSectionAccount => 'Account';
|
|
|
|
@override
|
|
String get settingsSectionPrivacy => 'Privacy';
|
|
|
|
@override
|
|
String get settingsSectionNotification => 'Notification Settings';
|
|
|
|
@override
|
|
String get settingsAccountAndDataTitle => 'Account Data';
|
|
|
|
@override
|
|
String get settingsInterfaceLanguage => 'Interface Language';
|
|
|
|
@override
|
|
String get settingsAiLanguage => 'AI Response Language';
|
|
|
|
@override
|
|
String get settingsNotificationAllow => 'Allow Notifications';
|
|
|
|
@override
|
|
String get settingsNotificationVibration => 'Allow Vibration';
|
|
|
|
@override
|
|
String get settingsSectionAbout => 'About';
|
|
|
|
@override
|
|
String get settingsGeneralTitle => 'General Settings';
|
|
|
|
@override
|
|
String settingsGeneralSubtitle(String currentLanguage) {
|
|
return 'Language: $currentLanguage. Other fields are reserved to match profiles.settings.';
|
|
}
|
|
|
|
@override
|
|
String get settingsPrivacyAndNotificationTitle => 'Privacy & Notifications';
|
|
|
|
@override
|
|
String get settingsPrivacyAndNotificationSubtitle =>
|
|
'Manage placeholders for privacy and notification groups';
|
|
|
|
@override
|
|
String get settingsLegalCenterTitle => 'About & Agreements';
|
|
|
|
@override
|
|
String get settingsLegalCenterSubtitle =>
|
|
'Read About Us, Privacy Policy, and Terms of Service';
|
|
|
|
@override
|
|
String get settingsCoinCenterTitle => 'Credits Center';
|
|
|
|
@override
|
|
String settingsCoinCenterSubtitle(int balance) {
|
|
return 'Balance: $balance credits. View packages and recharge entry.';
|
|
}
|
|
|
|
@override
|
|
String get settingsCoinHeroSubtitle =>
|
|
'Credits will be used for casting and related services later.';
|
|
|
|
@override
|
|
String get settingsAiLanguageHint =>
|
|
'This field will align with profiles.settings.preferences.ai_language once the real preference flow is connected.';
|
|
|
|
@override
|
|
String get settingsTimezone => 'Time Zone';
|
|
|
|
@override
|
|
String get settingsTimezoneHint =>
|
|
'This field will align with profiles.settings.preferences.timezone and later provide a real time zone picker.';
|
|
|
|
@override
|
|
String get settingsCountry => 'Country/Region';
|
|
|
|
@override
|
|
String get settingsCountryHint =>
|
|
'This field will align with profiles.settings.preferences.country and later provide a region picker.';
|
|
|
|
@override
|
|
String get settingsPrivacyProfileVisibility => 'Profile Visibility';
|
|
|
|
@override
|
|
String get settingsPrivacyPersonalization => 'Personalization';
|
|
|
|
@override
|
|
String get settingsPrivacyHistoryVisibility => 'History Visibility';
|
|
|
|
@override
|
|
String get settingsPrivacyHint =>
|
|
'These options will be stored under profiles.settings.privacy. The UI is prepared as a placeholder for now.';
|
|
|
|
@override
|
|
String get settingsNotificationSystem => 'System Notifications';
|
|
|
|
@override
|
|
String get settingsNotificationActivity => 'Activity Reminders';
|
|
|
|
@override
|
|
String get settingsNotificationResult => 'Result Reminders';
|
|
|
|
@override
|
|
String get settingsNotificationHint =>
|
|
'These options will be stored under profiles.settings.notification. The UI is prepared as a placeholder for now.';
|
|
|
|
@override
|
|
String get settingsVersion => 'App Version';
|
|
|
|
@override
|
|
String get settingsVersionHint =>
|
|
'Version details and more setting metadata will be connected later.';
|
|
|
|
@override
|
|
String get settingsTapToView => 'Tap to view';
|
|
|
|
@override
|
|
String get settingsComingSoon => 'Coming Soon';
|
|
|
|
@override
|
|
String settingsPlaceholderState(int count) {
|
|
return '$count config placeholders prepared';
|
|
}
|
|
|
|
@override
|
|
String get settingsCurrentValue => 'Current Value';
|
|
|
|
@override
|
|
String get settingsVersionLabel => 'Settings Version';
|
|
|
|
@override
|
|
String get settingsLogoutSubtitle => 'Sign out from the current account';
|
|
|
|
@override
|
|
String get settingsLogoutDialogTitle => 'Confirm logout?';
|
|
|
|
@override
|
|
String get settingsLogoutDialogBody =>
|
|
'You will need to sign in again to continue with this account.';
|
|
|
|
@override
|
|
String get settingsDeleteAccountTitle => 'Delete Account';
|
|
|
|
@override
|
|
String get settingsDeleteAccountSubtitle =>
|
|
'Permanently delete your account and personal data';
|
|
|
|
@override
|
|
String get settingsDeleteAccountWarningTitle =>
|
|
'Please confirm before deleting';
|
|
|
|
@override
|
|
String get settingsDeleteAccountWarningBody =>
|
|
'After deletion, related data including profile, history, and points will be permanently removed and cannot be restored.';
|
|
|
|
@override
|
|
String get settingsDeleteAccountReRegisterNotice =>
|
|
'Important: if you delete and re-register with the same email, consumed points will not be reset or refunded.';
|
|
|
|
@override
|
|
String get settingsDeleteAccountScopeProfile =>
|
|
'Profile and account information will be deleted';
|
|
|
|
@override
|
|
String get settingsDeleteAccountScopeHistory =>
|
|
'Divination history records will be deleted';
|
|
|
|
@override
|
|
String get settingsDeleteAccountScopePoints =>
|
|
'Points account and ledger records will be deleted';
|
|
|
|
@override
|
|
String get settingsDeleteAccountDialogTitle =>
|
|
'Permanently delete this account?';
|
|
|
|
@override
|
|
String get settingsDeleteAccountDialogBody =>
|
|
'This action cannot be undone. Deletion will start immediately after confirmation.';
|
|
|
|
@override
|
|
String get settingsDeleteAccountAction => 'Delete Account';
|
|
|
|
@override
|
|
String get settingsDeleteAccountProcessing => 'Deleting...';
|
|
|
|
@override
|
|
String settingsDeleteAccountWaitAction(int seconds) {
|
|
return 'Wait ${seconds}s before confirming deletion';
|
|
}
|
|
|
|
@override
|
|
String get settingsCancel => 'Cancel';
|
|
|
|
@override
|
|
String get settingsLogoutConfirmHint => 'Tap again to confirm logout';
|
|
|
|
@override
|
|
String get settingsLogoutConfirmAction => 'Tap again to logout';
|
|
|
|
@override
|
|
String get settingsEditProfileAction => 'Edit';
|
|
|
|
@override
|
|
String get settingsEditProfileTitle => 'Edit Profile';
|
|
|
|
@override
|
|
String get settingsAvatar => 'Avatar';
|
|
|
|
@override
|
|
String get settingsDisplayName => 'Display Name';
|
|
|
|
@override
|
|
String get settingsDisplayNameHint => 'Enter display name';
|
|
|
|
@override
|
|
String get settingsDisplayNameRequired => 'Display name is required';
|
|
|
|
@override
|
|
String get settingsBio => 'Bio';
|
|
|
|
@override
|
|
String get settingsBioHint => 'Write a short introduction';
|
|
|
|
@override
|
|
String get settingsAvatarPickerHint =>
|
|
'Supports PNG / JPG / WEBP. A clear square photo works best.';
|
|
|
|
@override
|
|
String get settingsAvatarChooseFromAlbum => 'Choose from Photos';
|
|
|
|
@override
|
|
String get settingsAvatarUploading => 'Uploading...';
|
|
|
|
@override
|
|
String get settingsAvatarUploadSuccess => 'Avatar uploaded';
|
|
|
|
@override
|
|
String get settingsAvatarPickPermissionHint =>
|
|
'Cannot open photo library. Please allow Photos access in system settings.';
|
|
|
|
@override
|
|
String get settingsLanguageSection => 'Interface Language';
|
|
|
|
@override
|
|
String get settingsCoinBalanceLabel => 'Current Credits';
|
|
|
|
@override
|
|
String settingsCoinBalanceValue(int balance) {
|
|
return '$balance credits';
|
|
}
|
|
|
|
@override
|
|
String get settingsCoinCenterDescription => '';
|
|
|
|
@override
|
|
String get settingsCoinRechargeSection => 'Recharge Packages';
|
|
|
|
@override
|
|
String get settingsCoinPackStarter => 'New User Pack';
|
|
|
|
@override
|
|
String get settingsCoinPackBasic => 'Starter Pack';
|
|
|
|
@override
|
|
String get settingsCoinPackPopular => 'Popular Pack';
|
|
|
|
@override
|
|
String get settingsCoinPackPremium => 'Premium Pack';
|
|
|
|
@override
|
|
String get settingsCoinPackPopularBadge => 'Popular';
|
|
|
|
@override
|
|
String get settingsPurchaseButton => 'Pay Now';
|
|
|
|
@override
|
|
String get settingsPurchasePending => '';
|
|
|
|
@override
|
|
String settingsCoinAmount(int amount) {
|
|
return '$amount credits';
|
|
}
|
|
|
|
@override
|
|
String get english => 'English';
|
|
|
|
@override
|
|
String get chinese => 'Chinese';
|
|
|
|
@override
|
|
String get dialogConfirm => 'OK';
|
|
|
|
@override
|
|
String get agreementSeparator => ', ';
|
|
|
|
@override
|
|
String get agreementAnd => ' and ';
|
|
|
|
@override
|
|
String get aboutUsContent =>
|
|
'Welcome to MeiYao Divination, an AI-assisted platform for interpreting traditional Six-Line divination and opening a window into classical Chinese wisdom.\n\nSix-Line divination originates from the deep philosophical system of the I Ching. It reflects the ancient idea that intention, timing, and the changing world are interconnected. After a hexagram is formed, it can be interpreted together with line texts and rules such as the Five Elements and GanZhi interactions to understand likely trends and developments.\n\nMeiYao Divination is built on this idea. Its core value is to help users step outside narrow thinking, understand contradictions, opportunities, and risks from a broader trend perspective, and make calmer, more thoughtful decisions. We hope AI can become a modern bridge to this old wisdom.\n\nImportant Notice\nAll divination interpretations are generated by AI and are for entertainment and reference only. They must not be used as the sole basis for business, medical, or other professional decisions.\n\nYue ICP 2025428416-1A';
|
|
|
|
@override
|
|
String get privacyContent =>
|
|
'Dear user,\nWelcome to MeiYao Divination. We understand that your privacy is critically important, and we take the protection of your personal information seriously. This policy explains how we collect, use, store, and share your information, as well as how you can access and manage it.\n\n1. Information We Collect\nWe may collect information you actively provide, including account registration details, profile information, and divination-related inputs and results. We may also collect device information and log data automatically to support security, compatibility, and service improvement.\n\n2. How We Use Information\nWe use your information to provide and improve divination services, manage accounts, protect account security, send service notifications, and respond to feedback or support requests.\n\n3. Storage of Information\nInformation collected in China is generally stored on servers located within China. We only retain personal information for as long as needed to meet legal obligations and service purposes, after which it will be deleted or anonymized.\n\n4. Sharing of Information\nWe do not share personal information with third parties except when you give clear consent, when we work with service providers under proper safeguards, when required by law, or in connection with mergers, acquisitions, restructuring, or bankruptcy.\n\n5. Your Rights\nYou may request access to, correction of, or deletion of your personal information, and you may request account cancellation. Please note that cancelling an account may make related data unrecoverable.\n\n6. Protection of Minors\nIf you are under the age of 14, please use the service under the guidance of a parent or legal guardian and obtain their prior consent.\n\n7. Security of Personal Information\nWe use reasonable organizational and technical measures, including encryption, access control, auditing, and monitoring, to protect personal information from unauthorized access, disclosure, use, modification, damage, or loss.\n\n8. Policy Updates\nWe may update this privacy policy from time to time because of legal, business, or service changes. Material changes will be communicated in a prominent way.\n\n9. Contact Us\nIf you have questions or suggestions about this privacy policy, please contact us at xuyunlong@xunmee.com.\n\nXunmee Technology (Shenzhen) Co., Ltd.\nJune 1, 2025';
|
|
|
|
@override
|
|
String get termsContent =>
|
|
'Chapter 1 General\nWelcome to MeiYao Divination. The app is developed, operated, and maintained by Xunmee Technology (Shenzhen) Co., Ltd. By downloading, installing, registering, signing in, or otherwise using the app, you confirm that you have read, understood, and accepted these terms.\n\nChapter 2 Service Description\nMeiYao Divination provides AI-based divination interpretation services, including manual and automatic casting flows. Service interruption caused by maintenance, failure, force majeure, or other reasonable causes does not constitute a breach.\n\nChapter 3 User Accounts and Information Security\nUsers must have proper legal capacity, provide true and valid registration information, and keep account credentials secure. Necessary personal information may be collected and processed according to the privacy policy.\n\nChapter 4 Intellectual Property\nAll content of MeiYao Divination, including software, text, images, audio, video, charts, trademarks, and domains, is protected by law. Reverse engineering, decompilation, disassembly, or any attempt to obtain source code without written permission is strictly prohibited.\n\nChapter 5 User Conduct\nUsers may not publish unlawful content, infringe on the rights of others, disrupt normal service operation, or conduct unauthorized commercial activity. The app may warn, restrict, suspend, or ban accounts that violate these rules and may pursue legal liability.\n\nChapter 6 Liability and Disclaimer\nUsers are responsible for losses caused by their own violations of these terms. AI-generated divination results are for reference only and must not be treated as the sole basis for real-world decisions. Users assume the related risks.\n\nChapter 7 Dispute Resolution\nThese terms are governed by the laws of the People\'s Republic of China. Disputes should first be resolved through friendly consultation. If consultation fails, either party may bring the dispute to the competent court where Xunmee Technology is registered.\n\nChapter 8 Miscellaneous\nNotices may be delivered through contact information, system messages, internal messages, or announcements. If you need to contact Xunmee Technology, please email xuyunlong@xunmee.com.\n\nXunmee Technology (Shenzhen) Co., Ltd.\nJune 1, 2025';
|
|
|
|
@override
|
|
String get disclaimerContent => 'Placeholder content for disclaimer.';
|
|
|
|
@override
|
|
String get toastLabelInfo => 'Tip';
|
|
|
|
@override
|
|
String get toastLabelSuccess => 'Success';
|
|
|
|
@override
|
|
String get toastLabelWarning => 'Warning';
|
|
|
|
@override
|
|
String get toastLabelError => 'Error';
|
|
|
|
@override
|
|
String get errorTooManyRequests =>
|
|
'Too many requests, please try again later';
|
|
|
|
@override
|
|
String get errorInvalidVerificationCode => 'Invalid verification code';
|
|
|
|
@override
|
|
String get errorSessionExpired => 'Session expired, please login again';
|
|
|
|
@override
|
|
String get errorServiceUnavailable =>
|
|
'Service unavailable, please try again later';
|
|
|
|
@override
|
|
String get errorServerGeneric => 'Server error, please try again later';
|
|
|
|
@override
|
|
String get errorRequestGeneric => 'Request failed, please try again';
|
|
|
|
@override
|
|
String get errorProfileDeleteFailed =>
|
|
'Failed to delete account, please try again';
|
|
|
|
@override
|
|
String get errorRunLimitExceeded =>
|
|
'Run limit reached in this session. Please start a new divination.';
|
|
|
|
@override
|
|
String get errorDivinationPayloadRequired =>
|
|
'Missing divination payload. Please cast again.';
|
|
|
|
@override
|
|
String get divinationScreenTitle => 'Cast Hexagram';
|
|
|
|
@override
|
|
String get divinationSelectMethod => 'Select divination method';
|
|
|
|
@override
|
|
String get divinationManualMethod => 'Manual Casting';
|
|
|
|
@override
|
|
String get divinationAutoMethod => 'Auto Casting';
|
|
|
|
@override
|
|
String get divinationQuestionTypePrompt => 'Select question type';
|
|
|
|
@override
|
|
String get divinationQuestionInputPrompt => 'Please enter your question';
|
|
|
|
@override
|
|
String get divinationQuestionInputHint =>
|
|
'Describe your question in detail for more accurate reading';
|
|
|
|
@override
|
|
String get divinationStartButton => 'Start Divination';
|
|
|
|
@override
|
|
String divinationCoinBalance(int balance) {
|
|
return 'Available coins: $balance';
|
|
}
|
|
|
|
@override
|
|
String get divinationRefreshBalance => 'Refresh balance';
|
|
|
|
@override
|
|
String get divinationRecommendManual =>
|
|
'Manual casting is recommended for more accurate readings! Prepare three identical coins and click here for the tutorial.';
|
|
|
|
@override
|
|
String get divinationMethodTipTitle => 'Divination Method';
|
|
|
|
@override
|
|
String get divinationMethodTipAuto =>
|
|
'Auto: No coins needed, just follow the instructions.';
|
|
|
|
@override
|
|
String get divinationMethodTipManual =>
|
|
'Manual: Prepare three identical coins.';
|
|
|
|
@override
|
|
String get divinationMethodTipRecommend =>
|
|
'Manual casting provides higher accuracy.';
|
|
|
|
@override
|
|
String get divinationManualGuideTitle => 'Manual Casting Tutorial';
|
|
|
|
@override
|
|
String get divinationManualGuideStep1 =>
|
|
'Left: Pattern side. Right: Inscription side. Prepare three identical coins or similar tokens.';
|
|
|
|
@override
|
|
String get divinationManualGuideStep2 =>
|
|
'Hold the coins in both hands, think about your question, then toss them onto a table. Record how many inscription sides and pattern sides appear.';
|
|
|
|
@override
|
|
String get divinationManualGuideStep3 =>
|
|
'Record each result by whether the inscription side or pattern side faces up. Repeat 6 times, recording from bottom to top.';
|
|
|
|
@override
|
|
String get autoGuideStep1Title => 'Auto Casting';
|
|
|
|
@override
|
|
String get autoGuideStep1Body =>
|
|
'No coins needed. Simply shake your phone or tap the button to cast. Each shake automatically rotates three coins and shows the result.';
|
|
|
|
@override
|
|
String get autoGuideStep2Title => 'Start Casting';
|
|
|
|
@override
|
|
String get autoGuideStep2Body =>
|
|
'Tap the \"Start Casting\" button or shake your phone. The coins will rotate automatically for 3 seconds.';
|
|
|
|
@override
|
|
String get autoGuideStep3Title => 'Auto Recording';
|
|
|
|
@override
|
|
String get autoGuideStep3Body =>
|
|
'Each shake automatically records the corresponding yao position. Repeat 6 times to complete all six yao.';
|
|
|
|
@override
|
|
String get autoGuideStep4Title => 'Analyze Hexagram';
|
|
|
|
@override
|
|
String get autoGuideStep4Body =>
|
|
'After 6 shakes, the \"Analyze Hexagram\" button will blink. Tap it to view the hexagram interpretation.';
|
|
|
|
@override
|
|
String get manualGuideStep1Title => 'Manual Casting';
|
|
|
|
@override
|
|
String get manualGuideStep1Body =>
|
|
'Prepare three identical coins. Record one yao at a time, from bottom to top, until all six yao are complete.';
|
|
|
|
@override
|
|
String get manualGuideStep2Title => 'Confirm Time';
|
|
|
|
@override
|
|
String get manualGuideStep2Body =>
|
|
'Check the casting time first. Tap \"Modify\" on the right if you need to adjust it.';
|
|
|
|
@override
|
|
String get manualGuideStep3Title => 'Fill Six Yao in Order';
|
|
|
|
@override
|
|
String get manualGuideStep3Body =>
|
|
'Start from the first yao and select one row at a time. The next row stays locked until the current row is completed.';
|
|
|
|
@override
|
|
String get manualGuideStep4Title => 'Start Analysis';
|
|
|
|
@override
|
|
String get manualGuideStep4Body =>
|
|
'After all six yao are filled, the \"Analyze Hexagram\" button will blink. Tap it to start interpretation.';
|
|
|
|
@override
|
|
String get yaoNameFirst => 'First Yao';
|
|
|
|
@override
|
|
String get yaoNameSecond => 'Second Yao';
|
|
|
|
@override
|
|
String get yaoNameThird => 'Third Yao';
|
|
|
|
@override
|
|
String get yaoNameFourth => 'Fourth Yao';
|
|
|
|
@override
|
|
String get yaoNameFifth => 'Fifth Yao';
|
|
|
|
@override
|
|
String get yaoNameTop => 'Top Yao';
|
|
|
|
@override
|
|
String get yaoYin => 'Yin';
|
|
|
|
@override
|
|
String get yaoYang => 'Yang';
|
|
|
|
@override
|
|
String get yaoYoungYin => 'Young Yin';
|
|
|
|
@override
|
|
String get yaoYoungYang => 'Young Yang';
|
|
|
|
@override
|
|
String get yaoOldYin => 'Old Yin';
|
|
|
|
@override
|
|
String get yaoOldYang => 'Old Yang';
|
|
|
|
@override
|
|
String get yaoMovingSuffix => '(moving)';
|
|
|
|
@override
|
|
String get autoCoinFaceZi => 'Inscription';
|
|
|
|
@override
|
|
String get autoCoinFaceHua => 'Pattern';
|
|
|
|
@override
|
|
String get divinationIAcknowledge => 'I Understand';
|
|
|
|
@override
|
|
String get divinationClose => 'Close';
|
|
|
|
@override
|
|
String get divinationModify => 'Modify';
|
|
|
|
@override
|
|
String get questionTypeCareer => 'Career';
|
|
|
|
@override
|
|
String get questionTypeLove => 'Love';
|
|
|
|
@override
|
|
String get questionTypeWealth => 'Wealth';
|
|
|
|
@override
|
|
String get questionTypeFortune => 'Fortune';
|
|
|
|
@override
|
|
String get questionTypeDream => 'Dream';
|
|
|
|
@override
|
|
String get questionTypeHealth => 'Health';
|
|
|
|
@override
|
|
String get questionTypeStudy => 'Study';
|
|
|
|
@override
|
|
String get questionTypeSearch => 'Search';
|
|
|
|
@override
|
|
String get questionTypeOther => 'Other';
|
|
|
|
@override
|
|
String get toastPleaseInputQuestion => 'Please enter your question';
|
|
|
|
@override
|
|
String get toastCoinInsufficient => 'Insufficient points';
|
|
|
|
@override
|
|
String get divinationCostDialogTitle => 'Confirm divination';
|
|
|
|
@override
|
|
String divinationCostDialogBody(int cost, int balance) {
|
|
return 'This run costs $cost credits. Available balance: $balance credits. Continue?';
|
|
}
|
|
|
|
@override
|
|
String get divinationCostDialogConfirm => 'Confirm';
|
|
|
|
@override
|
|
String get toastContentCopied => 'Content copied';
|
|
|
|
@override
|
|
String toastContentCopiedWithTitle(String title) {
|
|
return '$title copied';
|
|
}
|
|
|
|
@override
|
|
String get resultScreenTitle => 'Result';
|
|
|
|
@override
|
|
String get resultAIAnalysis => 'AI Analysis';
|
|
|
|
@override
|
|
String get resultShare => 'Share';
|
|
|
|
@override
|
|
String get resultBasicInfo => 'Basic Info';
|
|
|
|
@override
|
|
String get resultHexagramDetail => 'Hexagram Detail';
|
|
|
|
@override
|
|
String get resultConclusion => 'Conclusion';
|
|
|
|
@override
|
|
String get resultAnalysis => 'Analysis';
|
|
|
|
@override
|
|
String get resultSuggestion => 'Suggestion';
|
|
|
|
@override
|
|
String get resultDivinationInfo => 'Divination Info';
|
|
|
|
@override
|
|
String get resultDivinationTime => 'Casting Time';
|
|
|
|
@override
|
|
String get resultDivinationMethod => 'Method';
|
|
|
|
@override
|
|
String get resultQuestionType => 'Type';
|
|
|
|
@override
|
|
String get resultQuestion => 'Question';
|
|
|
|
@override
|
|
String get resultAutoMethod => 'Auto Casting';
|
|
|
|
@override
|
|
String get resultManualMethod => 'Manual Casting';
|
|
|
|
@override
|
|
String get signTypeShangShang => 'Supremely Auspicious';
|
|
|
|
@override
|
|
String get signTypeZhongShang => 'Auspicious';
|
|
|
|
@override
|
|
String get signTypeZhongXia => 'Cautionary';
|
|
|
|
@override
|
|
String get signTypeXiaXia => 'Inauspicious';
|
|
|
|
@override
|
|
String get resultCopy => 'Copy';
|
|
|
|
@override
|
|
String get resultWarning =>
|
|
'All interpretations are AI-generated for entertainment only. Do not use them as professional advice for business, medical, or legal decisions.';
|
|
|
|
@override
|
|
String get followUpEntryHint =>
|
|
'You can ask one follow-up question for this reading';
|
|
|
|
@override
|
|
String get followUpEntryAction => 'Ask Follow-up';
|
|
|
|
@override
|
|
String get followUpViewHistory => 'View history';
|
|
|
|
@override
|
|
String get followUpScreenTitle => 'Continue Follow-up';
|
|
|
|
@override
|
|
String get followUpEmpty => 'No messages yet';
|
|
|
|
@override
|
|
String get followUpQuotaUsed => 'Follow-up limit reached for this session';
|
|
|
|
@override
|
|
String get followUpInputHint => 'Type your follow-up question';
|
|
|
|
@override
|
|
String get followUpHoldToSpeak => 'Hold to speak';
|
|
|
|
@override
|
|
String get followUpRecording => 'Release to send';
|
|
|
|
@override
|
|
String get followUpRecordingHint => 'Slide up to cancel';
|
|
|
|
@override
|
|
String get followUpTranscribing => 'Transcribing voice...';
|
|
|
|
@override
|
|
String get followUpGenerating => 'Generating reply...';
|
|
|
|
@override
|
|
String get followUpStepWorker => 'Analyzing divination and generating reply';
|
|
|
|
@override
|
|
String followUpStepGeneric(String stepName) {
|
|
return 'Processing: $stepName';
|
|
}
|
|
|
|
@override
|
|
String get errorAudioUnsupportedFormat =>
|
|
'Unsupported audio format. Please use wav';
|
|
|
|
@override
|
|
String get errorAudioTooLarge =>
|
|
'Audio file too large. Please record a shorter clip';
|
|
|
|
@override
|
|
String get errorAudioEmpty => 'No valid voice detected. Please try again';
|
|
|
|
@override
|
|
String get errorAsrUnavailable =>
|
|
'Voice transcription service is unavailable now';
|
|
|
|
@override
|
|
String get transitionPreparing => 'Deriving...';
|
|
|
|
@override
|
|
String get transitionDeriving => 'Analyzing...';
|
|
|
|
@override
|
|
String get transitionDone => 'Complete\nTap to view';
|
|
|
|
@override
|
|
String get iChingTitle => 'I Ching';
|
|
|
|
@override
|
|
String get processingCardQianTitle => 'Qian • The Creative';
|
|
|
|
@override
|
|
String get processingCardQianQuote =>
|
|
'The movement of Heaven is full of power; thus the noble one makes himself strong and tireless.';
|
|
|
|
@override
|
|
String get processingCardDuiTitle => 'Dui • The Joyous';
|
|
|
|
@override
|
|
String get processingCardDuiQuote =>
|
|
'Joy grounded in integrity brings openness, harmony, and right expression.';
|
|
|
|
@override
|
|
String get processingCardLiTitle => 'Li • The Clinging Fire';
|
|
|
|
@override
|
|
String get processingCardLiQuote =>
|
|
'With clear brilliance, the great one illumines all directions.';
|
|
|
|
@override
|
|
String get processingCardZhenTitle => 'Zhen • The Arousing Thunder';
|
|
|
|
@override
|
|
String get processingCardZhenQuote =>
|
|
'Shock awakens the heart; composure turns fear into growth.';
|
|
|
|
@override
|
|
String get processingCardXunTitle => 'Xun • The Gentle Wind';
|
|
|
|
@override
|
|
String get processingCardXunQuote =>
|
|
'Gentle penetration furthers progress and helps one meet the right people.';
|
|
|
|
@override
|
|
String get processingCardKanTitle => 'Kan • The Abysmal Water';
|
|
|
|
@override
|
|
String get processingCardKanQuote =>
|
|
'In danger, sincerity and disciplined action carry one through.';
|
|
|
|
@override
|
|
String get processingCardGenTitle => 'Gen • Keeping Still Mountain';
|
|
|
|
@override
|
|
String get processingCardGenQuote =>
|
|
'Stillness at the proper time keeps one centered and steady in place.';
|
|
|
|
@override
|
|
String get processingCardKunTitle => 'Kun • The Receptive Earth';
|
|
|
|
@override
|
|
String get processingCardKunQuote =>
|
|
'The Earth\'s condition is devoted receptivity; the noble one carries all with broad virtue.';
|
|
|
|
@override
|
|
String get ganZhiInfo => '干支信息';
|
|
|
|
@override
|
|
String get wuXingWangShuai => '五行旺衰';
|
|
|
|
@override
|
|
String get ganZhiKongWang => '空亡信息';
|
|
|
|
@override
|
|
String get resultPillarColumn => '四柱';
|
|
|
|
@override
|
|
String get resultYearPillar => '年柱';
|
|
|
|
@override
|
|
String get resultMonthPillar => '月柱';
|
|
|
|
@override
|
|
String get resultDayPillar => '日柱';
|
|
|
|
@override
|
|
String get resultTimePillar => '时柱';
|
|
|
|
@override
|
|
String get resultGanZhiLabel => '干支';
|
|
|
|
@override
|
|
String get resultKongWangLabel => '空亡';
|
|
|
|
@override
|
|
String get termYueJian => '月建';
|
|
|
|
@override
|
|
String get termRiChen => '日辰';
|
|
|
|
@override
|
|
String get termYuePo => '月破';
|
|
|
|
@override
|
|
String get termRiChong => '日冲';
|
|
|
|
@override
|
|
String get guaNameSimplifiedChars => '风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济';
|
|
|
|
@override
|
|
String get guaNameTraditionalChars => '风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济';
|
|
|
|
@override
|
|
String get manualScreenTitle => 'Manual Casting';
|
|
|
|
@override
|
|
String get manualSelectTime => 'Select time';
|
|
|
|
@override
|
|
String get manualSpecifyYaoCombo => 'Select coin combination';
|
|
|
|
@override
|
|
String get manualStartResolve => 'Start Interpretation';
|
|
|
|
@override
|
|
String get manualSelectYaoTitle => 'Select Yao';
|
|
|
|
@override
|
|
String get manualYaoInstruction =>
|
|
'Tap to view casting method and coin combination guide';
|
|
|
|
@override
|
|
String get manualYaoTipTitle => 'Tip';
|
|
|
|
@override
|
|
String get manualYaoTipContent =>
|
|
'Select from bottom to top, not top to bottom.\n\nCast three coins together, select once each time, six times total.';
|
|
|
|
@override
|
|
String get manualCoinSelectHint =>
|
|
'Tap coins to flip between inscription and pattern. Record your casting result.';
|
|
|
|
@override
|
|
String get autoScreenTitle => 'Auto Casting';
|
|
|
|
@override
|
|
String get autoSelectTime => 'Select Time';
|
|
|
|
@override
|
|
String get autoCoinDivination => 'Coin Casting';
|
|
|
|
@override
|
|
String get autoHexagramForming => 'Forming Hexagram';
|
|
|
|
@override
|
|
String get autoShakeInstruction => 'Tap to view auto casting method';
|
|
|
|
@override
|
|
String get autoStartShake => 'Start Casting';
|
|
|
|
@override
|
|
String get autoContinueShake => 'Continue';
|
|
|
|
@override
|
|
String get autoFinishShake => 'Finish';
|
|
|
|
@override
|
|
String get autoShaking => 'Casting...';
|
|
|
|
@override
|
|
String get autoStartResolve => 'Start Interpretation';
|
|
|
|
@override
|
|
String autoShakeCountdown(int seconds) {
|
|
return 'Stopping in ${seconds}s';
|
|
}
|
|
|
|
@override
|
|
String autoShakeRemaining(int count) {
|
|
return '$count more times';
|
|
}
|
|
|
|
@override
|
|
String get autoShakeComplete => 'Tap the button below to analyze';
|
|
|
|
@override
|
|
String get autoTryShakePhone => 'You can also shake your phone';
|
|
|
|
@override
|
|
String autoSimBalance(int balance) {
|
|
return 'Available coins: $balance';
|
|
}
|
|
|
|
@override
|
|
String get autoGuideTitle => 'Auto Casting Tutorial';
|
|
|
|
@override
|
|
String get autoGuideInstruction =>
|
|
'Shake your phone or tap the button, cast 6 times to form a complete hexagram.';
|
|
|
|
@override
|
|
String get dateTab => 'Date';
|
|
|
|
@override
|
|
String get timeTab => 'Time Picker';
|
|
|
|
@override
|
|
String get confirm => 'Confirm';
|
|
|
|
@override
|
|
String get cancel => 'Cancel';
|
|
|
|
@override
|
|
String get coinFaceGuideTitle => 'Coin Face Guide';
|
|
|
|
@override
|
|
String get coinFaceGuideDescription =>
|
|
'Left: Pattern side. Right: Inscription side.';
|
|
|
|
@override
|
|
String get settingsInviteTitle => 'My Invitation';
|
|
|
|
@override
|
|
String get settingsInviteSubtitle => 'Invite friends, earn rewards together';
|
|
|
|
@override
|
|
String get settingsInviteMyCode => 'My Invite Code';
|
|
|
|
@override
|
|
String get settingsInviteCopySuccess => 'Invite code copied';
|
|
|
|
@override
|
|
String get settingsInviteCopied => 'Copied';
|
|
|
|
@override
|
|
String get settingsInviteCopy => 'Copy';
|
|
|
|
@override
|
|
String settingsInviteStats(int count) {
|
|
return 'Invited: $count friend(s)';
|
|
}
|
|
|
|
@override
|
|
String get settingsInviteBindCode => 'Bind Invite Code';
|
|
|
|
@override
|
|
String get settingsInviteBindHint => 'Enter your friend\'s invite code';
|
|
|
|
@override
|
|
String get settingsInviteBindPlaceholder => '6-digit code';
|
|
|
|
@override
|
|
String get settingsInviteBindButton => 'Bind';
|
|
|
|
@override
|
|
String get settingsInviteBindSuccess => 'Invite code bound successfully';
|
|
|
|
@override
|
|
String get settingsInviteBindFailed => 'Failed to bind invite code';
|
|
|
|
@override
|
|
String get settingsInviteGenerateTitle => 'Generate My Invite Code';
|
|
|
|
@override
|
|
String get settingsInviteGenerateButton => 'Generate My Invite Code';
|
|
|
|
@override
|
|
String get settingsInviteGenerateSuccess => 'Invite code generated';
|
|
|
|
@override
|
|
String get settingsInviteEmptyTitle => 'Invite Friends, Earn Rewards';
|
|
|
|
@override
|
|
String get settingsInviteEmptyDescription =>
|
|
'Each friend who registers using your invite code gives you bonus credits';
|
|
|
|
@override
|
|
String get settingsInviteInputLabel => 'Enter invite code (optional)';
|
|
|
|
@override
|
|
String get settingsInviteInputHint => 'Enter code to bind your inviter';
|
|
|
|
@override
|
|
String get settingsInviteInvalidCode =>
|
|
'Please enter a valid 6-character invite code';
|
|
|
|
@override
|
|
String get settingsDoNotSellTitle => 'Personalized Ads';
|
|
|
|
@override
|
|
String get settingsDoNotSellDescription =>
|
|
'When off, your personal info won\'t be used for ad recommendations';
|
|
|
|
@override
|
|
String get settingsDoNotSellEnabled => 'Off';
|
|
|
|
@override
|
|
String get settingsDoNotSellDisabled => 'On';
|
|
|
|
@override
|
|
String get settingsFeedbackTitle => 'Feedback';
|
|
|
|
@override
|
|
String get feedbackTitle => 'Feedback';
|
|
|
|
@override
|
|
String get feedbackTypeLabel => 'Feedback Type';
|
|
|
|
@override
|
|
String get feedbackTypeBug => 'Bug';
|
|
|
|
@override
|
|
String get feedbackTypeSuggestion => 'Suggestion';
|
|
|
|
@override
|
|
String get feedbackTypeOther => 'Other';
|
|
|
|
@override
|
|
String get feedbackContentLabel => 'Content';
|
|
|
|
@override
|
|
String get feedbackContentHint =>
|
|
'Please describe your issue or suggestion in detail...';
|
|
|
|
@override
|
|
String get feedbackImagesLabel => 'Add Screenshots (max 3)';
|
|
|
|
@override
|
|
String get feedbackAnonymousLabel => 'Do not upload my personal information';
|
|
|
|
@override
|
|
String get feedbackAnonymousHint =>
|
|
'If checked, your user ID will not be collected. Device info will still be collected for troubleshooting.';
|
|
|
|
@override
|
|
String get feedbackSubmit => 'Submit Feedback';
|
|
|
|
@override
|
|
String get feedbackSubmitting => 'Submitting...';
|
|
|
|
@override
|
|
String get feedbackSuccess =>
|
|
'Thank you for your feedback. We will process it soon.';
|
|
|
|
@override
|
|
String get feedbackContentRequired => 'Please enter feedback content';
|
|
|
|
@override
|
|
String get feedbackContentTooLong =>
|
|
'Feedback content cannot exceed 500 characters';
|
|
|
|
@override
|
|
String get feedbackTooManyImages => 'Maximum 3 images allowed';
|
|
|
|
@override
|
|
String get feedbackImageTooLarge => 'Image size cannot exceed 5MB';
|
|
|
|
@override
|
|
String get paymentSuccess => 'Purchase successful';
|
|
|
|
@override
|
|
String get paymentVerifyFailed =>
|
|
'Purchase verification failed, please try again later';
|
|
|
|
@override
|
|
String get paymentProductNotFound => 'Product temporarily unavailable';
|
|
|
|
@override
|
|
String get paymentStarterPackIneligible =>
|
|
'Starter pack is limited to one purchase per user';
|
|
|
|
@override
|
|
String get paymentProductUnavailable => 'Product temporarily unavailable';
|
|
|
|
@override
|
|
String get paymentPending => 'Apple is processing, please wait';
|
|
}
|