Files
eryao/apps/lib/l10n/app_localizations_en.dart
T
ZL-Q 87f92987b2 feat: 实现 iOS Apple Pay 内购支付功能
前端:
- 集成 in_app_purchase 插件,实现 IAP 支付流程
- 添加支付模块 (payments/) 处理产品获取、购买、验证
- 积分中心页面集成 Apple Pay 购买入口
- 设置页面重构: 关于/隐私/协议直接展示,删除 legal_center 子页面
- 修复欢迎引导页滚动检测阈值问题
- 修复解卦结果页 iOS 侧滑返回手势被阻止的问题
- 邀请码绑定按钮临时禁用(待后端实现)

后端:
- 新增 apple_iap_transactions 表记录交易
- 实现 Apple 服务器端验证 (App Store Server API)
- 支付成功后自动发放积分
- 支持 Sandbox/Production 环境切换
- 添加退款处理和交易状态机

协议:
- 更新积分流水协议,支持 purchase/refund 类型
- 新增 PAYMENT_* 错误码
2026-04-28 10:45:29 +08:00

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