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", "licenseValue": "AGPL-3.0",
"website": "Website", "website": "Website",
"openSourceLicenses": "Open-source licenses", "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": { "intro": {
"skip": "Skip", "skip": "Skip",

View file

@ -86,7 +86,8 @@
"licenseValue": "AGPL-3.0", "licenseValue": "AGPL-3.0",
"website": "Sitio web", "website": "Sitio web",
"openSourceLicenses": "Licencias de código abierto", "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": { "intro": {
"skip": "Saltar", "skip": "Saltar",

View file

@ -86,7 +86,8 @@
"licenseValue": "AGPL-3.0", "licenseValue": "AGPL-3.0",
"website": "Sítio web", "website": "Sítio web",
"openSourceLicenses": "Licenças de código aberto", "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": { "intro": {
"skip": "Saltar", "skip": "Saltar",

View file

@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang` /// To regenerate, run: `dart run slang`
/// ///
/// Locales: 3 /// 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 // coverage:ignore-file
// ignore_for_file: type=lint, unused_import // ignore_for_file: type=lint, unused_import

View file

@ -360,6 +360,9 @@ class Translations$about$en {
/// en: 'Third-party libraries and their licenses' /// en: 'Third-party libraries and their licenses'
String get openSourceLicensesSubtitle => '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 // Path: intro
@ -1570,6 +1573,7 @@ extension on Translations {
'about.website' => 'Website', 'about.website' => 'Website',
'about.openSourceLicenses' => 'Open-source licenses', 'about.openSourceLicenses' => 'Open-source licenses',
'about.openSourceLicensesSubtitle' => 'Third-party libraries and their licenses', 'about.openSourceLicensesSubtitle' => 'Third-party libraries and their licenses',
'about.copyright' => ({required Object years}) => '© ${years} Comunes Association, under AGPLv3',
'intro.skip' => 'Skip', 'intro.skip' => 'Skip',
'intro.next' => 'Next', 'intro.next' => 'Next',
'intro.start' => 'Get started', '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 website => 'Sitio web';
@override String get openSourceLicenses => 'Licencias de código abierto'; @override String get openSourceLicenses => 'Licencias de código abierto';
@override String get openSourceLicensesSubtitle => 'Bibliotecas de terceros y sus licencias'; @override String get openSourceLicensesSubtitle => 'Bibliotecas de terceros y sus licencias';
@override String copyright({required Object years}) => '© ${years} Asociación Comunes, bajo AGPLv3';
} }
// Path: intro // Path: intro
@ -1006,6 +1007,7 @@ extension on TranslationsEs {
'about.website' => 'Sitio web', 'about.website' => 'Sitio web',
'about.openSourceLicenses' => 'Licencias de código abierto', 'about.openSourceLicenses' => 'Licencias de código abierto',
'about.openSourceLicensesSubtitle' => 'Bibliotecas de terceros y sus licencias', 'about.openSourceLicensesSubtitle' => 'Bibliotecas de terceros y sus licencias',
'about.copyright' => ({required Object years}) => '© ${years} Asociación Comunes, bajo AGPLv3',
'intro.skip' => 'Saltar', 'intro.skip' => 'Saltar',
'intro.next' => 'Siguiente', 'intro.next' => 'Siguiente',
'intro.start' => 'Empezar', '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 website => 'Sítio web';
@override String get openSourceLicenses => 'Licenças de código aberto'; @override String get openSourceLicenses => 'Licenças de código aberto';
@override String get openSourceLicensesSubtitle => 'Bibliotecas de terceiros e as suas licenças'; @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 // Path: intro
@ -1002,6 +1003,7 @@ extension on TranslationsPt {
'about.website' => 'Sítio web', 'about.website' => 'Sítio web',
'about.openSourceLicenses' => 'Licenças de código aberto', 'about.openSourceLicenses' => 'Licenças de código aberto',
'about.openSourceLicensesSubtitle' => 'Bibliotecas de terceiros e as suas licenças', '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.skip' => 'Saltar',
'intro.next' => 'Seguinte', 'intro.next' => 'Seguinte',
'intro.start' => 'Começar', '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]. /// The app's public website. Shown as a tappable row in [AboutScreen].
const String _websiteUrl = 'https://tanemaki.app'; 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 /// 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 /// Tanemaki is and where its name comes from, the app version, license, the
/// website, and the bundled open-source licenses page. /// website, and the bundled open-source licenses page.
@ -62,12 +75,24 @@ class AboutScreen extends StatelessWidget {
onTap: () => showLicensePage( onTap: () => showLicensePage(
context: context, context: context,
applicationName: t.app.title, applicationName: t.app.title,
applicationLegalese: t.about.copyright(years: _copyrightYears()),
applicationIcon: Padding( applicationIcon: Padding(
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
child: Image.asset('assets/logo.png', width: 48), 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),
),
),
),
], ],
), ),
); );