From 33e0cffd3048f8884eb0ec456e324f7e52c8ef07 Mon Sep 17 00:00:00 2001 From: vjrj Date: Fri, 10 Jul 2026 02:36:17 +0200 Subject: [PATCH] =?UTF-8?q?feat(about):=20add=20Comunes=20Association=20co?= =?UTF-8?q?pyleft=20notice=20=C3=A0=20la=20=C4=9E1nkgo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/app_seeds/lib/i18n/en.i18n.json | 3 ++- apps/app_seeds/lib/i18n/es.i18n.json | 3 ++- apps/app_seeds/lib/i18n/pt.i18n.json | 3 ++- apps/app_seeds/lib/i18n/strings.g.dart | 4 ++-- apps/app_seeds/lib/i18n/strings_en.g.dart | 4 ++++ apps/app_seeds/lib/i18n/strings_es.g.dart | 2 ++ apps/app_seeds/lib/i18n/strings_pt.g.dart | 2 ++ apps/app_seeds/lib/ui/about_screen.dart | 25 +++++++++++++++++++++++ 8 files changed, 41 insertions(+), 5 deletions(-) diff --git a/apps/app_seeds/lib/i18n/en.i18n.json b/apps/app_seeds/lib/i18n/en.i18n.json index 7c8d030..1d90cab 100644 --- a/apps/app_seeds/lib/i18n/en.i18n.json +++ b/apps/app_seeds/lib/i18n/en.i18n.json @@ -86,7 +86,8 @@ "licenseValue": "AGPL-3.0", "website": "Website", "openSourceLicenses": "Open-source licenses", - "openSourceLicensesSubtitle": "Third-party libraries and their licenses" + "openSourceLicensesSubtitle": "Third-party libraries and their licenses", + "copyright": "© {years} Comunes Association, under AGPLv3" }, "intro": { "skip": "Skip", diff --git a/apps/app_seeds/lib/i18n/es.i18n.json b/apps/app_seeds/lib/i18n/es.i18n.json index 8348d41..63a37d7 100644 --- a/apps/app_seeds/lib/i18n/es.i18n.json +++ b/apps/app_seeds/lib/i18n/es.i18n.json @@ -86,7 +86,8 @@ "licenseValue": "AGPL-3.0", "website": "Sitio web", "openSourceLicenses": "Licencias de código abierto", - "openSourceLicensesSubtitle": "Bibliotecas de terceros y sus licencias" + "openSourceLicensesSubtitle": "Bibliotecas de terceros y sus licencias", + "copyright": "© {years} Asociación Comunes, bajo AGPLv3" }, "intro": { "skip": "Saltar", diff --git a/apps/app_seeds/lib/i18n/pt.i18n.json b/apps/app_seeds/lib/i18n/pt.i18n.json index d782107..2c0bee9 100644 --- a/apps/app_seeds/lib/i18n/pt.i18n.json +++ b/apps/app_seeds/lib/i18n/pt.i18n.json @@ -86,7 +86,8 @@ "licenseValue": "AGPL-3.0", "website": "Sítio web", "openSourceLicenses": "Licenças de código aberto", - "openSourceLicensesSubtitle": "Bibliotecas de terceiros e as suas licenças" + "openSourceLicensesSubtitle": "Bibliotecas de terceiros e as suas licenças", + "copyright": "© {years} Associação Comunes, sob AGPLv3" }, "intro": { "skip": "Saltar", diff --git a/apps/app_seeds/lib/i18n/strings.g.dart b/apps/app_seeds/lib/i18n/strings.g.dart index f51fd02..bbd7a3c 100644 --- a/apps/app_seeds/lib/i18n/strings.g.dart +++ b/apps/app_seeds/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 3 -/// Strings: 872 (290 per locale) +/// Strings: 875 (291 per locale) /// -/// Built on 2026-07-10 at 00:13 UTC +/// Built on 2026-07-10 at 00:35 UTC // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/apps/app_seeds/lib/i18n/strings_en.g.dart b/apps/app_seeds/lib/i18n/strings_en.g.dart index f0459cc..5d4adf7 100644 --- a/apps/app_seeds/lib/i18n/strings_en.g.dart +++ b/apps/app_seeds/lib/i18n/strings_en.g.dart @@ -360,6 +360,9 @@ class Translations$about$en { /// en: 'Third-party libraries and their licenses' String get openSourceLicensesSubtitle => 'Third-party libraries and their licenses'; + + /// en: '© {years} Comunes Association, under AGPLv3' + String copyright({required Object years}) => '© ${years} Comunes Association, under AGPLv3'; } // Path: intro @@ -1570,6 +1573,7 @@ extension on Translations { 'about.website' => 'Website', 'about.openSourceLicenses' => 'Open-source licenses', 'about.openSourceLicensesSubtitle' => 'Third-party libraries and their licenses', + 'about.copyright' => ({required Object years}) => '© ${years} Comunes Association, under AGPLv3', 'intro.skip' => 'Skip', 'intro.next' => 'Next', 'intro.start' => 'Get started', diff --git a/apps/app_seeds/lib/i18n/strings_es.g.dart b/apps/app_seeds/lib/i18n/strings_es.g.dart index ef7f69b..6dd0555 100644 --- a/apps/app_seeds/lib/i18n/strings_es.g.dart +++ b/apps/app_seeds/lib/i18n/strings_es.g.dart @@ -213,6 +213,7 @@ class _Translations$about$es extends Translations$about$en { @override String get website => 'Sitio web'; @override String get openSourceLicenses => 'Licencias de código abierto'; @override String get openSourceLicensesSubtitle => 'Bibliotecas de terceros y sus licencias'; + @override String copyright({required Object years}) => '© ${years} Asociación Comunes, bajo AGPLv3'; } // Path: intro @@ -1006,6 +1007,7 @@ extension on TranslationsEs { 'about.website' => 'Sitio web', 'about.openSourceLicenses' => 'Licencias de código abierto', 'about.openSourceLicensesSubtitle' => 'Bibliotecas de terceros y sus licencias', + 'about.copyright' => ({required Object years}) => '© ${years} Asociación Comunes, bajo AGPLv3', 'intro.skip' => 'Saltar', 'intro.next' => 'Siguiente', 'intro.start' => 'Empezar', diff --git a/apps/app_seeds/lib/i18n/strings_pt.g.dart b/apps/app_seeds/lib/i18n/strings_pt.g.dart index 905a3bc..4c35485 100644 --- a/apps/app_seeds/lib/i18n/strings_pt.g.dart +++ b/apps/app_seeds/lib/i18n/strings_pt.g.dart @@ -213,6 +213,7 @@ class _Translations$about$pt extends Translations$about$en { @override String get website => 'Sítio web'; @override String get openSourceLicenses => 'Licenças de código aberto'; @override String get openSourceLicensesSubtitle => 'Bibliotecas de terceiros e as suas licenças'; + @override String copyright({required Object years}) => '© ${years} Associação Comunes, sob AGPLv3'; } // Path: intro @@ -1002,6 +1003,7 @@ extension on TranslationsPt { 'about.website' => 'Sítio web', 'about.openSourceLicenses' => 'Licenças de código aberto', 'about.openSourceLicensesSubtitle' => 'Bibliotecas de terceiros e as suas licenças', + 'about.copyright' => ({required Object years}) => '© ${years} Associação Comunes, sob AGPLv3', 'intro.skip' => 'Saltar', 'intro.next' => 'Seguinte', 'intro.start' => 'Começar', diff --git a/apps/app_seeds/lib/ui/about_screen.dart b/apps/app_seeds/lib/ui/about_screen.dart index fa72ac6..a09e77c 100644 --- a/apps/app_seeds/lib/ui/about_screen.dart +++ b/apps/app_seeds/lib/ui/about_screen.dart @@ -8,6 +8,19 @@ import 'theme.dart'; /// The app's public website. Shown as a tappable row in [AboutScreen]. const String _websiteUrl = 'https://tanemaki.app'; +/// The year Tanemaki's copyright starts. Ğ1nkgo uses its own first year (2023); +/// Tanemaki's is 2026. +const int _copyrightStartYear = 2026; + +/// A single year (`2026`) until the calendar rolls over, then a range +/// (`2026-2027`), mirroring Ğ1nkgo's legalese line. +String _copyrightYears() { + final int now = DateTime.now().year; + return now <= _copyrightStartYear + ? '$_copyrightStartYear' + : '$_copyrightStartYear-$now'; +} + /// An "about" screen à la Ğ1nkgo: brand header, the human explanation of what /// Tanemaki is and where its name comes from, the app version, license, the /// website, and the bundled open-source licenses page. @@ -62,12 +75,24 @@ class AboutScreen extends StatelessWidget { onTap: () => showLicensePage( context: context, applicationName: t.app.title, + applicationLegalese: t.about.copyright(years: _copyrightYears()), applicationIcon: Padding( padding: const EdgeInsets.all(8), child: Image.asset('assets/logo.png', width: 48), ), ), ), + const Divider(height: 32), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Text( + t.about.copyright(years: _copyrightYears()), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: seedOnSurface.withValues(alpha: 0.7), + ), + ), + ), ], ), );