feat(about): add Comunes Association copyleft notice à la Ğ1nkgo

This commit is contained in:
vjrj 2026-07-10 02:36:17 +02:00
parent 913e058122
commit 33e0cffd30
8 changed files with 41 additions and 5 deletions

View file

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

View file

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

View file

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

View file

@ -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

View file

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

View file

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

View file

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

View file

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