diff --git a/.opencode/opencode.json b/.opencode/opencode.json index 0b8a85c..cfb9c32 100644 --- a/.opencode/opencode.json +++ b/.opencode/opencode.json @@ -1,9 +1,5 @@ { "$schema": "https://opencode.ai/config.json", - "instructions": [ - "./.opencode/memory/current.md", - "./.opencode/memory/durable.md" - ], "mcp": { "supabase": { "type": "remote", diff --git a/apps/AGENTS.md b/apps/AGENTS.md index a4f5269..6dad690 100644 --- a/apps/AGENTS.md +++ b/apps/AGENTS.md @@ -72,6 +72,49 @@ appBar: AppBar( - Signature level labels (`上上签/中上签/中下签`) may be localized for UI display only, while protocol/storage values remain canonical Chinese. - l10n can translate explanatory copy, but must not alter canonical divination terminology semantics. +## Localization Generation Rules (Must) + +The l10n system uses ARB files as the **single source of truth**. Generated `.dart` files are auto-derived and **must not be edited manually**. + +### File Structure + +``` +apps/lib/l10n/ +├── l10n.yaml # flutter gen-l10n configuration +├── app_zh.arb # Chinese (Simplified) source +├── app_zh_hant.arb # Chinese (Traditional) source +├── app_en.arb # English source +├── app_localizations.dart # GENERATED — do not edit +├── app_localizations_zh.dart # GENERATED — do not edit +├── app_localizations_zh_hant.dart # GENERATED — do not edit +└── app_localizations_en.dart # GENERATED — do not edit +``` + +### Adding or Modifying Translations + +1. **Edit `.arb` files only** — never edit generated `.dart` files directly. Edits to `.dart` files will be overwritten on next `flutter gen-l10n`. +2. When adding a new translation key: + - Add it to all locale ARB files (`app_zh.arb`, `app_zh_hant.arb`, `app_en.arb`) with the same key. + - For pluralizable/interpolated strings, also add `@key` metadata blocks as shown in existing entries. + - Run `flutter gen-l10n` to regenerate all `.dart` files. +3. When adding a new locale: + - Create a new `app_.arb` file with `"@@locale": ""`. + - Add the locale to `l10n.yaml`'s `output-localization-file` / `supported-locales` if configured. + - Run `flutter gen-l10n`. + +### Supported Locales + +- `zh` — Chinese Simplified (default) +- `zh_Hant` — Chinese Traditional +- `en` — English +- Script-based locales in Flutter code must use `Locale.fromSubtags(...)`; do not use `Locale('zh', 'Hant')` (that treats `Hant` as countryCode, not scriptCode). + +### Traditional Chinese Translation Principles + +- **Canonical divination terms** (六爻、爻、动爻、世爻、应爻、五行旺衰、空亡、干支、月建等) remain in Traditional Chinese form — they are not Simplified-to-Traditional converted. These are the correct scholarly expressions in both variants. +- General UI copy uses standard Simplified↔Traditional conversion (e.g., 設置→設定、資訊→信息). +- Placeholder and variable text in ARB files must match exactly — `{name}` (single braces) and corresponding `@key.placeholders` metadata must stay in sync. + ## Reuse & Composition (Must) - Prefer `apps/lib/shared/widgets/` before adding new components. diff --git a/apps/lib/app/app.dart b/apps/lib/app/app.dart index e824453..03dc486 100644 --- a/apps/lib/app/app.dart +++ b/apps/lib/app/app.dart @@ -379,8 +379,10 @@ class _EryaoAppState extends State { } Future _bootstrap() async { - final localeCode = await _sessionStore.getLocaleCode(); - final locale = localeCode == 'en' ? const Locale('en') : const Locale('zh'); + final localeTag = await _sessionStore.getLocaleTag(); + final locale = localeTag != null + ? localeFromLanguageTag(localeTag) + : const Locale('zh'); if (mounted) { setState(() { _locale = locale; @@ -392,7 +394,7 @@ class _EryaoAppState extends State { Future _handleInterfaceLanguageChanged(String languageTag) async { final locale = localeFromLanguageTag(languageTag); - await _sessionStore.saveLocaleCode(locale.languageCode); + await _sessionStore.saveLocaleTag(languageTag); if (!mounted) { return; } diff --git a/apps/lib/core/auth/session_store.dart b/apps/lib/core/auth/session_store.dart index 1e67523..83f111d 100644 --- a/apps/lib/core/auth/session_store.dart +++ b/apps/lib/core/auth/session_store.dart @@ -59,11 +59,11 @@ class SessionStore { return _kvStore.getBool(_welcomeReadKey); } - Future saveLocaleCode(String localeCode) async { - await _kvStore.setString(_localeKey, localeCode); + Future saveLocaleTag(String localeTag) async { + await _kvStore.setString(_localeKey, localeTag); } - Future getLocaleCode() async { + Future getLocaleTag() async { return _kvStore.getString(_localeKey); } } diff --git a/apps/lib/features/divination/presentation/screens/divination_result_screen.dart b/apps/lib/features/divination/presentation/screens/divination_result_screen.dart index 9e816fe..4c77dd5 100644 --- a/apps/lib/features/divination/presentation/screens/divination_result_screen.dart +++ b/apps/lib/features/divination/presentation/screens/divination_result_screen.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:intl/intl.dart'; @@ -426,7 +424,6 @@ class _ResultHeader extends StatelessWidget { @override Widget build(BuildContext context) { - final colors = Theme.of(context).colorScheme; final l10n = AppLocalizations.of(context)!; return Row( children: [ @@ -436,29 +433,6 @@ class _ResultHeader extends StatelessWidget { context, ).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w700), ), - const Spacer(), - TextButton( - onPressed: () { - final payload = { - 'signType': data.signType, - 'question': data.params.question, - 'keywords': data.keywords, - 'conclusion': data.conclusion, - }; - Clipboard.setData( - ClipboardData( - text: const JsonEncoder.withIndent(' ').convert(payload), - ), - ); - Toast.show( - context, - l10n.toastContentCopied, - type: ToastType.success, - ); - }, - style: TextButton.styleFrom(foregroundColor: colors.primary), - child: Text(l10n.resultShare), - ), ], ); } @@ -799,6 +773,8 @@ class _HexagramDetailCard extends StatelessWidget { Widget build(BuildContext context) { final colors = Theme.of(context).colorScheme; final l10n = AppLocalizations.of(context)!; + final isTraditionalChinese = + Localizations.localeOf(context).scriptCode == 'Hant'; return Column( children: [ Card( @@ -826,14 +802,14 @@ class _HexagramDetailCard extends StatelessWidget { Expanded( child: _miniKV( context, - DivinationTerms.yueJian, + l10n.termYueJian, data.ganzhi.yueJian, ), ), Expanded( child: _miniKV( context, - DivinationTerms.riChen, + l10n.termRiChen, data.ganzhi.riChen, ), ), @@ -845,14 +821,14 @@ class _HexagramDetailCard extends StatelessWidget { Expanded( child: _miniKV( context, - DivinationTerms.yuePo, + l10n.termYuePo, data.ganzhi.yuePo, ), ), Expanded( child: _miniKV( context, - DivinationTerms.riChong, + l10n.termRiChong, data.ganzhi.riChong, ), ), @@ -898,7 +874,11 @@ class _HexagramDetailCard extends StatelessWidget { children: [ Expanded( child: Text( - data.guaName, + _toTraditionalGuaNameIfNeeded( + data.guaName, + isTraditionalChinese, + l10n, + ), textAlign: TextAlign.center, style: Theme.of(context).textTheme.titleMedium ?.copyWith(fontWeight: FontWeight.w700), @@ -907,7 +887,11 @@ class _HexagramDetailCard extends StatelessWidget { if (data.hasChangingYao) Expanded( child: Text( - data.targetGuaName, + _toTraditionalGuaNameIfNeeded( + data.targetGuaName, + isTraditionalChinese, + l10n, + ), textAlign: TextAlign.center, style: Theme.of(context).textTheme.titleMedium ?.copyWith(fontWeight: FontWeight.w700), @@ -943,6 +927,24 @@ class _HexagramDetailCard extends StatelessWidget { } } +String _toTraditionalGuaNameIfNeeded( + String value, + bool isTraditionalChinese, + AppLocalizations l10n, +) { + if (!isTraditionalChinese || value.isEmpty) { + return value; + } + final from = l10n.guaNameSimplifiedChars; + final to = l10n.guaNameTraditionalChars; + final map = {}; + final length = from.length < to.length ? from.length : to.length; + for (var i = 0; i < length; i++) { + map[from[i]] = to[i]; + } + return value.split('').map((char) => map[char] ?? char).join(); +} + class _WuXingTable extends StatelessWidget { const _WuXingTable({required this.data}); diff --git a/apps/lib/features/settings/data/models/profile_settings.dart b/apps/lib/features/settings/data/models/profile_settings.dart index 2e6e264..405544e 100644 --- a/apps/lib/features/settings/data/models/profile_settings.dart +++ b/apps/lib/features/settings/data/models/profile_settings.dart @@ -5,7 +5,9 @@ import '../../../../l10n/app_localizations.dart'; String displayLanguageLabel(AppLocalizations l10n, String languageTag) { return switch (languageTag) { 'en-US' => l10n.english, - _ => l10n.chinese, + 'zh-Hant' => '繁體中文', + 'zh-CN' => '简体中文', + _ => '简体中文', }; } @@ -113,6 +115,10 @@ String languageTagFromLocale(Locale locale) { case 'en': return 'en-US'; case 'zh': + if (locale.scriptCode == 'Hant') { + return 'zh-Hant'; + } + return 'zh-CN'; default: return 'zh-CN'; } @@ -122,5 +128,8 @@ Locale localeFromLanguageTag(String tag) { if (tag.toLowerCase().startsWith('en')) { return const Locale('en'); } + if (tag == 'zh-Hant') { + return const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'); + } return const Locale('zh'); } diff --git a/apps/lib/features/settings/presentation/screens/general_settings_screen.dart b/apps/lib/features/settings/presentation/screens/general_settings_screen.dart index b7d4f86..7642b53 100644 --- a/apps/lib/features/settings/presentation/screens/general_settings_screen.dart +++ b/apps/lib/features/settings/presentation/screens/general_settings_screen.dart @@ -89,7 +89,7 @@ class _GeneralSettingsScreenState extends State { ), tint: colors.primary, background: colors.surfaceContainerHighest, - showDivider: true, + showDivider: false, onTap: () => _selectLanguage( _settings.preferences.aiLanguage, (lang) => setState(() { @@ -101,24 +101,6 @@ class _GeneralSettingsScreenState extends State { }), ), ), - SettingsMenuTile( - icon: Icons.access_time_rounded, - title: l10n.settingsTimezone, - subtitle: _settings.preferences.timezone, - tint: colors.primary, - background: colors.surfaceContainerHighest, - showDivider: true, - onTap: () => _selectTimezone(context), - ), - SettingsMenuTile( - icon: Icons.public_rounded, - title: l10n.settingsCountry, - subtitle: _settings.preferences.country, - tint: colors.primary, - background: colors.surfaceContainerHighest, - showDivider: false, - onTap: () => _selectCountry(context), - ), ], ), const SizedBox(height: AppSpacing.lg), @@ -169,44 +151,6 @@ class _GeneralSettingsScreenState extends State { await widget.onSettingsChanged(_settings); } - Future _selectTimezone(BuildContext context) async { - final result = await Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => TimezoneSettingsScreen( - selectedTimezone: _settings.preferences.timezone, - ), - ), - ); - if (result == null || result == _settings.preferences.timezone) { - return; - } - setState(() { - _settings = _settings.copyWith( - preferences: _settings.preferences.copyWith(timezone: result), - ); - }); - await widget.onSettingsChanged(_settings); - } - - Future _selectCountry(BuildContext context) async { - final result = await Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => CountrySettingsScreen( - selectedCountry: _settings.preferences.country, - ), - ), - ); - if (result == null || result == _settings.preferences.country) { - return; - } - setState(() { - _settings = _settings.copyWith( - preferences: _settings.preferences.copyWith(country: result), - ); - }); - await widget.onSettingsChanged(_settings); - } - void _updateNotification({bool? allowNotifications, bool? allowVibration}) { final newNotification = _settings.notification.copyWith( allowNotifications: allowNotifications, @@ -219,114 +163,3 @@ class _GeneralSettingsScreenState extends State { widget.onSettingsChanged(newSettings); } } - -class TimezoneSettingsScreen extends StatelessWidget { - const TimezoneSettingsScreen({super.key, required this.selectedTimezone}); - - final String selectedTimezone; - - static const _timezones = [ - 'Asia/Shanghai', - 'Asia/Hong_Kong', - 'Asia/Tokyo', - 'America/New_York', - 'America/Los_Angeles', - 'Europe/London', - 'Europe/Paris', - ]; - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final colors = Theme.of(context).colorScheme; - - return Scaffold( - backgroundColor: colors.surfaceContainerLow, - appBar: AppBar( - title: Text(l10n.settingsTimezone), - centerTitle: true, - backgroundColor: colors.surfaceContainerLow, - surfaceTintColor: colors.surfaceContainerLow, - ), - body: ListView( - padding: const EdgeInsets.all(AppSpacing.lg), - children: [ - SettingsGroupCard( - children: [ - for (int i = 0; i < _timezones.length; i++) - SettingsMenuTile( - icon: Icons.access_time_rounded, - title: _timezones[i], - subtitle: '', - tint: colors.primary, - background: colors.surfaceContainerHighest, - showDivider: i != _timezones.length - 1, - showChevron: false, - trailing: selectedTimezone == _timezones[i] - ? Icon(Icons.check_rounded, color: colors.primary) - : null, - onTap: () => Navigator.of(context).pop(_timezones[i]), - ), - ], - ), - ], - ), - ); - } -} - -class CountrySettingsScreen extends StatelessWidget { - const CountrySettingsScreen({super.key, required this.selectedCountry}); - - final String selectedCountry; - - static const _countries = ['CN', 'HK', 'TW', 'US', 'JP', 'GB', 'FR']; - static const _labels = [ - 'China', - 'Hong Kong', - 'Taiwan', - 'USA', - 'Japan', - 'UK', - 'France', - ]; - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final colors = Theme.of(context).colorScheme; - - return Scaffold( - backgroundColor: colors.surfaceContainerLow, - appBar: AppBar( - title: Text(l10n.settingsCountry), - centerTitle: true, - backgroundColor: colors.surfaceContainerLow, - surfaceTintColor: colors.surfaceContainerLow, - ), - body: ListView( - padding: const EdgeInsets.all(AppSpacing.lg), - children: [ - SettingsGroupCard( - children: [ - for (int i = 0; i < _countries.length; i++) - SettingsMenuTile( - icon: Icons.public_rounded, - title: _labels[i], - subtitle: _countries[i], - tint: colors.primary, - background: colors.surfaceContainerHighest, - showDivider: i != _countries.length - 1, - showChevron: false, - trailing: selectedCountry == _countries[i] - ? Icon(Icons.check_rounded, color: colors.primary) - : null, - onTap: () => Navigator.of(context).pop(_countries[i]), - ), - ], - ), - ], - ), - ); - } -} diff --git a/apps/lib/features/settings/presentation/screens/language_settings_screen.dart b/apps/lib/features/settings/presentation/screens/language_settings_screen.dart index 2b8ae5d..dd94fc8 100644 --- a/apps/lib/features/settings/presentation/screens/language_settings_screen.dart +++ b/apps/lib/features/settings/presentation/screens/language_settings_screen.dart @@ -70,6 +70,8 @@ class LanguageSettingsScreen extends StatelessWidget { return '$lang-$script-$country'; } else if (country != null) { return '$lang-$country'; + } else if (script != null) { + return '$lang-$script'; } return _mapToBackendTag(lang); } @@ -80,10 +82,13 @@ class LanguageSettingsScreen extends StatelessWidget { } String _getLocaleLabel(Locale locale, AppLocalizations l10n) { - if (locale.languageCode == 'zh') { - return l10n.chinese; - } else if (locale.languageCode == 'en') { + if (locale.languageCode == 'en') { return l10n.english; + } else if (locale.languageCode == 'zh') { + if (locale.scriptCode == 'Hant') { + return '繁體中文'; + } + return '简体中文'; } return locale.languageCode; } diff --git a/apps/lib/l10n/app_en.arb b/apps/lib/l10n/app_en.arb index f89ae33..d22ece9 100644 --- a/apps/lib/l10n/app_en.arb +++ b/apps/lib/l10n/app_en.arb @@ -385,16 +385,22 @@ "processingCardGenQuote": "Stillness at the proper time keeps one centered and steady in place.", "processingCardKunTitle": "Kun • The Receptive Earth", "processingCardKunQuote": "The Earth's condition is devoted receptivity; the noble one carries all with broad virtue.", - "ganZhiInfo": "GanZhi Info", - "wuXingWangShuai": "WuXing Strength", - "ganZhiKongWang": "KongWang Info", - "resultPillarColumn": "Pillar", - "resultYearPillar": "Year", - "resultMonthPillar": "Month", - "resultDayPillar": "Day", - "resultTimePillar": "Hour", - "resultGanZhiLabel": "GanZhi", - "resultKongWangLabel": "KongWang", + "ganZhiInfo": "干支信息", + "wuXingWangShuai": "五行旺衰", + "ganZhiKongWang": "空亡信息", + "resultPillarColumn": "四柱", + "resultYearPillar": "年柱", + "resultMonthPillar": "月柱", + "resultDayPillar": "日柱", + "resultTimePillar": "时柱", + "resultGanZhiLabel": "干支", + "resultKongWangLabel": "空亡", + "termYueJian": "月建", + "termRiChen": "日辰", + "termYuePo": "月破", + "termRiChong": "日冲", + "guaNameSimplifiedChars": "风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济", + "guaNameTraditionalChars": "风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济", "manualScreenTitle": "Manual Casting", "manualSelectTime": "Select time", "manualSpecifyYaoCombo": "Select coin combination", diff --git a/apps/lib/l10n/app_localizations.dart b/apps/lib/l10n/app_localizations.dart index 385ed5f..bc6ad81 100644 --- a/apps/lib/l10n/app_localizations.dart +++ b/apps/lib/l10n/app_localizations.dart @@ -96,6 +96,7 @@ abstract class AppLocalizations { static const List supportedLocales = [ Locale('en'), Locale('zh'), + Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'), ]; /// No description provided for @appTitle. @@ -1940,6 +1941,42 @@ abstract class AppLocalizations { /// **'空亡'** String get resultKongWangLabel; + /// No description provided for @termYueJian. + /// + /// In zh, this message translates to: + /// **'月建'** + String get termYueJian; + + /// No description provided for @termRiChen. + /// + /// In zh, this message translates to: + /// **'日辰'** + String get termRiChen; + + /// No description provided for @termYuePo. + /// + /// In zh, this message translates to: + /// **'月破'** + String get termYuePo; + + /// No description provided for @termRiChong. + /// + /// In zh, this message translates to: + /// **'日冲'** + String get termRiChong; + + /// No description provided for @guaNameSimplifiedChars. + /// + /// In zh, this message translates to: + /// **'风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济'** + String get guaNameSimplifiedChars; + + /// No description provided for @guaNameTraditionalChars. + /// + /// In zh, this message translates to: + /// **'风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济'** + String get guaNameTraditionalChars; + /// No description provided for @manualScreenTitle. /// /// In zh, this message translates to: @@ -2277,6 +2314,18 @@ class _AppLocalizationsDelegate } AppLocalizations lookupAppLocalizations(Locale locale) { + // Lookup logic when language+script codes are specified. + switch (locale.languageCode) { + case 'zh': + { + switch (locale.scriptCode) { + case 'Hant': + return AppLocalizationsZhHant(); + } + break; + } + } + // Lookup logic when only language code is specified. switch (locale.languageCode) { case 'en': diff --git a/apps/lib/l10n/app_localizations_en.dart b/apps/lib/l10n/app_localizations_en.dart index 9255312..6ff22b3 100644 --- a/apps/lib/l10n/app_localizations_en.dart +++ b/apps/lib/l10n/app_localizations_en.dart @@ -988,34 +988,52 @@ class AppLocalizationsEn extends AppLocalizations { 'The Earth\'s condition is devoted receptivity; the noble one carries all with broad virtue.'; @override - String get ganZhiInfo => 'GanZhi Info'; + String get ganZhiInfo => '干支信息'; @override - String get wuXingWangShuai => 'WuXing Strength'; + String get wuXingWangShuai => '五行旺衰'; @override - String get ganZhiKongWang => 'KongWang Info'; + String get ganZhiKongWang => '空亡信息'; @override - String get resultPillarColumn => 'Pillar'; + String get resultPillarColumn => '四柱'; @override - String get resultYearPillar => 'Year'; + String get resultYearPillar => '年柱'; @override - String get resultMonthPillar => 'Month'; + String get resultMonthPillar => '月柱'; @override - String get resultDayPillar => 'Day'; + String get resultDayPillar => '日柱'; @override - String get resultTimePillar => 'Hour'; + String get resultTimePillar => '时柱'; @override - String get resultGanZhiLabel => 'GanZhi'; + String get resultGanZhiLabel => '干支'; @override - String get resultKongWangLabel => 'KongWang'; + 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'; diff --git a/apps/lib/l10n/app_localizations_zh.dart b/apps/lib/l10n/app_localizations_zh.dart index 182d33e..1387797 100644 --- a/apps/lib/l10n/app_localizations_zh.dart +++ b/apps/lib/l10n/app_localizations_zh.dart @@ -972,6 +972,24 @@ class AppLocalizationsZh extends AppLocalizations { @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 => '手动起卦'; @@ -1139,3 +1157,1157 @@ class AppLocalizationsZh extends AppLocalizations { @override String get settingsInviteInvalidCode => '请输入有效的6位邀请码'; } + +/// The translations for Chinese, using the Han script (`zh_Hant`). +class AppLocalizationsZhHant extends AppLocalizationsZh { + AppLocalizationsZhHant() : super('zh_Hant'); + + @override + String get appTitle => '覓爻籤問'; + + @override + String get welcomeLogin => '歡迎登入'; + + @override + String get loginSubtitle => '請使用信箱登入'; + + @override + String get loginSubtitleEmail => '請使用信箱登入'; + + @override + String get emailHint => '請輸入信箱地址'; + + @override + String get codeHint => '請輸入驗證碼'; + + @override + String get sendCode => '取得驗證碼'; + + @override + String get sending => '傳送中...'; + + @override + String retryAfter(int seconds) { + return '$seconds秒後重試'; + } + + @override + String get login => '登入'; + + @override + String get agreementPrefix => '我已閱讀並同意'; + + @override + String get aboutUs => '關於我們'; + + @override + String get aboutUsSubtitle => '了解覓爻籤問的理念與定位'; + + @override + String get privacyPolicy => '隱私政策'; + + @override + String get privacyPolicySubtitle => '了解用戶隱私保護政策'; + + @override + String get termsOfService => '服務條款'; + + @override + String get termsOfServiceSubtitle => '了解用戶服務協議'; + + @override + String get legalDocumentLoadFailedTitle => '文檔載入失敗'; + + @override + String get legalDocumentLoadFailedPathPrefix => '路徑'; + + @override + String get legalDocumentLoadFailedErrorPrefix => '錯誤'; + + @override + String get disclaimer => '免責聲明'; + + @override + String get icp => '粵ICP備2025428416號-1A'; + + @override + String get invalidPhone => '請輸入正確的手機號碼'; + + @override + String get invalidEmail => '請輸入正確的信箱地址'; + + @override + String get invalidCode => '請輸入6位驗證碼'; + + @override + String get agreementRequired => '請先勾選協議'; + + @override + String get codeSent => '驗證碼已傳送,請注意查收'; + + @override + String get loginSuccess => '登入成功'; + + @override + String helloUser(String name) { + return '您好,$name'; + } + + @override + String get startJourney => '開始您的卦象之旅'; + + @override + String get journeySubtitle => '借助AI智能,探索未來的可能'; + + @override + String get startNow => '立即起卦'; + + @override + String get historyTitle => '歷史解卦'; + + @override + String get more => '更多'; + + @override + String get noRecords => '暫無記錄'; + + @override + String get noRecordsSubtitle => '您並沒有保存任何卦象'; + + @override + String get homeTab => '首頁'; + + @override + String get profileTab => '我的'; + + @override + String get notify => '訊息通知'; + + @override + String get featurePending => '該功能暫未接入資料'; + + @override + String get logout => '登出'; + + @override + String get defaultUserName => '用戶'; + + @override + String get historyQuestion1 => '今年轉崗是否合適?'; + + @override + String get historyQuestion2 => '最近感情是否能推進?'; + + @override + String get historyQuestion3 => '本季度投資節奏如何?'; + + @override + String get guaName1 => '天雷無妄'; + + @override + String get guaName2 => '澤火革'; + + @override + String get guaName3 => '風地觀'; + + @override + String get welcomeDialogTitle => '歡迎使用覓爻籤問'; + + @override + String get welcomeParagraph1 => + '你好,歡迎來到覓爻籤問,這是一個借助於AI解讀傳統六爻卦象的平臺,為用戶了解中國傳統易學文化提供一個窗口。'; + + @override + String get welcomeParagraph2 => + '六爻卦象源於《周易》深邃的哲學體系,是古人探索世界執行規律的一種獨特方法。古人認為宇宙萬物相互關聯,在您起卦時,您的心念與時空資訊會凝結 成卦象的方式呈現出來。'; + + @override + String get welcomeParagraph3 => + '覓爻籤問基於這樣的思路,幫助您跳出局限思維,從全域和演變趨勢看清矛盾 、機會與風險,為判斷和行動提供參考。'; + + @override + String get warningTitle => '特別提醒'; + + @override + String get warningBody => + '卦象解讀結果均由AI生成,僅供娛樂參考,切不可作為商業、醫療等專業領域的決策依據。理性看待卦象,自由掌握人生。'; + + @override + String get scrollHint => '請向下捲動閱讀全部內容'; + + @override + String get understood => '我已了解'; + + @override + String get readAllFirst => '請先閱讀完整內容'; + + @override + String get signBest => '上上籤'; + + @override + String get signGood => '中上籤'; + + @override + String get signNormal => '中下籤'; + + @override + String get signBad => '下下籤'; + + @override + String get language => '語言'; + + @override + String get settingsTitle => '設定'; + + @override + String get settingsSectionGeneral => '偏好設定'; + + @override + String get settingsSectionQuickAccess => '一級選單'; + + @override + String get settingsSectionAccount => '帳戶操作'; + + @override + String get settingsSectionPrivacy => '隱私設定'; + + @override + String get settingsSectionNotification => '通知設定'; + + @override + String get settingsAccountAndDataTitle => '帳號資料'; + + @override + String get settingsInterfaceLanguage => '介面語言'; + + @override + String get settingsAiLanguage => 'AI 回覆語言'; + + @override + String get settingsNotificationAllow => '允許通知'; + + @override + String get settingsNotificationVibration => '允許振動'; + + @override + String get settingsSectionAbout => '關於'; + + @override + String get settingsGeneralTitle => '通用設定'; + + @override + String settingsGeneralSubtitle(String currentLanguage) { + return '語言:$currentLanguage,其餘欄位按 profiles.settings 結構預留'; + } + + @override + String get settingsPrivacyAndNotificationTitle => '隱私與通知'; + + @override + String get settingsPrivacyAndNotificationSubtitle => + '分組管理 privacy 與 notification 佔位設定'; + + @override + String get settingsLegalCenterTitle => '關於與協議'; + + @override + String get settingsLegalCenterSubtitle => '查看關於我們、隱私政策與服務條款'; + + @override + String get settingsCoinCenterTitle => '點數中心'; + + @override + String settingsCoinCenterSubtitle(int balance) { + return '目前餘額 $balance 點數,查看套餐與儲值入口'; + } + + @override + String get settingsCoinHeroSubtitle => '點數可用於後續起卦與相關服務消費'; + + @override + String get settingsAiLanguageHint => + '該欄位將對齊 profiles.settings.preferences.ai_language,後續接入真實偏好設定。'; + + @override + String get settingsTimezone => '時區'; + + @override + String get settingsTimezoneHint => + '該欄位將對齊 profiles.settings.preferences.timezone,後續提供時區選擇。'; + + @override + String get settingsCountry => '國家/地區'; + + @override + String get settingsCountryHint => + '該欄位將對齊 profiles.settings.preferences.country,後續提供國家或地區選擇。'; + + @override + String get settingsPrivacyProfileVisibility => '資料可見性'; + + @override + String get settingsPrivacyPersonalization => '個人化推薦'; + + @override + String get settingsPrivacyHistoryVisibility => '歷史記錄展示'; + + @override + String get settingsPrivacyHint => + '這些選項會落到 profiles.settings.privacy 下,目前先提供介面佔位。'; + + @override + String get settingsNotificationSystem => '系統通知'; + + @override + String get settingsNotificationActivity => '活動提醒'; + + @override + String get settingsNotificationResult => '結果提醒'; + + @override + String get settingsNotificationHint => + '這些選項會落到 profiles.settings.notification 下,目前先提供介面佔位。'; + + @override + String get settingsVersion => '目前版本'; + + @override + String get settingsVersionHint => '版本資訊和更多設定說明會在後續接入真實資料。'; + + @override + String get settingsTapToView => '點擊查看'; + + @override + String get settingsComingSoon => '即將上線'; + + @override + String settingsPlaceholderState(int count) { + return '已佔位 $count 項設定'; + } + + @override + String get settingsCurrentValue => '目前值'; + + @override + String get settingsVersionLabel => '設定版本'; + + @override + String get settingsLogoutSubtitle => '登出目前登入帳戶'; + + @override + String get settingsLogoutDialogTitle => '確認登出?'; + + @override + String get settingsLogoutDialogBody => '登出後需要重新登入才能繼續使用目前帳戶。'; + + @override + String get settingsDeleteAccountTitle => '刪除帳號'; + + @override + String get settingsDeleteAccountSubtitle => '永久刪除帳號及相關個人資料'; + + @override + String get settingsDeleteAccountWarningTitle => '刪除前請確認'; + + @override + String get settingsDeleteAccountWarningBody => + '刪除帳號後,個人資料、歷史記錄、點數資訊等相關資料將被永久刪除,且不可恢復。'; + + @override + String get settingsDeleteAccountReRegisterNotice => + '重要提示:同一信箱刪除後重新註冊,已消耗積分不會重置或返還。'; + + @override + String get settingsDeleteAccountScopeProfile => '個人資料和帳號資訊會被刪除'; + + @override + String get settingsDeleteAccountScopeHistory => '歷史解卦記錄會被刪除'; + + @override + String get settingsDeleteAccountScopePoints => '點數帳戶與流水記錄會被刪除'; + + @override + String get settingsDeleteAccountDialogTitle => '確認永久刪除帳號?'; + + @override + String get settingsDeleteAccountDialogBody => '此操作無法撤銷。確認後將立即發起刪除。'; + + @override + String get settingsDeleteAccountAction => '確認刪除帳號'; + + @override + String get settingsDeleteAccountProcessing => '正在刪除...'; + + @override + String settingsDeleteAccountWaitAction(int seconds) { + return '請等待 $seconds 秒後確認刪除'; + } + + @override + String get settingsCancel => '取消'; + + @override + String get settingsLogoutConfirmHint => '再次點擊確認登出'; + + @override + String get settingsLogoutConfirmAction => '再次點擊確認登出'; + + @override + String get settingsEditProfileAction => '編輯'; + + @override + String get settingsEditProfileTitle => '編輯個人資訊'; + + @override + String get settingsAvatar => '頭像'; + + @override + String get settingsDisplayName => '暱稱'; + + @override + String get settingsDisplayNameHint => '請輸入暱稱'; + + @override + String get settingsDisplayNameRequired => '請輸入暱稱後再保存'; + + @override + String get settingsBio => '個人簡介'; + + @override + String get settingsBioHint => '一句話介紹你自己'; + + @override + String get settingsAvatarPickerHint => '支援 PNG / JPG / WEBP,建議上傳清晰正方形頭像'; + + @override + String get settingsAvatarChooseFromAlbum => '從相簿選擇頭像'; + + @override + String get settingsAvatarUploading => '上傳中...'; + + @override + String get settingsAvatarUploadSuccess => '頭像上傳成功'; + + @override + String get settingsAvatarPickPermissionHint => '無法開啟相簿,請在系統設定中允許照片存取權限'; + + @override + String get settingsLanguageSection => '介面語言'; + + @override + String get settingsCoinBalanceLabel => '目前點數'; + + @override + String settingsCoinBalanceValue(int balance) { + return '$balance 點數'; + } + + @override + String get settingsCoinCenterDescription => ''; + + @override + String get settingsCoinRechargeSection => '儲值套餐'; + + @override + String get settingsCoinPackBasic => '入門補充包'; + + @override + String get settingsCoinPackPopular => '常用加量包'; + + @override + String get settingsCoinPackPremium => '高頻進階包'; + + @override + String get settingsCoinPackPopularBadge => '推薦'; + + @override + String get settingsPurchaseButton => '立即支付'; + + @override + String get settingsPurchasePending => ''; + + @override + String settingsCoinAmount(int amount) { + return '$amount 點數'; + } + + @override + String get english => '英文'; + + @override + String get chinese => '中文'; + + @override + String get dialogConfirm => '確定'; + + @override + String get agreementSeparator => '、'; + + @override + String get agreementAnd => '和'; + + @override + String get aboutUsContent => + '你好,歡迎來到覓爻籤問,這是一個借助於AI解讀傳統六爻卦象的平臺,為用戶了解中國傳統易學文化提供一個窗口。\n\n六爻卦象源於《周易》深邃的哲學體系,是古人探索世界執行規律的一種獨特方法。古人認為宇宙萬物相互關聯,在您起卦時,您的心念與時空資訊會凝結 成卦象的方式呈現出來。得到卦象後,再結合《易經》中的爻辭和某些特定規律,如五行生剋、干支沖合等,分析各要素間的發展趨勢,最終斷定出事物可能的走向。\n\n覓爻籤問就是基於這樣的思路而開發出來的平臺,它的核心價值在於幫助您跳出局限思維,從事物全域和演變趨勢的角度看清現況的矛盾 、潛在機會和風險點,為您的判斷和行動提供多一個維度的參考資訊,讓您能更理性、更周全地做決定。用AI解鎖古老智慧,讓覓爻籤問成為您探索趨勢、明晰方向的現代助手吧!\n\n特別提醒\n卦象解讀結果均由AI生成,僅供娛樂參考,切不可作為商業、醫療等專業領域的決策依據。理性看待卦象,自由掌握人生。\n\n粵ICP備2025428416號-1A'; + + @override + String get privacyContent => + '尊敬的用戶:\n歡迎使用覓爻籤問 APP(以下簡稱「覓爻」)。我們深知您的隱私對您至關重要,因此非常重視保護您的個人資訊。本隱私政策將向您說明我們在您使用服務時如何收集、使用、儲存和共享您的個人資訊,以及您如何存取和管理這些資訊。\n\n一、我們收集哪些您的個人資訊\n1. 您主動提供的資訊:帳號註冊資訊、個人資料資訊、解卦相關資訊。\n2. 我們自動收集的資訊:裝置資訊、日誌資訊。\n\n二、我們如何使用您的個人資訊\n1. 提供和優化服務:利用您提供的卦象問題、解卦方式等資訊生成解卦結果,並持續優化演算法。\n2. 帳號管理和服務運營:用於登入驗證、帳號安全監測、服務改進。\n3. 與您溝通和聯繫:用於服務通知、用戶回饋與客服支援。\n\n三、我們如何儲存您的個人資訊\n1. 儲存地點:原則上儲存於中華人民共和國境內。\n2. 儲存期限:僅在符合法律要求及實現服務目的所必需的最短時間範圍內儲存,超期後刪除或匿名化處理。\n\n四、我們如何共享您的個人資訊\n除以下情況外,我們不會與第三方共享您的個人資訊:獲得您的明確同意;與服務提供商合作;法律要求或保護合法權益;涉及企業收購、合併或破產。\n\n五、您的權利\n您有權存取、更正、刪除個人資訊,也可以申請註銷帳號。帳號註銷後,相關資料可能無法恢復。\n\n六、未成年人保護\n如果您是未滿 14 週歲的未成年人,請在父母或法定監護人的指導下使用服務,並確保事先獲得其同意。\n\n七、您的個人資訊安全\n我們採取合理的安全措施和技術手段,保護您的個人資訊免遭未經授權的存取、公開披露、使用、修改、損壞或丟失,包括加密、存取控制、安全審計和監控等措施。\n\n八、本隱私政策的更新\n我們可能會根據業務發展、法律法規變化或服務調整適時更新本隱私政策,並通過顯著方式通知重大變更。\n\n九、如何聯繫我們\n如果您對本隱私政策有任何疑問、意見或建議,可通過信箱 xuyunlong@xunmee.com 與我們聯繫。\n\n洵覓科技(深圳)有限公司\n2025年6月1日'; + + @override + String get termsContent => + '第一章 總則\n1. 歡迎使用覓爻籤問 APP。覓爻由洵覓科技(深圳)有限公司開發、運營和維護,旨在為用戶提供實際、有趣的解卦體驗。\n2. 用戶在使用覓爻服務之前,應仔細閱讀並充分理解本服務條款。通過下載、安裝、註冊、登入或使用等任一方式開始使用覓爻,即表示用戶已充分理解並完全接受本服務條款。\n3. 如用戶不同意本服務條款的任何內容,請不要進行後續操作。\n\n第二章 服務說明\n覓爻提供基於人工智慧技術的解卦服務,包括手動起卦、自動起卦等基礎功能。因系統維護、故障、不可抗力或其他合理原因導致的服務中斷或暫停,不視為違約。\n\n第三章 用戶帳號與資訊安全\n用戶應確保註冊資格合法,提供真實、準確、完整、有效的資料,並妥善保管帳號及身份驗證資訊。覓爻會按照隱私政策收集、使用和保護必要的個人資訊。\n\n第四章 智慧財產權聲明\n覓爻整體內容及相關商標、標識、網域名稱等智慧財產權均受法律保護。未經書面許可,用戶不得複製、修改、出租、出借、出售、傳播或通過反向工程、反編譯、反彙編等方式取得原始碼。\n\n第五章 用戶行為規範\n用戶不得發布違法違規內容,不得侵犯他人合法權益,不得破壞服務正常執行,不得進行未經授權的商業活動。對於違反規範的行為,覓爻有權採取警告、限制功能、封禁帳號等措施,並保留追究法律責任的權利。\n\n第六章 法律責任與免責條款\n如果用戶違反本服務條款導致洵覓科技或關聯公司遭受損失,用戶應承擔賠償責任。解卦結果僅供參考,不能作為實際決策的唯一依據;因依賴解卦結果產生的後果,由用戶自行承擔風險。\n\n第七章 爭議解決\n本服務條款適用中華人民共和國法律。因本服務條款引起的爭議,應先友好協商;協商不成的,任一方有權向洵覓科技公司註冊地有管轄權的人民法院提起訴訟。\n\n第八章 其他條款\n覓爻可以通過聯繫方式、系統訊息、站內信、公告等方式向用戶送達通知。若用戶需要聯繫洵覓科技,可通過信箱 xuyunlong@xunmee.com 提交請求或回饋。\n\n洵覓科技(深圳)有限公司\n2025年6月1日'; + + @override + String get disclaimerContent => '免責聲明內容展示佔位。'; + + @override + String get toastLabelInfo => '提示'; + + @override + String get toastLabelSuccess => '成功'; + + @override + String get toastLabelWarning => '警告'; + + @override + String get toastLabelError => '錯誤'; + + @override + String get errorTooManyRequests => '請求過於頻繁,請稍後重試'; + + @override + String get errorInvalidVerificationCode => '驗證碼錯誤'; + + @override + String get errorSessionExpired => '登入已過期,請重新登入'; + + @override + String get errorServiceUnavailable => '服務暫時不可用,請稍後重試'; + + @override + String get errorServerGeneric => '服務異常,請稍後重試'; + + @override + String get errorRequestGeneric => '請求失敗,請稍後重試'; + + @override + String get errorProfileDeleteFailed => '刪除帳號失敗,請稍後重試'; + + @override + String get errorRunLimitExceeded => '本次會話追問次數已達上限,請新起一卦'; + + @override + String get errorDivinationPayloadRequired => '缺少六爻輸入資料,請重新起卦'; + + @override + String get divinationScreenTitle => '起卦'; + + @override + String get divinationSelectMethod => '選擇起卦方式'; + + @override + String get divinationManualMethod => '手動起卦'; + + @override + String get divinationAutoMethod => '自動起卦'; + + @override + String get divinationQuestionTypePrompt => '您想佔卜的問題類型'; + + @override + String get divinationQuestionInputPrompt => '請輸入您想佔卜的問題'; + + @override + String get divinationQuestionInputHint => '請描述您的問題,描述越詳細解卦越準確'; + + @override + String get divinationStartButton => '開始起卦'; + + @override + String divinationCoinBalance(int balance) { + return '目前可用銅幣:$balance 枚'; + } + + @override + String get divinationRefreshBalance => '重新整理餘額'; + + @override + String get divinationRecommendManual => + '推薦使用手動起卦,解卦更準確!準備三枚一樣的銅錢或硬幣,點擊這裡查看手動起卦教程。'; + + @override + String get divinationMethodTipTitle => '起卦方式說明'; + + @override + String get divinationMethodTipAuto => '自動起卦:不需要銅錢或硬幣,按照引導完成搖卦。'; + + @override + String get divinationMethodTipManual => '手動起卦:需要準備三枚同樣的銅錢或硬幣。'; + + @override + String get divinationMethodTipRecommend => '推薦使用手動起卦,卦象解讀準確率更高。'; + + @override + String get divinationManualGuideTitle => '手動起卦教程'; + + @override + String get divinationManualGuideStep1 => '左側為花面,右側為字面。準備三枚相同的錢幣,任何類似款式均可。'; + + @override + String get divinationManualGuideStep2 => + '雙手捧起錢幣,閉目心中默念所問之事,然後拋擲錢幣於桌面,記錄字面和花面出現的次數。'; + + @override + String get divinationManualGuideStep3 => + '記錄每次結果,按照「字面在上還是花面在上」記錄。重複六次,從下往上記錄。'; + + @override + String get autoGuideStep1Title => '自動起卦'; + + @override + String get autoGuideStep1Body => '無需銅錢,搖動手機或點擊按鈕即可完成起卦。每次搖動後,三枚銅幣將自動旋轉並顯示結果。'; + + @override + String get autoGuideStep2Title => '開始搖卦'; + + @override + String get autoGuideStep2Body => '點擊「開始搖卦」按鈕,或直接搖動手機。銅幣將自動旋轉3秒後停止。'; + + @override + String get autoGuideStep3Title => '自動記錄'; + + @override + String get autoGuideStep3Body => '每搖一次,對應的爻位會自動記錄。重複六次,即可完成全部六爻。'; + + @override + String get autoGuideStep4Title => '分析卦象'; + + @override + String get autoGuideStep4Body => '六次完成後,「分析卦象」按鈕將閃爍提示。點擊即可查看卦象解讀。'; + + @override + String get manualGuideStep1Title => '手動起卦'; + + @override + String get manualGuideStep1Body => '準備三枚相同的錢幣。每次記錄一爻,按從下往上的順序共記錄六爻。'; + + @override + String get manualGuideStep2Title => '確認時間'; + + @override + String get manualGuideStep2Body => '先確認起卦時間。如需調整,點擊右側「修改」。'; + + @override + String get manualGuideStep3Title => '依序錄入六爻'; + + @override + String get manualGuideStep3Body => '從初爻開始逐條選擇,未完成前下一爻不可點擊。每條會彈出三枚錢幣選擇面板。'; + + @override + String get manualGuideStep4Title => '開始分析'; + + @override + String get manualGuideStep4Body => '六爻都填完後,下方「分析卦象」按鈕會閃爍提示,點擊即可解卦。'; + + @override + String get yaoNameFirst => '初爻'; + + @override + String get yaoNameSecond => '二爻'; + + @override + String get yaoNameThird => '三爻'; + + @override + String get yaoNameFourth => '四爻'; + + @override + String get yaoNameFifth => '五爻'; + + @override + String get yaoNameTop => '上爻'; + + @override + String get yaoYin => '陰'; + + @override + String get yaoYang => '陽'; + + @override + String get yaoYoungYin => '少陰'; + + @override + String get yaoYoungYang => '少陽'; + + @override + String get yaoOldYin => '老陰'; + + @override + String get yaoOldYang => '老陽'; + + @override + String get yaoMovingSuffix => '(變)'; + + @override + String get autoCoinFaceZi => '字'; + + @override + String get autoCoinFaceHua => '花'; + + @override + String get divinationIAcknowledge => '我知道了'; + + @override + String get divinationClose => '關閉'; + + @override + String get divinationModify => '修改'; + + @override + String get questionTypeCareer => '事業'; + + @override + String get questionTypeLove => '情感'; + + @override + String get questionTypeWealth => '財富'; + + @override + String get questionTypeFortune => '運勢'; + + @override + String get questionTypeDream => '解夢'; + + @override + String get questionTypeHealth => '健康'; + + @override + String get questionTypeStudy => '學業'; + + @override + String get questionTypeSearch => '尋物'; + + @override + String get questionTypeOther => '其他'; + + @override + String get toastPleaseInputQuestion => '請輸入您想佔卜的問題'; + + @override + String get toastCoinInsufficient => '積分不足,無法解卦'; + + @override + String get divinationCostDialogTitle => '確認開始解卦'; + + @override + String divinationCostDialogBody(int cost, int balance) { + return '本次解卦將消耗 $cost 點數,目前可用 $balance 點數。是否繼續?'; + } + + @override + String get divinationCostDialogConfirm => '確認解卦'; + + @override + String get toastContentCopied => '分享內容已複製'; + + @override + String toastContentCopiedWithTitle(String title) { + return '$title已複製'; + } + + @override + String get resultScreenTitle => '解卦結果'; + + @override + String get resultAIAnalysis => 'AI解卦'; + + @override + String get resultShare => '分享'; + + @override + String get resultBasicInfo => '基本資訊'; + + @override + String get resultHexagramDetail => '卦象詳情'; + + @override + String get resultConclusion => '解卦結論'; + + @override + String get resultAnalysis => '具體解析'; + + @override + String get resultSuggestion => '卦象建議'; + + @override + String get resultDivinationInfo => '起卦資訊'; + + @override + String get resultDivinationTime => '起卦時間'; + + @override + String get resultDivinationMethod => '起卦方式'; + + @override + String get resultQuestionType => '問題類型'; + + @override + String get resultQuestion => '佔卜問題'; + + @override + String get resultAutoMethod => '自動起卦'; + + @override + String get resultManualMethod => '手動起卦'; + + @override + String get signTypeShangShang => '上上籤'; + + @override + String get signTypeZhongShang => '中上籤'; + + @override + String get signTypeZhongXia => '中下籤'; + + @override + String get signTypeXiaXia => '下下籤'; + + @override + String get resultCopy => '複製'; + + @override + String get resultWarning => + '卦象解讀結果均由AI生成,僅供娛樂參考,切不可作為商業、醫療等專業領域的決策依據。理性看待卦象,自由掌握人生。'; + + @override + String get followUpEntryHint => '可針對本次解卦繼續追問 1 次'; + + @override + String get followUpEntryAction => '追問'; + + @override + String get followUpViewHistory => '查看歷史記錄'; + + @override + String get followUpScreenTitle => '繼續追問'; + + @override + String get followUpEmpty => '暫無訊息'; + + @override + String get followUpQuotaUsed => '本次會話追問次數已用完'; + + @override + String get followUpInputHint => '輸入您想繼續追問的問題'; + + @override + String get followUpHoldToSpeak => '按住說話'; + + @override + String get followUpRecording => '鬆開發送'; + + @override + String get followUpRecordingHint => '上滑取消'; + + @override + String get followUpTranscribing => '語音轉文字中...'; + + @override + String get followUpGenerating => '正在生成回覆...'; + + @override + String get followUpStepWorker => '正在分析卦象並生成回覆'; + + @override + String followUpStepGeneric(String stepName) { + return '正在處理:$stepName'; + } + + @override + String get errorAudioUnsupportedFormat => '音頻格式不支援,請使用 wav'; + + @override + String get errorAudioTooLarge => '音頻檔案過大,請縮短錄音時長'; + + @override + String get errorAudioEmpty => '未偵測到有效語音,請重試'; + + @override + String get errorAsrUnavailable => '語音辨識服務暫不可用,請稍後重試'; + + @override + String get transitionPreparing => '天機推演中'; + + @override + String get transitionDeriving => '正在解卦'; + + @override + String get transitionDone => '解卦完成\n點擊查看'; + + @override + String get iChingTitle => '周易'; + + @override + String get processingCardQianTitle => '乾 • 元亨利貞'; + + @override + String get processingCardQianQuote => '天行健,君子以自強不息。'; + + @override + String get processingCardDuiTitle => '兌 • 亨利貞'; + + @override + String get processingCardDuiQuote => '麗澤兌,君子以朋友講習。'; + + @override + String get processingCardLiTitle => '離 • 明兩作亨利貞'; + + @override + String get processingCardLiQuote => '大人以繼明照於四方。'; + + @override + String get processingCardZhenTitle => '震 • 亨震來虩虩,笑言啞啞'; + + @override + String get processingCardZhenQuote => '震驚百里,驚遠而懼邇也。'; + + @override + String get processingCardXunTitle => '巽 • 小亨利貞'; + + @override + String get processingCardXunQuote => '隨風,君子以申命行事。'; + + @override + String get processingCardKanTitle => '坎 • 習坎有孚維心亨'; + + @override + String get processingCardKanQuote => '水流而不盈,行險而不失其信。'; + + @override + String get processingCardGenTitle => '艮 • 艮其背不獲其身'; + + @override + String get processingCardGenQuote => '時止則止,時行則行,動靜不失其時。'; + + @override + String get processingCardKunTitle => '坤 • 元亨利牝馬之貞'; + + @override + String get processingCardKunQuote => '地勢坤,君子以厚德載物。'; + + @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 => '手動起卦'; + + @override + String get manualSelectTime => '選擇起卦時間'; + + @override + String get manualSpecifyYaoCombo => '指定銅錢字花組合'; + + @override + String get manualStartResolve => '開始解卦'; + + @override + String get manualSelectYaoTitle => '選擇爻象'; + + @override + String get manualYaoInstruction => '點擊查看起卦方法與銅錢字花組合說明'; + + @override + String get manualYaoTipTitle => '提示'; + + @override + String get manualYaoTipContent => '請從下往上選,不是從上往下選。\n\n三枚銅錢一起搖,搖完一次選一次,一共搖六次。'; + + @override + String get manualCoinSelectHint => '點擊硬幣可翻轉,調整字面和花面。記錄搖卦結果。'; + + @override + String get autoScreenTitle => '自動起卦'; + + @override + String get autoSelectTime => '選擇時間'; + + @override + String get autoCoinDivination => '銅錢搖卦'; + + @override + String get autoHexagramForming => '卦象形成'; + + @override + String get autoShakeInstruction => '點擊查看自動起卦方法'; + + @override + String get autoStartShake => '開始搖卦'; + + @override + String get autoContinueShake => '繼續搖卦'; + + @override + String get autoFinishShake => '完成搖卦'; + + @override + String get autoShaking => '搖卦中'; + + @override + String get autoStartResolve => '開始解卦'; + + @override + String autoShakeCountdown(int seconds) { + return '$seconds 秒後自動停止'; + } + + @override + String autoShakeRemaining(int count) { + return '您還需搖 $count 次'; + } + + @override + String get autoShakeComplete => '點擊頁面底部開始解卦'; + + @override + String get autoTryShakePhone => '您也可以試試搖晃手機來起卦'; + + @override + String autoSimBalance(int balance) { + return '目前可用銅幣:$balance 枚'; + } + + @override + String get autoGuideTitle => '自動起卦教程'; + + @override + String get autoGuideInstruction => '搖晃手機或點擊按鈕,連續搖 6 次即可形成完整卦象。'; + + @override + String get dateTab => '日期'; + + @override + String get timeTab => '時間'; + + @override + String get confirm => '確認'; + + @override + String get cancel => '取消'; + + @override + String get coinFaceGuideTitle => '字花對照說明'; + + @override + String get coinFaceGuideDescription => '左側為花面,右側為字面。'; + + @override + String get settingsInviteTitle => '我的邀請'; + + @override + String get settingsInviteSubtitle => '邀請好友,共同獲得獎勵'; + + @override + String get settingsInviteMyCode => '我的邀請碼'; + + @override + String get settingsInviteCopySuccess => '邀請碼已複製'; + + @override + String get settingsInviteCopied => '已複製'; + + @override + String get settingsInviteCopy => '複製'; + + @override + String settingsInviteStats(int count) { + return '已邀請:$count 位好友'; + } + + @override + String get settingsInviteBindCode => '綁定邀請碼'; + + @override + String get settingsInviteBindHint => '輸入好友的邀請碼'; + + @override + String get settingsInviteBindPlaceholder => '6位邀請碼'; + + @override + String get settingsInviteBindButton => '綁定'; + + @override + String get settingsInviteBindSuccess => '邀請碼綁定成功'; + + @override + String get settingsInviteBindFailed => '邀請碼綁定失敗'; + + @override + String get settingsInviteGenerateTitle => '產生我的邀請碼'; + + @override + String get settingsInviteGenerateButton => '產生我的邀請碼'; + + @override + String get settingsInviteGenerateSuccess => '邀請碼產生成功'; + + @override + String get settingsInviteEmptyTitle => '邀請好友,獲得獎勵'; + + @override + String get settingsInviteEmptyDescription => '每成功邀請一位好友註冊,您將獲得積分獎勵'; + + @override + String get settingsInviteInputLabel => '輸入邀請碼(選填)'; + + @override + String get settingsInviteInputHint => '輸入邀請碼綁定您的邀請人'; + + @override + String get settingsInviteInvalidCode => '請輸入有效的6位邀請碼'; +} diff --git a/apps/lib/l10n/app_zh.arb b/apps/lib/l10n/app_zh.arb index 1664876..804b5fb 100644 --- a/apps/lib/l10n/app_zh.arb +++ b/apps/lib/l10n/app_zh.arb @@ -395,6 +395,12 @@ "resultTimePillar": "时柱", "resultGanZhiLabel": "干支", "resultKongWangLabel": "空亡", + "termYueJian": "月建", + "termRiChen": "日辰", + "termYuePo": "月破", + "termRiChong": "日冲", + "guaNameSimplifiedChars": "风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济", + "guaNameTraditionalChars": "风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济", "manualScreenTitle": "手动起卦", "manualSelectTime": "选择起卦时间", "manualSpecifyYaoCombo": "指定铜钱字花组合", diff --git a/apps/lib/l10n/app_zh_hant.arb b/apps/lib/l10n/app_zh_hant.arb new file mode 100644 index 0000000..d3b8388 --- /dev/null +++ b/apps/lib/l10n/app_zh_hant.arb @@ -0,0 +1,486 @@ +{ + "@@locale": "zh_Hant", + "appTitle": "覓爻籤問", + "welcomeLogin": "歡迎登入", + "loginSubtitle": "請使用信箱登入", + "loginSubtitleEmail": "請使用信箱登入", + "emailHint": "請輸入信箱地址", + "codeHint": "請輸入驗證碼", + "sendCode": "取得驗證碼", + "sending": "傳送中...", + "retryAfter": "{seconds}秒後重試", + "@retryAfter": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "login": "登入", + "agreementPrefix": "我已閱讀並同意", + "aboutUs": "關於我們", + "aboutUsSubtitle": "了解覓爻籤問的理念與定位", + "privacyPolicy": "隱私政策", + "privacyPolicySubtitle": "了解用戶隱私保護政策", + "termsOfService": "服務條款", + "termsOfServiceSubtitle": "了解用戶服務協議", + "legalDocumentLoadFailedTitle": "文檔載入失敗", + "legalDocumentLoadFailedPathPrefix": "路徑", + "legalDocumentLoadFailedErrorPrefix": "錯誤", + "disclaimer": "免責聲明", + "icp": "粵ICP備2025428416號-1A", + "invalidPhone": "請輸入正確的手機號碼", + "invalidEmail": "請輸入正確的信箱地址", + "invalidCode": "請輸入6位驗證碼", + "agreementRequired": "請先勾選協議", + "codeSent": "驗證碼已傳送,請注意查收", + "loginSuccess": "登入成功", + "helloUser": "您好,{name}", + "@helloUser": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "startJourney": "開始您的卦象之旅", + "journeySubtitle": "借助AI智能,探索未來的可能", + "startNow": "立即起卦", + "historyTitle": "歷史解卦", + "more": "更多", + "noRecords": "暫無記錄", + "noRecordsSubtitle": "您並沒有保存任何卦象", + "homeTab": "首頁", + "profileTab": "我的", + "notify": "訊息通知", + "featurePending": "該功能暫未接入資料", + "logout": "登出", + "defaultUserName": "用戶", + "historyQuestion1": "今年轉崗是否合適?", + "historyQuestion2": "最近感情是否能推進?", + "historyQuestion3": "本季度投資節奏如何?", + "guaName1": "天雷無妄", + "guaName2": "澤火革", + "guaName3": "風地觀", + "welcomeDialogTitle": "歡迎使用覓爻籤問", + "welcomeParagraph1": "你好,歡迎來到覓爻籤問,這是一個借助於AI解讀傳統六爻卦象的平臺,為用戶了解中國傳統易學文化提供一個窗口。", + "welcomeParagraph2": "六爻卦象源於《周易》深邃的哲學體系,是古人探索世界執行規律的一種獨特方法。古人認為宇宙萬物相互關聯,在您起卦時,您的心念與時空資訊會凝結 成卦象的方式呈現出來。", + "welcomeParagraph3": "覓爻籤問基於這樣的思路,幫助您跳出局限思維,從全域和演變趨勢看清矛盾 、機會與風險,為判斷和行動提供參考。", + "warningTitle": "特別提醒", + "warningBody": "卦象解讀結果均由AI生成,僅供娛樂參考,切不可作為商業、醫療等專業領域的決策依據。理性看待卦象,自由掌握人生。", + "scrollHint": "請向下捲動閱讀全部內容", + "understood": "我已了解", + "readAllFirst": "請先閱讀完整內容", + "signBest": "上上籤", + "signGood": "中上籤", + "signNormal": "中下籤", + "signBad": "下下籤", + "language": "語言", + "settingsTitle": "設定", + "settingsSectionGeneral": "偏好設定", + "settingsSectionQuickAccess": "一級選單", + "settingsSectionAccount": "帳戶操作", + "settingsSectionPrivacy": "隱私設定", + "settingsSectionNotification": "通知設定", + "settingsAccountAndDataTitle": "帳號資料", + "settingsInterfaceLanguage": "介面語言", + "settingsAiLanguage": "AI 回覆語言", + "settingsNotificationAllow": "允許通知", + "settingsNotificationVibration": "允許振動", + "settingsSectionAbout": "關於", + "settingsGeneralTitle": "通用設定", + "settingsGeneralSubtitle": "語言:{currentLanguage},其餘欄位按 profiles.settings 結構預留", + "@settingsGeneralSubtitle": { + "placeholders": { + "currentLanguage": { + "type": "String" + } + } + }, + "settingsPrivacyAndNotificationTitle": "隱私與通知", + "settingsPrivacyAndNotificationSubtitle": "分組管理 privacy 與 notification 佔位設定", + "settingsLegalCenterTitle": "關於與協議", + "settingsLegalCenterSubtitle": "查看關於我們、隱私政策與服務條款", + "settingsCoinCenterTitle": "點數中心", + "settingsCoinCenterSubtitle": "目前餘額 {balance} 點數,查看套餐與儲值入口", + "@settingsCoinCenterSubtitle": { + "placeholders": { + "balance": { + "type": "int" + } + } + }, + "settingsCoinHeroSubtitle": "點數可用於後續起卦與相關服務消費", + "settingsAiLanguage": "AI 回覆語言", + "settingsAiLanguageHint": "該欄位將對齊 profiles.settings.preferences.ai_language,後續接入真實偏好設定。", + "settingsTimezone": "時區", + "settingsTimezoneHint": "該欄位將對齊 profiles.settings.preferences.timezone,後續提供時區選擇。", + "settingsCountry": "國家/地區", + "settingsCountryHint": "該欄位將對齊 profiles.settings.preferences.country,後續提供國家或地區選擇。", + "settingsPrivacyProfileVisibility": "資料可見性", + "settingsPrivacyPersonalization": "個人化推薦", + "settingsPrivacyHistoryVisibility": "歷史記錄展示", + "settingsPrivacyHint": "這些選項會落到 profiles.settings.privacy 下,目前先提供介面佔位。", + "settingsNotificationSystem": "系統通知", + "settingsNotificationActivity": "活動提醒", + "settingsNotificationResult": "結果提醒", + "settingsNotificationHint": "這些選項會落到 profiles.settings.notification 下,目前先提供介面佔位。", + "settingsVersion": "目前版本", + "settingsVersionHint": "版本資訊和更多設定說明會在後續接入真實資料。", + "settingsTapToView": "點擊查看", + "settingsComingSoon": "即將上線", + "settingsPlaceholderState": "已佔位 {count} 項設定", + "@settingsPlaceholderState": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsCurrentValue": "目前值", + "settingsVersionLabel": "設定版本", + "settingsLogoutSubtitle": "登出目前登入帳戶", + "settingsLogoutDialogTitle": "確認登出?", + "settingsLogoutDialogBody": "登出後需要重新登入才能繼續使用目前帳戶。", + "settingsDeleteAccountTitle": "刪除帳號", + "settingsDeleteAccountSubtitle": "永久刪除帳號及相關個人資料", + "settingsDeleteAccountWarningTitle": "刪除前請確認", + "settingsDeleteAccountWarningBody": "刪除帳號後,個人資料、歷史記錄、點數資訊等相關資料將被永久刪除,且不可恢復。", + "settingsDeleteAccountReRegisterNotice": "重要提示:同一信箱刪除後重新註冊,已消耗積分不會重置或返還。", + "settingsDeleteAccountScopeProfile": "個人資料和帳號資訊會被刪除", + "settingsDeleteAccountScopeHistory": "歷史解卦記錄會被刪除", + "settingsDeleteAccountScopePoints": "點數帳戶與流水記錄會被刪除", + "settingsDeleteAccountDialogTitle": "確認永久刪除帳號?", + "settingsDeleteAccountDialogBody": "此操作無法撤銷。確認後將立即發起刪除。", + "settingsDeleteAccountAction": "確認刪除帳號", + "settingsDeleteAccountProcessing": "正在刪除...", + "settingsDeleteAccountWaitAction": "請等待 {seconds} 秒後確認刪除", + "@settingsDeleteAccountWaitAction": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "settingsCancel": "取消", + "settingsLogoutConfirmHint": "再次點擊確認登出", + "settingsLogoutConfirmAction": "再次點擊確認登出", + "settingsEditProfileAction": "編輯", + "settingsEditProfileTitle": "編輯個人資訊", + "settingsAvatar": "頭像", + "settingsDisplayName": "暱稱", + "settingsDisplayNameHint": "請輸入暱稱", + "settingsDisplayNameRequired": "請輸入暱稱後再保存", + "settingsBio": "個人簡介", + "settingsBioHint": "一句話介紹你自己", + "settingsAvatarPickerHint": "支援 PNG / JPG / WEBP,建議上傳清晰正方形頭像", + "settingsAvatarChooseFromAlbum": "從相簿選擇頭像", + "settingsAvatarUploading": "上傳中...", + "settingsAvatarUploadSuccess": "頭像上傳成功", + "settingsAvatarPickPermissionHint": "無法開啟相簿,請在系統設定中允許照片存取權限", + "settingsLanguageSection": "介面語言", + "settingsCoinBalanceLabel": "目前點數", + "settingsCoinBalanceValue": "{balance} 點數", + "@settingsCoinBalanceValue": { + "placeholders": { + "balance": { + "type": "int" + } + } + }, + "settingsCoinCenterDescription": "", + "settingsCoinRechargeSection": "儲值套餐", + "settingsCoinPackBasic": "入門補充包", + "settingsCoinPackPopular": "常用加量包", + "settingsCoinPackPremium": "高頻進階包", + "settingsCoinPackPopularBadge": "推薦", + "settingsPurchaseButton": "立即支付", + "settingsPurchasePending": "", + "settingsCoinAmount": "{amount} 點數", + "@settingsCoinAmount": { + "placeholders": { + "amount": { + "type": "int" + } + } + }, + "english": "英文", + "chinese": "中文", + "traditionalChinese": "繁體中文", + "dialogConfirm": "確定", + "agreementSeparator": "、", + "agreementAnd": "和", + "aboutUsContent": "你好,歡迎來到覓爻籤問,這是一個借助於AI解讀傳統六爻卦象的平臺,為用戶了解中國傳統易學文化提供一個窗口。\n\n六爻卦象源於《周易》深邃的哲學體系,是古人探索世界執行規律的一種獨特方法。古人認為宇宙萬物相互關聯,在您起卦時,您的心念與時空資訊會凝結 成卦象的方式呈現出來。得到卦象後,再結合《易經》中的爻辭和某些特定規律,如五行生剋、干支沖合等,分析各要素間的發展趨勢,最終斷定出事物可能的走向。\n\n覓爻籤問就是基於這樣的思路而開發出來的平臺,它的核心價值在於幫助您跳出局限思維,從事物全域和演變趨勢的角度看清現況的矛盾 、潛在機會和風險點,為您的判斷和行動提供多一個維度的參考資訊,讓您能更理性、更周全地做決定。用AI解鎖古老智慧,讓覓爻籤問成為您探索趨勢、明晰方向的現代助手吧!\n\n特別提醒\n卦象解讀結果均由AI生成,僅供娛樂參考,切不可作為商業、醫療等專業領域的決策依據。理性看待卦象,自由掌握人生。\n\n粵ICP備2025428416號-1A", + "privacyContent": "尊敬的用戶:\n歡迎使用覓爻籤問 APP(以下簡稱「覓爻」)。我們深知您的隱私對您至關重要,因此非常重視保護您的個人資訊。本隱私政策將向您說明我們在您使用服務時如何收集、使用、儲存和共享您的個人資訊,以及您如何存取和管理這些資訊。\n\n一、我們收集哪些您的個人資訊\n1. 您主動提供的資訊:帳號註冊資訊、個人資料資訊、解卦相關資訊。\n2. 我們自動收集的資訊:裝置資訊、日誌資訊。\n\n二、我們如何使用您的個人資訊\n1. 提供和優化服務:利用您提供的卦象問題、解卦方式等資訊生成解卦結果,並持續優化演算法。\n2. 帳號管理和服務運營:用於登入驗證、帳號安全監測、服務改進。\n3. 與您溝通和聯繫:用於服務通知、用戶回饋與客服支援。\n\n三、我們如何儲存您的個人資訊\n1. 儲存地點:原則上儲存於中華人民共和國境內。\n2. 儲存期限:僅在符合法律要求及實現服務目的所必需的最短時間範圍內儲存,超期後刪除或匿名化處理。\n\n四、我們如何共享您的個人資訊\n除以下情況外,我們不會與第三方共享您的個人資訊:獲得您的明確同意;與服務提供商合作;法律要求或保護合法權益;涉及企業收購、合併或破產。\n\n五、您的權利\n您有權存取、更正、刪除個人資訊,也可以申請註銷帳號。帳號註銷後,相關資料可能無法恢復。\n\n六、未成年人保護\n如果您是未滿 14 週歲的未成年人,請在父母或法定監護人的指導下使用服務,並確保事先獲得其同意。\n\n七、您的個人資訊安全\n我們採取合理的安全措施和技術手段,保護您的個人資訊免遭未經授權的存取、公開披露、使用、修改、損壞或丟失,包括加密、存取控制、安全審計和監控等措施。\n\n八、本隱私政策的更新\n我們可能會根據業務發展、法律法規變化或服務調整適時更新本隱私政策,並通過顯著方式通知重大變更。\n\n九、如何聯繫我們\n如果您對本隱私政策有任何疑問、意見或建議,可通過信箱 xuyunlong@xunmee.com 與我們聯繫。\n\n洵覓科技(深圳)有限公司\n2025年6月1日", + "termsContent": "第一章 總則\n1. 歡迎使用覓爻籤問 APP。覓爻由洵覓科技(深圳)有限公司開發、運營和維護,旨在為用戶提供實際、有趣的解卦體驗。\n2. 用戶在使用覓爻服務之前,應仔細閱讀並充分理解本服務條款。通過下載、安裝、註冊、登入或使用等任一方式開始使用覓爻,即表示用戶已充分理解並完全接受本服務條款。\n3. 如用戶不同意本服務條款的任何內容,請不要進行後續操作。\n\n第二章 服務說明\n覓爻提供基於人工智慧技術的解卦服務,包括手動起卦、自動起卦等基礎功能。因系統維護、故障、不可抗力或其他合理原因導致的服務中斷或暫停,不視為違約。\n\n第三章 用戶帳號與資訊安全\n用戶應確保註冊資格合法,提供真實、準確、完整、有效的資料,並妥善保管帳號及身份驗證資訊。覓爻會按照隱私政策收集、使用和保護必要的個人資訊。\n\n第四章 智慧財產權聲明\n覓爻整體內容及相關商標、標識、網域名稱等智慧財產權均受法律保護。未經書面許可,用戶不得複製、修改、出租、出借、出售、傳播或通過反向工程、反編譯、反彙編等方式取得原始碼。\n\n第五章 用戶行為規範\n用戶不得發布違法違規內容,不得侵犯他人合法權益,不得破壞服務正常執行,不得進行未經授權的商業活動。對於違反規範的行為,覓爻有權採取警告、限制功能、封禁帳號等措施,並保留追究法律責任的權利。\n\n第六章 法律責任與免責條款\n如果用戶違反本服務條款導致洵覓科技或關聯公司遭受損失,用戶應承擔賠償責任。解卦結果僅供參考,不能作為實際決策的唯一依據;因依賴解卦結果產生的後果,由用戶自行承擔風險。\n\n第七章 爭議解決\n本服務條款適用中華人民共和國法律。因本服務條款引起的爭議,應先友好協商;協商不成的,任一方有權向洵覓科技公司註冊地有管轄權的人民法院提起訴訟。\n\n第八章 其他條款\n覓爻可以通過聯繫方式、系統訊息、站內信、公告等方式向用戶送達通知。若用戶需要聯繫洵覓科技,可通過信箱 xuyunlong@xunmee.com 提交請求或回饋。\n\n洵覓科技(深圳)有限公司\n2025年6月1日", + "disclaimerContent": "免責聲明內容展示佔位。", + "toastLabelInfo": "提示", + "toastLabelSuccess": "成功", + "toastLabelWarning": "警告", + "toastLabelError": "錯誤", + "errorTooManyRequests": "請求過於頻繁,請稍後重試", + "errorInvalidVerificationCode": "驗證碼錯誤", + "errorSessionExpired": "登入已過期,請重新登入", + "errorServiceUnavailable": "服務暫時不可用,請稍後重試", + "errorServerGeneric": "服務異常,請稍後重試", + "errorRequestGeneric": "請求失敗,請稍後重試", + "errorProfileDeleteFailed": "刪除帳號失敗,請稍後重試", + "errorRunLimitExceeded": "本次會話追問次數已達上限,請新起一卦", + "errorDivinationPayloadRequired": "缺少六爻輸入資料,請重新起卦", + "divinationScreenTitle": "起卦", + "divinationSelectMethod": "選擇起卦方式", + "divinationManualMethod": "手動起卦", + "divinationAutoMethod": "自動起卦", + "divinationQuestionTypePrompt": "您想佔卜的問題類型", + "divinationQuestionInputPrompt": "請輸入您想佔卜的問題", + "divinationQuestionInputHint": "請描述您的問題,描述越詳細解卦越準確", + "divinationStartButton": "開始起卦", + "divinationCoinBalance": "目前可用銅幣:{balance} 枚", + "@divinationCoinBalance": { + "placeholders": { + "balance": { + "type": "int" + } + } + }, + "divinationRefreshBalance": "重新整理餘額", + "divinationRecommendManual": "推薦使用手動起卦,解卦更準確!準備三枚一樣的銅錢或硬幣,點擊這裡查看手動起卦教程。", + "divinationMethodTipTitle": "起卦方式說明", + "divinationMethodTipAuto": "自動起卦:不需要銅錢或硬幣,按照引導完成搖卦。", + "divinationMethodTipManual": "手動起卦:需要準備三枚同樣的銅錢或硬幣。", + "divinationMethodTipRecommend": "推薦使用手動起卦,卦象解讀準確率更高。", + "divinationManualGuideTitle": "手動起卦教程", + "divinationManualGuideStep1": "左側為花面,右側為字面。準備三枚相同的錢幣,任何類似款式均可。", + "divinationManualGuideStep2": "雙手捧起錢幣,閉目心中默念所問之事,然後拋擲錢幣於桌面,記錄字面和花面出現的次數。", + "divinationManualGuideStep3": "記錄每次結果,按照「字面在上還是花面在上」記錄。重複六次,從下往上記錄。", + "autoGuideStep1Title": "自動起卦", + "autoGuideStep1Body": "無需銅錢,搖動手機或點擊按鈕即可完成起卦。每次搖動後,三枚銅幣將自動旋轉並顯示結果。", + "autoGuideStep2Title": "開始搖卦", + "autoGuideStep2Body": "點擊「開始搖卦」按鈕,或直接搖動手機。銅幣將自動旋轉3秒後停止。", + "autoGuideStep3Title": "自動記錄", + "autoGuideStep3Body": "每搖一次,對應的爻位會自動記錄。重複六次,即可完成全部六爻。", + "autoGuideStep4Title": "分析卦象", + "autoGuideStep4Body": "六次完成後,「分析卦象」按鈕將閃爍提示。點擊即可查看卦象解讀。", + "manualGuideStep1Title": "手動起卦", + "manualGuideStep1Body": "準備三枚相同的錢幣。每次記錄一爻,按從下往上的順序共記錄六爻。", + "manualGuideStep2Title": "確認時間", + "manualGuideStep2Body": "先確認起卦時間。如需調整,點擊右側「修改」。", + "manualGuideStep3Title": "依序錄入六爻", + "manualGuideStep3Body": "從初爻開始逐條選擇,未完成前下一爻不可點擊。每條會彈出三枚錢幣選擇面板。", + "manualGuideStep4Title": "開始分析", + "manualGuideStep4Body": "六爻都填完後,下方「分析卦象」按鈕會閃爍提示,點擊即可解卦。", + "yaoNameFirst": "初爻", + "yaoNameSecond": "二爻", + "yaoNameThird": "三爻", + "yaoNameFourth": "四爻", + "yaoNameFifth": "五爻", + "yaoNameTop": "上爻", + "yaoYin": "陰", + "yaoYang": "陽", + "yaoYoungYin": "少陰", + "yaoYoungYang": "少陽", + "yaoOldYin": "老陰", + "yaoOldYang": "老陽", + "yaoMovingSuffix": "(變)", + "autoCoinFaceZi": "字", + "autoCoinFaceHua": "花", + "divinationIAcknowledge": "我知道了", + "divinationClose": "關閉", + "divinationModify": "修改", + "questionTypeCareer": "事業", + "questionTypeLove": "情感", + "questionTypeWealth": "財富", + "questionTypeFortune": "運勢", + "questionTypeDream": "解夢", + "questionTypeHealth": "健康", + "questionTypeStudy": "學業", + "questionTypeSearch": "尋物", + "questionTypeOther": "其他", + "toastPleaseInputQuestion": "請輸入您想佔卜的問題", + "toastCoinInsufficient": "積分不足,無法解卦", + "divinationCostDialogTitle": "確認開始解卦", + "divinationCostDialogBody": "本次解卦將消耗 {cost} 點數,目前可用 {balance} 點數。是否繼續?", + "@divinationCostDialogBody": { + "placeholders": { + "cost": { + "type": "int" + }, + "balance": { + "type": "int" + } + } + }, + "divinationCostDialogConfirm": "確認解卦", + "toastContentCopied": "分享內容已複製", + "toastContentCopiedWithTitle": "{title}已複製", + "@toastContentCopiedWithTitle": { + "placeholders": { + "title": { + "type": "String" + } + } + }, + "resultScreenTitle": "解卦結果", + "resultAIAnalysis": "AI解卦", + "resultShare": "分享", + "resultBasicInfo": "基本資訊", + "resultHexagramDetail": "卦象詳情", + "resultConclusion": "解卦結論", + "resultAnalysis": "具體解析", + "resultSuggestion": "卦象建議", + "resultDivinationInfo": "起卦資訊", + "resultDivinationTime": "起卦時間", + "resultDivinationMethod": "起卦方式", + "resultQuestionType": "問題類型", + "resultQuestion": "佔卜問題", + "resultAutoMethod": "自動起卦", + "resultManualMethod": "手動起卦", + "signTypeShangShang": "上上籤", + "signTypeZhongShang": "中上籤", + "signTypeZhongXia": "中下籤", + "signTypeXiaXia": "下下籤", + "resultCopy": "複製", + "resultWarning": "卦象解讀結果均由AI生成,僅供娛樂參考,切不可作為商業、醫療等專業領域的決策依據。理性看待卦象,自由掌握人生。", + "followUpEntryHint": "可針對本次解卦繼續追問 1 次", + "followUpEntryAction": "追問", + "followUpViewHistory": "查看歷史記錄", + "followUpScreenTitle": "繼續追問", + "followUpEmpty": "暫無訊息", + "followUpQuotaUsed": "本次會話追問次數已用完", + "followUpInputHint": "輸入您想繼續追問的問題", + "followUpHoldToSpeak": "按住說話", + "followUpRecording": "鬆開發送", + "followUpRecordingHint": "上滑取消", + "followUpTranscribing": "語音轉文字中...", + "followUpGenerating": "正在生成回覆...", + "followUpStepWorker": "正在分析卦象並生成回覆", + "followUpStepGeneric": "正在處理:{stepName}", + "@followUpStepGeneric": { + "placeholders": { + "stepName": { + "type": "String" + } + } + }, + "errorAudioUnsupportedFormat": "音頻格式不支援,請使用 wav", + "errorAudioTooLarge": "音頻檔案過大,請縮短錄音時長", + "errorAudioEmpty": "未偵測到有效語音,請重試", + "errorAsrUnavailable": "語音辨識服務暫不可用,請稍後重試", + "transitionPreparing": "天機推演中", + "transitionDeriving": "正在解卦", + "transitionDone": "解卦完成\n點擊查看", + "iChingTitle": "周易", + "processingCardQianTitle": "乾 • 元亨利貞", + "processingCardQianQuote": "天行健,君子以自強不息。", + "processingCardDuiTitle": "兌 • 亨利貞", + "processingCardDuiQuote": "麗澤兌,君子以朋友講習。", + "processingCardLiTitle": "離 • 明兩作亨利貞", + "processingCardLiQuote": "大人以繼明照於四方。", + "processingCardZhenTitle": "震 • 亨震來虩虩,笑言啞啞", + "processingCardZhenQuote": "震驚百里,驚遠而懼邇也。", + "processingCardXunTitle": "巽 • 小亨利貞", + "processingCardXunQuote": "隨風,君子以申命行事。", + "processingCardKanTitle": "坎 • 習坎有孚維心亨", + "processingCardKanQuote": "水流而不盈,行險而不失其信。", + "processingCardGenTitle": "艮 • 艮其背不獲其身", + "processingCardGenQuote": "時止則止,時行則行,動靜不失其時。", + "processingCardKunTitle": "坤 • 元亨利牝馬之貞", + "processingCardKunQuote": "地勢坤,君子以厚德載物。", + "ganZhiInfo": "干支資訊", + "wuXingWangShuai": "五行旺衰", + "ganZhiKongWang": "空亡資訊", + "resultPillarColumn": "四柱", + "resultYearPillar": "年柱", + "resultMonthPillar": "月柱", + "resultDayPillar": "日柱", + "resultTimePillar": "時柱", + "resultGanZhiLabel": "干支", + "resultKongWangLabel": "空亡", + "termYueJian": "月建", + "termRiChen": "日辰", + "termYuePo": "月破", + "termRiChong": "日沖", + "guaNameSimplifiedChars": "风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济", + "guaNameTraditionalChars": "風澤觀訟師謙隨蠱臨賁剝復無頤恆壯晉損漸歸豐兌渙節濟", + "manualScreenTitle": "手動起卦", + "manualSelectTime": "選擇起卦時間", + "manualSpecifyYaoCombo": "指定銅錢字花組合", + "manualStartResolve": "開始解卦", + "manualSelectYaoTitle": "選擇爻象", + "manualYaoInstruction": "點擊查看起卦方法與銅錢字花組合說明", + "manualYaoTipTitle": "提示", + "manualYaoTipContent": "請從下往上選,不是從上往下選。\n\n三枚銅錢一起搖,搖完一次選一次,一共搖六次。", + "manualCoinSelectHint": "點擊硬幣可翻轉,調整字面和花面。記錄搖卦結果。", + "autoScreenTitle": "自動起卦", + "autoSelectTime": "選擇時間", + "autoCoinDivination": "銅錢搖卦", + "autoHexagramForming": "卦象形成", + "autoShakeInstruction": "點擊查看自動起卦方法", + "autoStartShake": "開始搖卦", + "autoContinueShake": "繼續搖卦", + "autoFinishShake": "完成搖卦", + "autoShaking": "搖卦中", + "autoStartResolve": "開始解卦", + "autoShakeCountdown": "{seconds} 秒後自動停止", + "@autoShakeCountdown": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "autoShakeRemaining": "您還需搖 {count} 次", + "@autoShakeRemaining": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "autoShakeComplete": "點擊頁面底部開始解卦", + "autoTryShakePhone": "您也可以試試搖晃手機來起卦", + "autoSimBalance": "目前可用銅幣:{balance} 枚", + "@autoSimBalance": { + "placeholders": { + "balance": { + "type": "int" + } + } + }, + "autoGuideTitle": "自動起卦教程", + "autoGuideInstruction": "搖晃手機或點擊按鈕,連續搖 6 次即可形成完整卦象。", + "dateTab": "日期", + "timeTab": "時間", + "confirm": "確認", + "cancel": "取消", + "coinFaceGuideTitle": "字花對照說明", + "coinFaceGuideDescription": "左側為花面,右側為字面。", + "settingsInviteTitle": "我的邀請", + "settingsInviteSubtitle": "邀請好友,共同獲得獎勵", + "settingsInviteMyCode": "我的邀請碼", + "settingsInviteCopySuccess": "邀請碼已複製", + "settingsInviteCopied": "已複製", + "settingsInviteCopy": "複製", + "settingsInviteStats": "已邀請:{count} 位好友", + "@settingsInviteStats": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsInviteBindCode": "綁定邀請碼", + "settingsInviteBindHint": "輸入好友的邀請碼", + "settingsInviteBindPlaceholder": "6位邀請碼", + "settingsInviteBindButton": "綁定", + "settingsInviteBindSuccess": "邀請碼綁定成功", + "settingsInviteBindFailed": "邀請碼綁定失敗", + "settingsInviteGenerateTitle": "產生我的邀請碼", + "settingsInviteGenerateButton": "產生我的邀請碼", + "settingsInviteGenerateSuccess": "邀請碼產生成功", + "settingsInviteEmptyTitle": "邀請好友,獲得獎勵", + "settingsInviteEmptyDescription": "每成功邀請一位好友註冊,您將獲得積分獎勵", + "settingsInviteInputLabel": "輸入邀請碼(選填)", + "settingsInviteInputHint": "輸入邀請碼綁定您的邀請人", + "settingsInviteInvalidCode": "請輸入有效的6位邀請碼" +}