多语言支持

This commit is contained in:
ytc1012
2025-11-24 11:37:35 +08:00
parent 4444c401b9
commit 6557e1f911
4 changed files with 1169 additions and 1 deletions

View File

@@ -30,7 +30,8 @@
"Bash(flutter doctor:*)", "Bash(flutter doctor:*)",
"Bash(flutter analyze:*)", "Bash(flutter analyze:*)",
"Bash(start \"\" \"f:\\cursor-auto\\focusBuddy\\onboarding-preview.html\")", "Bash(start \"\" \"f:\\cursor-auto\\focusBuddy\\onboarding-preview.html\")",
"Bash(flutter emulators:*)" "Bash(flutter emulators:*)",
"Bash(flutter gen-l10n:*)"
], ],
"deny": [], "deny": [],
"ask": [] "ask": []

View File

@@ -0,0 +1,587 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;
import 'app_localizations_en.dart';
import 'app_localizations_zh.dart';
// ignore_for_file: type=lint
/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
/// localizationsDelegates: AppLocalizations.localizationsDelegates,
/// supportedLocales: AppLocalizations.supportedLocales,
/// home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
/// # Internationalization support.
/// flutter_localizations:
/// sdk: flutter
/// intl: any # Use the pinned version from flutter_localizations
///
/// # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, youll need to edit this
/// file.
///
/// First, open your projects ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// projects Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
AppLocalizations(String locale)
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
final String localeName;
static AppLocalizations? of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations);
}
static const LocalizationsDelegate<AppLocalizations> delegate =
_AppLocalizationsDelegate();
/// A list of this localizations delegate along with the default localizations
/// delegates.
///
/// Returns a list of localizations delegates containing this delegate along with
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
/// and GlobalWidgetsLocalizations.delegate.
///
/// Additional delegates can be added by appending to this list in
/// MaterialApp. This list does not have to be used at all if a custom list
/// of delegates is preferred or required.
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
<LocalizationsDelegate<dynamic>>[
delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
/// A list of this localizations delegate's supported locales.
static const List<Locale> supportedLocales = <Locale>[
Locale('en'),
Locale('zh'),
];
/// The application title
///
/// In en, this message translates to:
/// **'FocusBuddy'**
String get appTitle;
/// Button text to start a focus session
///
/// In en, this message translates to:
/// **'Start Focusing'**
String get startFocusing;
/// Minutes plural form
///
/// In en, this message translates to:
/// **'{count, plural, =1{minute} other{minutes}}'**
String minutes(int count);
/// Minutes with value
///
/// In en, this message translates to:
/// **'{count} {minutes}'**
String minutesValue(int count, Object minutes);
/// Helper text on home screen
///
/// In en, this message translates to:
/// **'Tap \'I got distracted\'\nanytime — no guilt.'**
String get tapDistractionAnytime;
/// History navigation button
///
/// In en, this message translates to:
/// **'History'**
String get history;
/// Settings navigation button
///
/// In en, this message translates to:
/// **'Settings'**
String get settings;
/// Main distraction button text
///
/// In en, this message translates to:
/// **'I got distracted'**
String get iGotDistracted;
/// No description provided for @pause.
///
/// In en, this message translates to:
/// **'Pause'**
String get pause;
/// No description provided for @resume.
///
/// In en, this message translates to:
/// **'Resume'**
String get resume;
/// No description provided for @stopSession.
///
/// In en, this message translates to:
/// **'Stop session'**
String get stopSession;
/// Distraction sheet title
///
/// In en, this message translates to:
/// **'What pulled you away?'**
String get whatPulledYouAway;
/// No description provided for @skipThisTime.
///
/// In en, this message translates to:
/// **'Skip this time'**
String get skipThisTime;
/// No description provided for @stopEarly.
///
/// In en, this message translates to:
/// **'Stop early?'**
String get stopEarly;
/// No description provided for @stopEarlyMessage.
///
/// In en, this message translates to:
/// **'That\'s totally fine — you still focused for {minutes} {minuteText}!'**
String stopEarlyMessage(int minutes, Object minuteText);
/// No description provided for @keepGoing.
///
/// In en, this message translates to:
/// **'Keep going'**
String get keepGoing;
/// No description provided for @yesStop.
///
/// In en, this message translates to:
/// **'Yes, stop'**
String get yesStop;
/// Encouragement message when distracted
///
/// In en, this message translates to:
/// **'It happens. Let\'s gently come back.'**
String get distractionEncouragement;
/// No description provided for @focusComplete.
///
/// In en, this message translates to:
/// **'Focus session complete!'**
String get focusComplete;
/// No description provided for @youFocusedFor.
///
/// In en, this message translates to:
/// **'You focused for'**
String get youFocusedFor;
/// No description provided for @totalToday.
///
/// In en, this message translates to:
/// **'Total today: {minutes} mins'**
String totalToday(int minutes);
/// No description provided for @distractionsCount.
///
/// In en, this message translates to:
/// **'Distractions: {count} {times}'**
String distractionsCount(int count, Object times);
/// No description provided for @times.
///
/// In en, this message translates to:
/// **'{count, plural, =1{time} other{times}}'**
String times(int count);
/// No description provided for @startAnother.
///
/// In en, this message translates to:
/// **'Start Another'**
String get startAnother;
/// No description provided for @viewHistory.
///
/// In en, this message translates to:
/// **'View History'**
String get viewHistory;
/// No description provided for @yourFocusJourney.
///
/// In en, this message translates to:
/// **'Your Focus Journey'**
String get yourFocusJourney;
/// No description provided for @noFocusSessionsYet.
///
/// In en, this message translates to:
/// **'No focus sessions yet'**
String get noFocusSessionsYet;
/// No description provided for @startFirstSession.
///
/// In en, this message translates to:
/// **'Start your first session\nto see your progress here!'**
String get startFirstSession;
/// No description provided for @today.
///
/// In en, this message translates to:
/// **'Today'**
String get today;
/// No description provided for @sessions.
///
/// In en, this message translates to:
/// **'{count, plural, =1{session} other{sessions}}'**
String sessions(int count);
/// No description provided for @completed.
///
/// In en, this message translates to:
/// **'Completed'**
String get completed;
/// No description provided for @stoppedEarly.
///
/// In en, this message translates to:
/// **'Stopped early'**
String get stoppedEarly;
/// No description provided for @distractions.
///
/// In en, this message translates to:
/// **'{count, plural, =1{distraction} other{distractions}}'**
String distractions(int count);
/// No description provided for @focusSettings.
///
/// In en, this message translates to:
/// **'Focus Settings'**
String get focusSettings;
/// No description provided for @defaultFocusDuration.
///
/// In en, this message translates to:
/// **'Default Focus Duration'**
String get defaultFocusDuration;
/// No description provided for @defaultLabel.
///
/// In en, this message translates to:
/// **'Default'**
String get defaultLabel;
/// No description provided for @about.
///
/// In en, this message translates to:
/// **'About'**
String get about;
/// No description provided for @privacyPolicy.
///
/// In en, this message translates to:
/// **'Privacy Policy'**
String get privacyPolicy;
/// No description provided for @aboutFocusBuddy.
///
/// In en, this message translates to:
/// **'About FocusBuddy'**
String get aboutFocusBuddy;
/// No description provided for @resetOnboarding.
///
/// In en, this message translates to:
/// **'Reset Onboarding'**
String get resetOnboarding;
/// No description provided for @version.
///
/// In en, this message translates to:
/// **'Version 1.0.0 (MVP)'**
String get version;
/// No description provided for @privacyPolicyTitle.
///
/// In en, this message translates to:
/// **'Privacy Policy'**
String get privacyPolicyTitle;
/// No description provided for @privacyPolicyContent.
///
/// In en, this message translates to:
/// **'FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\n[Your website URL]/privacy'**
String get privacyPolicyContent;
/// No description provided for @close.
///
/// In en, this message translates to:
/// **'Close'**
String get close;
/// No description provided for @aboutTitle.
///
/// In en, this message translates to:
/// **'About FocusBuddy'**
String get aboutTitle;
/// No description provided for @aboutSubtitle.
///
/// In en, this message translates to:
/// **'A gentle focus timer for neurodivergent minds'**
String get aboutSubtitle;
/// No description provided for @aboutQuote.
///
/// In en, this message translates to:
/// **'\"Focus is not about never getting distracted — it\'s about gently coming back every time you do.\"'**
String get aboutQuote;
/// No description provided for @aboutFeatures.
///
/// In en, this message translates to:
/// **'✨ No punishment for distractions\n💚 Encouragement over criticism\n🔒 100% offline and private\n🌱 Made with care'**
String get aboutFeatures;
/// No description provided for @resetOnboardingTitle.
///
/// In en, this message translates to:
/// **'Reset Onboarding?'**
String get resetOnboardingTitle;
/// No description provided for @resetOnboardingMessage.
///
/// In en, this message translates to:
/// **'This will show the onboarding screens again when you restart the app.'**
String get resetOnboardingMessage;
/// No description provided for @cancel.
///
/// In en, this message translates to:
/// **'Cancel'**
String get cancel;
/// No description provided for @reset.
///
/// In en, this message translates to:
/// **'Reset'**
String get reset;
/// No description provided for @onboardingReset.
///
/// In en, this message translates to:
/// **'Onboarding reset. Restart the app to see it again.'**
String get onboardingReset;
/// No description provided for @onboarding1Title.
///
/// In en, this message translates to:
/// **'Focus without guilt'**
String get onboarding1Title;
/// No description provided for @onboarding1Description.
///
/// In en, this message translates to:
/// **'This app is different — it won\'t punish you for losing focus.\n\nPerfect for ADHD, anxiety, or anyone who finds traditional timers too harsh.'**
String get onboarding1Description;
/// No description provided for @onboarding2Title.
///
/// In en, this message translates to:
/// **'Tap when you get distracted'**
String get onboarding2Title;
/// No description provided for @onboarding2Description.
///
/// In en, this message translates to:
/// **'We\'ll gently remind you to come back.\n\nNo shame. No stress. Just a friendly nudge.'**
String get onboarding2Description;
/// No description provided for @onboarding3Title.
///
/// In en, this message translates to:
/// **'Track your progress'**
String get onboarding3Title;
/// No description provided for @onboarding3Description.
///
/// In en, this message translates to:
/// **'See how you\'re improving, one session at a time.\n\nEvery distraction is just data — not failure.'**
String get onboarding3Description;
/// No description provided for @skip.
///
/// In en, this message translates to:
/// **'Skip'**
String get skip;
/// No description provided for @next.
///
/// In en, this message translates to:
/// **'Next'**
String get next;
/// No description provided for @getStarted.
///
/// In en, this message translates to:
/// **'Get Started'**
String get getStarted;
/// No description provided for @notificationFocusInProgress.
///
/// In en, this message translates to:
/// **'Focus session in progress'**
String get notificationFocusInProgress;
/// No description provided for @notificationRemaining.
///
/// In en, this message translates to:
/// **'{time} remaining'**
String notificationRemaining(String time);
/// No description provided for @notificationFocusCompleteTitle.
///
/// In en, this message translates to:
/// **'🎉 Focus session complete!'**
String get notificationFocusCompleteTitle;
/// No description provided for @notificationFocusCompleteBodyNoDistractions.
///
/// In en, this message translates to:
/// **'You focused for {minutes} {minuteText} without distractions!'**
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
);
/// No description provided for @notificationFocusCompleteBody.
///
/// In en, this message translates to:
/// **'You focused for {minutes} {minuteText}. Great effort!'**
String notificationFocusCompleteBody(int minutes, Object minuteText);
/// No description provided for @distractionPhoneNotification.
///
/// In en, this message translates to:
/// **'Phone / Notification'**
String get distractionPhoneNotification;
/// No description provided for @distractionSocialMedia.
///
/// In en, this message translates to:
/// **'Social Media'**
String get distractionSocialMedia;
/// No description provided for @distractionThoughts.
///
/// In en, this message translates to:
/// **'Thoughts / Daydream'**
String get distractionThoughts;
/// No description provided for @distractionOther.
///
/// In en, this message translates to:
/// **'Other'**
String get distractionOther;
/// No description provided for @language.
///
/// In en, this message translates to:
/// **'Language'**
String get language;
/// No description provided for @selectLanguage.
///
/// In en, this message translates to:
/// **'Select Language'**
String get selectLanguage;
/// No description provided for @english.
///
/// In en, this message translates to:
/// **'English'**
String get english;
/// No description provided for @chinese.
///
/// In en, this message translates to:
/// **'中文 (Chinese)'**
String get chinese;
}
class _AppLocalizationsDelegate
extends LocalizationsDelegate<AppLocalizations> {
const _AppLocalizationsDelegate();
@override
Future<AppLocalizations> load(Locale locale) {
return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
}
@override
bool isSupported(Locale locale) =>
<String>['en', 'zh'].contains(locale.languageCode);
@override
bool shouldReload(_AppLocalizationsDelegate old) => false;
}
AppLocalizations lookupAppLocalizations(Locale locale) {
// Lookup logic when only language code is specified.
switch (locale.languageCode) {
case 'en':
return AppLocalizationsEn();
case 'zh':
return AppLocalizationsZh();
}
throw FlutterError(
'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
'an issue with the localizations generation tool. Please file an issue '
'on GitHub with a reproducible sample app and the gen-l10n configuration '
'that was used.',
);
}

View File

@@ -0,0 +1,294 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Start Focusing';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'minutes',
one: 'minute',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime =>
'Tap \'I got distracted\'\nanytime — no guilt.';
@override
String get history => 'History';
@override
String get settings => 'Settings';
@override
String get iGotDistracted => 'I got distracted';
@override
String get pause => 'Pause';
@override
String get resume => 'Resume';
@override
String get stopSession => 'Stop session';
@override
String get whatPulledYouAway => 'What pulled you away?';
@override
String get skipThisTime => 'Skip this time';
@override
String get stopEarly => 'Stop early?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return 'That\'s totally fine — you still focused for $minutes $minuteText!';
}
@override
String get keepGoing => 'Keep going';
@override
String get yesStop => 'Yes, stop';
@override
String get distractionEncouragement => 'It happens. Let\'s gently come back.';
@override
String get focusComplete => 'Focus session complete!';
@override
String get youFocusedFor => 'You focused for';
@override
String totalToday(int minutes) {
return 'Total today: $minutes mins';
}
@override
String distractionsCount(int count, Object times) {
return 'Distractions: $count $times';
}
@override
String times(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'times',
one: 'time',
);
return '$_temp0';
}
@override
String get startAnother => 'Start Another';
@override
String get viewHistory => 'View History';
@override
String get yourFocusJourney => 'Your Focus Journey';
@override
String get noFocusSessionsYet => 'No focus sessions yet';
@override
String get startFirstSession =>
'Start your first session\nto see your progress here!';
@override
String get today => 'Today';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'sessions',
one: 'session',
);
return '$_temp0';
}
@override
String get completed => 'Completed';
@override
String get stoppedEarly => 'Stopped early';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'distractions',
one: 'distraction',
);
return '$_temp0';
}
@override
String get focusSettings => 'Focus Settings';
@override
String get defaultFocusDuration => 'Default Focus Duration';
@override
String get defaultLabel => 'Default';
@override
String get about => 'About';
@override
String get privacyPolicy => 'Privacy Policy';
@override
String get aboutFocusBuddy => 'About FocusBuddy';
@override
String get resetOnboarding => 'Reset Onboarding';
@override
String get version => 'Version 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Privacy Policy';
@override
String get privacyPolicyContent =>
'FocusBuddy is 100% offline. We do not collect your name, email, location, or usage data. All sessions stay on your device.\n\nThere is no cloud sync, no account system, and no analytics tracking.\n\nFor the full privacy policy, visit:\n[Your website URL]/privacy';
@override
String get close => 'Close';
@override
String get aboutTitle => 'About FocusBuddy';
@override
String get aboutSubtitle => 'A gentle focus timer for neurodivergent minds';
@override
String get aboutQuote =>
'\"Focus is not about never getting distracted — it\'s about gently coming back every time you do.\"';
@override
String get aboutFeatures =>
'✨ No punishment for distractions\n💚 Encouragement over criticism\n🔒 100% offline and private\n🌱 Made with care';
@override
String get resetOnboardingTitle => 'Reset Onboarding?';
@override
String get resetOnboardingMessage =>
'This will show the onboarding screens again when you restart the app.';
@override
String get cancel => 'Cancel';
@override
String get reset => 'Reset';
@override
String get onboardingReset =>
'Onboarding reset. Restart the app to see it again.';
@override
String get onboarding1Title => 'Focus without guilt';
@override
String get onboarding1Description =>
'This app is different — it won\'t punish you for losing focus.\n\nPerfect for ADHD, anxiety, or anyone who finds traditional timers too harsh.';
@override
String get onboarding2Title => 'Tap when you get distracted';
@override
String get onboarding2Description =>
'We\'ll gently remind you to come back.\n\nNo shame. No stress. Just a friendly nudge.';
@override
String get onboarding3Title => 'Track your progress';
@override
String get onboarding3Description =>
'See how you\'re improving, one session at a time.\n\nEvery distraction is just data — not failure.';
@override
String get skip => 'Skip';
@override
String get next => 'Next';
@override
String get getStarted => 'Get Started';
@override
String get notificationFocusInProgress => 'Focus session in progress';
@override
String notificationRemaining(String time) {
return '$time remaining';
}
@override
String get notificationFocusCompleteTitle => '🎉 Focus session complete!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return 'You focused for $minutes $minuteText without distractions!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return 'You focused for $minutes $minuteText. Great effort!';
}
@override
String get distractionPhoneNotification => 'Phone / Notification';
@override
String get distractionSocialMedia => 'Social Media';
@override
String get distractionThoughts => 'Thoughts / Daydream';
@override
String get distractionOther => 'Other';
@override
String get language => 'Language';
@override
String get selectLanguage => 'Select Language';
@override
String get english => 'English';
@override
String get chinese => '中文 (Chinese)';
}

View File

@@ -0,0 +1,286 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Chinese (`zh`).
class AppLocalizationsZh extends AppLocalizations {
AppLocalizationsZh([String locale = 'zh']) : super(locale);
@override
String get appTitle => '专注伙伴';
@override
String get startFocusing => '开始专注';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '分钟',
one: '分钟',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime => '随时点击\'我分心了\'\n——没有负罪感。';
@override
String get history => '历史';
@override
String get settings => '设置';
@override
String get iGotDistracted => '我分心了';
@override
String get pause => '暂停';
@override
String get resume => '继续';
@override
String get stopSession => '停止会话';
@override
String get whatPulledYouAway => '是什么分散了你的注意力?';
@override
String get skipThisTime => '跳过';
@override
String get stopEarly => '提前停止?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return '完全没问题——你已经专注了 $minutes $minuteText';
}
@override
String get keepGoing => '继续';
@override
String get yesStop => '确定停止';
@override
String get distractionEncouragement => '没关系,让我们温柔地回到正轨。';
@override
String get focusComplete => '专注完成!';
@override
String get youFocusedFor => '你专注了';
@override
String totalToday(int minutes) {
return '今日总计:$minutes 分钟';
}
@override
String distractionsCount(int count, Object times) {
return '分心:$count $times';
}
@override
String times(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '',
one: '',
);
return '$_temp0';
}
@override
String get startAnother => '再来一次';
@override
String get viewHistory => '查看历史';
@override
String get yourFocusJourney => '你的专注之旅';
@override
String get noFocusSessionsYet => '还没有专注记录';
@override
String get startFirstSession => '开始你的第一次专注\n在这里查看进度!';
@override
String get today => '今天';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '次会话',
one: '次会话',
);
return '$_temp0';
}
@override
String get completed => '已完成';
@override
String get stoppedEarly => '提前停止';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '次分心',
one: '次分心',
);
return '$_temp0';
}
@override
String get focusSettings => '专注设置';
@override
String get defaultFocusDuration => '默认专注时长';
@override
String get defaultLabel => '默认';
@override
String get about => '关于';
@override
String get privacyPolicy => '隐私政策';
@override
String get aboutFocusBuddy => '关于专注伙伴';
@override
String get resetOnboarding => '重置引导';
@override
String get version => '版本 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => '隐私政策';
@override
String get privacyPolicyContent =>
'专注伙伴 100% 离线运行。我们不收集您的姓名、电子邮件、位置或使用数据。所有会话数据都保存在您的设备上。\n\n没有云同步,没有账户系统,没有分析追踪。\n\n完整隐私政策请访问:\n[您的网站 URL]/privacy';
@override
String get close => '关闭';
@override
String get aboutTitle => '关于专注伙伴';
@override
String get aboutSubtitle => '为神经多样性人群设计的温柔专注计时器';
@override
String get aboutQuote => '\"专注不是永不分心——而是每次分心后温柔地回来。\"';
@override
String get aboutFeatures => '✨ 不惩罚分心\n💚 鼓励而非批评\n🔒 100% 离线和私密\n🌱 用心制作';
@override
String get resetOnboardingTitle => '重置引导?';
@override
String get resetOnboardingMessage => '重启应用后将再次显示引导页面。';
@override
String get cancel => '取消';
@override
String get reset => '重置';
@override
String get onboardingReset => '引导已重置。重启应用后将再次显示。';
@override
String get onboarding1Title => '无负罪感地专注';
@override
String get onboarding1Description =>
'这个应用与众不同——它不会因为你失去专注而惩罚你。\n\n完美适合 ADHD、焦虑症患者或任何觉得传统计时器太苛刻的人。';
@override
String get onboarding2Title => '分心时轻触按钮';
@override
String get onboarding2Description => '我们会温柔地提醒你回来。\n\n没有羞愧。没有压力。只是友好的提醒。';
@override
String get onboarding3Title => '追踪你的进步';
@override
String get onboarding3Description => '看看你是如何一次次进步的。\n\n每次分心都只是数据——而非失败。';
@override
String get skip => '跳过';
@override
String get next => '下一步';
@override
String get getStarted => '开始使用';
@override
String get notificationFocusInProgress => '专注进行中';
@override
String notificationRemaining(String time) {
return '剩余 $time';
}
@override
String get notificationFocusCompleteTitle => '🎉 专注完成!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return '你专注了 $minutes $minuteText,没有分心!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return '你专注了 $minutes $minuteText。做得很棒!';
}
@override
String get distractionPhoneNotification => '手机/通知';
@override
String get distractionSocialMedia => '社交媒体';
@override
String get distractionThoughts => '思绪/白日梦';
@override
String get distractionOther => '其他';
@override
String get language => '语言';
@override
String get selectLanguage => '选择语言';
@override
String get english => 'English';
@override
String get chinese => '中文';
}