diff --git a/lib/localizations/de.json b/lib/localizations/de.json index 17e33f3..d733d47 100644 --- a/lib/localizations/de.json +++ b/lib/localizations/de.json @@ -29,6 +29,8 @@ "systemDefault": "Systemstandard", "aboutInfo": "Über / Informationen", "aboutThisApp": "Über Diese App", + "aboutSubtitle": "App-Informationen und Credits", + "languageSubtitle": "Wählen Sie Ihre bevorzugte Sprache", "maxNodes": "Max. angezeigte Knoten", "maxNodesSubtitle": "Obergrenze für die Anzahl der Knoten auf der Karte festlegen (Standard: 250).", "maxNodesWarning": "Sie möchten das wahrscheinlich nicht tun, es sei denn, Sie sind absolut sicher, dass Sie einen guten Grund dafür haben.", diff --git a/lib/localizations/en.json b/lib/localizations/en.json index 67ade4e..b4ebf67 100644 --- a/lib/localizations/en.json +++ b/lib/localizations/en.json @@ -29,6 +29,8 @@ "systemDefault": "System Default", "aboutInfo": "About / Info", "aboutThisApp": "About This App", + "aboutSubtitle": "App information and credits", + "languageSubtitle": "Choose your preferred language", "maxNodes": "Max nodes drawn", "maxNodesSubtitle": "Set an upper limit for the number of nodes on the map (default: 250).", "maxNodesWarning": "You probably don't want to do that unless you are absolutely sure you have a good reason for it.", diff --git a/lib/localizations/es.json b/lib/localizations/es.json index a1c672c..db4f7a1 100644 --- a/lib/localizations/es.json +++ b/lib/localizations/es.json @@ -29,6 +29,8 @@ "systemDefault": "Sistema por Defecto", "aboutInfo": "Acerca de / Información", "aboutThisApp": "Acerca de Esta App", + "aboutSubtitle": "Información de la aplicación y créditos", + "languageSubtitle": "Elige tu idioma preferido", "maxNodes": "Máx. nodos dibujados", "maxNodesSubtitle": "Establecer un límite superior para el número de nodos en el mapa (predeterminado: 250).", "maxNodesWarning": "Probablemente no quieras hacer eso a menos que estés absolutamente seguro de que tienes una buena razón para ello.", diff --git a/lib/localizations/fr.json b/lib/localizations/fr.json index ff44d21..a25873a 100644 --- a/lib/localizations/fr.json +++ b/lib/localizations/fr.json @@ -29,6 +29,8 @@ "systemDefault": "Par Défaut du Système", "aboutInfo": "À Propos / Informations", "aboutThisApp": "À Propos de Cette App", + "aboutSubtitle": "Informations sur l'application et crédits", + "languageSubtitle": "Choisissez votre langue préférée", "maxNodes": "Max. nœuds dessinés", "maxNodesSubtitle": "Définir une limite supérieure pour le nombre de nœuds sur la carte (par défaut: 250).", "maxNodesWarning": "Vous ne voulez probablement pas faire cela à moins d'être absolument sûr d'avoir une bonne raison de le faire.", diff --git a/lib/localizations/it.json b/lib/localizations/it.json index e6caef9..f7c3cc4 100644 --- a/lib/localizations/it.json +++ b/lib/localizations/it.json @@ -29,6 +29,8 @@ "systemDefault": "Predefinito del Sistema", "aboutInfo": "Informazioni", "aboutThisApp": "Informazioni su questa App", + "aboutSubtitle": "Informazioni sull'applicazione e crediti", + "languageSubtitle": "Scegli la tua lingua preferita", "maxNodes": "Max nodi disegnati", "maxNodesSubtitle": "Imposta un limite superiore per il numero di nodi sulla mappa (predefinito: 250).", "maxNodesWarning": "Probabilmente non vuoi farlo a meno che non sei assolutamente sicuro di avere una buona ragione per farlo.", diff --git a/lib/localizations/pt.json b/lib/localizations/pt.json index 2ee1ae2..0243f61 100644 --- a/lib/localizations/pt.json +++ b/lib/localizations/pt.json @@ -29,6 +29,8 @@ "systemDefault": "Padrão do Sistema", "aboutInfo": "Sobre / Informações", "aboutThisApp": "Sobre este App", + "aboutSubtitle": "Informações do aplicativo e créditos", + "languageSubtitle": "Escolha seu idioma preferido", "maxNodes": "Máx. de nós desenhados", "maxNodesSubtitle": "Definir um limite superior para o número de nós no mapa (padrão: 250).", "maxNodesWarning": "Você provavelmente não quer fazer isso a menos que tenha certeza absoluta de que tem uma boa razão para isso.", diff --git a/lib/localizations/zh.json b/lib/localizations/zh.json index 93d4a30..eac44f4 100644 --- a/lib/localizations/zh.json +++ b/lib/localizations/zh.json @@ -29,6 +29,8 @@ "systemDefault": "系统默认", "aboutInfo": "关于 / 信息", "aboutThisApp": "关于此应用", + "aboutSubtitle": "应用程序信息和鸣谢", + "languageSubtitle": "选择您的首选语言", "maxNodes": "最大节点绘制数", "maxNodesSubtitle": "设置地图上节点数量的上限(默认:250)。", "maxNodesWarning": "除非您确定有充分的理由,否则您可能不想这样做。", diff --git a/lib/main.dart b/lib/main.dart index 2bdbf0a..b54ea75 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,8 @@ import 'screens/settings_screen.dart'; import 'screens/profiles_settings_screen.dart'; import 'screens/offline_settings_screen.dart'; import 'screens/advanced_settings_screen.dart'; +import 'screens/language_settings_screen.dart'; +import 'screens/about_screen.dart'; import 'services/localization_service.dart'; @@ -64,6 +66,8 @@ class DeFlockApp extends StatelessWidget { '/settings/profiles': (context) => const ProfilesSettingsScreen(), '/settings/offline': (context) => const OfflineSettingsScreen(), '/settings/advanced': (context) => const AdvancedSettingsScreen(), + '/settings/language': (context) => const LanguageSettingsScreen(), + '/settings/about': (context) => const AboutScreen(), }, initialRoute: '/', ); diff --git a/lib/screens/about_screen.dart b/lib/screens/about_screen.dart new file mode 100644 index 0000000..9d27791 --- /dev/null +++ b/lib/screens/about_screen.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import '../services/localization_service.dart'; + +class AboutScreen extends StatelessWidget { + const AboutScreen({super.key}); + + @override + Widget build(BuildContext context) { + final locService = LocalizationService.instance; + + return AnimatedBuilder( + animation: LocalizationService.instance, + builder: (context, child) => Scaffold( + appBar: AppBar( + title: Text(locService.t('settings.aboutThisApp')), + ), + body: FutureBuilder( + future: DefaultAssetBundle.of(context).loadString('assets/info.txt'), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + if (snapshot.hasError) { + return Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text( + 'Error loading info: ${snapshot.error}', + style: Theme.of(context).textTheme.bodyLarge, + textAlign: TextAlign.center, + ), + ), + ); + } + + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Text( + snapshot.data ?? 'No info available.', + style: Theme.of(context).textTheme.bodyLarge, + ), + ); + }, + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/language_settings_screen.dart b/lib/screens/language_settings_screen.dart new file mode 100644 index 0000000..8d8bf41 --- /dev/null +++ b/lib/screens/language_settings_screen.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'settings/sections/language_section.dart'; +import '../services/localization_service.dart'; + +class LanguageSettingsScreen extends StatelessWidget { + const LanguageSettingsScreen({super.key}); + + @override + Widget build(BuildContext context) { + final locService = LocalizationService.instance; + + return AnimatedBuilder( + animation: LocalizationService.instance, + builder: (context, child) => Scaffold( + appBar: AppBar( + title: Text(locService.t('settings.language')), + ), + body: const Padding( + padding: EdgeInsets.all(16), + child: LanguageSection(), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/settings/sections/language_section.dart b/lib/screens/settings/sections/language_section.dart index e1c06d3..3f8df54 100644 --- a/lib/screens/settings/sections/language_section.dart +++ b/lib/screens/settings/sections/language_section.dart @@ -57,11 +57,6 @@ class _LanguageSectionState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - locService.t('settings.language'), - style: Theme.of(context).textTheme.titleMedium, - ), - const SizedBox(height: 8), // System Default option RadioListTile( title: Text(locService.t('settings.systemDefault')), diff --git a/lib/screens/settings/sections/proximity_alerts_section.dart b/lib/screens/settings/sections/proximity_alerts_section.dart index 675af42..35bddd5 100644 --- a/lib/screens/settings/sections/proximity_alerts_section.dart +++ b/lib/screens/settings/sections/proximity_alerts_section.dart @@ -99,7 +99,7 @@ class _ProximityAlertsSectionState extends State { subtitle: Text( '${locService.t('proximityAlerts.batteryUsage')}\n' '${_notificationsEnabled ? locService.t('proximityAlerts.notificationsEnabled') : locService.t('proximityAlerts.notificationsDisabled')}', - style: const TextStyle(fontSize: 12), + style: TextStyle(fontSize: 12), ), value: appState.proximityAlertsEnabled, onChanged: (enabled) { @@ -131,14 +131,14 @@ class _ProximityAlertsSectionState extends State { const SizedBox(width: 8), Text( locService.t('proximityAlerts.permissionRequired'), - style: const TextStyle(fontWeight: FontWeight.w600), + style: TextStyle(fontWeight: FontWeight.w600), ), ], ), const SizedBox(height: 8), Text( locService.t('proximityAlerts.permissionExplanation'), - style: const TextStyle(fontSize: 12), + style: TextStyle(fontSize: 12), ), const SizedBox(height: 8), ElevatedButton.icon( @@ -158,15 +158,15 @@ class _ProximityAlertsSectionState extends State { // Loading indicator if (_checkingPermissions) ...[ const SizedBox(height: 8), - const Row( + Row( children: [ - SizedBox( + const SizedBox( width: 16, height: 16, child: CircularProgressIndicator(strokeWidth: 2), ), - SizedBox(width: 8), - Text(locService.t('proximityAlerts.checkingPermissions'), style: const TextStyle(fontSize: 12)), + const SizedBox(width: 8), + Text(locService.t('proximityAlerts.checkingPermissions'), style: TextStyle(fontSize: 12)), ], ), ], diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 7b9ccbb..fe55788 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -2,8 +2,6 @@ import 'package:flutter/material.dart'; import 'settings/sections/auth_section.dart'; import 'settings/sections/upload_mode_section.dart'; import 'settings/sections/queue_section.dart'; -import 'settings/sections/about_section.dart'; -import 'settings/sections/language_section.dart'; import '../services/localization_service.dart'; import '../dev_config.dart'; @@ -59,9 +57,22 @@ class SettingsScreen extends StatelessWidget { ), const Divider(), - const LanguageSection(), + _buildNavigationTile( + context, + icon: Icons.language, + title: locService.t('settings.language'), + subtitle: locService.t('settings.languageSubtitle'), + onTap: () => Navigator.pushNamed(context, '/settings/language'), + ), const Divider(), - const AboutSection(), + + _buildNavigationTile( + context, + icon: Icons.info_outline, + title: locService.t('settings.aboutInfo'), + subtitle: locService.t('settings.aboutSubtitle'), + onTap: () => Navigator.pushNamed(context, '/settings/about'), + ), ], ), ),