languages and about get their own section

This commit is contained in:
stopflock
2025-09-30 09:50:24 -05:00
parent e79790c30d
commit ab567b1da4
13 changed files with 116 additions and 16 deletions

View File

@@ -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.",

View File

@@ -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.",

View File

@@ -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.",

View File

@@ -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.",

View File

@@ -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.",

View File

@@ -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.",

View File

@@ -29,6 +29,8 @@
"systemDefault": "系统默认",
"aboutInfo": "关于 / 信息",
"aboutThisApp": "关于此应用",
"aboutSubtitle": "应用程序信息和鸣谢",
"languageSubtitle": "选择您的首选语言",
"maxNodes": "最大节点绘制数",
"maxNodesSubtitle": "设置地图上节点数量的上限默认250。",
"maxNodesWarning": "除非您确定有充分的理由,否则您可能不想这样做。",

View File

@@ -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: '/',
);

View File

@@ -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<String>(
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,
),
);
},
),
),
);
}
}

View File

@@ -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(),
),
),
);
}
}

View File

@@ -57,11 +57,6 @@ class _LanguageSectionState extends State<LanguageSection> {
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<String?>(
title: Text(locService.t('settings.systemDefault')),

View File

@@ -99,7 +99,7 @@ class _ProximityAlertsSectionState extends State<ProximityAlertsSection> {
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<ProximityAlertsSection> {
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<ProximityAlertsSection> {
// 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)),
],
),
],

View File

@@ -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'),
),
],
),
),