From 7fdb58204d15f378c72d73fb114ff9cb4e7959b9 Mon Sep 17 00:00:00 2001 From: Strycher Date: Mon, 10 Aug 2026 21:15:30 -0400 Subject: [PATCH] feat(#526): relocate About to its own top-level Settings category About moves out of the Debug pane into a top-level 'About' category (its own pane, not the stock dialog). Keeps the marketing version display, adds a description + refreshed legalese (Offband, zjs81/MeshCore MIT attribution kept), and a View licenses row (showLicensePage). Build identity stays in Device Info (#553). #527 adds the outbound links here next. Part of epic #525. Agent: QuietSnow (session 31eaba02) --- lib/l10n/app_en.arb | 5 +- lib/l10n/app_localizations.dart | 10 +++- lib/l10n/app_localizations_bg.dart | 3 ++ lib/l10n/app_localizations_de.dart | 3 ++ lib/l10n/app_localizations_en.dart | 8 ++- lib/l10n/app_localizations_es.dart | 3 ++ lib/l10n/app_localizations_fr.dart | 3 ++ lib/l10n/app_localizations_hu.dart | 3 ++ lib/l10n/app_localizations_it.dart | 3 ++ lib/l10n/app_localizations_ja.dart | 3 ++ lib/l10n/app_localizations_ko.dart | 3 ++ lib/l10n/app_localizations_nl.dart | 3 ++ lib/l10n/app_localizations_pl.dart | 3 ++ lib/l10n/app_localizations_pt.dart | 3 ++ lib/l10n/app_localizations_ru.dart | 3 ++ lib/l10n/app_localizations_sk.dart | 3 ++ lib/l10n/app_localizations_sl.dart | 3 ++ lib/l10n/app_localizations_sv.dart | 3 ++ lib/l10n/app_localizations_uk.dart | 3 ++ lib/l10n/app_localizations_zh.dart | 3 ++ lib/screens/settings_screen.dart | 81 +++++++++++++++++++----------- untranslated.json | 17 +++++++ 22 files changed, 138 insertions(+), 34 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7f4bbc1..9a0b309 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -246,8 +246,9 @@ } } }, - "settings_aboutLegalese": "2026 MeshCore Open Source Project", - "settings_aboutDescription": "An open-source Flutter client for MeshCore LoRa mesh networking devices.", + "settings_aboutLegalese": "© 2026 Offband. Based on MeshCore Open by zjs81, MIT licensed.", + "settings_aboutDescription": "Offband Meshcore is an open-source client for MeshCore LoRa mesh networking devices.", + "settings_aboutLicenses": "View licenses", "settings_aboutOpenMeteoAttribution": "LOS elevation data: Open-Meteo (CC BY 4.0)", "settings_infoName": "Name", "settings_infoId": "ID", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 1f5a3c2..6d9fe2c 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -1195,15 +1195,21 @@ abstract class AppLocalizations { /// No description provided for @settings_aboutLegalese. /// /// In en, this message translates to: - /// **'2026 MeshCore Open Source Project'** + /// **'© 2026 Offband. Based on MeshCore Open by zjs81, MIT licensed.'** String get settings_aboutLegalese; /// No description provided for @settings_aboutDescription. /// /// In en, this message translates to: - /// **'An open-source Flutter client for MeshCore LoRa mesh networking devices.'** + /// **'Offband Meshcore is an open-source client for MeshCore LoRa mesh networking devices.'** String get settings_aboutDescription; + /// No description provided for @settings_aboutLicenses. + /// + /// In en, this message translates to: + /// **'View licenses'** + String get settings_aboutLicenses; + /// No description provided for @settings_aboutOpenMeteoAttribution. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 65151a1..f72cec8 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -612,6 +612,9 @@ class AppLocalizationsBg extends AppLocalizations { String get settings_aboutDescription => 'Отворен софтуер за Flutter клиент за MeshCore LoRa мрежови устройства.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Данни за надморска височина на LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index b547268..e255401 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -607,6 +607,9 @@ class AppLocalizationsDe extends AppLocalizations { String get settings_aboutDescription => 'Ein Open-Source-Flutter-Client für MeshCore LoRa-Meshnetzwerkgeräte.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'LOS-Höhendaten: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index e0d6ee9..ad5191d 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -591,11 +591,15 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get settings_aboutLegalese => '2026 MeshCore Open Source Project'; + String get settings_aboutLegalese => + '© 2026 Offband. Based on MeshCore Open by zjs81, MIT licensed.'; @override String get settings_aboutDescription => - 'An open-source Flutter client for MeshCore LoRa mesh networking devices.'; + 'Offband Meshcore is an open-source client for MeshCore LoRa mesh networking devices.'; + + @override + String get settings_aboutLicenses => 'View licenses'; @override String get settings_aboutOpenMeteoAttribution => diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 28e29ae..dd283d6 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -608,6 +608,9 @@ class AppLocalizationsEs extends AppLocalizations { String get settings_aboutDescription => 'Un cliente de código abierto de Flutter para dispositivos de red mesh LoRa de MeshCore.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Datos de elevación LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 906b914..e607797 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -612,6 +612,9 @@ class AppLocalizationsFr extends AppLocalizations { String get settings_aboutDescription => 'Un client Flutter open source pour les appareils de réseau mesh MeshCore LoRa.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Données d\'élévation LOS : Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart index f0edde9..6d9a3ae 100644 --- a/lib/l10n/app_localizations_hu.dart +++ b/lib/l10n/app_localizations_hu.dart @@ -610,6 +610,9 @@ class AppLocalizationsHu extends AppLocalizations { String get settings_aboutDescription => 'Egy nyílt forráskódú Flutter kliens a MeshCore LoRa hálózati eszközök számára.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'LOS magassági adatok: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index e9d91f2..a59f4a5 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -610,6 +610,9 @@ class AppLocalizationsIt extends AppLocalizations { String get settings_aboutDescription => 'Un client Flutter open-source per i dispositivi di rete mesh LoRa Core di MeshCore.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Dati di elevazione LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index a5db0fc..2e3474b 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -583,6 +583,9 @@ class AppLocalizationsJa extends AppLocalizations { String get settings_aboutDescription => 'MeshCore LoRaメッシュネットワークデバイス用の、オープンソースのFlutterクライアント。'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'LOS 標高データ:Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 0f5eff1..ab8e07b 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -583,6 +583,9 @@ class AppLocalizationsKo extends AppLocalizations { String get settings_aboutDescription => 'MeshCore LoRa 메시 네트워크 장치를 위한 오픈 소스 Flutter 클라이언트.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'LOS 고도 데이터: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 0aa4060..3570721 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -604,6 +604,9 @@ class AppLocalizationsNl extends AppLocalizations { String get settings_aboutDescription => 'Een open-source Flutter client voor MeshCore LoRa mesh netwerkapparaten.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'LOS-hoogtegegevens: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 589ae4c..927938c 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -612,6 +612,9 @@ class AppLocalizationsPl extends AppLocalizations { String get settings_aboutDescription => 'Otwartoźródłowy klient Flutter dla urządzeń MeshCore LoRa do sieci mesh.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Dane wysokościowe LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index abd8bbc..03b5d96 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -610,6 +610,9 @@ class AppLocalizationsPt extends AppLocalizations { String get settings_aboutDescription => 'Um cliente Flutter de código aberto para dispositivos de rede mesh LoRa Core da MeshCore.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Dados de elevação LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 8a47bd6..4c4fca2 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -609,6 +609,9 @@ class AppLocalizationsRu extends AppLocalizations { String get settings_aboutDescription => 'Открытое клиентское приложение на Flutter для устройств MeshCore с LoRa-сетями.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Данные о высоте LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index 118dec9..58b3d5c 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -604,6 +604,9 @@ class AppLocalizationsSk extends AppLocalizations { String get settings_aboutDescription => 'Otvorený zdrojový Flutter klient pre MeshCore LoRa sieťové zariadenia.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Údaje o nadmorskej výške LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 2c5776c..10eaddf 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -601,6 +601,9 @@ class AppLocalizationsSl extends AppLocalizations { String get settings_aboutDescription => 'Odprtokodni Flutter klient za naprave za LoRa omrežje MeshCore.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Podatki o višini LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index b9788ff..936765d 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -599,6 +599,9 @@ class AppLocalizationsSv extends AppLocalizations { String get settings_aboutDescription => 'En öppen källkods Flutter-klient för MeshCore LoRa meshnätverksenheter.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'LOS-höjddata: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index ae8af6b..b96aa40 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -607,6 +607,9 @@ class AppLocalizationsUk extends AppLocalizations { String get settings_aboutDescription => 'Клієнт Flutter з відкритим вихідним кодом для пристроїв мережі MeshCore LoRa.'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'Дані про висоту LOS: Open-Meteo (CC BY 4.0)'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 661b280..e23ad96 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -575,6 +575,9 @@ class AppLocalizationsZh extends AppLocalizations { String get settings_aboutDescription => '一个开源的 Flutter 客户端,用于 MeshCore LoRa 无线网络设备。'; + @override + String get settings_aboutLicenses => 'View licenses'; + @override String get settings_aboutOpenMeteoAttribution => 'LOS 高程数据:Open-Meteo (CC BY 4.0)'; diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index ee34dbd..2cee268 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -228,6 +228,11 @@ class _SettingsScreenState extends State { title: l10n.settings_debug, builder: _diagnosticsPane, ), + SettingsCategory( + icon: Icons.info_outline, + title: l10n.settings_about, + builder: _aboutPane, + ), ]; } @@ -526,8 +531,6 @@ class _SettingsScreenState extends State { _buildDebugCard(context), const SizedBox(height: 16), _buildExportCard(connector), - const SizedBox(height: 16), - _buildAboutCard(context), ], ); } @@ -762,19 +765,57 @@ class _SettingsScreenState extends State { ); } - Widget _buildAboutCard(BuildContext context) { + // About is its own top-level Settings category (#525/#526), no longer a card + // in the Debug pane. Outbound links (offband.org / Play / donate) added by + // #527 between the info block and the licenses row. + Widget _aboutPane(BuildContext context) { final l10n = context.l10n; - return Card( - child: ListTile( - leading: const Icon(Icons.info_outline), - title: Text(l10n.settings_about), - subtitle: Text( - l10n.settings_aboutVersion( - _appVersion.isEmpty ? l10n.common_loading : _appVersion, + return ListView( + padding: const EdgeInsets.all(16), + children: [ + Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + leading: const Icon(Icons.info_outline), + title: Text(l10n.appTitle), + subtitle: Text( + l10n.settings_aboutVersion( + _appVersion.isEmpty ? l10n.common_loading : _appVersion, + ), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(16, 0, 16, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(l10n.settings_aboutDescription), + const SizedBox(height: 12), + Text( + l10n.settings_aboutLegalese, + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + ), + const Divider(height: 1), + ListTile( + leading: const Icon(Icons.description_outlined), + title: Text(l10n.settings_aboutLicenses), + trailing: const Icon(Icons.chevron_right), + onTap: () => showLicensePage( + context: context, + applicationName: l10n.appTitle, + applicationVersion: _appVersion.isEmpty ? null : _appVersion, + applicationLegalese: l10n.settings_aboutLegalese, + ), + ), + ], ), ), - onTap: () => _showAbout(context), - ), + ], ); } @@ -1422,22 +1463,6 @@ class _SettingsScreenState extends State { ); } - void _showAbout(BuildContext context) { - final l10n = context.l10n; - showAboutDialog( - context: context, - applicationName: l10n.appTitle, - applicationVersion: _appVersion.isEmpty - ? l10n.common_loading - : _appVersion, - applicationLegalese: l10n.settings_aboutLegalese, - children: [ - const SizedBox(height: 16), - Text(l10n.settings_aboutDescription), - ], - ); - } - Future _gpxExport( GpxExport exporter, String name, diff --git a/untranslated.json b/untranslated.json index b9fdac0..1495c7b 100644 --- a/untranslated.json +++ b/untranslated.json @@ -23,6 +23,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -126,6 +127,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -229,6 +231,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -332,6 +335,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -435,6 +439,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -538,6 +543,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -641,6 +647,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -744,6 +751,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -847,6 +855,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -950,6 +959,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -1053,6 +1063,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -1156,6 +1167,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -1259,6 +1271,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -1362,6 +1375,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -1465,6 +1479,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -1568,6 +1583,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps", @@ -1671,6 +1687,7 @@ "settings_experimentalUnlocked", "settings_experimentalAlreadyUnlocked", "settings_experimentalCountdown", + "settings_aboutLicenses", "settings_infoFirmware", "settings_infoModel", "settings_infoOffbandCaps",