diff --git a/android/app/src/main/res/drawable-anydpi-v24/ic_stat_name.xml b/android/app/src/main/res/drawable-anydpi-v24/ic_stat_name.xml new file mode 100644 index 0000000..55c5316 --- /dev/null +++ b/android/app/src/main/res/drawable-anydpi-v24/ic_stat_name.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/android/app/src/main/res/drawable-hdpi/ic_stat_name.png b/android/app/src/main/res/drawable-hdpi/ic_stat_name.png new file mode 100644 index 0000000..3aba05f Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_stat_name.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_stat_name.png b/android/app/src/main/res/drawable-mdpi/ic_stat_name.png new file mode 100644 index 0000000..11c776b Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_stat_name.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_stat_name.png b/android/app/src/main/res/drawable-xhdpi/ic_stat_name.png new file mode 100644 index 0000000..00d420b Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_stat_name.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_stat_name.png b/android/app/src/main/res/drawable-xxhdpi/ic_stat_name.png new file mode 100644 index 0000000..3118493 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_stat_name.png differ diff --git a/assets/logo.jpg b/assets/logo.jpg new file mode 100644 index 0000000..9eccfb9 Binary files /dev/null and b/assets/logo.jpg differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 705aa42..bb1ecab 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 9b1cc0e..55c9b23 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 50e7c64..5eb7a51 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 155fa59..ca73bd0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index e1d3423..3f47e8a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index a099679..d148e35 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 079b739..40a94f6 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 50e7c64..5eb7a51 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 831f7e0..9b780f6 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index d7dafae..57da72a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png index 1c36167..5b42650 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png index f746542..3e7cf12 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png index bb75054..13f0902 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png index a319ece..7191999 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index d7dafae..57da72a 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 30a6ca3..83779ef 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png index aee135b..6153e9b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png index 72f88f8..b9d7114 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 0c903b0..55d0abd 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index e943ccf..00dee61 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 08ec6b7..a7b86fe 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/lib/const.dart b/lib/const.dart index 2fca126..d49e800 100644 --- a/lib/const.dart +++ b/lib/const.dart @@ -17,7 +17,7 @@ class NoVerify extends EventVerifier { final ndkCache = DbObjectBox(); final eventVerifier = kDebugMode ? NoVerify() : RustEventVerifier(); -var ndk = Ndk( +final ndk = Ndk( NdkConfig( eventVerifier: eventVerifier, cache: ndkCache, diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 793b348..0557400 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 22 -/// Strings: 1628 (74 per locale) +/// Strings: 1650 (75 per locale) /// -/// Built on 2025-05-28 at 12:41 UTC +/// Built on 2025-05-29 at 10:02 UTC // coverage:ignore-file // ignore_for_file: type=lint, unused_import diff --git a/lib/i18n/strings_ar.g.dart b/lib/i18n/strings_ar.g.dart index 62e3d66..995ea2d 100644 --- a/lib/i18n/strings_ar.g.dart +++ b/lib/i18n/strings_ar.g.dart @@ -54,7 +54,7 @@ class TranslationsAr extends Translations { /// عدد مشاهدي البث @override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ar'))(n, one: '1 مشاهد', - other: '${NumberFormat.decimalPattern('ar').format(n)} المشاهدين', + other: '{n:decimalPattern} المشاهدين', ); @override late final _TranslationsStreamAr stream = _TranslationsStreamAr._(_root); @@ -80,6 +80,7 @@ class _TranslationsStreamAr extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusAr status = _TranslationsStreamStatusAr._(_root); @override String started({required Object timestamp}) => 'بدأ ${timestamp}'; + @override String notification({required Object name}) => '${name} بدأ البث المباشر!'; @override late final _TranslationsStreamChatAr chat = _TranslationsStreamChatAr._(_root); } @@ -381,12 +382,13 @@ extension on TranslationsAr { case 'anon': return 'هوية مخفية'; case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ar'))(n, one: '1 مشاهد', - other: '${NumberFormat.decimalPattern('ar').format(n)} المشاهدين', + other: '{n:decimalPattern} المشاهدين', ); case 'stream.status.live': return 'بث مباشر'; case 'stream.status.ended': return 'انتهى'; case 'stream.status.planned': return 'مخطط'; case 'stream.started': return ({required Object timestamp}) => 'بدأ ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} بدأ البث المباشر!'; case 'stream.chat.disabled': return 'تم تعطيل الدردشة'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'تنتهي المهلة: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_cs.g.dart b/lib/i18n/strings_cs.g.dart index f4351e2..71381bc 100644 --- a/lib/i18n/strings_cs.g.dart +++ b/lib/i18n/strings_cs.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamCs extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusCs status = _TranslationsStreamStatusCs._(_root); @override String started({required Object timestamp}) => 'Založeno ${timestamp}'; + @override String notification({required Object name}) => '${name} byl spuštěn!'; @override late final _TranslationsStreamChatCs chat = _TranslationsStreamChatCs._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsCs { case 'stream.status.ended': return 'KONEC'; case 'stream.status.planned': return 'PLÁNOVANÉ'; case 'stream.started': return ({required Object timestamp}) => 'Založeno ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} byl spuštěn!'; case 'stream.chat.disabled': return 'CHAT ZRUŠEN'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Časový limit vyprší: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_da.g.dart b/lib/i18n/strings_da.g.dart index 1115d6a..9f46e3e 100644 --- a/lib/i18n/strings_da.g.dart +++ b/lib/i18n/strings_da.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamDa extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusDa status = _TranslationsStreamStatusDa._(_root); @override String started({required Object timestamp}) => 'Startet ${timestamp}'; + @override String notification({required Object name}) => '${name} gik live!'; @override late final _TranslationsStreamChatDa chat = _TranslationsStreamChatDa._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsDa { case 'stream.status.ended': return 'AFSLUTTET'; case 'stream.status.planned': return 'PLANLAGT'; case 'stream.started': return ({required Object timestamp}) => 'Startet ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} gik live!'; case 'stream.chat.disabled': return 'CHAT DEAKTIVERET'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Timeout udløber: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_de.g.dart b/lib/i18n/strings_de.g.dart index a44ba5c..11dd63a 100644 --- a/lib/i18n/strings_de.g.dart +++ b/lib/i18n/strings_de.g.dart @@ -42,7 +42,7 @@ class TranslationsDe extends Translations { /// Text, der den Benutzer auffordert, auf den Avatar-Platzhalter zu klicken, um den Upload zu starten @override String get upload_avatar => 'Avatar hochladen'; - /// Überschrift über gelistete Top-Streamer von zaps + /// Überschrift über gelistete Top-Streamer nach Zaps @override String get most_zapped_streamers => 'Meistgezappte Streamer'; /// Kein Benutzer bei der Suche gefunden @@ -51,7 +51,7 @@ class TranslationsDe extends Translations { /// Ein anonymer Benutzer @override String get anon => 'Anon'; - /// Anzahl der Betrachter des Streams + /// Anzahl der Zuschauer des Streams @override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n, one: '1 Zuschauer', other: '${NumberFormat.decimalPattern('de').format(n)} Zuschauer', @@ -80,6 +80,7 @@ class _TranslationsStreamDe extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusDe status = _TranslationsStreamStatusDe._(_root); @override String started({required Object timestamp}) => 'Gestartet ${timestamp}'; + @override String notification({required Object name}) => '${name} ging live!'; @override late final _TranslationsStreamChatDe chat = _TranslationsStreamChatDe._(_root); } @@ -212,7 +213,7 @@ class _TranslationsStreamStatusDe extends TranslationsStreamStatusEn { // Translations @override String get live => 'LIVE'; - @override String get ended => 'ENDED'; + @override String get ended => 'BEENDET'; @override String get planned => 'GEPLANT'; } @@ -224,21 +225,21 @@ class _TranslationsStreamChatDe extends TranslationsStreamChatEn { // Translations @override String get disabled => 'CHAT DEAKTIVIERT'; - @override String disabled_timeout({required Object time}) => 'Die Zeitüberschreitung läuft ab: ${time}'; + @override String disabled_timeout({required Object time}) => 'Timeout läuft ab: ${time}'; - /// Chat-Nachricht mit Zeitüberschreitungsereignissen + /// Chat-Nachricht mit Timeout-Ereignissen @override TextSpan timeout({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ mod, - const TextSpan(text: ' Zeitüberschreitung '), + const TextSpan(text: ' gibt '), user, - const TextSpan(text: ' für '), + const TextSpan(text: ' einen Timeout für '), time, ]); /// Stream beendet Fußzeile am Ende des Chats @override String get ended => 'STREAM BEENDET'; - /// Chatnachricht mit Stream Zaps + /// Chat-Nachricht mit Stream-Zaps @override TextSpan zap({required InlineSpan user, required InlineSpan amount}) => TextSpan(children: [ user, const TextSpan(text: ' hat '), @@ -384,16 +385,17 @@ extension on TranslationsDe { other: '${NumberFormat.decimalPattern('de').format(n)} Zuschauer', ); case 'stream.status.live': return 'LIVE'; - case 'stream.status.ended': return 'ENDED'; + case 'stream.status.ended': return 'BEENDET'; case 'stream.status.planned': return 'GEPLANT'; case 'stream.started': return ({required Object timestamp}) => 'Gestartet ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} ging live!'; case 'stream.chat.disabled': return 'CHAT DEAKTIVIERT'; - case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Die Zeitüberschreitung läuft ab: ${time}'; + case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Timeout läuft ab: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ mod, - const TextSpan(text: ' Zeitüberschreitung '), + const TextSpan(text: ' gibt '), user, - const TextSpan(text: ' für '), + const TextSpan(text: ' einen Timeout für '), time, ]); case 'stream.chat.ended': return 'STREAM BEENDET'; diff --git a/lib/i18n/strings_el.g.dart b/lib/i18n/strings_el.g.dart index a2974b2..1c400cf 100644 --- a/lib/i18n/strings_el.g.dart +++ b/lib/i18n/strings_el.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamEl extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusEl status = _TranslationsStreamStatusEl._(_root); @override String started({required Object timestamp}) => 'Ξεκίνησε ${timestamp}'; + @override String notification({required Object name}) => '${name} βγήκε ζωντανά!'; @override late final _TranslationsStreamChatEl chat = _TranslationsStreamChatEl._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsEl { case 'stream.status.ended': return 'ENDED'; case 'stream.status.planned': return 'ΣΧΕΔΙΑΣΜΟΣ'; case 'stream.started': return ({required Object timestamp}) => 'Ξεκίνησε ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} βγήκε ζωντανά!'; case 'stream.chat.disabled': return 'ΑΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ ΣΥΝΟΜΙΛΊΑ'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Το χρονικό όριο λήγει: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_en.g.dart b/lib/i18n/strings_en.g.dart index bb6ab67..139a8b2 100644 --- a/lib/i18n/strings_en.g.dart +++ b/lib/i18n/strings_en.g.dart @@ -81,6 +81,7 @@ class TranslationsStreamEn { // Translations late final TranslationsStreamStatusEn status = TranslationsStreamStatusEn.internal(_root); String started({required Object timestamp}) => 'Started ${timestamp}'; + String notification({required Object name}) => '${name} went live!'; late final TranslationsStreamChatEn chat = TranslationsStreamChatEn.internal(_root); } @@ -388,6 +389,7 @@ extension on Translations { case 'stream.status.ended': return 'ENDED'; case 'stream.status.planned': return 'PLANNED'; case 'stream.started': return ({required Object timestamp}) => 'Started ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} went live!'; case 'stream.chat.disabled': return 'CHAT DISABLED'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Timeout expires: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_es.g.dart b/lib/i18n/strings_es.g.dart index 4ba0d9b..3c6fba8 100644 --- a/lib/i18n/strings_es.g.dart +++ b/lib/i18n/strings_es.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamEs extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusEs status = _TranslationsStreamStatusEs._(_root); @override String started({required Object timestamp}) => 'Comenzó ${timestamp}'; + @override String notification({required Object name}) => '${name} ¡se ha puesto en marcha!'; @override late final _TranslationsStreamChatEs chat = _TranslationsStreamChatEs._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsEs { case 'stream.status.ended': return 'FIN'; case 'stream.status.planned': return 'PLANIFICADO'; case 'stream.started': return ({required Object timestamp}) => 'Comenzó ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} ¡se ha puesto en marcha!'; case 'stream.chat.disabled': return 'CHAT DESHABILITADO'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'El tiempo de espera expira: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_fi.g.dart b/lib/i18n/strings_fi.g.dart index e619e4e..70c1143 100644 --- a/lib/i18n/strings_fi.g.dart +++ b/lib/i18n/strings_fi.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamFi extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusFi status = _TranslationsStreamStatusFi._(_root); @override String started({required Object timestamp}) => 'Aloitettu ${timestamp}'; + @override String notification({required Object name}) => '${name} meni suoraksi!'; @override late final _TranslationsStreamChatFi chat = _TranslationsStreamChatFi._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsFi { case 'stream.status.ended': return 'ENDED'; case 'stream.status.planned': return 'SUUNNITELTU'; case 'stream.started': return ({required Object timestamp}) => 'Aloitettu ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} meni suoraksi!'; case 'stream.chat.disabled': return 'CHAT POISTETTU KÄYTÖSTÄ'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Aikakatkaisu päättyy: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_fr.g.dart b/lib/i18n/strings_fr.g.dart index d98b7bc..db1f3ae 100644 --- a/lib/i18n/strings_fr.g.dart +++ b/lib/i18n/strings_fr.g.dart @@ -54,7 +54,7 @@ class TranslationsFr extends Translations { /// Nombre de spectateurs du flux @override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n, one: '1 téléspectateur', - other: '${NumberFormat.decimalPattern('fr').format(n)} téléspectateurs', + other: '{n:decimalPattern} téléspectateurs', ); @override late final _TranslationsStreamFr stream = _TranslationsStreamFr._(_root); @@ -80,6 +80,7 @@ class _TranslationsStreamFr extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusFr status = _TranslationsStreamStatusFr._(_root); @override String started({required Object timestamp}) => 'Commencé à ${timestamp}'; + @override String notification({required Object name}) => '${name} est en ligne !'; @override late final _TranslationsStreamChatFr chat = _TranslationsStreamChatFr._(_root); } @@ -381,12 +382,13 @@ extension on TranslationsFr { case 'anon': return 'Anonyme'; case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n, one: '1 téléspectateur', - other: '${NumberFormat.decimalPattern('fr').format(n)} téléspectateurs', + other: '{n:decimalPattern} téléspectateurs', ); case 'stream.status.live': return 'VIVRE'; case 'stream.status.ended': return 'FINI'; case 'stream.status.planned': return 'PRÉVU'; case 'stream.started': return ({required Object timestamp}) => 'Commencé à ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} est en ligne !'; case 'stream.chat.disabled': return 'CHAT DISABLED'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Le délai expire : ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_hu.g.dart b/lib/i18n/strings_hu.g.dart index 5686529..8c6c5ef 100644 --- a/lib/i18n/strings_hu.g.dart +++ b/lib/i18n/strings_hu.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamHu extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusHu status = _TranslationsStreamStatusHu._(_root); @override String started({required Object timestamp}) => 'Elindult ${timestamp}'; + @override String notification({required Object name}) => '${name} elindult!'; @override late final _TranslationsStreamChatHu chat = _TranslationsStreamChatHu._(_root); } @@ -132,7 +133,7 @@ class _TranslationsEmbedHu extends TranslationsEmbedEn { // Translations @override String article_by({required Object name}) => 'Cikk ${name}'; @override String note_by({required Object name}) => '${name} bejegyzése'; - @override String live_stream_by({required Object name}) => 'Élő közvetítés a ${name}oldalon'; + @override String live_stream_by({required Object name}) => 'Élő közvetítés a ${name} oldalon'; } // Path: stream_list @@ -347,7 +348,7 @@ class _TranslationsStreamChatRaidHu extends TranslationsStreamChatRaidEn { @override String from({required Object name}) => 'RAID FROM ${name}'; /// Visszaszámláló időzítő az automatikus lovagláshoz - @override String countdown({required Object time}) => 'Raiding a ${time}oldalon'; + @override String countdown({required Object time}) => 'Raiding a ${time} oldalon'; } // Path: settings.profile.error @@ -388,6 +389,7 @@ extension on TranslationsHu { case 'stream.status.ended': return 'ENDED'; case 'stream.status.planned': return 'TERVEZETT'; case 'stream.started': return ({required Object timestamp}) => 'Elindult ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} elindult!'; case 'stream.chat.disabled': return 'CHAT KIKAPCSOLVA'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Az időkorlát lejár: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ @@ -411,7 +413,7 @@ extension on TranslationsHu { case 'stream.chat.badge.awarded_to': return 'Elnyerte:'; case 'stream.chat.raid.to': return ({required Object name}) => 'RAIDING ${name}'; case 'stream.chat.raid.from': return ({required Object name}) => 'RAID FROM ${name}'; - case 'stream.chat.raid.countdown': return ({required Object time}) => 'Raiding a ${time}oldalon'; + case 'stream.chat.raid.countdown': return ({required Object time}) => 'Raiding a ${time} oldalon'; case 'goal.title': return ({required Object amount}) => 'Cél: ${amount}'; case 'goal.remaining': return ({required Object amount}) => 'Maradék: ${amount}'; case 'goal.complete': return 'TELJES'; @@ -428,7 +430,7 @@ extension on TranslationsHu { case 'button.settings': return 'Beállítások'; case 'embed.article_by': return ({required Object name}) => 'Cikk ${name}'; case 'embed.note_by': return ({required Object name}) => '${name} bejegyzése'; - case 'embed.live_stream_by': return ({required Object name}) => 'Élő közvetítés a ${name}oldalon'; + case 'embed.live_stream_by': return ({required Object name}) => 'Élő közvetítés a ${name} oldalon'; case 'stream_list.following': return 'Követettek bejegyzései'; case 'stream_list.live': return 'Élő'; case 'stream_list.planned': return 'Tervezett'; diff --git a/lib/i18n/strings_it.g.dart b/lib/i18n/strings_it.g.dart index a34b907..5c37364 100644 --- a/lib/i18n/strings_it.g.dart +++ b/lib/i18n/strings_it.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamIt extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusIt status = _TranslationsStreamStatusIt._(_root); @override String started({required Object timestamp}) => 'Avviato ${timestamp}'; + @override String notification({required Object name}) => '${name} è andato in onda!'; @override late final _TranslationsStreamChatIt chat = _TranslationsStreamChatIt._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsIt { case 'stream.status.ended': return 'FINE'; case 'stream.status.planned': return 'PREVISTO'; case 'stream.started': return ({required Object timestamp}) => 'Avviato ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} è andato in onda!'; case 'stream.chat.disabled': return 'CHAT DISABILITATA'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Il timeout scade: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_ja.g.dart b/lib/i18n/strings_ja.g.dart index f833ef2..1123574 100644 --- a/lib/i18n/strings_ja.g.dart +++ b/lib/i18n/strings_ja.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamJa extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusJa status = _TranslationsStreamStatusJa._(_root); @override String started({required Object timestamp}) => '${timestamp} を開始'; + @override String notification({required Object name}) => '${name} がライブを開始した!'; @override late final _TranslationsStreamChatJa chat = _TranslationsStreamChatJa._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsJa { case 'stream.status.ended': return '終了'; case 'stream.status.planned': return '予定'; case 'stream.started': return ({required Object timestamp}) => '${timestamp} を開始'; + case 'stream.notification': return ({required Object name}) => '${name} がライブを開始した!'; case 'stream.chat.disabled': return 'チャット無効'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'タイムアウト: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_ko.g.dart b/lib/i18n/strings_ko.g.dart index 11a8115..3b10552 100644 --- a/lib/i18n/strings_ko.g.dart +++ b/lib/i18n/strings_ko.g.dart @@ -54,7 +54,7 @@ class TranslationsKo extends Translations { /// 스트림 시청자 수 @override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, one: '시청자 1명', - other: '${NumberFormat.decimalPattern('ko').format(n)} 시청자', + other: '{n:decimalPattern} 시청자', ); @override late final _TranslationsStreamKo stream = _TranslationsStreamKo._(_root); @@ -80,6 +80,7 @@ class _TranslationsStreamKo extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusKo status = _TranslationsStreamStatusKo._(_root); @override String started({required Object timestamp}) => '시작 ${timestamp}'; + @override String notification({required Object name}) => '${name} 라이브가 시작되었습니다!'; @override late final _TranslationsStreamChatKo chat = _TranslationsStreamChatKo._(_root); } @@ -381,12 +382,13 @@ extension on TranslationsKo { case 'anon': return 'Anon'; case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, one: '시청자 1명', - other: '${NumberFormat.decimalPattern('ko').format(n)} 시청자', + other: '{n:decimalPattern} 시청자', ); case 'stream.status.live': return '라이브'; case 'stream.status.ended': return '종료'; case 'stream.status.planned': return '계획된'; case 'stream.started': return ({required Object timestamp}) => '시작 ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} 라이브가 시작되었습니다!'; case 'stream.chat.disabled': return '채팅 사용 안 함'; case 'stream.chat.disabled_timeout': return ({required Object time}) => '시간 초과가 만료되었습니다: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_nl.g.dart b/lib/i18n/strings_nl.g.dart index 4adabfb..3114d77 100644 --- a/lib/i18n/strings_nl.g.dart +++ b/lib/i18n/strings_nl.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamNl extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusNl status = _TranslationsStreamStatusNl._(_root); @override String started({required Object timestamp}) => 'Begonnen met ${timestamp}'; + @override String notification({required Object name}) => '${name} ging live!'; @override late final _TranslationsStreamChatNl chat = _TranslationsStreamChatNl._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsNl { case 'stream.status.ended': return 'GESLOTEN'; case 'stream.status.planned': return 'GEPLAND'; case 'stream.started': return ({required Object timestamp}) => 'Begonnen met ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} ging live!'; case 'stream.chat.disabled': return 'CHAT UITGESCHAKELD'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Time-out loopt af: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_pl.g.dart b/lib/i18n/strings_pl.g.dart index c829d87..8c6fc02 100644 --- a/lib/i18n/strings_pl.g.dart +++ b/lib/i18n/strings_pl.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamPl extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusPl status = _TranslationsStreamStatusPl._(_root); @override String started({required Object timestamp}) => 'Start ${timestamp}'; + @override String notification({required Object name}) => '${name} został uruchomiony!'; @override late final _TranslationsStreamChatPl chat = _TranslationsStreamChatPl._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsPl { case 'stream.status.ended': return 'ZAKOŃCZONY'; case 'stream.status.planned': return 'PLANOWANE'; case 'stream.started': return ({required Object timestamp}) => 'Start ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} został uruchomiony!'; case 'stream.chat.disabled': return 'CZAT WYŁĄCZONY'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Upłynął limit czasu: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_pt.g.dart b/lib/i18n/strings_pt.g.dart index c4bf786..ca35ca3 100644 --- a/lib/i18n/strings_pt.g.dart +++ b/lib/i18n/strings_pt.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamPt extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusPt status = _TranslationsStreamStatusPt._(_root); @override String started({required Object timestamp}) => 'Iniciado em ${timestamp}'; + @override String notification({required Object name}) => '${name} foi ao ar!'; @override late final _TranslationsStreamChatPt chat = _TranslationsStreamChatPt._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsPt { case 'stream.status.ended': return 'FINALIZADO'; case 'stream.status.planned': return 'PLANEJADO'; case 'stream.started': return ({required Object timestamp}) => 'Iniciado em ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} foi ao ar!'; case 'stream.chat.disabled': return 'BATE-PAPO DESATIVADO'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'O tempo limite expira: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_ro.g.dart b/lib/i18n/strings_ro.g.dart index 4673894..f863aba 100644 --- a/lib/i18n/strings_ro.g.dart +++ b/lib/i18n/strings_ro.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamRo extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusRo status = _TranslationsStreamStatusRo._(_root); @override String started({required Object timestamp}) => 'A început ${timestamp}'; + @override String notification({required Object name}) => '${name} a intrat în direct!'; @override late final _TranslationsStreamChatRo chat = _TranslationsStreamChatRo._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsRo { case 'stream.status.ended': return 'TERMINAT'; case 'stream.status.planned': return 'PLANIFICATE'; case 'stream.started': return ({required Object timestamp}) => 'A început ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} a intrat în direct!'; case 'stream.chat.disabled': return 'CHAT DEZACTIVAT'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Timpul expiră: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_ru.g.dart b/lib/i18n/strings_ru.g.dart index 976aa26..c2da09d 100644 --- a/lib/i18n/strings_ru.g.dart +++ b/lib/i18n/strings_ru.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamRu extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusRu status = _TranslationsStreamStatusRu._(_root); @override String started({required Object timestamp}) => 'Начало ${timestamp}'; + @override String notification({required Object name}) => '${name} запустился!'; @override late final _TranslationsStreamChatRu chat = _TranslationsStreamChatRu._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsRu { case 'stream.status.ended': return 'КОНЕЦ'; case 'stream.status.planned': return 'ПЛАНИРУЕМЫЙ'; case 'stream.started': return ({required Object timestamp}) => 'Начало ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} запустился!'; case 'stream.chat.disabled': return 'ЧАТ ОТКЛЮЧЕН'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Таймаут истекает: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_sv.g.dart b/lib/i18n/strings_sv.g.dart index 98d349e..347ac66 100644 --- a/lib/i18n/strings_sv.g.dart +++ b/lib/i18n/strings_sv.g.dart @@ -39,19 +39,19 @@ class TranslationsSv extends Translations { // Translations - /// Text som uppmanar användaren att trycka på avatarplatshållaren för att påbörja uppladdningen + /// Text som uppmanar användaren att trycka på avatar platshållaren för att påbörja uppladdningen @override String get upload_avatar => 'Ladda upp avatar'; - /// Rubrik över listade toppstreamers av zaps - @override String get most_zapped_streamers => 'De flesta zappade streamers'; + /// Rubrik över listade topp streamers av zaps + @override String get most_zapped_streamers => 'De flest zappade streamers'; /// Ingen användare hittades vid sökning @override String get no_user_found => 'Ingen användare hittades'; /// En anonym användare - @override String get anon => 'Anon'; + @override String get anon => 'Anno'; - /// Antal tittare på streamingen + /// Antal tittare på strömmingen @override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, one: '1 tittare', other: '${NumberFormat.decimalPattern('sv').format(n)} tittare', @@ -79,7 +79,8 @@ class _TranslationsStreamSv extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusSv status = _TranslationsStreamStatusSv._(_root); - @override String started({required Object timestamp}) => 'Startade ${timestamp}'; + @override String started({required Object timestamp}) => 'Startad ${timestamp}'; + @override String notification({required Object name}) => '${name} gick live!'; @override late final _TranslationsStreamChatSv chat = _TranslationsStreamChatSv._(_root); } @@ -112,7 +113,7 @@ class _TranslationsButtonSv extends TranslationsButtonEn { /// Knapptext för följ-knappen @override String get follow => 'Följ'; - /// Knapptext för avföljningsknappen + /// Knapptext för sluta följa knappen @override String get unfollow => 'Sluta följa'; @override String get mute => 'Tysta'; @@ -235,7 +236,7 @@ class _TranslationsStreamChatSv extends TranslationsStreamChatEn { time, ]); - /// Stream avslutade sidfoten längst ner på chatten + /// Streama slutade sidfot längst ned i chatten @override String get ended => 'STREAM AVSLUTAD'; /// Chattmeddelande som visar strömavbrott @@ -272,8 +273,8 @@ class _TranslationsSettingsProfileSv extends TranslationsSettingsProfileEn { // Translations @override String get display_name => 'Visa namn'; @override String get about => 'Om'; - @override String get nip05 => 'Nostr Adress'; - @override String get lud16 => 'Adress för blixtnedslag'; + @override String get nip05 => 'Nostr adress'; + @override String get lud16 => 'Lightning-adress'; @override late final _TranslationsSettingsProfileErrorSv error = _TranslationsSettingsProfileErrorSv._(_root); } @@ -284,9 +285,9 @@ class _TranslationsSettingsWalletSv extends TranslationsSettingsWalletEn { final TranslationsSv _root; // ignore: unused_field // Translations - @override String get connect_wallet => 'Connect plånbok (NWC nostr+walletconnect://)'; + @override String get connect_wallet => 'Anslut plånbok (NWC nostr+walletconnect://)'; @override String get disconnect_wallet => 'Koppla bort plånboken'; - @override String get connect_1tap => '1-Tap-anslutning'; + @override String get connect_1tap => '1-tryck anslutning'; @override String get paste => 'Klistra in URL'; @override late final _TranslationsSettingsWalletErrorSv error = _TranslationsSettingsWalletErrorSv._(_root); } @@ -312,8 +313,8 @@ class _TranslationsStreamChatWriteSv extends TranslationsStreamChatWriteEn { /// Etikett på inmatningsrutan för chattmeddelanden @override String get label => 'Skriv meddelande'; - /// Chattinmatningsmeddelande som visas när användaren endast är inloggad med pubkey - @override String get no_signer => 'Det går inte att skriva meddelanden med npub-inloggning'; + /// Chattinmatningsmeddelande som visas när användaren endast är inloggad med publik nyckel + @override String get no_signer => 'Det går inte att skriva meddelanden med n-pub inloggning'; /// Chattinmatningsmeddelande som visas när användaren är utloggad @override String get login => 'Logga in för att skicka meddelanden'; @@ -327,7 +328,7 @@ class _TranslationsStreamChatBadgeSv extends TranslationsStreamChatBadgeEn { // Translations - /// Rubrik över lista över användare som tilldelats en badge + /// Rubrik över listan över användare som tilldelas ett märke @override String get awarded_to => 'Tilldelas till:'; } @@ -339,14 +340,14 @@ class _TranslationsStreamChatRaidSv extends TranslationsStreamChatRaidEn { // Translations - /// Chatta raidmeddelande till en annan ström + /// Chatt raid meddelande till en annan ström @override String to({required Object name}) => 'RAIDING ${name}'; - /// Chat raid-meddelande från en annan ström + /// Chatt raid meddelande från en annan ström @override String from({required Object name}) => 'RAID FRÅN ${name}'; - /// Nedräkningstimer för auto-raiding - @override String countdown({required Object time}) => 'Raiding på ${time}'; + /// Nedräkningstimer för auto- radiering + @override String countdown({required Object time}) => 'Radiering i ${time}'; } // Path: settings.profile.error @@ -366,7 +367,7 @@ class _TranslationsSettingsWalletErrorSv extends TranslationsSettingsWalletError final TranslationsSv _root; // ignore: unused_field // Translations - @override String get logged_out => 'Kan inte ansluta plånbok när du är inloggad'; + @override String get logged_out => 'Kan inte ansluta plånbok när du är utloggad'; @override String get nwc_auth_event_not_found => 'Inget autentiseringshändelse för plånbok hittades'; } @@ -376,9 +377,9 @@ extension on TranslationsSv { dynamic _flatMapFunction(String path) { switch (path) { case 'upload_avatar': return 'Ladda upp avatar'; - case 'most_zapped_streamers': return 'De flesta zappade streamers'; + case 'most_zapped_streamers': return 'De flest zappade streamers'; case 'no_user_found': return 'Ingen användare hittades'; - case 'anon': return 'Anon'; + case 'anon': return 'Anno'; case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n, one: '1 tittare', other: '${NumberFormat.decimalPattern('sv').format(n)} tittare', @@ -386,7 +387,8 @@ extension on TranslationsSv { case 'stream.status.live': return 'LIVE'; case 'stream.status.ended': return 'AVSLUTAD'; case 'stream.status.planned': return 'PLANERADE'; - case 'stream.started': return ({required Object timestamp}) => 'Startade ${timestamp}'; + case 'stream.started': return ({required Object timestamp}) => 'Startad ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} gick live!'; case 'stream.chat.disabled': return 'CHAT AVSTÄNGD'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Tidsgränsen går ut: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ @@ -404,12 +406,12 @@ extension on TranslationsSv { const TextSpan(text: ' sats'), ]); case 'stream.chat.write.label': return 'Skriv meddelande'; - case 'stream.chat.write.no_signer': return 'Det går inte att skriva meddelanden med npub-inloggning'; + case 'stream.chat.write.no_signer': return 'Det går inte att skriva meddelanden med n-pub inloggning'; case 'stream.chat.write.login': return 'Logga in för att skicka meddelanden'; case 'stream.chat.badge.awarded_to': return 'Tilldelas till:'; case 'stream.chat.raid.to': return ({required Object name}) => 'RAIDING ${name}'; case 'stream.chat.raid.from': return ({required Object name}) => 'RAID FRÅN ${name}'; - case 'stream.chat.raid.countdown': return ({required Object time}) => 'Raiding på ${time}'; + case 'stream.chat.raid.countdown': return ({required Object time}) => 'Radiering i ${time}'; case 'goal.title': return ({required Object amount}) => 'Mål: ${amount}'; case 'goal.remaining': return ({required Object amount}) => 'Kvarvarande: ${amount}'; case 'goal.complete': return 'KOMPLETT'; @@ -448,14 +450,14 @@ extension on TranslationsSv { case 'settings.button_wallet': return 'Inställningar för plånbok'; case 'settings.profile.display_name': return 'Visa namn'; case 'settings.profile.about': return 'Om'; - case 'settings.profile.nip05': return 'Nostr Adress'; - case 'settings.profile.lud16': return 'Adress för blixtnedslag'; + case 'settings.profile.nip05': return 'Nostr adress'; + case 'settings.profile.lud16': return 'Lightning-adress'; case 'settings.profile.error.logged_out': return 'Kan inte redigera profil när jag är utloggad'; - case 'settings.wallet.connect_wallet': return 'Connect plånbok (NWC nostr+walletconnect://)'; + case 'settings.wallet.connect_wallet': return 'Anslut plånbok (NWC nostr+walletconnect://)'; case 'settings.wallet.disconnect_wallet': return 'Koppla bort plånboken'; - case 'settings.wallet.connect_1tap': return '1-Tap-anslutning'; + case 'settings.wallet.connect_1tap': return '1-tryck anslutning'; case 'settings.wallet.paste': return 'Klistra in URL'; - case 'settings.wallet.error.logged_out': return 'Kan inte ansluta plånbok när du är inloggad'; + case 'settings.wallet.error.logged_out': return 'Kan inte ansluta plånbok när du är utloggad'; case 'settings.wallet.error.nwc_auth_event_not_found': return 'Inget autentiseringshändelse för plånbok hittades'; case 'login.username': return 'Användarnamn'; case 'login.amber': return 'Logga in med Amber'; diff --git a/lib/i18n/strings_tr.g.dart b/lib/i18n/strings_tr.g.dart index cfd85de..291e4b9 100644 --- a/lib/i18n/strings_tr.g.dart +++ b/lib/i18n/strings_tr.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamTr extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusTr status = _TranslationsStreamStatusTr._(_root); @override String started({required Object timestamp}) => 'Başlatıldı ${timestamp}'; + @override String notification({required Object name}) => '${name} yayına girdi!'; @override late final _TranslationsStreamChatTr chat = _TranslationsStreamChatTr._(_root); } @@ -231,8 +232,9 @@ class _TranslationsStreamChatTr extends TranslationsStreamChatEn { mod, const TextSpan(text: ' zaman aşımına uğradı '), user, - const TextSpan(text: ' için '), + const TextSpan(text: ' '), time, + const TextSpan(text: 'için'), ]); /// Sohbetin alt kısmında akış sona erdi altbilgisi @@ -343,7 +345,7 @@ class _TranslationsStreamChatRaidTr extends TranslationsStreamChatRaidEn { @override String to({required Object name}) => 'RAIDING ${name}'; /// Başka bir akıştan sohbet baskını mesajı - @override String from({required Object name}) => '${name}ADRESINDEN RAID'; + @override String from({required Object name}) => '${name} ADRESINDEN RAID'; /// Otomatik sürüş için geri sayım sayacı @override String countdown({required Object time}) => '${time}adresinde baskın'; @@ -387,14 +389,16 @@ extension on TranslationsTr { case 'stream.status.ended': return 'SONLANDI'; case 'stream.status.planned': return 'PLANLANMIŞ'; case 'stream.started': return ({required Object timestamp}) => 'Başlatıldı ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} yayına girdi!'; case 'stream.chat.disabled': return 'SOHBET DEVRE DIŞI'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Zaman aşımı sona eriyor: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ mod, const TextSpan(text: ' zaman aşımına uğradı '), user, - const TextSpan(text: ' için '), + const TextSpan(text: ' '), time, + const TextSpan(text: 'için'), ]); case 'stream.chat.ended': return 'YAYIN SONLANDI'; case 'stream.chat.zap': return ({required InlineSpan user, required InlineSpan amount}) => TextSpan(children: [ @@ -408,7 +412,7 @@ extension on TranslationsTr { case 'stream.chat.write.login': return 'Mesaj göndermek için lütfen giriş yapın'; case 'stream.chat.badge.awarded_to': return 'Ödüllendirildi:'; case 'stream.chat.raid.to': return ({required Object name}) => 'RAIDING ${name}'; - case 'stream.chat.raid.from': return ({required Object name}) => '${name}ADRESINDEN RAID'; + case 'stream.chat.raid.from': return ({required Object name}) => '${name} ADRESINDEN RAID'; case 'stream.chat.raid.countdown': return ({required Object time}) => '${time}adresinde baskın'; case 'goal.title': return ({required Object amount}) => 'Hedef: ${amount}'; case 'goal.remaining': return ({required Object amount}) => 'Kalan: ${amount}'; diff --git a/lib/i18n/strings_uk.g.dart b/lib/i18n/strings_uk.g.dart index 596d79d..167d119 100644 --- a/lib/i18n/strings_uk.g.dart +++ b/lib/i18n/strings_uk.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamUk extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusUk status = _TranslationsStreamStatusUk._(_root); @override String started({required Object timestamp}) => 'Запустив ${timestamp}'; + @override String notification({required Object name}) => '${name} запрацював!'; @override late final _TranslationsStreamChatUk chat = _TranslationsStreamChatUk._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsUk { case 'stream.status.ended': return 'ЗАКІНЧЕНО'; case 'stream.status.planned': return 'ЗАПЛАНОВАНО'; case 'stream.started': return ({required Object timestamp}) => 'Запустив ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} запрацював!'; case 'stream.chat.disabled': return 'ЧАТ ВІДКЛЮЧЕНО'; case 'stream.chat.disabled_timeout': return ({required Object time}) => 'Тайм-аут закінчився: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/strings_zh.g.dart b/lib/i18n/strings_zh.g.dart index 87371e7..15239f8 100644 --- a/lib/i18n/strings_zh.g.dart +++ b/lib/i18n/strings_zh.g.dart @@ -80,6 +80,7 @@ class _TranslationsStreamZh extends TranslationsStreamEn { // Translations @override late final _TranslationsStreamStatusZh status = _TranslationsStreamStatusZh._(_root); @override String started({required Object timestamp}) => '開始 ${timestamp}'; + @override String notification({required Object name}) => '${name} 已啟用!'; @override late final _TranslationsStreamChatZh chat = _TranslationsStreamChatZh._(_root); } @@ -387,6 +388,7 @@ extension on TranslationsZh { case 'stream.status.ended': return '結束'; case 'stream.status.planned': return '計劃'; case 'stream.started': return ({required Object timestamp}) => '開始 ${timestamp}'; + case 'stream.notification': return ({required Object name}) => '${name} 已啟用!'; case 'stream.chat.disabled': return '關閉聊天'; case 'stream.chat.disabled_timeout': return ({required Object time}) => '超時過期: ${time}'; case 'stream.chat.timeout': return ({required InlineSpan mod, required InlineSpan user, required InlineSpan time}) => TextSpan(children: [ diff --git a/lib/i18n/translated/ar.i18n.yaml b/lib/i18n/translated/ar.i18n.yaml index 2fc9858..5034a0e 100644 --- a/lib/i18n/translated/ar.i18n.yaml +++ b/lib/i18n/translated/ar.i18n.yaml @@ -10,7 +10,7 @@ no_user_found: لم يتم العثور على مستخدم anon: هوية مخفية viewers: one: 1 مشاهد - other: "${n:decimalPattern} المشاهدين" + other: "{n:decimalPattern} المشاهدين" "@viewers": description: عدد مشاهدي البث "@anon": @@ -21,10 +21,11 @@ stream: ended: انتهى planned: مخطط started: بدأ $timestamp + notification: ${name} بدأ البث المباشر! chat: disabled: تم تعطيل الدردشة disabled_timeout: "تنتهي المهلة: $time" - timeout(rich): $mod انتهى الوقت $user لـ $time + timeout(rich): $mod انتهى الوقت $user لـ ${time} "@timeout": description: رسالة دردشة تظهر أحداث المهلة ended: انتهى البث diff --git a/lib/i18n/translated/cs.i18n.yaml b/lib/i18n/translated/cs.i18n.yaml index ec1c7ff..1a08f68 100644 --- a/lib/i18n/translated/cs.i18n.yaml +++ b/lib/i18n/translated/cs.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: KONEC planned: PLÁNOVANÉ started: Založeno $timestamp + notification: ${name} byl spuštěn! chat: disabled: CHAT ZRUŠEN disabled_timeout: "Časový limit vyprší: $time" - timeout(rich): $mod vypršel čas $user pro $time + timeout(rich): $mod vypršel čas $user pro ${time} "@timeout": description: Zpráva chatu zobrazující události časového limitu ended: STREAM UKONČEN diff --git a/lib/i18n/translated/da.i18n.yaml b/lib/i18n/translated/da.i18n.yaml index cddd14a..56436e1 100644 --- a/lib/i18n/translated/da.i18n.yaml +++ b/lib/i18n/translated/da.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: AFSLUTTET planned: PLANLAGT started: Startet $timestamp + notification: ${name} gik live! chat: disabled: CHAT DEAKTIVERET disabled_timeout: "Timeout udløber: $time" - timeout(rich): $mod udløbet $user for $time + timeout(rich): $mod udløbet $user for ${time} "@timeout": description: Chatbesked, der viser timeout-hændelser ended: STREAM AFSLUTTET diff --git a/lib/i18n/translated/de.i18n.yaml b/lib/i18n/translated/de.i18n.yaml index b376caa..89a347f 100644 --- a/lib/i18n/translated/de.i18n.yaml +++ b/lib/i18n/translated/de.i18n.yaml @@ -4,7 +4,7 @@ upload_avatar: Avatar hochladen klicken, um den Upload zu starten most_zapped_streamers: Meistgezappte Streamer "@most_zapped_streamers": - description: Überschrift über gelistete Top-Streamer von zaps + description: Überschrift über gelistete Top-Streamer nach Zaps no_user_found: Kein Benutzer gefunden "@no_user_found": description: Kein Benutzer bei der Suche gefunden @@ -13,27 +13,28 @@ viewers: one: 1 Zuschauer other: ${n:decimalPattern} Zuschauer "@viewers": - description: Anzahl der Betrachter des Streams + description: Anzahl der Zuschauer des Streams "@anon": description: Ein anonymer Benutzer stream: status: live: LIVE - ended: ENDED + ended: BEENDET planned: GEPLANT started: Gestartet $timestamp + notification: ${name} ging live! chat: disabled: CHAT DEAKTIVIERT - disabled_timeout: "Die Zeitüberschreitung läuft ab: $time" - timeout(rich): $mod Zeitüberschreitung $user für $time + disabled_timeout: "Timeout läuft ab: $time" + timeout(rich): $mod gibt $user einen Timeout für ${time} "@timeout": - description: Chat-Nachricht mit Zeitüberschreitungsereignissen + description: Chat-Nachricht mit Timeout-Ereignissen ended: STREAM BEENDET "@ended": description: Stream beendet Fußzeile am Ende des Chats zap(rich): $user hat $amount sats gezappt "@zap": - description: Chatnachricht mit Stream Zaps + description: Chat-Nachricht mit Stream-Zaps write: label: Nachricht schreiben "@label": diff --git a/lib/i18n/translated/el.i18n.yaml b/lib/i18n/translated/el.i18n.yaml index f51ee12..2816050 100644 --- a/lib/i18n/translated/el.i18n.yaml +++ b/lib/i18n/translated/el.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: ENDED planned: ΣΧΕΔΙΑΣΜΟΣ started: Ξεκίνησε $timestamp + notification: ${name} βγήκε ζωντανά! chat: disabled: ΑΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ ΣΥΝΟΜΙΛΊΑ disabled_timeout: "Το χρονικό όριο λήγει: $time" - timeout(rich): $mod χρονομετρημένη λήξη $user για $time + timeout(rich): $mod χρονομετρημένη λήξη $user για ${time} "@timeout": description: Μήνυμα συνομιλίας που εμφανίζει συμβάντα timeout ended: STREAM ΤΕΛΕΙΩΣΕ diff --git a/lib/i18n/translated/en.i18n.yaml b/lib/i18n/translated/en.i18n.yaml index f823a43..64a3a80 100644 --- a/lib/i18n/translated/en.i18n.yaml +++ b/lib/i18n/translated/en.i18n.yaml @@ -21,6 +21,7 @@ stream: ended: ENDED planned: PLANNED started: Started $timestamp + notification: ${name} went live! chat: disabled: CHAT DISABLED disabled_timeout: "Timeout expires: $time" diff --git a/lib/i18n/translated/es.i18n.yaml b/lib/i18n/translated/es.i18n.yaml index 21965dd..d1a01ea 100644 --- a/lib/i18n/translated/es.i18n.yaml +++ b/lib/i18n/translated/es.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: FIN planned: PLANIFICADO started: Comenzó $timestamp + notification: ${name} ¡se ha puesto en marcha! chat: disabled: CHAT DESHABILITADO disabled_timeout: "El tiempo de espera expira: $time" - timeout(rich): $mod timed out $user para $time + timeout(rich): $mod timed out $user para ${time} "@timeout": description: Mensaje de chat que muestra los eventos de tiempo de espera ended: STREAM FINED diff --git a/lib/i18n/translated/fi.i18n.yaml b/lib/i18n/translated/fi.i18n.yaml index a186198..72b2651 100644 --- a/lib/i18n/translated/fi.i18n.yaml +++ b/lib/i18n/translated/fi.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: ENDED planned: SUUNNITELTU started: Aloitettu $timestamp + notification: ${name} meni suoraksi! chat: disabled: CHAT POISTETTU KÄYTÖSTÄ disabled_timeout: "Aikakatkaisu päättyy: $time" - timeout(rich): $mod ajastettu $user for $time + timeout(rich): $mod ajastettu $user for ${time} "@timeout": description: Chat-viesti, joka näyttää aikakatkaisutapahtumat ended: STREAM PÄÄTTYNYT diff --git a/lib/i18n/translated/fr.i18n.yaml b/lib/i18n/translated/fr.i18n.yaml index c832b88..af3868d 100644 --- a/lib/i18n/translated/fr.i18n.yaml +++ b/lib/i18n/translated/fr.i18n.yaml @@ -11,7 +11,7 @@ no_user_found: Aucun utilisateur trouvé anon: Anonyme viewers: one: 1 téléspectateur - other: "${n:decimalPattern} téléspectateurs" + other: "{n:decimalPattern} téléspectateurs" "@viewers": description: Nombre de spectateurs du flux "@anon": @@ -22,10 +22,11 @@ stream: ended: FINI planned: PRÉVU started: Commencé à $timestamp + notification: ${name} est en ligne ! chat: disabled: CHAT DISABLED disabled_timeout: "Le délai expire : $time" - timeout(rich): $mod $user a expiré dans le temps pour $time + timeout(rich): $mod $user a expiré dans le temps pour ${time} "@timeout": description: Message de chat indiquant les événements de dépassement de délai ended: STREAM ENDED diff --git a/lib/i18n/translated/hu.i18n.yaml b/lib/i18n/translated/hu.i18n.yaml index c05e1f5..6e517d7 100644 --- a/lib/i18n/translated/hu.i18n.yaml +++ b/lib/i18n/translated/hu.i18n.yaml @@ -22,6 +22,7 @@ stream: ended: ENDED planned: TERVEZETT started: Elindult $timestamp + notification: ${name} elindult! chat: disabled: CHAT KIKAPCSOLVA disabled_timeout: "Az időkorlát lejár: $time" @@ -56,7 +57,7 @@ stream: from: RAID FROM $name "@from": description: Chat raid üzenet egy másik folyamból - countdown: Raiding a ${time}oldalon + countdown: Raiding a ${time} oldalon "@countdown": description: Visszaszámláló időzítő az automatikus lovagláshoz goal: @@ -84,7 +85,7 @@ button: embed: article_by: Cikk ${name} note_by: $name bejegyzése - live_stream_by: Élő közvetítés a ${name}oldalon + live_stream_by: Élő közvetítés a ${name} oldalon stream_list: following: Követettek bejegyzései live: Élő diff --git a/lib/i18n/translated/it.i18n.yaml b/lib/i18n/translated/it.i18n.yaml index 564f63f..e64fc77 100644 --- a/lib/i18n/translated/it.i18n.yaml +++ b/lib/i18n/translated/it.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: FINE planned: PREVISTO started: Avviato $timestamp + notification: ${name} è andato in onda! chat: disabled: CHAT DISABILITATA disabled_timeout: "Il timeout scade: $time" - timeout(rich): $mod time out $user per $time + timeout(rich): $mod time out $user per ${time} "@timeout": description: Messaggio di chat che mostra gli eventi di timeout ended: STREAM ENDED diff --git a/lib/i18n/translated/ja.i18n.yaml b/lib/i18n/translated/ja.i18n.yaml index fae6f63..eb2d4a5 100644 --- a/lib/i18n/translated/ja.i18n.yaml +++ b/lib/i18n/translated/ja.i18n.yaml @@ -21,10 +21,11 @@ stream: ended: 終了 planned: 予定 started: $timestamp を開始 + notification: ${name} がライブを開始した! chat: disabled: チャット無効 disabled_timeout: タイムアウト: $time - timeout(rich): $mod タイムアウト $user for $time + timeout(rich): $mod タイムアウト $user for ${time} "@timeout": description: タイムアウトイベントを表示するチャットメッセージ ended: 配信終了 diff --git a/lib/i18n/translated/ko.i18n.yaml b/lib/i18n/translated/ko.i18n.yaml index fa6c6ab..dac0291 100644 --- a/lib/i18n/translated/ko.i18n.yaml +++ b/lib/i18n/translated/ko.i18n.yaml @@ -10,7 +10,7 @@ no_user_found: 사용자를 찾을 수 없습니다. anon: Anon viewers: one: 시청자 1명 - other: "${n:decimalPattern} 시청자" + other: "{n:decimalPattern} 시청자" "@viewers": description: 스트림 시청자 수 "@anon": @@ -21,10 +21,11 @@ stream: ended: 종료 planned: 계획된 started: 시작 $timestamp + notification: ${name} 라이브가 시작되었습니다! chat: disabled: 채팅 사용 안 함 disabled_timeout: "시간 초과가 만료되었습니다: $time" - timeout(rich): $mod 시간 초과됨 $user $time + timeout(rich): $mod 시간 초과됨 $user ${time} "@timeout": description: 시간 초과 이벤트를 표시하는 채팅 메시지 ended: 스트림 종료 diff --git a/lib/i18n/translated/nl.i18n.yaml b/lib/i18n/translated/nl.i18n.yaml index d69e6e7..2472e13 100644 --- a/lib/i18n/translated/nl.i18n.yaml +++ b/lib/i18n/translated/nl.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: GESLOTEN planned: GEPLAND started: Begonnen met $timestamp + notification: ${name} ging live! chat: disabled: CHAT UITGESCHAKELD disabled_timeout: "Time-out loopt af: $time" - timeout(rich): $mod timed out $user voor $time + timeout(rich): $mod timed out $user voor ${time} "@timeout": description: Chatbericht met time-outgebeurtenissen ended: STREAM BEËINDIGD diff --git a/lib/i18n/translated/pl.i18n.yaml b/lib/i18n/translated/pl.i18n.yaml index 884466f..5c55af7 100644 --- a/lib/i18n/translated/pl.i18n.yaml +++ b/lib/i18n/translated/pl.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: ZAKOŃCZONY planned: PLANOWANE started: Start $timestamp + notification: ${name} został uruchomiony! chat: disabled: CZAT WYŁĄCZONY disabled_timeout: "Upłynął limit czasu: $time" - timeout(rich): $mod upłynął limit czasu $user dla $time + timeout(rich): $mod upłynął limit czasu $user dla ${time} "@timeout": description: Komunikat czatu pokazujący zdarzenia przekroczenia limitu czasu ended: TRANSMISJA ZAKOŃCZONA diff --git a/lib/i18n/translated/pt.i18n.yaml b/lib/i18n/translated/pt.i18n.yaml index 714e514..349b05c 100644 --- a/lib/i18n/translated/pt.i18n.yaml +++ b/lib/i18n/translated/pt.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: FINALIZADO planned: PLANEJADO started: Iniciado em $timestamp + notification: ${name} foi ao ar! chat: disabled: BATE-PAPO DESATIVADO disabled_timeout: "O tempo limite expira: $time" - timeout(rich): $mod Tempo esgotado $user para $time + timeout(rich): $mod Tempo esgotado $user para ${time} "@timeout": description: Mensagem de bate-papo mostrando eventos de tempo limite ended: TRANSMISSÃO ENCERRADA diff --git a/lib/i18n/translated/ro.i18n.yaml b/lib/i18n/translated/ro.i18n.yaml index 80f7fba..5eba125 100644 --- a/lib/i18n/translated/ro.i18n.yaml +++ b/lib/i18n/translated/ro.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: TERMINAT planned: PLANIFICATE started: A început $timestamp + notification: ${name} a intrat în direct! chat: disabled: CHAT DEZACTIVAT disabled_timeout: "Timpul expiră: $time" - timeout(rich): $mod Timed out $user pentru $time + timeout(rich): $mod Timed out $user pentru ${time} "@timeout": description: Mesaj de chat care afișează evenimentele de timeout ended: STREAM ÎNCHEIAT diff --git a/lib/i18n/translated/ru.i18n.yaml b/lib/i18n/translated/ru.i18n.yaml index fa82d00..bf8f345 100644 --- a/lib/i18n/translated/ru.i18n.yaml +++ b/lib/i18n/translated/ru.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: КОНЕЦ planned: ПЛАНИРУЕМЫЙ started: Начало $timestamp + notification: ${name} запустился! chat: disabled: ЧАТ ОТКЛЮЧЕН disabled_timeout: "Таймаут истекает: $time" - timeout(rich): $mod тайм-аут $user для $time + timeout(rich): $mod тайм-аут $user для ${time} "@timeout": description: Сообщение в чате, показывающее события по тайм-ауту ended: ТРАНСЛЯЦИЯ ОКОНЧЕНА diff --git a/lib/i18n/translated/sv.i18n.yaml b/lib/i18n/translated/sv.i18n.yaml index 081e2cc..5e5558f 100644 --- a/lib/i18n/translated/sv.i18n.yaml +++ b/lib/i18n/translated/sv.i18n.yaml @@ -1,19 +1,19 @@ upload_avatar: Ladda upp avatar "@upload_avatar": - description: Text som uppmanar användaren att trycka på avatarplatshållaren för + description: Text som uppmanar användaren att trycka på avatar platshållaren för att påbörja uppladdningen -most_zapped_streamers: De flesta zappade streamers +most_zapped_streamers: De flest zappade streamers "@most_zapped_streamers": - description: Rubrik över listade toppstreamers av zaps + description: Rubrik över listade topp streamers av zaps no_user_found: Ingen användare hittades "@no_user_found": description: Ingen användare hittades vid sökning -anon: Anon +anon: Anno viewers: one: 1 tittare other: ${n:decimalPattern} tittare "@viewers": - description: Antal tittare på streamingen + description: Antal tittare på strömmingen "@anon": description: En anonym användare stream: @@ -21,16 +21,17 @@ stream: live: LIVE ended: AVSLUTAD planned: PLANERADE - started: Startade $timestamp + started: Startad $timestamp + notification: ${name} gick live! chat: disabled: CHAT AVSTÄNGD disabled_timeout: "Tidsgränsen går ut: $time" - timeout(rich): $mod tidsbegränsad $user för $time + timeout(rich): $mod tidsbegränsad $user för ${time} "@timeout": description: Chattmeddelande som visar timeout-händelser ended: STREAM AVSLUTAD "@ended": - description: Stream avslutade sidfoten längst ner på chatten + description: Streama slutade sidfot längst ned i chatten zap(rich): $user zapped $amount sats "@zap": description: Chattmeddelande som visar strömavbrott @@ -38,27 +39,27 @@ stream: label: Skriv meddelande "@label": description: Etikett på inmatningsrutan för chattmeddelanden - no_signer: Det går inte att skriva meddelanden med npub-inloggning + no_signer: Det går inte att skriva meddelanden med n-pub inloggning "@no_signer": description: Chattinmatningsmeddelande som visas när användaren endast är - inloggad med pubkey + inloggad med publik nyckel login: Logga in för att skicka meddelanden "@login": description: Chattinmatningsmeddelande som visas när användaren är utloggad badge: awarded_to: "Tilldelas till:" "@awarded_to": - description: Rubrik över lista över användare som tilldelats en badge + description: Rubrik över listan över användare som tilldelas ett märke raid: - to: RAIDING $name + to: RAIDING ${name} "@to": - description: Chatta raidmeddelande till en annan ström - from: RAID FRÅN $name + description: Chatt raid meddelande till en annan ström + from: RAID FRÅN ${name} "@from": - description: Chat raid-meddelande från en annan ström - countdown: Raiding på $time + description: Chatt raid meddelande från en annan ström + countdown: Radiering i ${time} "@countdown": - description: Nedräkningstimer för auto-raiding + description: Nedräkningstimer för auto- radiering goal: title: "Mål: $amount" remaining: "Kvarvarande: $amount" @@ -74,7 +75,7 @@ button: description: Knapptext för följ-knappen unfollow: Sluta följa "@unfollow": - description: Knapptext för avföljningsknappen + description: Knapptext för sluta följa knappen mute: Tysta unmute: Avtysta share: Dela @@ -82,9 +83,9 @@ button: connect: Anslut settings: Inställningar embed: - article_by: Artikel av $name + article_by: Artikel av ${name} note_by: Anteckning av $name - live_stream_by: Direktsändning via $name + live_stream_by: Direktsändning via ${name} stream_list: following: Följer live: Live @@ -114,17 +115,17 @@ settings: profile: display_name: Visa namn about: Om - nip05: Nostr Adress - lud16: Adress för blixtnedslag + nip05: Nostr adress + lud16: Lightning-adress error: logged_out: Kan inte redigera profil när jag är utloggad wallet: - connect_wallet: Connect plånbok (NWC nostr+walletconnect://) + connect_wallet: Anslut plånbok (NWC nostr+walletconnect://) disconnect_wallet: Koppla bort plånboken - connect_1tap: 1-Tap-anslutning + connect_1tap: 1-tryck anslutning paste: Klistra in URL error: - logged_out: Kan inte ansluta plånbok när du är inloggad + logged_out: Kan inte ansluta plånbok när du är utloggad nwc_auth_event_not_found: Inget autentiseringshändelse för plånbok hittades login: username: Användarnamn diff --git a/lib/i18n/translated/tr.i18n.yaml b/lib/i18n/translated/tr.i18n.yaml index f373be0..e3eb059 100644 --- a/lib/i18n/translated/tr.i18n.yaml +++ b/lib/i18n/translated/tr.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: SONLANDI planned: PLANLANMIŞ started: Başlatıldı $timestamp + notification: ${name} yayına girdi! chat: disabled: SOHBET DEVRE DIŞI disabled_timeout: "Zaman aşımı sona eriyor: $time" - timeout(rich): $mod zaman aşımına uğradı $user için $time + timeout(rich): $mod zaman aşımına uğradı $user ${time}için "@timeout": description: Zaman aşımı olaylarını gösteren sohbet mesajı ended: YAYIN SONLANDI @@ -53,7 +54,7 @@ stream: to: RAIDING ${name} "@to": description: Başka bir akışa sohbet baskını mesajı - from: ${name}ADRESINDEN RAID + from: ${name} ADRESINDEN RAID "@from": description: Başka bir akıştan sohbet baskını mesajı countdown: ${time}adresinde baskın diff --git a/lib/i18n/translated/uk.i18n.yaml b/lib/i18n/translated/uk.i18n.yaml index f2d2413..716c1a5 100644 --- a/lib/i18n/translated/uk.i18n.yaml +++ b/lib/i18n/translated/uk.i18n.yaml @@ -22,10 +22,11 @@ stream: ended: ЗАКІНЧЕНО planned: ЗАПЛАНОВАНО started: Запустив $timestamp + notification: ${name} запрацював! chat: disabled: ЧАТ ВІДКЛЮЧЕНО disabled_timeout: "Тайм-аут закінчився: $time" - timeout(rich): $mod таймінг $user для $time + timeout(rich): $mod таймінг $user для ${time} "@timeout": description: Повідомлення в чаті про події тайм-ауту ended: СТРІМ ЗАКІНЧИВСЯ diff --git a/lib/i18n/translated/zh.i18n.yaml b/lib/i18n/translated/zh.i18n.yaml index 5972107..9e161db 100644 --- a/lib/i18n/translated/zh.i18n.yaml +++ b/lib/i18n/translated/zh.i18n.yaml @@ -21,10 +21,11 @@ stream: ended: 結束 planned: 計劃 started: 開始 $timestamp + notification: ${name} 已啟用! chat: disabled: 關閉聊天 disabled_timeout: 超時過期: $time - timeout(rich): $mod 超時 $user for $time + timeout(rich): $mod 超時 $user for ${time} "@timeout": description: 顯示逾時事件的聊天訊息 ended: 串流結束 diff --git a/lib/main.dart b/lib/main.dart index 23a029f..e79ff00 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -28,7 +28,7 @@ Future main() async { builder: () => MainPlayer(), config: AudioServiceConfig( androidNotificationChannelId: "io.nostrlabs.zap_stream_flutter.player", - androidNotificationChannelName: "player", + androidNotificationChannelName: "Player Status", androidNotificationOngoing: true ), ); diff --git a/lib/notifications.dart b/lib/notifications.dart index 5e3882d..3341a36 100644 --- a/lib/notifications.dart +++ b/lib/notifications.dart @@ -10,11 +10,14 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:ndk/ndk.dart'; +import 'package:ndk_objectbox/ndk_objectbox.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:zap_stream_flutter/const.dart'; import 'package:http/http.dart' as http; import 'package:zap_stream_flutter/firebase_options.dart'; +import 'package:zap_stream_flutter/i18n/strings.g.dart'; import 'package:zap_stream_flutter/utils.dart'; +import 'package:zap_stream_flutter/widgets/profile.dart'; class Notepush { final String base; @@ -183,6 +186,82 @@ class NotificationsStore extends ValueNotifier { } } +Future _initLocalNotifications() async { + await localNotifications.initialize( + InitializationSettings( + android: AndroidInitializationSettings("@drawable/ic_stat_name"), + iOS: DarwinInitializationSettings(), + ), + ); +} + +@pragma('vm:entry-point') +Future _onBackgroundNotification(RemoteMessage msg) async { + await LocaleSettings.useDeviceLocale(); + final cache = DbObjectBox(attach: true); + await _initLocalNotifications(); + await _handleNotification(msg, cache); +} + +Future _onNotification(RemoteMessage msg) async { + await _handleNotification(msg, ndkCache); +} + +Future _handleNotification(RemoteMessage msg, DbObjectBox cache) async { + final notification = msg.notification; + if (notification != null && notification.android != null) { + final String? json = msg.data["nostr_event"]; + + final event = + json != null ? Nip01Event.fromJson(JsonCodec().decode(json)) : null; + await _showNotification(notification, ndkCache, event); + } +} + +Future _showNotification( + RemoteNotification notification, + DbObjectBox cache, + Nip01Event? event, +) async { + final stream = event != null ? StreamEvent(event) : null; + final hostProfile = + stream != null ? await cache.loadMetadata(stream.info.host) : null; + final newTitle = + hostProfile != null + ? t.stream.notification( + name: ProfileNameWidget.nameFromProfile(hostProfile), + ) + : null; + + localNotifications.show( + notification.hashCode, + newTitle ?? notification.title, + stream?.info.title ?? notification.body, + NotificationDetails( + android: AndroidNotificationDetails( + notification.android!.channelId ?? "fcm", + "Push Notifications", + category: AndroidNotificationCategory.social + ), + ), + ); +} + +Future _onOpenMessage(RemoteMessage msg) async { + try { + final notification = msg.notification; + final String? json = msg.data["nostr_event"]; + if (notification != null && json != null) { + // Just launch the URL because we support deep links + final event = Nip01Event.fromJson(JsonCodec().decode(json)); + final stream = StreamEvent(event); + launchUrl(Uri.parse("https://zap.stream/${stream.link}")); + } + } catch (e) { + developer.log("Failed to process push notification\n ${e.toString()}"); + } +} + // global notifications store final notifications = NotificationsStore(null); @@ -191,47 +270,20 @@ Future setupNotifications() async { final signer = ndk.accounts.getLoggedAccount()?.signer; if (signer != null) { - final pusher = Notepush(dotenv.env["NOTEPUSH_URL"]!, signer: signer); - final fbase = FirebaseMessaging.instance; - FirebaseMessaging.onMessage.listen((msg) { - developer.log(msg.notification?.body ?? ""); - final notification = msg.notification; - if (notification != null && notification.android != null) { - FlutterLocalNotificationsPlugin().show( - notification.hashCode, - notification.title, - notification.body, - NotificationDetails( - android: AndroidNotificationDetails( - notification.android!.channelId ?? "fcm", - "fcm", - ), - ), - ); - } - }); - FirebaseMessaging.onMessageOpenedApp.listen((msg) { - try { - final notification = msg.notification; - final String? json = msg.data["nostr_event"]; - if (notification != null && json != null) { - // Just launch the URL because we support deep links - final event = Nip01Event.fromJson(JsonCodec().decode(json)); - final stream = StreamEvent(event); - launchUrl(Uri.parse("https://zap.stream/${stream.link}")); - } - } catch (e) { - developer.log("Failed to process push notification\n ${e.toString()}"); - } - }); + FirebaseMessaging.onMessage.listen(_onNotification); + //FirebaseMessaging.onBackgroundMessage(_onBackgroundNotification); + FirebaseMessaging.onMessageOpenedApp.listen(_onOpenMessage); - final settings = await fbase.requestPermission(provisional: true); - await fbase.setAutoInitEnabled(true); - await fbase.setForegroundNotificationPresentationOptions( - alert: true, - badge: true, - sound: true, + final settings = await FirebaseMessaging.instance.requestPermission( + provisional: true, ); + await FirebaseMessaging.instance.setAutoInitEnabled(true); + await FirebaseMessaging.instance + .setForegroundNotificationPresentationOptions( + alert: true, + badge: true, + sound: true, + ); if (Platform.isIOS) { final apnsToken = await FirebaseMessaging.instance.getAPNSToken(); @@ -239,13 +291,10 @@ Future setupNotifications() async { throw "APNS token not availble"; } } - await localNotifications.initialize( - InitializationSettings( - android: AndroidInitializationSettings("@mipmap/ic_launcher"), - iOS: DarwinInitializationSettings(), - ), - ); - fbase.onTokenRefresh.listen((token) async { + await _initLocalNotifications(); + + final pusher = Notepush(dotenv.env["NOTEPUSH_URL"]!, signer: signer); + FirebaseMessaging.instance.onTokenRefresh.listen((token) async { developer.log("NEW TOKEN: $token"); await pusher.register(token); await pusher.setNotificationSettings(token, [30_311]); diff --git a/pubspec.yaml b/pubspec.yaml index 7f96bc3..fe7eb8e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -84,4 +84,4 @@ flutter: flutter_launcher_icons: ios: true - image_path: assets/logo.png \ No newline at end of file + image_path: assets/logo.jpg \ No newline at end of file