多语言支持
This commit is contained in:
@@ -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": []
|
||||||
|
|||||||
587
lib/l10n/app_localizations.dart
Normal file
587
lib/l10n/app_localizations.dart
Normal 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, you’ll need to edit this
|
||||||
|
/// file.
|
||||||
|
///
|
||||||
|
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
|
||||||
|
/// Then, in the Project Navigator, open the Info.plist file under the Runner
|
||||||
|
/// project’s 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.',
|
||||||
|
);
|
||||||
|
}
|
||||||
294
lib/l10n/app_localizations_en.dart
Normal file
294
lib/l10n/app_localizations_en.dart
Normal 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)';
|
||||||
|
}
|
||||||
286
lib/l10n/app_localizations_zh.dart
Normal file
286
lib/l10n/app_localizations_zh.dart
Normal 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 => '中文';
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user