From 3cf1e0cdac6a616c3617d8ed90ffbeb8c4238fa6 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 10 Nov 2022 18:42:33 +0100 Subject: [PATCH] updated about translators --- lib/widgets/about/about_page.dart | 3 + lib/widgets/about/credits.dart | 26 +--- lib/widgets/about/translators.dart | 149 ++++++++++++++++++++ lib/widgets/common/basic/animated_text.dart | 6 +- untranslated.json | 118 ---------------- 5 files changed, 157 insertions(+), 145 deletions(-) create mode 100644 lib/widgets/about/translators.dart diff --git a/lib/widgets/about/about_page.dart b/lib/widgets/about/about_page.dart index 3766f7f82..b0aa49436 100644 --- a/lib/widgets/about/about_page.dart +++ b/lib/widgets/about/about_page.dart @@ -2,6 +2,7 @@ import 'package:aves/widgets/about/app_ref.dart'; import 'package:aves/widgets/about/bug_report.dart'; import 'package:aves/widgets/about/credits.dart'; import 'package:aves/widgets/about/licenses.dart'; +import 'package:aves/widgets/about/translators.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; @@ -35,6 +36,8 @@ class AboutPage extends StatelessWidget { Divider(), AboutCredits(), Divider(), + AboutTranslators(), + Divider(), ], ), ), diff --git a/lib/widgets/about/credits.dart b/lib/widgets/about/credits.dart index 52fb62b5c..4a5c6e059 100644 --- a/lib/widgets/about/credits.dart +++ b/lib/widgets/about/credits.dart @@ -1,26 +1,11 @@ import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/link_chip.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class AboutCredits extends StatelessWidget { const AboutCredits({super.key}); - static const translators = { - 'Bahasa Indonesia': 'MeFinity', - 'Deutsch': 'JanWaldhorn', - 'Español (México)': 'n-berenice', - 'Italiano': 'glemco', - 'Nederlands': 'Martijn Fabrie, Koen Koppens', - 'Português (Brasil)': 'Jonatas De Almeida Barros', - 'Türkçe': 'metezd', - 'Ελληνικά': 'Emmanouil Papavergis', - 'Русский': 'D3ZOXY, kha84', - '日本語': 'Maki', - '简体中文': '小默, Aerowolf', - }; - @override Widget build(BuildContext context) { final l10n = context.l10n; @@ -36,6 +21,7 @@ class AboutCredits extends StatelessWidget { child: Text(l10n.aboutCreditsSectionTitle, style: Constants.knownTitleTextStyle), ), ), + const SizedBox(height: 8), Text.rich( TextSpan( children: [ @@ -52,15 +38,7 @@ class AboutCredits extends StatelessWidget { ], ), ), - ConstrainedBox( - constraints: const BoxConstraints(minHeight: 48), - child: Align( - alignment: AlignmentDirectional.centerStart, - child: Text(l10n.aboutTranslatorsSectionTitle, style: Constants.knownTitleTextStyle), - ), - ), - const InfoRowGroup(info: translators), - const SizedBox(height: 16), + const SizedBox(height: 8), ], ), ); diff --git a/lib/widgets/about/translators.dart b/lib/widgets/about/translators.dart new file mode 100644 index 000000000..106558d94 --- /dev/null +++ b/lib/widgets/about/translators.dart @@ -0,0 +1,149 @@ +import 'dart:math'; + +import 'package:aves/utils/constants.dart'; +import 'package:aves/widgets/common/basic/animated_text.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; + +class AboutTranslators extends StatelessWidget { + const AboutTranslators({super.key}); + + static const translators = { + Contributor('D3ZOXY', 'its.ghost.message@gmail.com'), + Contributor('JanWaldhorn', 'weblate@jwh.anonaddy.com'), + Contributor('n-berenice', null), + Contributor('Jonatas de Almeida Barros', 'ajonatas56@gmail.com'), + Contributor('MeFinity', 'me.dot.finity@gmail.com'), + Contributor('Maki', null), + Contributor('HiSubway', 'shenyusoftware@gmail.com'), + Contributor('glemco', null), + Contributor('Aerowolf', null), + Contributor('小默', null), + Contributor('metezd', 'itoldyouthat@protonmail.com'), + Contributor('Martijn Fabrie', null), + Contributor('Koen Koppens', 'koenkoppens@proton.me'), + Contributor('Emmanouil Papavergis', null), + Contributor('kha84', 'khalukhin@gmail.com'), + Contributor('gallegonovato', 'fran-carro@hotmail.es'), + Contributor('Havokdan', 'havokdan@yahoo.com.br'), + Contributor('Jean Mareilles', 'waged1266@tutanota.com'), + Contributor('이정희', 'daemul72@gmail.com'), + Contributor('Translator-3000', 'weblate.m1d0h@8shield.net'), + // Contributor('Allan Nordhøy', 'epost@anotheragency.no'), + // Contributor('Piotr K', '1337.kelt@gmail.com'), + // Contributor('امیر جهانگرد', 'ijahangard.a@gmail.com'), + }; + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: const BoxConstraints(minHeight: 48), + child: Align( + alignment: AlignmentDirectional.centerStart, + child: Text(l10n.aboutTranslatorsSectionTitle, style: Constants.knownTitleTextStyle), + ), + ), + const SizedBox(height: 8), + _RandomTextSpanHighlighter( + spans: translators.map((v) => v.name).toList(), + highlightColor: Theme.of(context).colorScheme.onPrimary, + ), + const SizedBox(height: 16), + ], + ), + ); + } +} + +class _RandomTextSpanHighlighter extends StatefulWidget { + final List spans; + final Color highlightColor; + + const _RandomTextSpanHighlighter({ + required this.spans, + required this.highlightColor, + }); + + @override + State<_RandomTextSpanHighlighter> createState() => _RandomTextSpanHighlighterState(); +} + +class _RandomTextSpanHighlighterState extends State<_RandomTextSpanHighlighter> with SingleTickerProviderStateMixin { + late final AnimationController _controller; + late final Animation _animatedStyle; + late final TextStyle _baseStyle; + int _highlightedIndex = 0; + + @override + void initState() { + super.initState(); + + _baseStyle = TextStyle( + shadows: [ + Shadow( + color: widget.highlightColor.withOpacity(0), + blurRadius: 0, + ) + ], + ); + final highlightStyle = TextStyle( + shadows: [ + Shadow( + color: widget.highlightColor, + blurRadius: 3, + ) + ], + ); + + _controller = AnimationController( + duration: const Duration(seconds: 1), + vsync: this, + ) + ..addListener(() => setState(() {})) + ..addStatusListener((status) { + if (status == AnimationStatus.forward) { + _highlightedIndex = Random().nextInt(widget.spans.length); + } + }) + ..repeat(reverse: true); + _animatedStyle = ShadowedTextStyleTween(begin: _baseStyle, end: highlightStyle).animate(CurvedAnimation( + parent: _controller, + curve: Curves.linear, + )); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Text.rich( + TextSpan( + children: [ + ...widget.spans.expandIndexed((i, v) => [ + if (i != 0) const TextSpan(text: ' • '), + TextSpan(text: v, style: i == _highlightedIndex ? _animatedStyle.value : _baseStyle), + ]) + ], + ), + strutStyle: const StrutStyle(height: 1.5, forceStrutHeight: true), + ); + } +} + +class Contributor { + final String name; + final String? weblateEmail; + + const Contributor(this.name, this.weblateEmail); +} diff --git a/lib/widgets/common/basic/animated_text.dart b/lib/widgets/common/basic/animated_text.dart index 80c7c04a9..c4b1a2eca 100644 --- a/lib/widgets/common/basic/animated_text.dart +++ b/lib/widgets/common/basic/animated_text.dart @@ -33,7 +33,7 @@ class _AnimatedTextState extends State with SingleTickerProviderSt ) ..value = 1 ..addListener(() => setState(() {})); - _style = _ShadowedTextStyleTween(begin: widget.changedStyle, end: widget.style).animate(CurvedAnimation( + _style = ShadowedTextStyleTween(begin: widget.changedStyle, end: widget.style).animate(CurvedAnimation( parent: _controller, curve: widget.curve, )); @@ -64,8 +64,8 @@ class _AnimatedTextState extends State with SingleTickerProviderSt } } -class _ShadowedTextStyleTween extends Tween { - _ShadowedTextStyleTween({super.begin, super.end}); +class ShadowedTextStyleTween extends Tween { + ShadowedTextStyleTween({super.begin, super.end}); @override TextStyle lerp(double t) { diff --git a/untranslated.json b/untranslated.json index 684d75c5a..1a8a4f0d4 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,12 +1,4 @@ { - "de": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "el": [ "editEntryLocationDialogSetCustom", "settingsAllowMediaManagement", @@ -1046,29 +1038,6 @@ "filePickerUseThisFolder" ], - "id": [ - "chipActionFilterOut", - "chipActionFilterIn", - "viewerTransitionNone", - "widgetOpenPageHome", - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "durationDialogSeconds", - "editEntryLocationDialogSetCustom", - "tileLayoutMosaic", - "albumGroupType", - "albumMimeTypeMixed", - "settingsDisabled", - "settingsSlideshowAnimatedZoomEffect", - "settingsAllowMediaManagement", - "settingsWidgetOpenPage", - "statsTopAlbumsSectionTitle", - "wallpaperUseScrollEffect", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "ja": [ "chipActionFilterOut", "chipActionFilterIn", @@ -1191,19 +1160,6 @@ "tagPlaceholderPlace" ], - "nl": [ - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "durationDialogSeconds", - "editEntryLocationDialogSetCustom", - "aboutLinkPolicy", - "policyPageTitle", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "pl": [ "itemCount", "timeSeconds", @@ -1693,80 +1649,6 @@ "filePickerUseThisFolder" ], - "pt": [ - "editEntryLocationDialogSetCustom", - "settingsAllowMediaManagement", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - - "tr": [ - "chipActionFilterOut", - "chipActionFilterIn", - "slideshowActionResume", - "slideshowActionShowInCollection", - "entryInfoActionEditTitleDescription", - "filterNoDateLabel", - "filterNoTitleLabel", - "filterOnThisDayLabel", - "filterRecentlyAddedLabel", - "videoPlaybackSkip", - "videoPlaybackMuted", - "videoPlaybackWithSound", - "viewerTransitionSlide", - "viewerTransitionParallax", - "viewerTransitionFade", - "viewerTransitionZoomIn", - "viewerTransitionNone", - "wallpaperTargetHome", - "wallpaperTargetLock", - "wallpaperTargetHomeLock", - "widgetOpenPageHome", - "widgetOpenPageCollection", - "widgetOpenPageViewer", - "durationDialogSeconds", - "editEntryLocationDialogSetCustom", - "menuActionSlideshow", - "viewDialogReverseSortOrder", - "tileLayoutMosaic", - "sortOrderNewestFirst", - "sortOrderOldestFirst", - "sortOrderAtoZ", - "sortOrderZtoA", - "sortOrderHighestFirst", - "sortOrderLowestFirst", - "sortOrderLargestFirst", - "sortOrderSmallestFirst", - "albumGroupType", - "albumMimeTypeMixed", - "searchMetadataSectionTitle", - "settingsDisabled", - "settingsConfirmationAfterMoveToBinItems", - "settingsViewerGestureSideTapNext", - "settingsViewerSlideshowTile", - "settingsViewerSlideshowPageTitle", - "settingsSlideshowRepeat", - "settingsSlideshowShuffle", - "settingsSlideshowFillScreen", - "settingsSlideshowAnimatedZoomEffect", - "settingsSlideshowTransitionTile", - "settingsSlideshowIntervalTile", - "settingsSlideshowVideoPlaybackTile", - "settingsSlideshowVideoPlaybackDialogTitle", - "settingsAllowMediaManagement", - "settingsScreenSaverPageTitle", - "settingsWidgetShowOutline", - "settingsWidgetOpenPage", - "statsTopAlbumsSectionTitle", - "viewerSetWallpaperButtonLabel", - "viewerInfoLabelDescription", - "wallpaperUseScrollEffect", - "tagEditorSectionPlaceholders", - "tagPlaceholderCountry", - "tagPlaceholderPlace" - ], - "zh": [ "editEntryLocationDialogSetCustom", "settingsAllowMediaManagement",