fix: 修复语言设置为简体中文而非繁体翻译
This commit is contained in:
@@ -1,9 +1,5 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"instructions": [
|
||||
"./.opencode/memory/current.md",
|
||||
"./.opencode/memory/durable.md"
|
||||
],
|
||||
"mcp": {
|
||||
"supabase": {
|
||||
"type": "remote",
|
||||
|
||||
@@ -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_<locale>.arb` file with `"@@locale": "<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.
|
||||
|
||||
@@ -379,8 +379,10 @@ class _EryaoAppState extends State<EryaoApp> {
|
||||
}
|
||||
|
||||
Future<void> _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<EryaoApp> {
|
||||
|
||||
Future<void> _handleInterfaceLanguageChanged(String languageTag) async {
|
||||
final locale = localeFromLanguageTag(languageTag);
|
||||
await _sessionStore.saveLocaleCode(locale.languageCode);
|
||||
await _sessionStore.saveLocaleTag(languageTag);
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -59,11 +59,11 @@ class SessionStore {
|
||||
return _kvStore.getBool(_welcomeReadKey);
|
||||
}
|
||||
|
||||
Future<void> saveLocaleCode(String localeCode) async {
|
||||
await _kvStore.setString(_localeKey, localeCode);
|
||||
Future<void> saveLocaleTag(String localeTag) async {
|
||||
await _kvStore.setString(_localeKey, localeTag);
|
||||
}
|
||||
|
||||
Future<String?> getLocaleCode() async {
|
||||
Future<String?> getLocaleTag() async {
|
||||
return _kvStore.getString(_localeKey);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 = <String, dynamic>{
|
||||
'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(
|
||||
_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(
|
||||
_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 = <String, String>{};
|
||||
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});
|
||||
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ class _GeneralSettingsScreenState extends State<GeneralSettingsScreen> {
|
||||
),
|
||||
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<GeneralSettingsScreen> {
|
||||
}),
|
||||
),
|
||||
),
|
||||
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<GeneralSettingsScreen> {
|
||||
await widget.onSettingsChanged(_settings);
|
||||
}
|
||||
|
||||
Future<void> _selectTimezone(BuildContext context) async {
|
||||
final result = await Navigator.of(context).push<String>(
|
||||
MaterialPageRoute<String>(
|
||||
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<void> _selectCountry(BuildContext context) async {
|
||||
final result = await Navigator.of(context).push<String>(
|
||||
MaterialPageRoute<String>(
|
||||
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<GeneralSettingsScreen> {
|
||||
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]),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
+16
-10
@@ -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",
|
||||
|
||||
@@ -96,6 +96,7 @@ abstract class AppLocalizations {
|
||||
static const List<Locale> supportedLocales = <Locale>[
|
||||
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':
|
||||
|
||||
@@ -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';
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -395,6 +395,12 @@
|
||||
"resultTimePillar": "时柱",
|
||||
"resultGanZhiLabel": "干支",
|
||||
"resultKongWangLabel": "空亡",
|
||||
"termYueJian": "月建",
|
||||
"termRiChen": "日辰",
|
||||
"termYuePo": "月破",
|
||||
"termRiChong": "日冲",
|
||||
"guaNameSimplifiedChars": "风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济",
|
||||
"guaNameTraditionalChars": "风泽观讼师谦随蛊临贲剥复无颐恒壮晋损渐归丰兑涣节济",
|
||||
"manualScreenTitle": "手动起卦",
|
||||
"manualSelectTime": "选择起卦时间",
|
||||
"manualSpecifyYaoCombo": "指定铜钱字花组合",
|
||||
|
||||
@@ -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位邀請碼"
|
||||
}
|
||||
Reference in New Issue
Block a user