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