diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb new file mode 100644 index 0000000..febded7 --- /dev/null +++ b/lib/l10n/app_ar.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb new file mode 100644 index 0000000..71e16f5 --- /dev/null +++ b/lib/l10n/app_de.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 2c1f53f..ae90080 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -119,7 +119,7 @@ "startFirstSession": "Start your first session\nto see your progress here!", "today": "Today", - "sessions": "{count, plural, =1{session} other{sessions}}", + "sessions": "{count, plural, =1{{count} session} other{{count} sessions}}", "@sessions": { "placeholders": { "count": { @@ -215,5 +215,16 @@ "language": "Language", "selectLanguage": "Select Language", "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)" } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb new file mode 100644 index 0000000..3a542a8 --- /dev/null +++ b/lib/l10n/app_es.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb new file mode 100644 index 0000000..c439c5a --- /dev/null +++ b/lib/l10n/app_fr.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb new file mode 100644 index 0000000..e6d1da8 --- /dev/null +++ b/lib/l10n/app_hi.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb new file mode 100644 index 0000000..6c57fc4 --- /dev/null +++ b/lib/l10n/app_id.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb new file mode 100644 index 0000000..e4ffb31 --- /dev/null +++ b/lib/l10n/app_it.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb new file mode 100644 index 0000000..8da7c35 --- /dev/null +++ b/lib/l10n/app_ja.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb new file mode 100644 index 0000000..384f56d --- /dev/null +++ b/lib/l10n/app_ko.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index d747e6c..50be0dd 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -5,7 +5,18 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; 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_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'; // ignore_for_file: type=lint @@ -94,7 +105,18 @@ abstract class AppLocalizations { /// A list of this localizations delegate's supported locales. static const List supportedLocales = [ + Locale('ar'), + Locale('de'), Locale('en'), + Locale('es'), + Locale('fr'), + Locale('hi'), + Locale('id'), + Locale('it'), + Locale('ja'), + Locale('ko'), + Locale('pt'), + Locale('ru'), Locale('zh'), ]; @@ -275,7 +297,7 @@ abstract class AppLocalizations { /// No description provided for @sessions. /// /// In en, this message translates to: - /// **'{count, plural, =1{session} other{sessions}}'** + /// **'{count, plural, =1{{count} session} other{{count} sessions}}'** String sessions(int count); /// No description provided for @completed. @@ -550,6 +572,72 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'中文 (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 @@ -562,8 +650,21 @@ class _AppLocalizationsDelegate } @override - bool isSupported(Locale locale) => - ['en', 'zh'].contains(locale.languageCode); + bool isSupported(Locale locale) => [ + 'ar', + 'de', + 'en', + 'es', + 'fr', + 'hi', + 'id', + 'it', + 'ja', + 'ko', + 'pt', + 'ru', + 'zh', + ].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -572,8 +673,30 @@ class _AppLocalizationsDelegate AppLocalizations lookupAppLocalizations(Locale locale) { // Lookup logic when only language code is specified. switch (locale.languageCode) { + case 'ar': + return AppLocalizationsAr(); + case 'de': + return AppLocalizationsDe(); case 'en': 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': return AppLocalizationsZh(); } diff --git a/lib/l10n/app_localizations_ar.dart b/lib/l10n/app_localizations_ar.dart new file mode 100644 index 0000000..6338e8c --- /dev/null +++ b/lib/l10n/app_localizations_ar.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart new file mode 100644 index 0000000..3167210 --- /dev/null +++ b/lib/l10n/app_localizations_de.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 0777797..629a31e 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -126,8 +126,8 @@ class AppLocalizationsEn extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'sessions', - one: 'session', + other: '$count sessions', + one: '$count session', ); return '$_temp0'; } @@ -291,4 +291,37 @@ class AppLocalizationsEn extends AppLocalizations { @override 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)'; } diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart new file mode 100644 index 0000000..0c62eac --- /dev/null +++ b/lib/l10n/app_localizations_es.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart new file mode 100644 index 0000000..80bfbb0 --- /dev/null +++ b/lib/l10n/app_localizations_fr.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart new file mode 100644 index 0000000..eca673e --- /dev/null +++ b/lib/l10n/app_localizations_hi.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart new file mode 100644 index 0000000..92fdf0a --- /dev/null +++ b/lib/l10n/app_localizations_id.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart new file mode 100644 index 0000000..7f89c34 --- /dev/null +++ b/lib/l10n/app_localizations_it.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart new file mode 100644 index 0000000..8f8c90c --- /dev/null +++ b/lib/l10n/app_localizations_ja.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart new file mode 100644 index 0000000..e0ab065 --- /dev/null +++ b/lib/l10n/app_localizations_ko.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart new file mode 100644 index 0000000..8969845 --- /dev/null +++ b/lib/l10n/app_localizations_pt.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart new file mode 100644 index 0000000..7e6ac10 --- /dev/null +++ b/lib/l10n/app_localizations_ru.dart @@ -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 => 'العربية'; +} diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index f2559eb..ddb1257 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -124,8 +124,8 @@ class AppLocalizationsZh extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '次会话', - one: '次会话', + other: '$count 次会话', + one: '$count 次会话', ); return '$_temp0'; } @@ -283,4 +283,37 @@ class AppLocalizationsZh extends AppLocalizations { @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 => 'العربية'; } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb new file mode 100644 index 0000000..397b67b --- /dev/null +++ b/lib/l10n/app_pt.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb new file mode 100644 index 0000000..4973e34 --- /dev/null +++ b/lib/l10n/app_ru.arb @@ -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": "العربية" +} diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index a0992c2..457f2ac 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -46,7 +46,7 @@ "startFirstSession": "开始你的第一次专注\n在这里查看进度!", "today": "今天", - "sessions": "{count, plural, =1{次会话} other{次会话}}", + "sessions": "{count, plural, =1{{count} 次会话} other{{count} 次会话}}", "completed": "已完成", "stoppedEarly": "提前停止", @@ -105,5 +105,16 @@ "language": "语言", "selectLanguage": "选择语言", "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": "العربية" } diff --git a/lib/main.dart b/lib/main.dart index eac24ae..6eee49c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -97,6 +97,17 @@ class _MyAppState extends State { supportedLocales: const [ Locale('en'), 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 ? const Scaffold( diff --git a/lib/screens/history_screen.dart b/lib/screens/history_screen.dart index 75b7461..17ea55b 100644 --- a/lib/screens/history_screen.dart +++ b/lib/screens/history_screen.dart @@ -23,7 +23,7 @@ class _HistoryScreenState extends State { final sessions = _storageService.getAllSessions(); final todayTotal = _storageService.getTodayTotalMinutes(); final todayDistractions = _storageService.getTodayDistractionCount(); - final todayCompleted = _storageService.getTodayCompletedCount(); + final todaySessions = _storageService.getTodaySessionsCount(); // Group sessions by date final sessionsByDate = >{}; @@ -59,7 +59,7 @@ class _HistoryScreenState extends State { l10n, todayTotal, todayDistractions, - todayCompleted, + todaySessions, ), const SizedBox(height: 24), @@ -108,7 +108,7 @@ class _HistoryScreenState extends State { ); } - Widget _buildTodaySummary(AppLocalizations l10n, int totalMins, int distractions, int completed) { + Widget _buildTodaySummary(AppLocalizations l10n, int totalMins, int distractions, int sessions) { return Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( @@ -140,7 +140,7 @@ class _HistoryScreenState extends State { borderRadius: BorderRadius.circular(12), ), child: Text( - l10n.sessions(completed), + l10n.sessions(sessions), style: const TextStyle( fontFamily: 'Nunito', fontSize: 14, diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 7ed0188..daec959 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -116,9 +116,7 @@ class _SettingsScreenState extends State { _buildSection( title: l10n.language, children: [ - _buildLanguageOption(l10n, 'en', l10n.english), - const Divider(color: AppColors.divider), - _buildLanguageOption(l10n, 'zh', l10n.chinese), + _buildLanguageDropdown(l10n), ], ), @@ -310,27 +308,57 @@ class _SettingsScreenState extends State { ); } - Widget _buildLanguageOption(AppLocalizations l10n, String localeCode, String label) { - final isSelected = _selectedLocale == localeCode; + Widget _buildLanguageDropdown(AppLocalizations l10n) { + // 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( - contentPadding: EdgeInsets.zero, - title: Text( - label, - style: TextStyle( - fontFamily: 'Nunito', - fontSize: 16, - fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400, - color: isSelected ? AppColors.primary : AppColors.textPrimary, + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + decoration: BoxDecoration( + color: AppColors.background, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColors.divider), + ), + child: DropdownButtonHideUnderline( + child: DropdownButton( + value: _selectedLocale, + isExpanded: true, + icon: const Icon(Icons.arrow_drop_down, color: AppColors.primary), + style: const TextStyle( + fontFamily: 'Nunito', + fontSize: 16, + fontWeight: FontWeight.w600, + color: AppColors.textPrimary, + ), + dropdownColor: AppColors.white, + borderRadius: BorderRadius.circular(12), + items: languages.entries.map((entry) { + return DropdownMenuItem( + 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), ); } diff --git a/lib/services/storage_service.dart b/lib/services/storage_service.dart index 4d0717d..d270b5a 100644 --- a/lib/services/storage_service.dart +++ b/lib/services/storage_service.dart @@ -63,6 +63,11 @@ class StorageService { .length; } + /// Get total sessions count for today (including stopped early) + int getTodaySessionsCount() { + return getTodaySessions().length; + } + /// Delete a focus session Future deleteSession(FocusSession session) async { await session.delete(); diff --git a/product-design.md b/product-design.md index 0a6d1d8..129f454 100644 --- a/product-design.md +++ b/product-design.md @@ -144,6 +144,39 @@ class Distraction { | 第3周 | 报告生成 + 成就系统 | | 第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) 🇹🇷 + --- ## 六、合规与隐私