多语言支持

This commit is contained in:
ytc1012
2025-11-24 14:01:01 +08:00
parent bf21dba275
commit 57ef852863
32 changed files with 5255 additions and 36 deletions

120
lib/l10n/app_ar.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "ar",
"appTitle": "FocusBuddy",
"startFocusing": "ابدأ التركيز",
"minutes": "{count, plural, =1{دقيقة} other{دقائق}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "اضغط على 'تشتت انتباهي'\nفي أي وقت\n—بدون شعور بالذنب",
"history": "السجل",
"settings": "الإعدادات",
"iGotDistracted": "تشتت انتباهي",
"pause": "إيقاف مؤقت",
"resume": "استئناف",
"stopSession": "إيقاف الجلسة",
"whatPulledYouAway": "ما الذي شتت انتباهك؟",
"skipThisTime": "تخطي هذه المرة",
"stopEarly": "التوقف مبكراً؟",
"stopEarlyMessage": "لا بأس — لقد ركزت لمدة {minutes} {minuteText}!",
"keepGoing": "استمر",
"yesStop": "نعم، توقف",
"distractionEncouragement": "هذا يحدث. دعنا نعود بلطف.",
"focusComplete": "جلسة التركيز مكتملة!",
"youFocusedFor": "لقد ركزت لمدة",
"totalToday": "الإجمالي اليوم: {minutes} دقيقة",
"distractionsCount": "التشتتات: {count} {times}",
"times": "{count, plural, =1{مرة} other{مرات}}",
"startAnother": "ابدأ أخرى",
"viewHistory": "عرض السجل",
"yourFocusJourney": "رحلة تركيزك",
"noFocusSessionsYet": "لا توجد جلسات تركيز بعد",
"startFirstSession": "ابدأ جلستك الأولى\nلرؤية تقدمك هنا!",
"today": "اليوم",
"sessions": "{count, plural, =1{{count} جلسة} other{{count} جلسات}}",
"completed": "مكتملة",
"stoppedEarly": "توقفت مبكراً",
"distractions": "{count, plural, =1{تشتت} other{تشتتات}}",
"focusSettings": "إعدادات التركيز",
"defaultFocusDuration": "مدة التركيز الافتراضية",
"defaultLabel": "افتراضي",
"about": "حول",
"privacyPolicy": "سياسة الخصوصية",
"aboutFocusBuddy": "حول FocusBuddy",
"resetOnboarding": "إعادة تعيين التعريف",
"version": "الإصدار 1.0.0 (MVP)",
"privacyPolicyTitle": "سياسة الخصوصية",
"privacyPolicyContent": "يعمل FocusBuddy بنسبة 100٪ دون اتصال بالإنترنت. لا نجمع اسمك أو بريدك الإلكتروني أو موقعك أو بيانات الاستخدام. تبقى جميع الجلسات على جهازك.\n\nلا توجد مزامنة سحابية أو نظام حسابات أو تتبع تحليلي.\n\nللحصول على سياسة الخصوصية الكاملة، قم بزيارة:\n[عنوان URL لموقعك]/privacy",
"close": "إغلاق",
"aboutTitle": "حول FocusBuddy",
"aboutSubtitle": "مؤقت تركيز لطيف للعقول العصبية المتنوعة",
"aboutQuote": "\"التركيز لا يتعلق بعدم التشتت أبداً — بل يتعلق بالعودة بلطف في كل مرة تتشتت فيها.\"",
"aboutFeatures": "✨ لا عقاب على التشتتات\n💚 تشجيع بدلاً من النقد\n🔒 100٪ دون اتصال وخاص\n🌱 مصنوع بعناية",
"resetOnboardingTitle": "إعادة تعيين التعريف؟",
"resetOnboardingMessage": "سيعرض هذا شاشات التعريف مرة أخرى عند إعادة تشغيل التطبيق.",
"cancel": "إلغاء",
"reset": "إعادة تعيين",
"onboardingReset": "تم إعادة تعيين التعريف. أعد تشغيل التطبيق لرؤيته مرة أخرى.",
"onboarding1Title": "ركز بدون شعور بالذنب",
"onboarding1Description": "هذا التطبيق مختلف — لن يعاقبك على فقدان التركيز.\n\nمثالي لاضطراب فرط الحركة ونقص الانتباه أو القلق أو أي شخص يجد المؤقتات التقليدية قاسية جداً.",
"onboarding2Title": "اضغط عندما تتشتت",
"onboarding2Description": "سنذكرك بلطف بالعودة.\n\nلا خجل. لا ضغط. مجرد تذكير ودي.",
"onboarding3Title": "تتبع تقدمك",
"onboarding3Description": "شاهد كيف تتحسن، جلسة واحدة في كل مرة.\n\nكل تشتت هو مجرد بيانات — وليس فشلاً.",
"skip": "تخطي",
"next": "التالي",
"getStarted": "ابدأ",
"notificationFocusInProgress": "جلسة تركيز قيد التقدم",
"notificationRemaining": "{time} متبقية",
"notificationFocusCompleteTitle": "🎉 جلسة التركيز مكتملة!",
"notificationFocusCompleteBodyNoDistractions": "لقد ركزت لمدة {minutes} {minuteText} بدون تشتتات!",
"notificationFocusCompleteBody": "لقد ركزت لمدة {minutes} {minuteText}. جهد رائع!",
"distractionPhoneNotification": "الهاتف / الإشعارات",
"distractionSocialMedia": "وسائل التواصل الاجتماعي",
"distractionThoughts": "أفكار / أحلام اليقظة",
"distractionOther": "أخرى",
"language": "اللغة",
"selectLanguage": "اختر اللغة",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_de.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "de",
"appTitle": "FocusBuddy",
"startFocusing": "Fokus starten",
"minutes": "{count, plural, =1{Minute} other{Minuten}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "Tippe jederzeit auf\n'Ich wurde abgelenkt'\n—ohne Schuldgefühle",
"history": "Verlauf",
"settings": "Einstellungen",
"iGotDistracted": "Ich wurde abgelenkt",
"pause": "Pausieren",
"resume": "Fortsetzen",
"stopSession": "Sitzung beenden",
"whatPulledYouAway": "Was hat dich abgelenkt?",
"skipThisTime": "Diesmal überspringen",
"stopEarly": "Vorzeitig beenden?",
"stopEarlyMessage": "Das ist völlig in Ordnung — du hast dich {minutes} {minuteText} konzentriert!",
"keepGoing": "Weitermachen",
"yesStop": "Ja, beenden",
"distractionEncouragement": "Das passiert. Lass uns sanft zurückkommen.",
"focusComplete": "Fokussitzung abgeschlossen!",
"youFocusedFor": "Du hast dich konzentriert für",
"totalToday": "Heute insgesamt: {minutes} Min",
"distractionsCount": "Ablenkungen: {count} {times}",
"times": "{count, plural, =1{Mal} other{Mal}}",
"startAnother": "Noch eine starten",
"viewHistory": "Verlauf anzeigen",
"yourFocusJourney": "Deine Fokus-Reise",
"noFocusSessionsYet": "Noch keine Fokussitzungen",
"startFirstSession": "Starte deine erste Sitzung,\num deinen Fortschritt hier zu sehen!",
"today": "Heute",
"sessions": "{count, plural, =1{{count} Sitzung} other{{count} Sitzungen}}",
"completed": "Abgeschlossen",
"stoppedEarly": "Vorzeitig beendet",
"distractions": "{count, plural, =1{Ablenkung} other{Ablenkungen}}",
"focusSettings": "Fokus-Einstellungen",
"defaultFocusDuration": "Standard-Fokusdauer",
"defaultLabel": "Standard",
"about": "Über",
"privacyPolicy": "Datenschutzrichtlinie",
"aboutFocusBuddy": "Über FocusBuddy",
"resetOnboarding": "Einführung zurücksetzen",
"version": "Version 1.0.0 (MVP)",
"privacyPolicyTitle": "Datenschutzrichtlinie",
"privacyPolicyContent": "FocusBuddy funktioniert zu 100% offline. Wir sammeln weder deinen Namen, E-Mail, Standort noch Nutzungsdaten. Alle Sitzungen bleiben auf deinem Gerät.\n\nEs gibt keine Cloud-Synchronisation, kein Kontosystem und keine Analyse-Verfolgung.\n\nFür die vollständige Datenschutzrichtlinie besuche:\n[Deine Website-URL]/privacy",
"close": "Schließen",
"aboutTitle": "Über FocusBuddy",
"aboutSubtitle": "Ein sanfter Fokus-Timer für neurodivergente Köpfe",
"aboutQuote": "\"Fokus bedeutet nicht, niemals abgelenkt zu werden — sondern jedes Mal sanft zurückzukommen.\"",
"aboutFeatures": "✨ Keine Bestrafung für Ablenkungen\n💚 Ermutigung statt Kritik\n🔒 100% offline und privat\n🌱 Mit Sorgfalt gemacht",
"resetOnboardingTitle": "Einführung zurücksetzen?",
"resetOnboardingMessage": "Dies zeigt die Einführungsbildschirme erneut an, wenn du die App neu startest.",
"cancel": "Abbrechen",
"reset": "Zurücksetzen",
"onboardingReset": "Einführung zurückgesetzt. Starte die App neu, um sie erneut zu sehen.",
"onboarding1Title": "Fokus ohne Schuldgefühle",
"onboarding1Description": "Diese App ist anders — sie bestraft dich nicht für Ablenkungen.\n\nPerfekt für ADHS, Angst oder jeden, der traditionelle Timer zu hart findet.",
"onboarding2Title": "Tippe, wenn du abgelenkt wirst",
"onboarding2Description": "Wir erinnern dich sanft daran, zurückzukommen.\n\nKeine Scham. Kein Stress. Nur eine freundliche Erinnerung.",
"onboarding3Title": "Verfolge deinen Fortschritt",
"onboarding3Description": "Sieh, wie du dich von Sitzung zu Sitzung verbesserst.\n\nJede Ablenkung ist nur ein Datenpunkt — kein Versagen.",
"skip": "Überspringen",
"next": "Weiter",
"getStarted": "Los geht's",
"notificationFocusInProgress": "Fokussitzung läuft",
"notificationRemaining": "{time} verbleibend",
"notificationFocusCompleteTitle": "🎉 Fokussitzung abgeschlossen!",
"notificationFocusCompleteBodyNoDistractions": "Du hast dich {minutes} {minuteText} ohne Ablenkungen konzentriert!",
"notificationFocusCompleteBody": "Du hast dich {minutes} {minuteText} konzentriert. Tolle Leistung!",
"distractionPhoneNotification": "Handy / Benachrichtigung",
"distractionSocialMedia": "Soziale Medien",
"distractionThoughts": "Gedanken / Tagträumen",
"distractionOther": "Anderes",
"language": "Sprache",
"selectLanguage": "Sprache auswählen",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

View File

@@ -119,7 +119,7 @@
"startFirstSession": "Start your first session\nto see your progress here!", "startFirstSession": "Start your first session\nto see your progress here!",
"today": "Today", "today": "Today",
"sessions": "{count, plural, =1{session} other{sessions}}", "sessions": "{count, plural, =1{{count} session} other{{count} sessions}}",
"@sessions": { "@sessions": {
"placeholders": { "placeholders": {
"count": { "count": {
@@ -215,5 +215,16 @@
"language": "Language", "language": "Language",
"selectLanguage": "Select Language", "selectLanguage": "Select Language",
"english": "English", "english": "English",
"chinese": "中文 (Chinese)" "chinese": "中文 (Chinese)",
"japanese": "日本語 (Japanese)",
"korean": "한국어 (Korean)",
"spanish": "Español (Spanish)",
"german": "Deutsch (German)",
"french": "Français (French)",
"portuguese": "Português (Portuguese)",
"russian": "Русский (Russian)",
"hindi": "हिन्दी (Hindi)",
"indonesian": "Bahasa Indonesia (Indonesian)",
"italian": "Italiano (Italian)",
"arabic": "العربية (Arabic)"
} }

120
lib/l10n/app_es.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "es",
"appTitle": "FocusBuddy",
"startFocusing": "Comenzar a concentrarse",
"minutes": "{count, plural, =1{minuto} other{minutos}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "Toca 'Me distraje'\nen cualquier momento\n—sin culpa",
"history": "Historial",
"settings": "Configuración",
"iGotDistracted": "Me distraje",
"pause": "Pausar",
"resume": "Reanudar",
"stopSession": "Detener sesión",
"whatPulledYouAway": "¿Qué te distrajo?",
"skipThisTime": "Omitir esta vez",
"stopEarly": "¿Detener antes de tiempo?",
"stopEarlyMessage": "Está bien — ¡te concentraste durante {minutes} {minuteText}!",
"keepGoing": "Continuar",
"yesStop": "Sí, detener",
"distractionEncouragement": "Sucede. Volvamos suavemente.",
"focusComplete": "¡Sesión de concentración completa!",
"youFocusedFor": "Te concentraste durante",
"totalToday": "Total hoy: {minutes} min",
"distractionsCount": "Distracciones: {count} {times}",
"times": "{count, plural, =1{vez} other{veces}}",
"startAnother": "Comenzar otra",
"viewHistory": "Ver historial",
"yourFocusJourney": "Tu viaje de concentración",
"noFocusSessionsYet": "Aún no hay sesiones de concentración",
"startFirstSession": "¡Comienza tu primera sesión\npara ver tu progreso aquí!",
"today": "Hoy",
"sessions": "{count, plural, =1{{count} sesión} other{{count} sesiones}}",
"completed": "Completada",
"stoppedEarly": "Detenida antes de tiempo",
"distractions": "{count, plural, =1{distracción} other{distracciones}}",
"focusSettings": "Configuración de concentración",
"defaultFocusDuration": "Duración de concentración predeterminada",
"defaultLabel": "Predeterminado",
"about": "Acerca de",
"privacyPolicy": "Política de privacidad",
"aboutFocusBuddy": "Acerca de FocusBuddy",
"resetOnboarding": "Restablecer introducción",
"version": "Versión 1.0.0 (MVP)",
"privacyPolicyTitle": "Política de privacidad",
"privacyPolicyContent": "FocusBuddy funciona 100% sin conexión. No recopilamos tu nombre, correo electrónico, ubicación ni datos de uso. Todas las sesiones permanecen en tu dispositivo.\n\nNo hay sincronización en la nube, sistema de cuentas ni seguimiento de análisis.\n\nPara la política de privacidad completa, visita:\n[URL de tu sitio web]/privacy",
"close": "Cerrar",
"aboutTitle": "Acerca de FocusBuddy",
"aboutSubtitle": "Un temporizador suave de concentración para mentes neurodivergentes",
"aboutQuote": "\"La concentración no se trata de nunca distraerse, sino de volver suavemente cada vez que lo haces.\"",
"aboutFeatures": "✨ Sin castigos por distracciones\n💚 Aliento en lugar de críticas\n🔒 100% sin conexión y privado\n🌱 Hecho con cuidado",
"resetOnboardingTitle": "¿Restablecer introducción?",
"resetOnboardingMessage": "Esto mostrará las pantallas de introducción nuevamente cuando reinicies la aplicación.",
"cancel": "Cancelar",
"reset": "Restablecer",
"onboardingReset": "Introducción restablecida. Reinicia la aplicación para verla nuevamente.",
"onboarding1Title": "Concéntrate sin culpa",
"onboarding1Description": "Esta aplicación es diferente: no te castigará por perder la concentración.\n\nPerfecta para TDAH, ansiedad o cualquiera que encuentre los temporizadores tradicionales demasiado duros.",
"onboarding2Title": "Toca cuando te distraigas",
"onboarding2Description": "Te recordaremos suavemente que vuelvas.\n\nSin vergüenza. Sin estrés. Solo un recordatorio amable.",
"onboarding3Title": "Rastrea tu progreso",
"onboarding3Description": "Observa cómo mejoras, una sesión a la vez.\n\nCada distracción es solo datos, no un fracaso.",
"skip": "Omitir",
"next": "Siguiente",
"getStarted": "Comenzar",
"notificationFocusInProgress": "Sesión de concentración en progreso",
"notificationRemaining": "{time} restante",
"notificationFocusCompleteTitle": "🎉 ¡Sesión de concentración completa!",
"notificationFocusCompleteBodyNoDistractions": "¡Te concentraste durante {minutes} {minuteText} sin distracciones!",
"notificationFocusCompleteBody": "Te concentraste durante {minutes} {minuteText}. ¡Gran esfuerzo!",
"distractionPhoneNotification": "Teléfono / Notificación",
"distractionSocialMedia": "Redes sociales",
"distractionThoughts": "Pensamientos / Soñar despierto",
"distractionOther": "Otro",
"language": "Idioma",
"selectLanguage": "Seleccionar idioma",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_fr.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "fr",
"appTitle": "FocusBuddy",
"startFocusing": "Commencer à se concentrer",
"minutes": "{count, plural, =1{minute} other{minutes}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "Appuyez sur 'Je me suis distrait'\nà tout moment\n—sans culpabilité",
"history": "Historique",
"settings": "Paramètres",
"iGotDistracted": "Je me suis distrait",
"pause": "Pause",
"resume": "Reprendre",
"stopSession": "Arrêter la session",
"whatPulledYouAway": "Qu'est-ce qui vous a distrait?",
"skipThisTime": "Passer cette fois",
"stopEarly": "Arrêter plus tôt?",
"stopEarlyMessage": "C'est tout à fait normal — vous vous êtes concentré pendant {minutes} {minuteText}!",
"keepGoing": "Continuer",
"yesStop": "Oui, arrêter",
"distractionEncouragement": "Ça arrive. Revenons en douceur.",
"focusComplete": "Session de concentration terminée!",
"youFocusedFor": "Vous vous êtes concentré pendant",
"totalToday": "Total aujourd'hui: {minutes} min",
"distractionsCount": "Distractions: {count} {times}",
"times": "{count, plural, =1{fois} other{fois}}",
"startAnother": "Commencer une autre",
"viewHistory": "Voir l'historique",
"yourFocusJourney": "Votre parcours de concentration",
"noFocusSessionsYet": "Aucune session de concentration pour le moment",
"startFirstSession": "Commencez votre première session\npour voir vos progrès ici!",
"today": "Aujourd'hui",
"sessions": "{count, plural, =1{{count} session} other{{count} sessions}}",
"completed": "Terminée",
"stoppedEarly": "Arrêtée tôt",
"distractions": "{count, plural, =1{distraction} other{distractions}}",
"focusSettings": "Paramètres de concentration",
"defaultFocusDuration": "Durée de concentration par défaut",
"defaultLabel": "Par défaut",
"about": "À propos",
"privacyPolicy": "Politique de confidentialité",
"aboutFocusBuddy": "À propos de FocusBuddy",
"resetOnboarding": "Réinitialiser l'introduction",
"version": "Version 1.0.0 (MVP)",
"privacyPolicyTitle": "Politique de confidentialité",
"privacyPolicyContent": "FocusBuddy fonctionne à 100% hors ligne. Nous ne collectons ni votre nom, ni votre e-mail, ni votre localisation, ni vos données d'utilisation. Toutes les sessions restent sur votre appareil.\n\nIl n'y a pas de synchronisation cloud, pas de système de compte et pas de suivi analytique.\n\nPour la politique de confidentialité complète, visitez:\n[URL de votre site web]/privacy",
"close": "Fermer",
"aboutTitle": "À propos de FocusBuddy",
"aboutSubtitle": "Un minuteur de concentration doux pour les esprits neurodivergents",
"aboutQuote": "\"La concentration ne consiste pas à ne jamais être distrait — c'est revenir doucement à chaque fois.\"",
"aboutFeatures": "✨ Aucune punition pour les distractions\n💚 Encouragement plutôt que critique\n🔒 100% hors ligne et privé\n🌱 Fait avec soin",
"resetOnboardingTitle": "Réinitialiser l'introduction?",
"resetOnboardingMessage": "Cela affichera à nouveau les écrans d'introduction lorsque vous redémarrerez l'application.",
"cancel": "Annuler",
"reset": "Réinitialiser",
"onboardingReset": "Introduction réinitialisée. Redémarrez l'application pour la revoir.",
"onboarding1Title": "Concentrez-vous sans culpabilité",
"onboarding1Description": "Cette application est différente — elle ne vous punira pas pour avoir perdu votre concentration.\n\nParfaite pour le TDAH, l'anxiété ou quiconque trouve les minuteurs traditionnels trop sévères.",
"onboarding2Title": "Appuyez quand vous êtes distrait",
"onboarding2Description": "Nous vous rappellerons doucement de revenir.\n\nPas de honte. Pas de stress. Juste un rappel amical.",
"onboarding3Title": "Suivez vos progrès",
"onboarding3Description": "Voyez comment vous vous améliorez, une session à la fois.\n\nChaque distraction n'est qu'une donnée — pas un échec.",
"skip": "Passer",
"next": "Suivant",
"getStarted": "Commencer",
"notificationFocusInProgress": "Session de concentration en cours",
"notificationRemaining": "{time} restant",
"notificationFocusCompleteTitle": "🎉 Session de concentration terminée!",
"notificationFocusCompleteBodyNoDistractions": "Vous vous êtes concentré pendant {minutes} {minuteText} sans distractions!",
"notificationFocusCompleteBody": "Vous vous êtes concentré pendant {minutes} {minuteText}. Super effort!",
"distractionPhoneNotification": "Téléphone / Notification",
"distractionSocialMedia": "Réseaux sociaux",
"distractionThoughts": "Pensées / Rêverie",
"distractionOther": "Autre",
"language": "Langue",
"selectLanguage": "Sélectionner la langue",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_hi.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "hi",
"appTitle": "FocusBuddy",
"startFocusing": "फोकस शुरू करें",
"minutes": "{count, plural, =1{मिनट} other{मिनट}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "कभी भी 'मैं विचलित हो गया'\nटैप करें\n—बिना अपराध बोध के",
"history": "इतिहास",
"settings": "सेटिंग्स",
"iGotDistracted": "मैं विचलित हो गया",
"pause": "रोकें",
"resume": "जारी रखें",
"stopSession": "सत्र बंद करें",
"whatPulledYouAway": "आपको क्या विचलित किया?",
"skipThisTime": "इस बार छोड़ें",
"stopEarly": "जल्दी बंद करें?",
"stopEarlyMessage": "यह बिल्कुल ठीक है — आपने {minutes} {minuteText} तक फोकस किया!",
"keepGoing": "जारी रखें",
"yesStop": "हां, बंद करें",
"distractionEncouragement": "ऐसा होता है। चलिए धीरे से वापस आते हैं।",
"focusComplete": "फोकस सत्र पूर्ण!",
"youFocusedFor": "आपने फोकस किया",
"totalToday": "आज कुल: {minutes} मिनट",
"distractionsCount": "विचलन: {count} {times}",
"times": "{count, plural, =1{बार} other{बार}}",
"startAnother": "एक और शुरू करें",
"viewHistory": "इतिहास देखें",
"yourFocusJourney": "आपकी फोकस यात्रा",
"noFocusSessionsYet": "अभी तक कोई फोकस सत्र नहीं",
"startFirstSession": "अपनी प्रगति यहाँ देखने के लिए\nअपना पहला सत्र शुरू करें!",
"today": "आज",
"sessions": "{count, plural, =1{{count} सत्र} other{{count} सत्र}}",
"completed": "पूर्ण",
"stoppedEarly": "जल्दी बंद किया",
"distractions": "{count, plural, =1{विचलन} other{विचलन}}",
"focusSettings": "फोकस सेटिंग्स",
"defaultFocusDuration": "डिफ़ॉल्ट फोकस अवधि",
"defaultLabel": "डिफ़ॉल्ट",
"about": "के बारे में",
"privacyPolicy": "गोपनीयता नीति",
"aboutFocusBuddy": "FocusBuddy के बारे में",
"resetOnboarding": "ऑनबोर्डिंग रीसेट करें",
"version": "संस्करण 1.0.0 (MVP)",
"privacyPolicyTitle": "गोपनीयता नीति",
"privacyPolicyContent": "FocusBuddy 100% ऑफ़लाइन काम करता है। हम आपका नाम, ईमेल, स्थान या उपयोग डेटा एकत्र नहीं करते। सभी सत्र आपके डिवाइस पर रहते हैं।\n\nकोई क्लाउड सिंक, खाता प्रणाली या विश्लेषण ट्रैकिंग नहीं है।\n\nपूर्ण गोपनीयता नीति के लिए, यहाँ जाएं:\n[आपकी वेबसाइट URL]/privacy",
"close": "बंद करें",
"aboutTitle": "FocusBuddy के बारे में",
"aboutSubtitle": "न्यूरोडाइवर्जेंट दिमाग के लिए एक सौम्य फोकस टाइमर",
"aboutQuote": "\"फोकस कभी विचलित न होने के बारे में नहीं है — यह हर बार धीरे से वापस आने के बारे में है।\"",
"aboutFeatures": "✨ विचलन के लिए कोई सजा नहीं\n💚 आलोचना के बजाय प्रोत्साहन\n🔒 100% ऑफ़लाइन और निजी\n🌱 देखभाल के साथ बनाया गया",
"resetOnboardingTitle": "ऑनबोर्डिंग रीसेट करें?",
"resetOnboardingMessage": "यह ऐप को पुनरारंभ करने पर ऑनबोर्डिंग स्क्रीन फिर से दिखाएगा।",
"cancel": "रद्द करें",
"reset": "रीसेट करें",
"onboardingReset": "ऑनबोर्डिंग रीसेट हो गया। इसे फिर से देखने के लिए ऐप को पुनरारंभ करें।",
"onboarding1Title": "बिना अपराध बोध के फोकस करें",
"onboarding1Description": "यह ऐप अलग है — यह फोकस खोने के लिए आपको दंडित नहीं करेगा।\n\nADHD, चिंता या किसी के लिए भी परफेक्ट है जो पारंपरिक टाइमर को बहुत कठोर मानता है।",
"onboarding2Title": "विचलित होने पर टैप करें",
"onboarding2Description": "हम आपको धीरे से वापस आने की याद दिलाएंगे।\n\nकोई शर्म नहीं। कोई तनाव नहीं। बस एक दोस्ताना रिमाइंडर।",
"onboarding3Title": "अपनी प्रगति ट्रैक करें",
"onboarding3Description": "देखें कि आप हर सत्र के साथ कैसे सुधार कर रहे हैं।\n\nहर विचलन सिर्फ डेटा है — असफलता नहीं।",
"skip": "छोड़ें",
"next": "अगला",
"getStarted": "शुरू करें",
"notificationFocusInProgress": "फोकस सत्र चल रहा है",
"notificationRemaining": "{time} शेष",
"notificationFocusCompleteTitle": "🎉 फोकस सत्र पूर्ण!",
"notificationFocusCompleteBodyNoDistractions": "आपने {minutes} {minuteText} बिना विचलन के फोकस किया!",
"notificationFocusCompleteBody": "आपने {minutes} {minuteText} फोकस किया। बढ़िया प्रयास!",
"distractionPhoneNotification": "फोन / सूचना",
"distractionSocialMedia": "सोशल मीडिया",
"distractionThoughts": "विचार / दिवास्वप्न",
"distractionOther": "अन्य",
"language": "भाषा",
"selectLanguage": "भाषा चुनें",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_id.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "id",
"appTitle": "FocusBuddy",
"startFocusing": "Mulai Fokus",
"minutes": "{count, plural, =1{menit} other{menit}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "Ketuk 'Saya terganggu'\nkapan saja\n—tanpa rasa bersalah",
"history": "Riwayat",
"settings": "Pengaturan",
"iGotDistracted": "Saya terganggu",
"pause": "Jeda",
"resume": "Lanjutkan",
"stopSession": "Hentikan sesi",
"whatPulledYouAway": "Apa yang mengganggu Anda?",
"skipThisTime": "Lewati kali ini",
"stopEarly": "Hentikan lebih awal?",
"stopEarlyMessage": "Tidak apa-apa — Anda sudah fokus selama {minutes} {minuteText}!",
"keepGoing": "Lanjutkan",
"yesStop": "Ya, hentikan",
"distractionEncouragement": "Tidak apa-apa. Mari kembali dengan lembut.",
"focusComplete": "Sesi fokus selesai!",
"youFocusedFor": "Anda fokus selama",
"totalToday": "Total hari ini: {minutes} menit",
"distractionsCount": "Gangguan: {count} {times}",
"times": "{count, plural, =1{kali} other{kali}}",
"startAnother": "Mulai Lagi",
"viewHistory": "Lihat Riwayat",
"yourFocusJourney": "Perjalanan Fokus Anda",
"noFocusSessionsYet": "Belum ada sesi fokus",
"startFirstSession": "Mulai sesi pertama Anda\nuntuk melihat kemajuan di sini!",
"today": "Hari ini",
"sessions": "{count, plural, =1{{count} sesi} other{{count} sesi}}",
"completed": "Selesai",
"stoppedEarly": "Dihentikan lebih awal",
"distractions": "{count, plural, =1{gangguan} other{gangguan}}",
"focusSettings": "Pengaturan Fokus",
"defaultFocusDuration": "Durasi Fokus Default",
"defaultLabel": "Default",
"about": "Tentang",
"privacyPolicy": "Kebijakan Privasi",
"aboutFocusBuddy": "Tentang FocusBuddy",
"resetOnboarding": "Reset Onboarding",
"version": "Versi 1.0.0 (MVP)",
"privacyPolicyTitle": "Kebijakan Privasi",
"privacyPolicyContent": "FocusBuddy 100% offline. Kami tidak mengumpulkan nama, email, lokasi, atau data penggunaan Anda. Semua sesi tetap di perangkat Anda.\n\nTidak ada sinkronisasi cloud, sistem akun, atau pelacakan analitik.\n\nUntuk kebijakan privasi lengkap, kunjungi:\n[URL situs web Anda]/privacy",
"close": "Tutup",
"aboutTitle": "Tentang FocusBuddy",
"aboutSubtitle": "Timer fokus yang lembut untuk pikiran neurodivergent",
"aboutQuote": "\"Fokus bukan tentang tidak pernah terganggu — tetapi tentang kembali dengan lembut setiap kali Anda terganggu.\"",
"aboutFeatures": "✨ Tidak ada hukuman untuk gangguan\n💚 Dorongan daripada kritik\n🔒 100% offline dan pribadi\n🌱 Dibuat dengan perhatian",
"resetOnboardingTitle": "Reset Onboarding?",
"resetOnboardingMessage": "Ini akan menampilkan layar onboarding lagi saat Anda restart aplikasi.",
"cancel": "Batal",
"reset": "Reset",
"onboardingReset": "Onboarding direset. Restart aplikasi untuk melihatnya lagi.",
"onboarding1Title": "Fokus tanpa rasa bersalah",
"onboarding1Description": "Aplikasi ini berbeda — tidak akan menghukum Anda karena kehilangan fokus.\n\nSempurna untuk ADHD, kecemasan, atau siapa saja yang merasa timer tradisional terlalu keras.",
"onboarding2Title": "Ketuk saat Anda terganggu",
"onboarding2Description": "Kami akan mengingatkan Anda dengan lembut untuk kembali.\n\nTidak ada rasa malu. Tidak ada stres. Hanya pengingat yang ramah.",
"onboarding3Title": "Lacak kemajuan Anda",
"onboarding3Description": "Lihat bagaimana Anda berkembang, satu sesi pada satu waktu.\n\nSetiap gangguan hanyalah data — bukan kegagalan.",
"skip": "Lewati",
"next": "Berikutnya",
"getStarted": "Mulai",
"notificationFocusInProgress": "Sesi fokus sedang berlangsung",
"notificationRemaining": "{time} tersisa",
"notificationFocusCompleteTitle": "🎉 Sesi fokus selesai!",
"notificationFocusCompleteBodyNoDistractions": "Anda fokus selama {minutes} {minuteText} tanpa gangguan!",
"notificationFocusCompleteBody": "Anda fokus selama {minutes} {minuteText}. Usaha yang bagus!",
"distractionPhoneNotification": "Telepon / Notifikasi",
"distractionSocialMedia": "Media Sosial",
"distractionThoughts": "Pikiran / Melamun",
"distractionOther": "Lainnya",
"language": "Bahasa",
"selectLanguage": "Pilih Bahasa",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_it.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "it",
"appTitle": "FocusBuddy",
"startFocusing": "Inizia a concentrarti",
"minutes": "{count, plural, =1{minuto} other{minuti}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "Tocca 'Mi sono distratto'\nin qualsiasi momento\n—senza sensi di colpa",
"history": "Cronologia",
"settings": "Impostazioni",
"iGotDistracted": "Mi sono distratto",
"pause": "Pausa",
"resume": "Riprendi",
"stopSession": "Interrompi sessione",
"whatPulledYouAway": "Cosa ti ha distratto?",
"skipThisTime": "Salta questa volta",
"stopEarly": "Fermare prima?",
"stopEarlyMessage": "Va bene — ti sei concentrato per {minutes} {minuteText}!",
"keepGoing": "Continua",
"yesStop": "Sì, ferma",
"distractionEncouragement": "Succede. Torniamo gentilmente indietro.",
"focusComplete": "Sessione di concentrazione completata!",
"youFocusedFor": "Ti sei concentrato per",
"totalToday": "Totale oggi: {minutes} min",
"distractionsCount": "Distrazioni: {count} {times}",
"times": "{count, plural, =1{volta} other{volte}}",
"startAnother": "Inizia un'altra",
"viewHistory": "Visualizza cronologia",
"yourFocusJourney": "Il tuo viaggio di concentrazione",
"noFocusSessionsYet": "Nessuna sessione di concentrazione ancora",
"startFirstSession": "Inizia la tua prima sessione\nper vedere i tuoi progressi qui!",
"today": "Oggi",
"sessions": "{count, plural, =1{{count} sessione} other{{count} sessioni}}",
"completed": "Completata",
"stoppedEarly": "Interrotta prima",
"distractions": "{count, plural, =1{distrazione} other{distrazioni}}",
"focusSettings": "Impostazioni di concentrazione",
"defaultFocusDuration": "Durata predefinita della concentrazione",
"defaultLabel": "Predefinito",
"about": "Informazioni",
"privacyPolicy": "Informativa sulla privacy",
"aboutFocusBuddy": "Informazioni su FocusBuddy",
"resetOnboarding": "Ripristina introduzione",
"version": "Versione 1.0.0 (MVP)",
"privacyPolicyTitle": "Informativa sulla privacy",
"privacyPolicyContent": "FocusBuddy funziona al 100% offline. Non raccogliamo nome, email, posizione o dati di utilizzo. Tutte le sessioni rimangono sul tuo dispositivo.\n\nNessuna sincronizzazione cloud, sistema di account o tracciamento analitico.\n\nPer l'informativa completa sulla privacy, visita:\n[URL del tuo sito web]/privacy",
"close": "Chiudi",
"aboutTitle": "Informazioni su FocusBuddy",
"aboutSubtitle": "Un timer di concentrazione delicato per menti neurodivergenti",
"aboutQuote": "\"La concentrazione non riguarda il non distrarsi mai — riguarda il tornare gentilmente ogni volta che lo fai.\"",
"aboutFeatures": "✨ Nessuna punizione per le distrazioni\n💚 Incoraggiamento invece di critiche\n🔒 100% offline e privato\n🌱 Fatto con cura",
"resetOnboardingTitle": "Ripristinare introduzione?",
"resetOnboardingMessage": "Questo mostrerà di nuovo le schermate di introduzione quando riavvii l'app.",
"cancel": "Annulla",
"reset": "Ripristina",
"onboardingReset": "Introduzione ripristinata. Riavvia l'app per vederla di nuovo.",
"onboarding1Title": "Concentrati senza sensi di colpa",
"onboarding1Description": "Questa app è diversa — non ti punirà per aver perso la concentrazione.\n\nPerfetta per ADHD, ansia o chiunque trovi i timer tradizionali troppo severi.",
"onboarding2Title": "Tocca quando ti distrai",
"onboarding2Description": "Ti ricorderemo gentilmente di tornare.\n\nNessuna vergogna. Nessuno stress. Solo un promemoria amichevole.",
"onboarding3Title": "Monitora i tuoi progressi",
"onboarding3Description": "Guarda come stai migliorando, una sessione alla volta.\n\nOgni distrazione è solo un dato — non un fallimento.",
"skip": "Salta",
"next": "Avanti",
"getStarted": "Inizia",
"notificationFocusInProgress": "Sessione di concentrazione in corso",
"notificationRemaining": "{time} rimanenti",
"notificationFocusCompleteTitle": "🎉 Sessione di concentrazione completata!",
"notificationFocusCompleteBodyNoDistractions": "Ti sei concentrato per {minutes} {minuteText} senza distrazioni!",
"notificationFocusCompleteBody": "Ti sei concentrato per {minutes} {minuteText}. Ottimo sforzo!",
"distractionPhoneNotification": "Telefono / Notifica",
"distractionSocialMedia": "Social Media",
"distractionThoughts": "Pensieri / Sogni ad occhi aperti",
"distractionOther": "Altro",
"language": "Lingua",
"selectLanguage": "Seleziona lingua",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_ja.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "ja",
"appTitle": "フォーカスバディ",
"startFocusing": "集中を始める",
"minutes": "{count, plural, =1{分} other{分}}",
"minutesValue": "{count}{minutes}",
"tapDistractionAnytime": "気が散ったら\nいつでもタップ\n—罪悪感なし",
"history": "履歴",
"settings": "設定",
"iGotDistracted": "気が散りました",
"pause": "一時停止",
"resume": "再開",
"stopSession": "セッションを停止",
"whatPulledYouAway": "何があなたの気を散らしましたか?",
"skipThisTime": "今回はスキップ",
"stopEarly": "早めに終了しますか?",
"stopEarlyMessage": "大丈夫です—{minutes}{minuteText}も集中できました!",
"keepGoing": "続ける",
"yesStop": "はい、停止",
"distractionEncouragement": "大丈夫です。優しく戻りましょう。",
"focusComplete": "集中セッション完了!",
"youFocusedFor": "集中した時間",
"totalToday": "今日の合計:{minutes}分",
"distractionsCount": "気が散った回数:{count}{times}",
"times": "{count, plural, =1{回} other{回}}",
"startAnother": "もう一度始める",
"viewHistory": "履歴を見る",
"yourFocusJourney": "あなたの集中の旅",
"noFocusSessionsYet": "まだ集中セッションがありません",
"startFirstSession": "最初のセッションを始めて\n進捗を確認しましょう",
"today": "今日",
"sessions": "{count, plural, =1{{count} セッション} other{{count} セッション}}",
"completed": "完了",
"stoppedEarly": "早めに終了",
"distractions": "{count, plural, =1{回気が散った} other{回気が散った}}",
"focusSettings": "集中設定",
"defaultFocusDuration": "デフォルトの集中時間",
"defaultLabel": "デフォルト",
"about": "について",
"privacyPolicy": "プライバシーポリシー",
"aboutFocusBuddy": "フォーカスバディについて",
"resetOnboarding": "オンボーディングをリセット",
"version": "バージョン 1.0.0 (MVP)",
"privacyPolicyTitle": "プライバシーポリシー",
"privacyPolicyContent": "フォーカスバディは100%オフラインで動作します。氏名、メールアドレス、位置情報、使用データは一切収集しません。すべてのセッションデータはデバイスに保存されます。\n\nクラウド同期、アカウントシステム、分析トラッキングはありません。\n\n完全なプライバシーポリシーについては\n[あなたのウェブサイトURL]/privacy",
"close": "閉じる",
"aboutTitle": "フォーカスバディについて",
"aboutSubtitle": "神経多様性のための優しい集中タイマー",
"aboutQuote": "「集中とは、決して気が散らないことではありません—気が散るたびに優しく戻ってくることです。」",
"aboutFeatures": "✨ 気が散っても罰しません\n💚 批判ではなく励まし\n🔒 100%オフラインでプライベート\n🌱 心を込めて作られました",
"resetOnboardingTitle": "オンボーディングをリセットしますか?",
"resetOnboardingMessage": "アプリを再起動すると、オンボーディング画面が再び表示されます。",
"cancel": "キャンセル",
"reset": "リセット",
"onboardingReset": "オンボーディングがリセットされました。アプリを再起動すると再度表示されます。",
"onboarding1Title": "罪悪感なしの集中",
"onboarding1Description": "このアプリは違います—集中力が途切れても罰しません。\n\nADHD、不安症、または従来のタイマーが厳しすぎると感じる方に最適です。",
"onboarding2Title": "気が散ったらタップ",
"onboarding2Description": "優しく戻ってくるよう促します。\n\n恥ずかしさなし。ストレスなし。ただの優しいリマインダーです。",
"onboarding3Title": "進捗を追跡",
"onboarding3Description": "セッションごとに、どのように改善しているかを確認できます。\n\n気が散ることはデータです—失敗ではありません。",
"skip": "スキップ",
"next": "次へ",
"getStarted": "始める",
"notificationFocusInProgress": "集中セッション実行中",
"notificationRemaining": "残り{time}",
"notificationFocusCompleteTitle": "🎉 集中セッション完了!",
"notificationFocusCompleteBodyNoDistractions": "{minutes}{minuteText}、気が散らずに集中できました!",
"notificationFocusCompleteBody": "{minutes}{minuteText}集中しました。よく頑張りました!",
"distractionPhoneNotification": "スマホ/通知",
"distractionSocialMedia": "SNS",
"distractionThoughts": "考え事/空想",
"distractionOther": "その他",
"language": "言語",
"selectLanguage": "言語を選択",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_ko.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "ko",
"appTitle": "포커스버디",
"startFocusing": "집중 시작",
"minutes": "{count, plural, =1{분} other{분}}",
"minutesValue": "{count}{minutes}",
"tapDistractionAnytime": "산만해질 때\n언제든지 탭하세요\n—죄책감 없이",
"history": "기록",
"settings": "설정",
"iGotDistracted": "집중이 흐트러졌어요",
"pause": "일시정지",
"resume": "재개",
"stopSession": "세션 종료",
"whatPulledYouAway": "무엇이 당신의 집중을 방해했나요?",
"skipThisTime": "이번엔 건너뛰기",
"stopEarly": "일찍 종료하시겠어요?",
"stopEarlyMessage": "괜찮아요—{minutes}{minuteText}이나 집중했어요!",
"keepGoing": "계속하기",
"yesStop": "네, 종료",
"distractionEncouragement": "괜찮아요. 부드럽게 다시 돌아와요.",
"focusComplete": "집중 세션 완료!",
"youFocusedFor": "집중한 시간",
"totalToday": "오늘 총 시간: {minutes}분",
"distractionsCount": "산만해진 횟수: {count}{times}",
"times": "{count, plural, =1{번} other{번}}",
"startAnother": "다시 시작",
"viewHistory": "기록 보기",
"yourFocusJourney": "나의 집중 여정",
"noFocusSessionsYet": "아직 집중 세션이 없습니다",
"startFirstSession": "첫 번째 세션을 시작하고\n진행 상황을 확인하세요!",
"today": "오늘",
"sessions": "{count, plural, =1{{count} 세션} other{{count} 세션}}",
"completed": "완료",
"stoppedEarly": "일찍 종료",
"distractions": "{count, plural, =1{번 산만해짐} other{번 산만해짐}}",
"focusSettings": "집중 설정",
"defaultFocusDuration": "기본 집중 시간",
"defaultLabel": "기본",
"about": "정보",
"privacyPolicy": "개인정보 처리방침",
"aboutFocusBuddy": "포커스버디 소개",
"resetOnboarding": "온보딩 재설정",
"version": "버전 1.0.0 (MVP)",
"privacyPolicyTitle": "개인정보 처리방침",
"privacyPolicyContent": "포커스버디는 100% 오프라인으로 작동합니다. 이름, 이메일, 위치 또는 사용 데이터를 수집하지 않습니다. 모든 세션 데이터는 기기에 저장됩니다.\n\n클라우드 동기화, 계정 시스템, 분석 추적이 없습니다.\n\n전체 개인정보 처리방침은 다음을 참조하세요:\n[귀하의 웹사이트 URL]/privacy",
"close": "닫기",
"aboutTitle": "포커스버디 소개",
"aboutSubtitle": "신경다양성을 위한 부드러운 집중 타이머",
"aboutQuote": "\"집중이란 절대 산만해지지 않는 것이 아니라—산만해질 때마다 부드럽게 돌아오는 것입니다.\"",
"aboutFeatures": "✨ 산만함에 대한 처벌 없음\n💚 비판이 아닌 격려\n🔒 100% 오프라인 및 프라이빗\n🌱 정성껏 제작",
"resetOnboardingTitle": "온보딩을 재설정하시겠어요?",
"resetOnboardingMessage": "앱을 다시 시작하면 온보딩 화면이 다시 표시됩니다.",
"cancel": "취소",
"reset": "재설정",
"onboardingReset": "온보딩이 재설정되었습니다. 앱을 다시 시작하면 다시 표시됩니다.",
"onboarding1Title": "죄책감 없이 집중",
"onboarding1Description": "이 앱은 다릅니다—집중력을 잃어도 처벌하지 않습니다.\n\nADHD, 불안 또는 기존 타이머가 너무 가혹하다고 느끼는 분들에게 완벽합니다.",
"onboarding2Title": "산만해지면 탭하세요",
"onboarding2Description": "부드럽게 다시 돌아오도록 알려드립니다.\n\n수치심 없이. 스트레스 없이. 그저 친절한 알림뿐입니다.",
"onboarding3Title": "진행 상황 추적",
"onboarding3Description": "세션마다 어떻게 향상되고 있는지 확인하세요.\n\n모든 산만함은 데이터일 뿐—실패가 아닙니다.",
"skip": "건너뛰기",
"next": "다음",
"getStarted": "시작하기",
"notificationFocusInProgress": "집중 세션 진행 중",
"notificationRemaining": "남은 시간 {time}",
"notificationFocusCompleteTitle": "🎉 집중 세션 완료!",
"notificationFocusCompleteBodyNoDistractions": "{minutes}{minuteText} 동안 산만해지지 않고 집중했어요!",
"notificationFocusCompleteBody": "{minutes}{minuteText} 동안 집중했어요. 잘했어요!",
"distractionPhoneNotification": "휴대폰/알림",
"distractionSocialMedia": "소셜 미디어",
"distractionThoughts": "생각/공상",
"distractionOther": "기타",
"language": "언어",
"selectLanguage": "언어 선택",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

View File

@@ -5,7 +5,18 @@ import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl; import 'package:intl/intl.dart' as intl;
import 'app_localizations_ar.dart';
import 'app_localizations_de.dart';
import 'app_localizations_en.dart'; import 'app_localizations_en.dart';
import 'app_localizations_es.dart';
import 'app_localizations_fr.dart';
import 'app_localizations_hi.dart';
import 'app_localizations_id.dart';
import 'app_localizations_it.dart';
import 'app_localizations_ja.dart';
import 'app_localizations_ko.dart';
import 'app_localizations_pt.dart';
import 'app_localizations_ru.dart';
import 'app_localizations_zh.dart'; import 'app_localizations_zh.dart';
// ignore_for_file: type=lint // ignore_for_file: type=lint
@@ -94,7 +105,18 @@ abstract class AppLocalizations {
/// A list of this localizations delegate's supported locales. /// A list of this localizations delegate's supported locales.
static const List<Locale> supportedLocales = <Locale>[ static const List<Locale> supportedLocales = <Locale>[
Locale('ar'),
Locale('de'),
Locale('en'), Locale('en'),
Locale('es'),
Locale('fr'),
Locale('hi'),
Locale('id'),
Locale('it'),
Locale('ja'),
Locale('ko'),
Locale('pt'),
Locale('ru'),
Locale('zh'), Locale('zh'),
]; ];
@@ -275,7 +297,7 @@ abstract class AppLocalizations {
/// No description provided for @sessions. /// No description provided for @sessions.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'{count, plural, =1{session} other{sessions}}'** /// **'{count, plural, =1{{count} session} other{{count} sessions}}'**
String sessions(int count); String sessions(int count);
/// No description provided for @completed. /// No description provided for @completed.
@@ -550,6 +572,72 @@ abstract class AppLocalizations {
/// In en, this message translates to: /// In en, this message translates to:
/// **'中文 (Chinese)'** /// **'中文 (Chinese)'**
String get chinese; String get chinese;
/// No description provided for @japanese.
///
/// In en, this message translates to:
/// **'日本語 (Japanese)'**
String get japanese;
/// No description provided for @korean.
///
/// In en, this message translates to:
/// **'한국어 (Korean)'**
String get korean;
/// No description provided for @spanish.
///
/// In en, this message translates to:
/// **'Español (Spanish)'**
String get spanish;
/// No description provided for @german.
///
/// In en, this message translates to:
/// **'Deutsch (German)'**
String get german;
/// No description provided for @french.
///
/// In en, this message translates to:
/// **'Français (French)'**
String get french;
/// No description provided for @portuguese.
///
/// In en, this message translates to:
/// **'Português (Portuguese)'**
String get portuguese;
/// No description provided for @russian.
///
/// In en, this message translates to:
/// **'Русский (Russian)'**
String get russian;
/// No description provided for @hindi.
///
/// In en, this message translates to:
/// **'हिन्दी (Hindi)'**
String get hindi;
/// No description provided for @indonesian.
///
/// In en, this message translates to:
/// **'Bahasa Indonesia (Indonesian)'**
String get indonesian;
/// No description provided for @italian.
///
/// In en, this message translates to:
/// **'Italiano (Italian)'**
String get italian;
/// No description provided for @arabic.
///
/// In en, this message translates to:
/// **'العربية (Arabic)'**
String get arabic;
} }
class _AppLocalizationsDelegate class _AppLocalizationsDelegate
@@ -562,8 +650,21 @@ class _AppLocalizationsDelegate
} }
@override @override
bool isSupported(Locale locale) => bool isSupported(Locale locale) => <String>[
<String>['en', 'zh'].contains(locale.languageCode); 'ar',
'de',
'en',
'es',
'fr',
'hi',
'id',
'it',
'ja',
'ko',
'pt',
'ru',
'zh',
].contains(locale.languageCode);
@override @override
bool shouldReload(_AppLocalizationsDelegate old) => false; bool shouldReload(_AppLocalizationsDelegate old) => false;
@@ -572,8 +673,30 @@ class _AppLocalizationsDelegate
AppLocalizations lookupAppLocalizations(Locale locale) { AppLocalizations lookupAppLocalizations(Locale locale) {
// Lookup logic when only language code is specified. // Lookup logic when only language code is specified.
switch (locale.languageCode) { switch (locale.languageCode) {
case 'ar':
return AppLocalizationsAr();
case 'de':
return AppLocalizationsDe();
case 'en': case 'en':
return AppLocalizationsEn(); return AppLocalizationsEn();
case 'es':
return AppLocalizationsEs();
case 'fr':
return AppLocalizationsFr();
case 'hi':
return AppLocalizationsHi();
case 'id':
return AppLocalizationsId();
case 'it':
return AppLocalizationsIt();
case 'ja':
return AppLocalizationsJa();
case 'ko':
return AppLocalizationsKo();
case 'pt':
return AppLocalizationsPt();
case 'ru':
return AppLocalizationsRu();
case 'zh': case 'zh':
return AppLocalizationsZh(); return AppLocalizationsZh();
} }

View File

@@ -0,0 +1,326 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Arabic (`ar`).
class AppLocalizationsAr extends AppLocalizations {
AppLocalizationsAr([String locale = 'ar']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@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في أي وقت\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: '$count جلسات',
one: '$count جلسة',
);
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 => 'حول FocusBuddy';
@override
String get resetOnboarding => 'إعادة تعيين التعريف';
@override
String get version => 'الإصدار 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'سياسة الخصوصية';
@override
String get privacyPolicyContent =>
'يعمل FocusBuddy بنسبة 100٪ دون اتصال بالإنترنت. لا نجمع اسمك أو بريدك الإلكتروني أو موقعك أو بيانات الاستخدام. تبقى جميع الجلسات على جهازك.\n\nلا توجد مزامنة سحابية أو نظام حسابات أو تتبع تحليلي.\n\nللحصول على سياسة الخصوصية الكاملة، قم بزيارة:\n[عنوان URL لموقعك]/privacy';
@override
String get close => 'إغلاق';
@override
String get aboutTitle => 'حول FocusBuddy';
@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مثالي لاضطراب فرط الحركة ونقص الانتباه أو القلق أو أي شخص يجد المؤقتات التقليدية قاسية جداً.';
@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 => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,329 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for German (`de`).
class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Fokus starten';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Minuten',
one: 'Minute',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime =>
'Tippe jederzeit auf\n\'Ich wurde abgelenkt\'\n—ohne Schuldgefühle';
@override
String get history => 'Verlauf';
@override
String get settings => 'Einstellungen';
@override
String get iGotDistracted => 'Ich wurde abgelenkt';
@override
String get pause => 'Pausieren';
@override
String get resume => 'Fortsetzen';
@override
String get stopSession => 'Sitzung beenden';
@override
String get whatPulledYouAway => 'Was hat dich abgelenkt?';
@override
String get skipThisTime => 'Diesmal überspringen';
@override
String get stopEarly => 'Vorzeitig beenden?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return 'Das ist völlig in Ordnung — du hast dich $minutes $minuteText konzentriert!';
}
@override
String get keepGoing => 'Weitermachen';
@override
String get yesStop => 'Ja, beenden';
@override
String get distractionEncouragement =>
'Das passiert. Lass uns sanft zurückkommen.';
@override
String get focusComplete => 'Fokussitzung abgeschlossen!';
@override
String get youFocusedFor => 'Du hast dich konzentriert für';
@override
String totalToday(int minutes) {
return 'Heute insgesamt: $minutes Min';
}
@override
String distractionsCount(int count, Object times) {
return 'Ablenkungen: $count $times';
}
@override
String times(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Mal',
one: 'Mal',
);
return '$_temp0';
}
@override
String get startAnother => 'Noch eine starten';
@override
String get viewHistory => 'Verlauf anzeigen';
@override
String get yourFocusJourney => 'Deine Fokus-Reise';
@override
String get noFocusSessionsYet => 'Noch keine Fokussitzungen';
@override
String get startFirstSession =>
'Starte deine erste Sitzung,\num deinen Fortschritt hier zu sehen!';
@override
String get today => 'Heute';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Sitzungen',
one: '$count Sitzung',
);
return '$_temp0';
}
@override
String get completed => 'Abgeschlossen';
@override
String get stoppedEarly => 'Vorzeitig beendet';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Ablenkungen',
one: 'Ablenkung',
);
return '$_temp0';
}
@override
String get focusSettings => 'Fokus-Einstellungen';
@override
String get defaultFocusDuration => 'Standard-Fokusdauer';
@override
String get defaultLabel => 'Standard';
@override
String get about => 'Über';
@override
String get privacyPolicy => 'Datenschutzrichtlinie';
@override
String get aboutFocusBuddy => 'Über FocusBuddy';
@override
String get resetOnboarding => 'Einführung zurücksetzen';
@override
String get version => 'Version 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Datenschutzrichtlinie';
@override
String get privacyPolicyContent =>
'FocusBuddy funktioniert zu 100% offline. Wir sammeln weder deinen Namen, E-Mail, Standort noch Nutzungsdaten. Alle Sitzungen bleiben auf deinem Gerät.\n\nEs gibt keine Cloud-Synchronisation, kein Kontosystem und keine Analyse-Verfolgung.\n\nFür die vollständige Datenschutzrichtlinie besuche:\n[Deine Website-URL]/privacy';
@override
String get close => 'Schließen';
@override
String get aboutTitle => 'Über FocusBuddy';
@override
String get aboutSubtitle =>
'Ein sanfter Fokus-Timer für neurodivergente Köpfe';
@override
String get aboutQuote =>
'\"Fokus bedeutet nicht, niemals abgelenkt zu werden — sondern jedes Mal sanft zurückzukommen.\"';
@override
String get aboutFeatures =>
'✨ Keine Bestrafung für Ablenkungen\n💚 Ermutigung statt Kritik\n🔒 100% offline und privat\n🌱 Mit Sorgfalt gemacht';
@override
String get resetOnboardingTitle => 'Einführung zurücksetzen?';
@override
String get resetOnboardingMessage =>
'Dies zeigt die Einführungsbildschirme erneut an, wenn du die App neu startest.';
@override
String get cancel => 'Abbrechen';
@override
String get reset => 'Zurücksetzen';
@override
String get onboardingReset =>
'Einführung zurückgesetzt. Starte die App neu, um sie erneut zu sehen.';
@override
String get onboarding1Title => 'Fokus ohne Schuldgefühle';
@override
String get onboarding1Description =>
'Diese App ist anders — sie bestraft dich nicht für Ablenkungen.\n\nPerfekt für ADHS, Angst oder jeden, der traditionelle Timer zu hart findet.';
@override
String get onboarding2Title => 'Tippe, wenn du abgelenkt wirst';
@override
String get onboarding2Description =>
'Wir erinnern dich sanft daran, zurückzukommen.\n\nKeine Scham. Kein Stress. Nur eine freundliche Erinnerung.';
@override
String get onboarding3Title => 'Verfolge deinen Fortschritt';
@override
String get onboarding3Description =>
'Sieh, wie du dich von Sitzung zu Sitzung verbesserst.\n\nJede Ablenkung ist nur ein Datenpunkt — kein Versagen.';
@override
String get skip => 'Überspringen';
@override
String get next => 'Weiter';
@override
String get getStarted => 'Los geht\'s';
@override
String get notificationFocusInProgress => 'Fokussitzung läuft';
@override
String notificationRemaining(String time) {
return '$time verbleibend';
}
@override
String get notificationFocusCompleteTitle => '🎉 Fokussitzung abgeschlossen!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return 'Du hast dich $minutes $minuteText ohne Ablenkungen konzentriert!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return 'Du hast dich $minutes $minuteText konzentriert. Tolle Leistung!';
}
@override
String get distractionPhoneNotification => 'Handy / Benachrichtigung';
@override
String get distractionSocialMedia => 'Soziale Medien';
@override
String get distractionThoughts => 'Gedanken / Tagträumen';
@override
String get distractionOther => 'Anderes';
@override
String get language => 'Sprache';
@override
String get selectLanguage => 'Sprache auswählen';
@override
String get english => 'English';
@override
String get chinese => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -126,8 +126,8 @@ class AppLocalizationsEn extends AppLocalizations {
String _temp0 = intl.Intl.pluralLogic( String _temp0 = intl.Intl.pluralLogic(
count, count,
locale: localeName, locale: localeName,
other: 'sessions', other: '$count sessions',
one: 'session', one: '$count session',
); );
return '$_temp0'; return '$_temp0';
} }
@@ -291,4 +291,37 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get chinese => '中文 (Chinese)'; String get chinese => '中文 (Chinese)';
@override
String get japanese => '日本語 (Japanese)';
@override
String get korean => '한국어 (Korean)';
@override
String get spanish => 'Español (Spanish)';
@override
String get german => 'Deutsch (German)';
@override
String get french => 'Français (French)';
@override
String get portuguese => 'Português (Portuguese)';
@override
String get russian => 'Русский (Russian)';
@override
String get hindi => 'हिन्दी (Hindi)';
@override
String get indonesian => 'Bahasa Indonesia (Indonesian)';
@override
String get italian => 'Italiano (Italian)';
@override
String get arabic => 'العربية (Arabic)';
} }

View File

@@ -0,0 +1,330 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Spanish Castilian (`es`).
class AppLocalizationsEs extends AppLocalizations {
AppLocalizationsEs([String locale = 'es']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Comenzar a concentrarse';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'minutos',
one: 'minuto',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime =>
'Toca \'Me distraje\'\nen cualquier momento\n—sin culpa';
@override
String get history => 'Historial';
@override
String get settings => 'Configuración';
@override
String get iGotDistracted => 'Me distraje';
@override
String get pause => 'Pausar';
@override
String get resume => 'Reanudar';
@override
String get stopSession => 'Detener sesión';
@override
String get whatPulledYouAway => '¿Qué te distrajo?';
@override
String get skipThisTime => 'Omitir esta vez';
@override
String get stopEarly => '¿Detener antes de tiempo?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return 'Está bien — ¡te concentraste durante $minutes $minuteText!';
}
@override
String get keepGoing => 'Continuar';
@override
String get yesStop => 'Sí, detener';
@override
String get distractionEncouragement => 'Sucede. Volvamos suavemente.';
@override
String get focusComplete => '¡Sesión de concentración completa!';
@override
String get youFocusedFor => 'Te concentraste durante';
@override
String totalToday(int minutes) {
return 'Total hoy: $minutes min';
}
@override
String distractionsCount(int count, Object times) {
return 'Distracciones: $count $times';
}
@override
String times(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'veces',
one: 'vez',
);
return '$_temp0';
}
@override
String get startAnother => 'Comenzar otra';
@override
String get viewHistory => 'Ver historial';
@override
String get yourFocusJourney => 'Tu viaje de concentración';
@override
String get noFocusSessionsYet => 'Aún no hay sesiones de concentración';
@override
String get startFirstSession =>
'¡Comienza tu primera sesión\npara ver tu progreso aquí!';
@override
String get today => 'Hoy';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count sesiones',
one: '$count sesión',
);
return '$_temp0';
}
@override
String get completed => 'Completada';
@override
String get stoppedEarly => 'Detenida antes de tiempo';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'distracciones',
one: 'distracción',
);
return '$_temp0';
}
@override
String get focusSettings => 'Configuración de concentración';
@override
String get defaultFocusDuration => 'Duración de concentración predeterminada';
@override
String get defaultLabel => 'Predeterminado';
@override
String get about => 'Acerca de';
@override
String get privacyPolicy => 'Política de privacidad';
@override
String get aboutFocusBuddy => 'Acerca de FocusBuddy';
@override
String get resetOnboarding => 'Restablecer introducción';
@override
String get version => 'Versión 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Política de privacidad';
@override
String get privacyPolicyContent =>
'FocusBuddy funciona 100% sin conexión. No recopilamos tu nombre, correo electrónico, ubicación ni datos de uso. Todas las sesiones permanecen en tu dispositivo.\n\nNo hay sincronización en la nube, sistema de cuentas ni seguimiento de análisis.\n\nPara la política de privacidad completa, visita:\n[URL de tu sitio web]/privacy';
@override
String get close => 'Cerrar';
@override
String get aboutTitle => 'Acerca de FocusBuddy';
@override
String get aboutSubtitle =>
'Un temporizador suave de concentración para mentes neurodivergentes';
@override
String get aboutQuote =>
'\"La concentración no se trata de nunca distraerse, sino de volver suavemente cada vez que lo haces.\"';
@override
String get aboutFeatures =>
'✨ Sin castigos por distracciones\n💚 Aliento en lugar de críticas\n🔒 100% sin conexión y privado\n🌱 Hecho con cuidado';
@override
String get resetOnboardingTitle => '¿Restablecer introducción?';
@override
String get resetOnboardingMessage =>
'Esto mostrará las pantallas de introducción nuevamente cuando reinicies la aplicación.';
@override
String get cancel => 'Cancelar';
@override
String get reset => 'Restablecer';
@override
String get onboardingReset =>
'Introducción restablecida. Reinicia la aplicación para verla nuevamente.';
@override
String get onboarding1Title => 'Concéntrate sin culpa';
@override
String get onboarding1Description =>
'Esta aplicación es diferente: no te castigará por perder la concentración.\n\nPerfecta para TDAH, ansiedad o cualquiera que encuentre los temporizadores tradicionales demasiado duros.';
@override
String get onboarding2Title => 'Toca cuando te distraigas';
@override
String get onboarding2Description =>
'Te recordaremos suavemente que vuelvas.\n\nSin vergüenza. Sin estrés. Solo un recordatorio amable.';
@override
String get onboarding3Title => 'Rastrea tu progreso';
@override
String get onboarding3Description =>
'Observa cómo mejoras, una sesión a la vez.\n\nCada distracción es solo datos, no un fracaso.';
@override
String get skip => 'Omitir';
@override
String get next => 'Siguiente';
@override
String get getStarted => 'Comenzar';
@override
String get notificationFocusInProgress =>
'Sesión de concentración en progreso';
@override
String notificationRemaining(String time) {
return '$time restante';
}
@override
String get notificationFocusCompleteTitle =>
'🎉 ¡Sesión de concentración completa!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return '¡Te concentraste durante $minutes $minuteText sin distracciones!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return 'Te concentraste durante $minutes $minuteText. ¡Gran esfuerzo!';
}
@override
String get distractionPhoneNotification => 'Teléfono / Notificación';
@override
String get distractionSocialMedia => 'Redes sociales';
@override
String get distractionThoughts => 'Pensamientos / Soñar despierto';
@override
String get distractionOther => 'Otro';
@override
String get language => 'Idioma';
@override
String get selectLanguage => 'Seleccionar idioma';
@override
String get english => 'English';
@override
String get chinese => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,330 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for French (`fr`).
class AppLocalizationsFr extends AppLocalizations {
AppLocalizationsFr([String locale = 'fr']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Commencer à se concentrer';
@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 =>
'Appuyez sur \'Je me suis distrait\'\nà tout moment\n—sans culpabilité';
@override
String get history => 'Historique';
@override
String get settings => 'Paramètres';
@override
String get iGotDistracted => 'Je me suis distrait';
@override
String get pause => 'Pause';
@override
String get resume => 'Reprendre';
@override
String get stopSession => 'Arrêter la session';
@override
String get whatPulledYouAway => 'Qu\'est-ce qui vous a distrait?';
@override
String get skipThisTime => 'Passer cette fois';
@override
String get stopEarly => 'Arrêter plus tôt?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return 'C\'est tout à fait normal — vous vous êtes concentré pendant $minutes $minuteText!';
}
@override
String get keepGoing => 'Continuer';
@override
String get yesStop => 'Oui, arrêter';
@override
String get distractionEncouragement => 'Ça arrive. Revenons en douceur.';
@override
String get focusComplete => 'Session de concentration terminée!';
@override
String get youFocusedFor => 'Vous vous êtes concentré pendant';
@override
String totalToday(int minutes) {
return 'Total aujourd\'hui: $minutes min';
}
@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: 'fois',
one: 'fois',
);
return '$_temp0';
}
@override
String get startAnother => 'Commencer une autre';
@override
String get viewHistory => 'Voir l\'historique';
@override
String get yourFocusJourney => 'Votre parcours de concentration';
@override
String get noFocusSessionsYet =>
'Aucune session de concentration pour le moment';
@override
String get startFirstSession =>
'Commencez votre première session\npour voir vos progrès ici!';
@override
String get today => 'Aujourd\'hui';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count sessions',
one: '$count session',
);
return '$_temp0';
}
@override
String get completed => 'Terminée';
@override
String get stoppedEarly => 'Arrêtée tôt';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'distractions',
one: 'distraction',
);
return '$_temp0';
}
@override
String get focusSettings => 'Paramètres de concentration';
@override
String get defaultFocusDuration => 'Durée de concentration par défaut';
@override
String get defaultLabel => 'Par défaut';
@override
String get about => 'À propos';
@override
String get privacyPolicy => 'Politique de confidentialité';
@override
String get aboutFocusBuddy => 'À propos de FocusBuddy';
@override
String get resetOnboarding => 'Réinitialiser l\'introduction';
@override
String get version => 'Version 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Politique de confidentialité';
@override
String get privacyPolicyContent =>
'FocusBuddy fonctionne à 100% hors ligne. Nous ne collectons ni votre nom, ni votre e-mail, ni votre localisation, ni vos données d\'utilisation. Toutes les sessions restent sur votre appareil.\n\nIl n\'y a pas de synchronisation cloud, pas de système de compte et pas de suivi analytique.\n\nPour la politique de confidentialité complète, visitez:\n[URL de votre site web]/privacy';
@override
String get close => 'Fermer';
@override
String get aboutTitle => 'À propos de FocusBuddy';
@override
String get aboutSubtitle =>
'Un minuteur de concentration doux pour les esprits neurodivergents';
@override
String get aboutQuote =>
'\"La concentration ne consiste pas à ne jamais être distrait — c\'est revenir doucement à chaque fois.\"';
@override
String get aboutFeatures =>
'✨ Aucune punition pour les distractions\n💚 Encouragement plutôt que critique\n🔒 100% hors ligne et privé\n🌱 Fait avec soin';
@override
String get resetOnboardingTitle => 'Réinitialiser l\'introduction?';
@override
String get resetOnboardingMessage =>
'Cela affichera à nouveau les écrans d\'introduction lorsque vous redémarrerez l\'application.';
@override
String get cancel => 'Annuler';
@override
String get reset => 'Réinitialiser';
@override
String get onboardingReset =>
'Introduction réinitialisée. Redémarrez l\'application pour la revoir.';
@override
String get onboarding1Title => 'Concentrez-vous sans culpabilité';
@override
String get onboarding1Description =>
'Cette application est différente — elle ne vous punira pas pour avoir perdu votre concentration.\n\nParfaite pour le TDAH, l\'anxiété ou quiconque trouve les minuteurs traditionnels trop sévères.';
@override
String get onboarding2Title => 'Appuyez quand vous êtes distrait';
@override
String get onboarding2Description =>
'Nous vous rappellerons doucement de revenir.\n\nPas de honte. Pas de stress. Juste un rappel amical.';
@override
String get onboarding3Title => 'Suivez vos progrès';
@override
String get onboarding3Description =>
'Voyez comment vous vous améliorez, une session à la fois.\n\nChaque distraction n\'est qu\'une donnée — pas un échec.';
@override
String get skip => 'Passer';
@override
String get next => 'Suivant';
@override
String get getStarted => 'Commencer';
@override
String get notificationFocusInProgress => 'Session de concentration en cours';
@override
String notificationRemaining(String time) {
return '$time restant';
}
@override
String get notificationFocusCompleteTitle =>
'🎉 Session de concentration terminée!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return 'Vous vous êtes concentré pendant $minutes $minuteText sans distractions!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return 'Vous vous êtes concentré pendant $minutes $minuteText. Super effort!';
}
@override
String get distractionPhoneNotification => 'Téléphone / Notification';
@override
String get distractionSocialMedia => 'Réseaux sociaux';
@override
String get distractionThoughts => 'Pensées / Rêverie';
@override
String get distractionOther => 'Autre';
@override
String get language => 'Langue';
@override
String get selectLanguage => 'Sélectionner la langue';
@override
String get english => 'English';
@override
String get chinese => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,329 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Hindi (`hi`).
class AppLocalizationsHi extends AppLocalizations {
AppLocalizationsHi([String locale = 'hi']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@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टैप करें\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: '$count सत्र',
one: '$count सत्र',
);
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 => 'FocusBuddy के बारे में';
@override
String get resetOnboarding => 'ऑनबोर्डिंग रीसेट करें';
@override
String get version => 'संस्करण 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'गोपनीयता नीति';
@override
String get privacyPolicyContent =>
'FocusBuddy 100% ऑफ़लाइन काम करता है। हम आपका नाम, ईमेल, स्थान या उपयोग डेटा एकत्र नहीं करते। सभी सत्र आपके डिवाइस पर रहते हैं।\n\nकोई क्लाउड सिंक, खाता प्रणाली या विश्लेषण ट्रैकिंग नहीं है।\n\nपूर्ण गोपनीयता नीति के लिए, यहाँ जाएं:\n[आपकी वेबसाइट URL]/privacy';
@override
String get close => 'बंद करें';
@override
String get aboutTitle => 'FocusBuddy के बारे में';
@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\nADHD, चिंता या किसी के लिए भी परफेक्ट है जो पारंपरिक टाइमर को बहुत कठोर मानता है।';
@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 => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,329 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Indonesian (`id`).
class AppLocalizationsId extends AppLocalizations {
AppLocalizationsId([String locale = 'id']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Mulai Fokus';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'menit',
one: 'menit',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime =>
'Ketuk \'Saya terganggu\'\nkapan saja\n—tanpa rasa bersalah';
@override
String get history => 'Riwayat';
@override
String get settings => 'Pengaturan';
@override
String get iGotDistracted => 'Saya terganggu';
@override
String get pause => 'Jeda';
@override
String get resume => 'Lanjutkan';
@override
String get stopSession => 'Hentikan sesi';
@override
String get whatPulledYouAway => 'Apa yang mengganggu Anda?';
@override
String get skipThisTime => 'Lewati kali ini';
@override
String get stopEarly => 'Hentikan lebih awal?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return 'Tidak apa-apa — Anda sudah fokus selama $minutes $minuteText!';
}
@override
String get keepGoing => 'Lanjutkan';
@override
String get yesStop => 'Ya, hentikan';
@override
String get distractionEncouragement =>
'Tidak apa-apa. Mari kembali dengan lembut.';
@override
String get focusComplete => 'Sesi fokus selesai!';
@override
String get youFocusedFor => 'Anda fokus selama';
@override
String totalToday(int minutes) {
return 'Total hari ini: $minutes menit';
}
@override
String distractionsCount(int count, Object times) {
return 'Gangguan: $count $times';
}
@override
String times(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'kali',
one: 'kali',
);
return '$_temp0';
}
@override
String get startAnother => 'Mulai Lagi';
@override
String get viewHistory => 'Lihat Riwayat';
@override
String get yourFocusJourney => 'Perjalanan Fokus Anda';
@override
String get noFocusSessionsYet => 'Belum ada sesi fokus';
@override
String get startFirstSession =>
'Mulai sesi pertama Anda\nuntuk melihat kemajuan di sini!';
@override
String get today => 'Hari ini';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count sesi',
one: '$count sesi',
);
return '$_temp0';
}
@override
String get completed => 'Selesai';
@override
String get stoppedEarly => 'Dihentikan lebih awal';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'gangguan',
one: 'gangguan',
);
return '$_temp0';
}
@override
String get focusSettings => 'Pengaturan Fokus';
@override
String get defaultFocusDuration => 'Durasi Fokus Default';
@override
String get defaultLabel => 'Default';
@override
String get about => 'Tentang';
@override
String get privacyPolicy => 'Kebijakan Privasi';
@override
String get aboutFocusBuddy => 'Tentang FocusBuddy';
@override
String get resetOnboarding => 'Reset Onboarding';
@override
String get version => 'Versi 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Kebijakan Privasi';
@override
String get privacyPolicyContent =>
'FocusBuddy 100% offline. Kami tidak mengumpulkan nama, email, lokasi, atau data penggunaan Anda. Semua sesi tetap di perangkat Anda.\n\nTidak ada sinkronisasi cloud, sistem akun, atau pelacakan analitik.\n\nUntuk kebijakan privasi lengkap, kunjungi:\n[URL situs web Anda]/privacy';
@override
String get close => 'Tutup';
@override
String get aboutTitle => 'Tentang FocusBuddy';
@override
String get aboutSubtitle =>
'Timer fokus yang lembut untuk pikiran neurodivergent';
@override
String get aboutQuote =>
'\"Fokus bukan tentang tidak pernah terganggu — tetapi tentang kembali dengan lembut setiap kali Anda terganggu.\"';
@override
String get aboutFeatures =>
'✨ Tidak ada hukuman untuk gangguan\n💚 Dorongan daripada kritik\n🔒 100% offline dan pribadi\n🌱 Dibuat dengan perhatian';
@override
String get resetOnboardingTitle => 'Reset Onboarding?';
@override
String get resetOnboardingMessage =>
'Ini akan menampilkan layar onboarding lagi saat Anda restart aplikasi.';
@override
String get cancel => 'Batal';
@override
String get reset => 'Reset';
@override
String get onboardingReset =>
'Onboarding direset. Restart aplikasi untuk melihatnya lagi.';
@override
String get onboarding1Title => 'Fokus tanpa rasa bersalah';
@override
String get onboarding1Description =>
'Aplikasi ini berbeda — tidak akan menghukum Anda karena kehilangan fokus.\n\nSempurna untuk ADHD, kecemasan, atau siapa saja yang merasa timer tradisional terlalu keras.';
@override
String get onboarding2Title => 'Ketuk saat Anda terganggu';
@override
String get onboarding2Description =>
'Kami akan mengingatkan Anda dengan lembut untuk kembali.\n\nTidak ada rasa malu. Tidak ada stres. Hanya pengingat yang ramah.';
@override
String get onboarding3Title => 'Lacak kemajuan Anda';
@override
String get onboarding3Description =>
'Lihat bagaimana Anda berkembang, satu sesi pada satu waktu.\n\nSetiap gangguan hanyalah data — bukan kegagalan.';
@override
String get skip => 'Lewati';
@override
String get next => 'Berikutnya';
@override
String get getStarted => 'Mulai';
@override
String get notificationFocusInProgress => 'Sesi fokus sedang berlangsung';
@override
String notificationRemaining(String time) {
return '$time tersisa';
}
@override
String get notificationFocusCompleteTitle => '🎉 Sesi fokus selesai!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return 'Anda fokus selama $minutes $minuteText tanpa gangguan!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return 'Anda fokus selama $minutes $minuteText. Usaha yang bagus!';
}
@override
String get distractionPhoneNotification => 'Telepon / Notifikasi';
@override
String get distractionSocialMedia => 'Media Sosial';
@override
String get distractionThoughts => 'Pikiran / Melamun';
@override
String get distractionOther => 'Lainnya';
@override
String get language => 'Bahasa';
@override
String get selectLanguage => 'Pilih Bahasa';
@override
String get english => 'English';
@override
String get chinese => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,331 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Italian (`it`).
class AppLocalizationsIt extends AppLocalizations {
AppLocalizationsIt([String locale = 'it']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Inizia a concentrarti';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'minuti',
one: 'minuto',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime =>
'Tocca \'Mi sono distratto\'\nin qualsiasi momento\n—senza sensi di colpa';
@override
String get history => 'Cronologia';
@override
String get settings => 'Impostazioni';
@override
String get iGotDistracted => 'Mi sono distratto';
@override
String get pause => 'Pausa';
@override
String get resume => 'Riprendi';
@override
String get stopSession => 'Interrompi sessione';
@override
String get whatPulledYouAway => 'Cosa ti ha distratto?';
@override
String get skipThisTime => 'Salta questa volta';
@override
String get stopEarly => 'Fermare prima?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return 'Va bene — ti sei concentrato per $minutes $minuteText!';
}
@override
String get keepGoing => 'Continua';
@override
String get yesStop => 'Sì, ferma';
@override
String get distractionEncouragement =>
'Succede. Torniamo gentilmente indietro.';
@override
String get focusComplete => 'Sessione di concentrazione completata!';
@override
String get youFocusedFor => 'Ti sei concentrato per';
@override
String totalToday(int minutes) {
return 'Totale oggi: $minutes min';
}
@override
String distractionsCount(int count, Object times) {
return 'Distrazioni: $count $times';
}
@override
String times(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'volte',
one: 'volta',
);
return '$_temp0';
}
@override
String get startAnother => 'Inizia un\'altra';
@override
String get viewHistory => 'Visualizza cronologia';
@override
String get yourFocusJourney => 'Il tuo viaggio di concentrazione';
@override
String get noFocusSessionsYet => 'Nessuna sessione di concentrazione ancora';
@override
String get startFirstSession =>
'Inizia la tua prima sessione\nper vedere i tuoi progressi qui!';
@override
String get today => 'Oggi';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count sessioni',
one: '$count sessione',
);
return '$_temp0';
}
@override
String get completed => 'Completata';
@override
String get stoppedEarly => 'Interrotta prima';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'distrazioni',
one: 'distrazione',
);
return '$_temp0';
}
@override
String get focusSettings => 'Impostazioni di concentrazione';
@override
String get defaultFocusDuration => 'Durata predefinita della concentrazione';
@override
String get defaultLabel => 'Predefinito';
@override
String get about => 'Informazioni';
@override
String get privacyPolicy => 'Informativa sulla privacy';
@override
String get aboutFocusBuddy => 'Informazioni su FocusBuddy';
@override
String get resetOnboarding => 'Ripristina introduzione';
@override
String get version => 'Versione 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Informativa sulla privacy';
@override
String get privacyPolicyContent =>
'FocusBuddy funziona al 100% offline. Non raccogliamo nome, email, posizione o dati di utilizzo. Tutte le sessioni rimangono sul tuo dispositivo.\n\nNessuna sincronizzazione cloud, sistema di account o tracciamento analitico.\n\nPer l\'informativa completa sulla privacy, visita:\n[URL del tuo sito web]/privacy';
@override
String get close => 'Chiudi';
@override
String get aboutTitle => 'Informazioni su FocusBuddy';
@override
String get aboutSubtitle =>
'Un timer di concentrazione delicato per menti neurodivergenti';
@override
String get aboutQuote =>
'\"La concentrazione non riguarda il non distrarsi mai — riguarda il tornare gentilmente ogni volta che lo fai.\"';
@override
String get aboutFeatures =>
'✨ Nessuna punizione per le distrazioni\n💚 Incoraggiamento invece di critiche\n🔒 100% offline e privato\n🌱 Fatto con cura';
@override
String get resetOnboardingTitle => 'Ripristinare introduzione?';
@override
String get resetOnboardingMessage =>
'Questo mostrerà di nuovo le schermate di introduzione quando riavvii l\'app.';
@override
String get cancel => 'Annulla';
@override
String get reset => 'Ripristina';
@override
String get onboardingReset =>
'Introduzione ripristinata. Riavvia l\'app per vederla di nuovo.';
@override
String get onboarding1Title => 'Concentrati senza sensi di colpa';
@override
String get onboarding1Description =>
'Questa app è diversa — non ti punirà per aver perso la concentrazione.\n\nPerfetta per ADHD, ansia o chiunque trovi i timer tradizionali troppo severi.';
@override
String get onboarding2Title => 'Tocca quando ti distrai';
@override
String get onboarding2Description =>
'Ti ricorderemo gentilmente di tornare.\n\nNessuna vergogna. Nessuno stress. Solo un promemoria amichevole.';
@override
String get onboarding3Title => 'Monitora i tuoi progressi';
@override
String get onboarding3Description =>
'Guarda come stai migliorando, una sessione alla volta.\n\nOgni distrazione è solo un dato — non un fallimento.';
@override
String get skip => 'Salta';
@override
String get next => 'Avanti';
@override
String get getStarted => 'Inizia';
@override
String get notificationFocusInProgress =>
'Sessione di concentrazione in corso';
@override
String notificationRemaining(String time) {
return '$time rimanenti';
}
@override
String get notificationFocusCompleteTitle =>
'🎉 Sessione di concentrazione completata!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return 'Ti sei concentrato per $minutes $minuteText senza distrazioni!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return 'Ti sei concentrato per $minutes $minuteText. Ottimo sforzo!';
}
@override
String get distractionPhoneNotification => 'Telefono / Notifica';
@override
String get distractionSocialMedia => 'Social Media';
@override
String get distractionThoughts => 'Pensieri / Sogni ad occhi aperti';
@override
String get distractionOther => 'Altro';
@override
String get language => 'Lingua';
@override
String get selectLanguage => 'Seleziona lingua';
@override
String get english => 'English';
@override
String get chinese => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,322 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Japanese (`ja`).
class AppLocalizationsJa extends AppLocalizations {
AppLocalizationsJa([String locale = 'ja']) : 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いつでもタップ\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: '$count セッション',
one: '$count セッション',
);
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\nADHD、不安症、または従来のタイマーが厳しすぎると感じる方に最適です。';
@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 => 'SNS';
@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 => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,323 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Korean (`ko`).
class AppLocalizationsKo extends AppLocalizations {
AppLocalizationsKo([String locale = 'ko']) : 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언제든지 탭하세요\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: '$count 세션',
one: '$count 세션',
);
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\nADHD, 불안 또는 기존 타이머가 너무 가혹하다고 느끼는 분들에게 완벽합니다.';
@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 => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,328 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Portuguese (`pt`).
class AppLocalizationsPt extends AppLocalizations {
AppLocalizationsPt([String locale = 'pt']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Começar a focar';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'minutos',
one: 'minuto',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime =>
'Toque em \'Me distraí\'\na qualquer momento\n—sem culpa';
@override
String get history => 'Histórico';
@override
String get settings => 'Configurações';
@override
String get iGotDistracted => 'Me distraí';
@override
String get pause => 'Pausar';
@override
String get resume => 'Continuar';
@override
String get stopSession => 'Parar sessão';
@override
String get whatPulledYouAway => 'O que te distraiu?';
@override
String get skipThisTime => 'Pular desta vez';
@override
String get stopEarly => 'Parar mais cedo?';
@override
String stopEarlyMessage(int minutes, Object minuteText) {
return 'Tudo bem — você focou por $minutes $minuteText!';
}
@override
String get keepGoing => 'Continuar';
@override
String get yesStop => 'Sim, parar';
@override
String get distractionEncouragement => 'Acontece. Vamos voltar gentilmente.';
@override
String get focusComplete => 'Sessão de foco completa!';
@override
String get youFocusedFor => 'Você focou por';
@override
String totalToday(int minutes) {
return 'Total hoje: $minutes min';
}
@override
String distractionsCount(int count, Object times) {
return 'Distrações: $count $times';
}
@override
String times(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'vezes',
one: 'vez',
);
return '$_temp0';
}
@override
String get startAnother => 'Começar outra';
@override
String get viewHistory => 'Ver histórico';
@override
String get yourFocusJourney => 'Sua jornada de foco';
@override
String get noFocusSessionsYet => 'Ainda não há sessões de foco';
@override
String get startFirstSession =>
'Comece sua primeira sessão\npara ver seu progresso aqui!';
@override
String get today => 'Hoje';
@override
String sessions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count sessões',
one: '$count sessão',
);
return '$_temp0';
}
@override
String get completed => 'Concluída';
@override
String get stoppedEarly => 'Parada cedo';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'distrações',
one: 'distração',
);
return '$_temp0';
}
@override
String get focusSettings => 'Configurações de foco';
@override
String get defaultFocusDuration => 'Duração padrão do foco';
@override
String get defaultLabel => 'Padrão';
@override
String get about => 'Sobre';
@override
String get privacyPolicy => 'Política de Privacidade';
@override
String get aboutFocusBuddy => 'Sobre FocusBuddy';
@override
String get resetOnboarding => 'Redefinir introdução';
@override
String get version => 'Versão 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Política de Privacidade';
@override
String get privacyPolicyContent =>
'FocusBuddy funciona 100% offline. Não coletamos seu nome, e-mail, localização ou dados de uso. Todas as sessões ficam no seu dispositivo.\n\nNão há sincronização na nuvem, sistema de conta ou rastreamento de análise.\n\nPara a política de privacidade completa, visite:\n[URL do seu site]/privacy';
@override
String get close => 'Fechar';
@override
String get aboutTitle => 'Sobre FocusBuddy';
@override
String get aboutSubtitle =>
'Um temporizador de foco gentil para mentes neurodivergentes';
@override
String get aboutQuote =>
'\"Foco não é sobre nunca se distrair — é sobre voltar gentilmente toda vez que você se distrai.\"';
@override
String get aboutFeatures =>
'✨ Sem punição por distrações\n💚 Encorajamento em vez de crítica\n🔒 100% offline e privado\n🌱 Feito com carinho';
@override
String get resetOnboardingTitle => 'Redefinir introdução?';
@override
String get resetOnboardingMessage =>
'Isso mostrará as telas de introdução novamente quando você reiniciar o aplicativo.';
@override
String get cancel => 'Cancelar';
@override
String get reset => 'Redefinir';
@override
String get onboardingReset =>
'Introdução redefinida. Reinicie o aplicativo para vê-la novamente.';
@override
String get onboarding1Title => 'Foque sem culpa';
@override
String get onboarding1Description =>
'Este aplicativo é diferente — ele não vai punir você por perder o foco.\n\nPerfeito para TDAH, ansiedade ou qualquer pessoa que ache os temporizadores tradicionais muito severos.';
@override
String get onboarding2Title => 'Toque quando se distrair';
@override
String get onboarding2Description =>
'Nós vamos gentilmente lembrá-lo de voltar.\n\nSem vergonha. Sem estresse. Apenas um lembrete amigável.';
@override
String get onboarding3Title => 'Acompanhe seu progresso';
@override
String get onboarding3Description =>
'Veja como você está melhorando, uma sessão por vez.\n\nCada distração é apenas um dado — não um fracasso.';
@override
String get skip => 'Pular';
@override
String get next => 'Próximo';
@override
String get getStarted => 'Começar';
@override
String get notificationFocusInProgress => 'Sessão de foco em andamento';
@override
String notificationRemaining(String time) {
return '$time restante';
}
@override
String get notificationFocusCompleteTitle => '🎉 Sessão de foco completa!';
@override
String notificationFocusCompleteBodyNoDistractions(
int minutes,
Object minuteText,
) {
return 'Você focou por $minutes $minuteText sem distrações!';
}
@override
String notificationFocusCompleteBody(int minutes, Object minuteText) {
return 'Você focou por $minutes $minuteText. Ótimo esforço!';
}
@override
String get distractionPhoneNotification => 'Telefone / Notificação';
@override
String get distractionSocialMedia => 'Redes sociais';
@override
String get distractionThoughts => 'Pensamentos / Devaneio';
@override
String get distractionOther => 'Outro';
@override
String get language => 'Idioma';
@override
String get selectLanguage => 'Selecionar idioma';
@override
String get english => 'English';
@override
String get chinese => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -0,0 +1,334 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Russian (`ru`).
class AppLocalizationsRu extends AppLocalizations {
AppLocalizationsRu([String locale = 'ru']) : super(locale);
@override
String get appTitle => 'FocusBuddy';
@override
String get startFocusing => 'Начать концентрацию';
@override
String minutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'минут',
few: 'минуты',
one: 'минута',
);
return '$_temp0';
}
@override
String minutesValue(int count, Object minutes) {
return '$count $minutes';
}
@override
String get tapDistractionAnytime =>
'Нажмите \'Я отвлёкся\'\nв любое время\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: 'раз',
few: 'раза',
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: '$count сессий',
few: '$count сессии',
one: '$count сессия',
);
return '$_temp0';
}
@override
String get completed => 'Завершена';
@override
String get stoppedEarly => 'Остановлена раньше';
@override
String distractions(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'отвлечений',
few: 'отвлечения',
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 => 'О FocusBuddy';
@override
String get resetOnboarding => 'Сбросить введение';
@override
String get version => 'Версия 1.0.0 (MVP)';
@override
String get privacyPolicyTitle => 'Политика конфиденциальности';
@override
String get privacyPolicyContent =>
'FocusBuddy работает на 100% офлайн. Мы не собираем ваше имя, email, местоположение или данные об использовании. Все сессии остаются на вашем устройстве.\n\nНет облачной синхронизации, системы аккаунтов и отслеживания аналитики.\n\nПолную политику конфиденциальности см.:\n[URL вашего сайта]/privacy';
@override
String get close => 'Закрыть';
@override
String get aboutTitle => 'О FocusBuddy';
@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Идеально для СДВГ, тревожности или для тех, кто находит традиционные таймеры слишком строгими.';
@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 => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
}

View File

@@ -124,8 +124,8 @@ class AppLocalizationsZh extends AppLocalizations {
String _temp0 = intl.Intl.pluralLogic( String _temp0 = intl.Intl.pluralLogic(
count, count,
locale: localeName, locale: localeName,
other: '次会话', other: '$count 次会话',
one: '次会话', one: '$count 次会话',
); );
return '$_temp0'; return '$_temp0';
} }
@@ -283,4 +283,37 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get chinese => '中文'; String get chinese => '中文';
@override
String get japanese => '日本語';
@override
String get korean => '한국어';
@override
String get spanish => 'Español';
@override
String get german => 'Deutsch';
@override
String get french => 'Français';
@override
String get portuguese => 'Português';
@override
String get russian => 'Русский';
@override
String get hindi => 'हिन्दी';
@override
String get indonesian => 'Bahasa Indonesia';
@override
String get italian => 'Italiano';
@override
String get arabic => 'العربية';
} }

120
lib/l10n/app_pt.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "pt",
"appTitle": "FocusBuddy",
"startFocusing": "Começar a focar",
"minutes": "{count, plural, =1{minuto} other{minutos}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "Toque em 'Me distraí'\na qualquer momento\n—sem culpa",
"history": "Histórico",
"settings": "Configurações",
"iGotDistracted": "Me distraí",
"pause": "Pausar",
"resume": "Continuar",
"stopSession": "Parar sessão",
"whatPulledYouAway": "O que te distraiu?",
"skipThisTime": "Pular desta vez",
"stopEarly": "Parar mais cedo?",
"stopEarlyMessage": "Tudo bem — você focou por {minutes} {minuteText}!",
"keepGoing": "Continuar",
"yesStop": "Sim, parar",
"distractionEncouragement": "Acontece. Vamos voltar gentilmente.",
"focusComplete": "Sessão de foco completa!",
"youFocusedFor": "Você focou por",
"totalToday": "Total hoje: {minutes} min",
"distractionsCount": "Distrações: {count} {times}",
"times": "{count, plural, =1{vez} other{vezes}}",
"startAnother": "Começar outra",
"viewHistory": "Ver histórico",
"yourFocusJourney": "Sua jornada de foco",
"noFocusSessionsYet": "Ainda não há sessões de foco",
"startFirstSession": "Comece sua primeira sessão\npara ver seu progresso aqui!",
"today": "Hoje",
"sessions": "{count, plural, =1{{count} sessão} other{{count} sessões}}",
"completed": "Concluída",
"stoppedEarly": "Parada cedo",
"distractions": "{count, plural, =1{distração} other{distrações}}",
"focusSettings": "Configurações de foco",
"defaultFocusDuration": "Duração padrão do foco",
"defaultLabel": "Padrão",
"about": "Sobre",
"privacyPolicy": "Política de Privacidade",
"aboutFocusBuddy": "Sobre FocusBuddy",
"resetOnboarding": "Redefinir introdução",
"version": "Versão 1.0.0 (MVP)",
"privacyPolicyTitle": "Política de Privacidade",
"privacyPolicyContent": "FocusBuddy funciona 100% offline. Não coletamos seu nome, e-mail, localização ou dados de uso. Todas as sessões ficam no seu dispositivo.\n\nNão há sincronização na nuvem, sistema de conta ou rastreamento de análise.\n\nPara a política de privacidade completa, visite:\n[URL do seu site]/privacy",
"close": "Fechar",
"aboutTitle": "Sobre FocusBuddy",
"aboutSubtitle": "Um temporizador de foco gentil para mentes neurodivergentes",
"aboutQuote": "\"Foco não é sobre nunca se distrair — é sobre voltar gentilmente toda vez que você se distrai.\"",
"aboutFeatures": "✨ Sem punição por distrações\n💚 Encorajamento em vez de crítica\n🔒 100% offline e privado\n🌱 Feito com carinho",
"resetOnboardingTitle": "Redefinir introdução?",
"resetOnboardingMessage": "Isso mostrará as telas de introdução novamente quando você reiniciar o aplicativo.",
"cancel": "Cancelar",
"reset": "Redefinir",
"onboardingReset": "Introdução redefinida. Reinicie o aplicativo para vê-la novamente.",
"onboarding1Title": "Foque sem culpa",
"onboarding1Description": "Este aplicativo é diferente — ele não vai punir você por perder o foco.\n\nPerfeito para TDAH, ansiedade ou qualquer pessoa que ache os temporizadores tradicionais muito severos.",
"onboarding2Title": "Toque quando se distrair",
"onboarding2Description": "Nós vamos gentilmente lembrá-lo de voltar.\n\nSem vergonha. Sem estresse. Apenas um lembrete amigável.",
"onboarding3Title": "Acompanhe seu progresso",
"onboarding3Description": "Veja como você está melhorando, uma sessão por vez.\n\nCada distração é apenas um dado — não um fracasso.",
"skip": "Pular",
"next": "Próximo",
"getStarted": "Começar",
"notificationFocusInProgress": "Sessão de foco em andamento",
"notificationRemaining": "{time} restante",
"notificationFocusCompleteTitle": "🎉 Sessão de foco completa!",
"notificationFocusCompleteBodyNoDistractions": "Você focou por {minutes} {minuteText} sem distrações!",
"notificationFocusCompleteBody": "Você focou por {minutes} {minuteText}. Ótimo esforço!",
"distractionPhoneNotification": "Telefone / Notificação",
"distractionSocialMedia": "Redes sociais",
"distractionThoughts": "Pensamentos / Devaneio",
"distractionOther": "Outro",
"language": "Idioma",
"selectLanguage": "Selecionar idioma",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

120
lib/l10n/app_ru.arb Normal file
View File

@@ -0,0 +1,120 @@
{
"@@locale": "ru",
"appTitle": "FocusBuddy",
"startFocusing": "Начать концентрацию",
"minutes": "{count, plural, =1{минута} few{минуты} other{минут}}",
"minutesValue": "{count} {minutes}",
"tapDistractionAnytime": "Нажмите 'Я отвлёкся'\nв любое время\n—без чувства вины",
"history": "История",
"settings": "Настройки",
"iGotDistracted": "Я отвлёкся",
"pause": "Пауза",
"resume": "Продолжить",
"stopSession": "Остановить сессию",
"whatPulledYouAway": "Что вас отвлекло?",
"skipThisTime": "Пропустить сейчас",
"stopEarly": "Остановить раньше?",
"stopEarlyMessage": "Всё в порядке — вы концентрировались {minutes} {minuteText}!",
"keepGoing": "Продолжить",
"yesStop": "Да, остановить",
"distractionEncouragement": "Это случается. Давайте мягко вернёмся.",
"focusComplete": "Сессия концентрации завершена!",
"youFocusedFor": "Вы концентрировались",
"totalToday": "Всего сегодня: {minutes} мин",
"distractionsCount": "Отвлечения: {count} {times}",
"times": "{count, plural, =1{раз} few{раза} other{раз}}",
"startAnother": "Начать ещё",
"viewHistory": "Показать историю",
"yourFocusJourney": "Ваш путь концентрации",
"noFocusSessionsYet": "Пока нет сессий концентрации",
"startFirstSession": "Начните первую сессию,\nчтобы увидеть свой прогресс!",
"today": "Сегодня",
"sessions": "{count, plural, =1{{count} сессия} few{{count} сессии} other{{count} сессий}}",
"completed": "Завершена",
"stoppedEarly": "Остановлена раньше",
"distractions": "{count, plural, =1{отвлечение} few{отвлечения} other{отвлечений}}",
"focusSettings": "Настройки концентрации",
"defaultFocusDuration": "Стандартная длительность",
"defaultLabel": "По умолчанию",
"about": "О программе",
"privacyPolicy": "Политика конфиденциальности",
"aboutFocusBuddy": "О FocusBuddy",
"resetOnboarding": "Сбросить введение",
"version": "Версия 1.0.0 (MVP)",
"privacyPolicyTitle": "Политика конфиденциальности",
"privacyPolicyContent": "FocusBuddy работает на 100% офлайн. Мы не собираем ваше имя, email, местоположение или данные об использовании. Все сессии остаются на вашем устройстве.\n\nНет облачной синхронизации, системы аккаунтов и отслеживания аналитики.\n\nПолную политику конфиденциальности см.:\n[URL вашего сайта]/privacy",
"close": "Закрыть",
"aboutTitle": "О FocusBuddy",
"aboutSubtitle": "Мягкий таймер концентрации для нейроотличных людей",
"aboutQuote": "\"Концентрация — это не о том, чтобы никогда не отвлекаться, а о том, чтобы мягко возвращаться каждый раз.\"",
"aboutFeatures": "✨ Без наказания за отвлечения\n💚 Поддержка вместо критики\n🔒 100% офлайн и приватно\n🌱 Сделано с заботой",
"resetOnboardingTitle": "Сбросить введение?",
"resetOnboardingMessage": "Это снова покажет экраны введения при перезапуске приложения.",
"cancel": "Отмена",
"reset": "Сбросить",
"onboardingReset": "Введение сброшено. Перезапустите приложение, чтобы увидеть его снова.",
"onboarding1Title": "Концентрация без вины",
"onboarding1Description": "Это приложение другое — оно не наказывает за потерю концентрации.\n\nИдеально для СДВГ, тревожности или для тех, кто находит традиционные таймеры слишком строгими.",
"onboarding2Title": "Нажмите, когда отвлеклись",
"onboarding2Description": "Мы мягко напомним вам вернуться.\n\nБез стыда. Без стресса. Просто дружеское напоминание.",
"onboarding3Title": "Отслеживайте прогресс",
"onboarding3Description": "Смотрите, как вы улучшаетесь от сессии к сессии.\n\nКаждое отвлечение — просто данные, а не провал.",
"skip": "Пропустить",
"next": "Далее",
"getStarted": "Начать",
"notificationFocusInProgress": "Идёт сессия концентрации",
"notificationRemaining": "осталось {time}",
"notificationFocusCompleteTitle": "🎉 Сессия концентрации завершена!",
"notificationFocusCompleteBodyNoDistractions": "Вы концентрировались {minutes} {minuteText} без отвлечений!",
"notificationFocusCompleteBody": "Вы концентрировались {minutes} {minuteText}. Отличная работа!",
"distractionPhoneNotification": "Телефон / Уведомление",
"distractionSocialMedia": "Соцсети",
"distractionThoughts": "Мысли / Мечты",
"distractionOther": "Другое",
"language": "Язык",
"selectLanguage": "Выбрать язык",
"english": "English",
"chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
}

View File

@@ -46,7 +46,7 @@
"startFirstSession": "开始你的第一次专注\n在这里查看进度", "startFirstSession": "开始你的第一次专注\n在这里查看进度",
"today": "今天", "today": "今天",
"sessions": "{count, plural, =1{次会话} other{次会话}}", "sessions": "{count, plural, =1{{count} 次会话} other{{count} 次会话}}",
"completed": "已完成", "completed": "已完成",
"stoppedEarly": "提前停止", "stoppedEarly": "提前停止",
@@ -105,5 +105,16 @@
"language": "语言", "language": "语言",
"selectLanguage": "选择语言", "selectLanguage": "选择语言",
"english": "English", "english": "English",
"chinese": "中文" "chinese": "中文",
"japanese": "日本語",
"korean": "한국어",
"spanish": "Español",
"german": "Deutsch",
"french": "Français",
"portuguese": "Português",
"russian": "Русский",
"hindi": "हिन्दी",
"indonesian": "Bahasa Indonesia",
"italian": "Italiano",
"arabic": "العربية"
} }

View File

@@ -97,6 +97,17 @@ class _MyAppState extends State<MyApp> {
supportedLocales: const [ supportedLocales: const [
Locale('en'), Locale('en'),
Locale('zh'), Locale('zh'),
Locale('ja'),
Locale('ko'),
Locale('es'),
Locale('de'),
Locale('fr'),
Locale('pt'),
Locale('ru'),
Locale('hi'),
Locale('id'),
Locale('it'),
Locale('ar'),
], ],
home: _isLoading home: _isLoading
? const Scaffold( ? const Scaffold(

View File

@@ -23,7 +23,7 @@ class _HistoryScreenState extends State<HistoryScreen> {
final sessions = _storageService.getAllSessions(); final sessions = _storageService.getAllSessions();
final todayTotal = _storageService.getTodayTotalMinutes(); final todayTotal = _storageService.getTodayTotalMinutes();
final todayDistractions = _storageService.getTodayDistractionCount(); final todayDistractions = _storageService.getTodayDistractionCount();
final todayCompleted = _storageService.getTodayCompletedCount(); final todaySessions = _storageService.getTodaySessionsCount();
// Group sessions by date // Group sessions by date
final sessionsByDate = <DateTime, List<FocusSession>>{}; final sessionsByDate = <DateTime, List<FocusSession>>{};
@@ -59,7 +59,7 @@ class _HistoryScreenState extends State<HistoryScreen> {
l10n, l10n,
todayTotal, todayTotal,
todayDistractions, todayDistractions,
todayCompleted, todaySessions,
), ),
const SizedBox(height: 24), const SizedBox(height: 24),
@@ -108,7 +108,7 @@ class _HistoryScreenState extends State<HistoryScreen> {
); );
} }
Widget _buildTodaySummary(AppLocalizations l10n, int totalMins, int distractions, int completed) { Widget _buildTodaySummary(AppLocalizations l10n, int totalMins, int distractions, int sessions) {
return Container( return Container(
padding: const EdgeInsets.all(24), padding: const EdgeInsets.all(24),
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -140,7 +140,7 @@ class _HistoryScreenState extends State<HistoryScreen> {
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
), ),
child: Text( child: Text(
l10n.sessions(completed), l10n.sessions(sessions),
style: const TextStyle( style: const TextStyle(
fontFamily: 'Nunito', fontFamily: 'Nunito',
fontSize: 14, fontSize: 14,

View File

@@ -116,9 +116,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
_buildSection( _buildSection(
title: l10n.language, title: l10n.language,
children: [ children: [
_buildLanguageOption(l10n, 'en', l10n.english), _buildLanguageDropdown(l10n),
const Divider(color: AppColors.divider),
_buildLanguageOption(l10n, 'zh', l10n.chinese),
], ],
), ),
@@ -310,27 +308,57 @@ class _SettingsScreenState extends State<SettingsScreen> {
); );
} }
Widget _buildLanguageOption(AppLocalizations l10n, String localeCode, String label) { Widget _buildLanguageDropdown(AppLocalizations l10n) {
final isSelected = _selectedLocale == localeCode; // Language options with their codes and display names
final languages = {
'en': l10n.english,
'zh': l10n.chinese,
'ja': l10n.japanese,
'ko': l10n.korean,
'es': l10n.spanish,
'de': l10n.german,
'fr': l10n.french,
'pt': l10n.portuguese,
'ru': l10n.russian,
'hi': l10n.hindi,
'id': l10n.indonesian,
'it': l10n.italian,
'ar': l10n.arabic,
};
return ListTile( return Container(
contentPadding: EdgeInsets.zero, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
title: Text( decoration: BoxDecoration(
label, color: AppColors.background,
style: TextStyle( borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColors.divider),
),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: _selectedLocale,
isExpanded: true,
icon: const Icon(Icons.arrow_drop_down, color: AppColors.primary),
style: const TextStyle(
fontFamily: 'Nunito', fontFamily: 'Nunito',
fontSize: 16, fontSize: 16,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400, fontWeight: FontWeight.w600,
color: isSelected ? AppColors.primary : AppColors.textPrimary, color: AppColors.textPrimary,
),
dropdownColor: AppColors.white,
borderRadius: BorderRadius.circular(12),
items: languages.entries.map((entry) {
return DropdownMenuItem<String>(
value: entry.key,
child: Text(entry.value),
);
}).toList(),
onChanged: (String? newValue) {
if (newValue != null) {
_saveLocale(newValue);
}
},
), ),
), ),
trailing: isSelected
? const Icon(
Icons.check_circle,
color: AppColors.primary,
)
: null,
onTap: () => _saveLocale(localeCode),
); );
} }

View File

@@ -63,6 +63,11 @@ class StorageService {
.length; .length;
} }
/// Get total sessions count for today (including stopped early)
int getTodaySessionsCount() {
return getTodaySessions().length;
}
/// Delete a focus session /// Delete a focus session
Future<void> deleteSession(FocusSession session) async { Future<void> deleteSession(FocusSession session) async {
await session.delete(); await session.delete();

View File

@@ -144,6 +144,39 @@ class Distraction {
| 第3周 | 报告生成 + 成就系统 | | 第3周 | 报告生成 + 成就系统 |
| 第4周 | 广告接入 + 测试发布 | | 第4周 | 广告接入 + 测试发布 |
### 5.4 多语言支持
#### 高优先级
日语 (Japanese) 🇯🇵
原因: 日本对生产力工具和专注应用有极高需求
特点: ADHD 和神经多样性支持在日本很受关注
市场: 日本的 App Store 付费意愿很高
韩语 (Korean) 🇰🇷
原因: 韩国学生和上班族对学习/工作效率工具需求很大
特点: "番茄工作法"和专注应用在韩国非常流行
市场: K-pop 文化影响,年轻用户群体活跃
西班牙语 (Spanish) 🇪🇸 🇲🇽
原因: 全球第二大母语人口4.5亿+
覆盖: 西班牙、墨西哥、阿根廷、哥伦比亚等20+国家
市场: 拉丁美洲移动应用市场快速增长
#### 中等优先级
德语 (German) 🇩🇪
德国、奥地利、瑞士
注重隐私和离线功能(你的卖点!)
付费意愿高
法语 (French) 🇫🇷
法国、加拿大(魁北克)、比利时、瑞士
约3亿使用者
葡萄牙语 (Portuguese) 🇧🇷
巴西2.2亿人口)
快速增长的移动市场
俄语 (Russian) 🇷🇺
俄罗斯、独联体国家
约2.6亿使用者
#### 长期考虑
意大利语 (Italian) 🇮🇹
荷兰语 (Dutch) 🇳🇱
土耳其语 (Turkish) 🇹🇷
--- ---
## 六、合规与隐私 ## 六、合规与隐私