mirror of
https://github.com/nostrlabs-io/zap-stream-flutter.git
synced 2025-06-16 20:08:50 +00:00
Compare commits
71 Commits
Author | SHA1 | Date | |
---|---|---|---|
befd7c014b
|
|||
0a75665bde
|
|||
46b809ff58
|
|||
8f41ed6d0e
|
|||
acbf311972
|
|||
43c3b3fc31
|
|||
7838607cfc
|
|||
9a0811760c
|
|||
5af5bab20c
|
|||
4db0317c0b
|
|||
4e4061b808
|
|||
3dbb247890
|
|||
825152c6bf
|
|||
99ec8cfbf7
|
|||
b8422291a5
|
|||
a0b2275bea
|
|||
182f34ff71
|
|||
57a67106fd
|
|||
b1a1e4131b
|
|||
9f91135572
|
|||
a5736aa3d3
|
|||
c865f24b2c
|
|||
f8f5860b64
|
|||
a500e0b3da
|
|||
86a8181aea
|
|||
cb1c995023
|
|||
46d60994a8
|
|||
3eac1c4bfa
|
|||
e6bad40608
|
|||
e332dc9c6c
|
|||
a870aa0888
|
|||
8173eab05d
|
|||
e91807e80e
|
|||
c79ea1b872
|
|||
b630b59e53
|
|||
c7435d5772
|
|||
b5e0822d6c
|
|||
dcf42e7a78
|
|||
244a0aad38
|
|||
556377263d
|
|||
7c3e9afc3e
|
|||
d85c93b7ed
|
|||
4ca9460a6c
|
|||
21f69e433e
|
|||
52953a4c16
|
|||
54a61322cf
|
|||
4c6d5b995f
|
|||
be66446e85
|
|||
787a848257
|
|||
2d855362e4
|
|||
5e28b40c5c
|
|||
12b4475c60
|
|||
e0e9175536
|
|||
465c6f222e
|
|||
eefbbc2f73
|
|||
f094569ed4
|
|||
f5a03d756b
|
|||
1f8124b708
|
|||
42d9293ecb
|
|||
e3dc985b0d
|
|||
9e5108930a
|
|||
0b83881a3d
|
|||
efd95837ea
|
|||
3e18f7544e
|
|||
f1e518a0d7
|
|||
1a912e88ce
|
|||
f8a2df0097
|
|||
fb32b1cfdb
|
|||
994b40dda9
|
|||
e6531bff7c
|
|||
3e672f9e28
|
1
.env.development
Normal file
1
.env.development
Normal file
@ -0,0 +1 @@
|
|||||||
|
NOTEPUSH_URL="http://10.0.2.2:8000"
|
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
@ -12,6 +12,7 @@ jobs:
|
|||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: stable
|
channel: stable
|
||||||
|
flutter-version: 3.29.3
|
||||||
- run: flutter pub get
|
- run: flutter pub get
|
||||||
- run: flutter build appbundle
|
- run: flutter build appbundle
|
||||||
env:
|
env:
|
||||||
|
1
.github/workflows/release.yml
vendored
1
.github/workflows/release.yml
vendored
@ -16,6 +16,7 @@ jobs:
|
|||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: stable
|
channel: stable
|
||||||
|
flutter-version: 3.29.3
|
||||||
- run: flutter pub get
|
- run: flutter pub get
|
||||||
- name: Build apk
|
- name: Build apk
|
||||||
env:
|
env:
|
||||||
|
@ -8,6 +8,9 @@ import java.util.Properties
|
|||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("com.android.application")
|
id("com.android.application")
|
||||||
|
// START: FlutterFire Configuration
|
||||||
|
id("com.google.gms.google-services")
|
||||||
|
// END: FlutterFire Configuration
|
||||||
id("kotlin-android")
|
id("kotlin-android")
|
||||||
id("dev.flutter.flutter-gradle-plugin")
|
id("dev.flutter.flutter-gradle-plugin")
|
||||||
}
|
}
|
||||||
@ -82,6 +85,7 @@ android {
|
|||||||
ndkVersion = flutter.ndkVersion
|
ndkVersion = flutter.ndkVersion
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
|
isCoreLibraryDesugaringEnabled = true
|
||||||
sourceCompatibility = JavaVersion.VERSION_11
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
targetCompatibility = JavaVersion.VERSION_11
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
}
|
}
|
||||||
@ -108,3 +112,7 @@ android {
|
|||||||
flutter {
|
flutter {
|
||||||
source = "../.."
|
source = "../.."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
|
||||||
|
}
|
29
android/app/google-services.json
Normal file
29
android/app/google-services.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "953923151748",
|
||||||
|
"project_id": "nostrlabs",
|
||||||
|
"storage_bucket": "nostrlabs.firebasestorage.app"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:953923151748:android:8536cdc7f75edc9f9e9fd1",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "io.nostrlabs.zap_stream_flutter"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyAdpxIN8DR1-mh8MCjHU0mDtaUAk6xda6w"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"appinvite_service": {
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
@ -24,6 +24,13 @@
|
|||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
<intent-filter android:autoVerify="true">
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="http" android:host="zap.stream" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<!-- Don't delete the meta-data below.
|
<!-- Don't delete the meta-data below.
|
||||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
@ -46,4 +53,10 @@
|
|||||||
<data android:mimeType="text/plain"/>
|
<data android:mimeType="text/plain"/>
|
||||||
</intent>
|
</intent>
|
||||||
</queries>
|
</queries>
|
||||||
|
<meta-data
|
||||||
|
android:name="firebase_messaging_auto_init_enabled"
|
||||||
|
android:value="false" />
|
||||||
|
<meta-data
|
||||||
|
android:name="firebase_analytics_collection_enabled"
|
||||||
|
android:value="false" />
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@ -19,6 +19,9 @@ pluginManagement {
|
|||||||
plugins {
|
plugins {
|
||||||
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
|
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
|
||||||
id("com.android.application") version "8.7.0" apply false
|
id("com.android.application") version "8.7.0" apply false
|
||||||
|
// START: FlutterFire Configuration
|
||||||
|
id("com.google.gms.google-services") version("4.3.15") apply false
|
||||||
|
// END: FlutterFire Configuration
|
||||||
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
|
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BIN
assets/category/art.jpeg
Normal file
BIN
assets/category/art.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 660 KiB |
BIN
assets/category/gaming.jpeg
Normal file
BIN
assets/category/gaming.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 333 KiB |
BIN
assets/category/irl.jpeg
Normal file
BIN
assets/category/irl.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 521 KiB |
BIN
assets/category/music.jpeg
Normal file
BIN
assets/category/music.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 300 KiB |
BIN
assets/category/talk.jpeg
Normal file
BIN
assets/category/talk.jpeg
Normal file
Binary file not shown.
After Width: | Height: | Size: 402 KiB |
25
firebase.json
Normal file
25
firebase.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"flutter": {
|
||||||
|
"platforms": {
|
||||||
|
"android": {
|
||||||
|
"default": {
|
||||||
|
"projectId": "nostrlabs",
|
||||||
|
"appId": "1:953923151748:android:8536cdc7f75edc9f9e9fd1",
|
||||||
|
"fileOutput": "android/app/google-services.json"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dart": {
|
||||||
|
"lib/firebase_options.dart": {
|
||||||
|
"projectId": "nostrlabs",
|
||||||
|
"configurations": {
|
||||||
|
"android": "1:953923151748:android:8536cdc7f75edc9f9e9fd1",
|
||||||
|
"ios": "1:953923151748:ios:30ec9a230e55fe139e9fd1",
|
||||||
|
"macos": "1:953923151748:ios:19516d42a1cc02229e9fd1",
|
||||||
|
"web": "1:953923151748:web:f04633c33f9343b19e9fd1",
|
||||||
|
"windows": "1:953923151748:web:6b9a6be6798644909e9fd1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
143
lib/app.dart
Normal file
143
lib/app.dart
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/category.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/hashtag.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/home.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/login.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/login_input.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/new_account.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/profile.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/settings_profile.dart';
|
||||||
|
import 'package:zap_stream_flutter/pages/stream.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/header.dart';
|
||||||
|
|
||||||
|
void runZapStream() {
|
||||||
|
runApp(
|
||||||
|
MaterialApp.router(
|
||||||
|
title: "zap.stream",
|
||||||
|
supportedLocales: AppLocaleUtils.supportedLocales,
|
||||||
|
localizationsDelegates: GlobalMaterialLocalizations.delegates,
|
||||||
|
theme: ThemeData.localize(
|
||||||
|
ThemeData(colorScheme: ColorScheme.dark(), highlightColor: PRIMARY_1),
|
||||||
|
TextTheme(),
|
||||||
|
),
|
||||||
|
routerConfig: GoRouter(
|
||||||
|
routes: [
|
||||||
|
ShellRoute(
|
||||||
|
observers: [routeObserver],
|
||||||
|
builder:
|
||||||
|
(context, state, child) => SafeArea(
|
||||||
|
child: Scaffold(body: child, backgroundColor: Colors.black),
|
||||||
|
),
|
||||||
|
routes: [
|
||||||
|
GoRoute(path: "/", builder: (ctx, state) => HomePage()),
|
||||||
|
ShellRoute(
|
||||||
|
builder: (context, state, child) {
|
||||||
|
return Container(
|
||||||
|
margin: EdgeInsets.only(top: 50),
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 5),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
spacing: 20,
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
|
child: Image.asset("assets/logo.png", height: 150),
|
||||||
|
),
|
||||||
|
child,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
routes: [
|
||||||
|
GoRoute(
|
||||||
|
path: "/login",
|
||||||
|
builder: (ctx, state) => LoginPage(),
|
||||||
|
routes: [
|
||||||
|
GoRoute(
|
||||||
|
path: "key",
|
||||||
|
builder: (ctx, state) => LoginInputPage(),
|
||||||
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: "new",
|
||||||
|
builder: (context, state) => NewAccountPage(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: StreamPage.path,
|
||||||
|
builder: (ctx, state) {
|
||||||
|
if (state.extra is StreamEvent) {
|
||||||
|
return StreamPage(stream: state.extra as StreamEvent);
|
||||||
|
} else {
|
||||||
|
return StreamPage.loader(state.pathParameters["id"]!);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: "/p/:id",
|
||||||
|
builder: (ctx, state) {
|
||||||
|
return ProfilePage(pubkey: state.pathParameters["id"]!);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: "/t/:id",
|
||||||
|
builder: (context, state) {
|
||||||
|
return HashtagPage(tag: state.pathParameters["id"]!);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: "/category/:id",
|
||||||
|
builder: (context, state) {
|
||||||
|
return CategoryPage(
|
||||||
|
category: state.pathParameters["id"]!,
|
||||||
|
info: state.extra as GameInfo?,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ShellRoute(
|
||||||
|
observers: [routeObserver],
|
||||||
|
builder:
|
||||||
|
(context, state, child) =>
|
||||||
|
Column(children: [HeaderWidget(), child]),
|
||||||
|
routes: [
|
||||||
|
GoRoute(
|
||||||
|
path: "/settings",
|
||||||
|
builder: (context, state) => SizedBox(),
|
||||||
|
routes: [
|
||||||
|
GoRoute(
|
||||||
|
path: "profile",
|
||||||
|
builder: (context, state) => SettingsProfilePage(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: "/:id",
|
||||||
|
redirect: (context, state) {
|
||||||
|
final id = state.pathParameters["id"]!;
|
||||||
|
if (id.startsWith("naddr1") ||
|
||||||
|
id.startsWith("nevent1") ||
|
||||||
|
id.startsWith("note1")) {
|
||||||
|
return "/e/$id";
|
||||||
|
} else if (id.startsWith("npub1") ||
|
||||||
|
id.startsWith("nprofile1")) {
|
||||||
|
return "/p/$id";
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
75
lib/const.dart
Normal file
75
lib/const.dart
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import 'package:amberflutter/amberflutter.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||||
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:ndk_amber/ndk_amber.dart';
|
||||||
|
import 'package:ndk_objectbox/ndk_objectbox.dart';
|
||||||
|
import 'package:ndk_rust_verifier/ndk_rust_verifier.dart';
|
||||||
|
import 'package:zap_stream_flutter/login.dart';
|
||||||
|
|
||||||
|
class NoVerify extends EventVerifier {
|
||||||
|
@override
|
||||||
|
Future<bool> verify(Nip01Event event) {
|
||||||
|
return Future.value(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final ndkCache = DbObjectBox();
|
||||||
|
final eventVerifier = kDebugMode ? NoVerify() : RustEventVerifier();
|
||||||
|
var ndk = Ndk(
|
||||||
|
NdkConfig(
|
||||||
|
eventVerifier: eventVerifier,
|
||||||
|
cache: ndkCache,
|
||||||
|
bootstrapRelays: defaultRelays,
|
||||||
|
//engine: NdkEngine.JIT,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
const userAgent = "zap.stream/1.0";
|
||||||
|
const defaultRelays = [
|
||||||
|
"wss://nos.lol",
|
||||||
|
"wss://relay.damus.io",
|
||||||
|
"wss://relay.primal.net",
|
||||||
|
"wss://relay.snort.social",
|
||||||
|
"wss://relay.fountain.fm",
|
||||||
|
];
|
||||||
|
const searchRelays = ["wss://relay.nostr.band", "wss://search.nos.today"];
|
||||||
|
|
||||||
|
final loginData = LoginData();
|
||||||
|
final RouteObserver<ModalRoute<void>> routeObserver =
|
||||||
|
RouteObserver<ModalRoute<void>>();
|
||||||
|
final localNotifications = FlutterLocalNotificationsPlugin();
|
||||||
|
|
||||||
|
Future<void> initLogin() async {
|
||||||
|
// reload / cache login data
|
||||||
|
loginData.addListener(() {
|
||||||
|
if (loginData.value != null) {
|
||||||
|
final pubkey = loginData.value!.pubkey;
|
||||||
|
if (!ndk.accounts.hasAccount(pubkey)) {
|
||||||
|
switch (loginData.value!.type) {
|
||||||
|
case AccountType.privateKey:
|
||||||
|
ndk.accounts.loginPrivateKey(
|
||||||
|
pubkey: pubkey,
|
||||||
|
privkey: loginData.value!.privateKey!,
|
||||||
|
);
|
||||||
|
case AccountType.externalSigner:
|
||||||
|
ndk.accounts.loginExternalSigner(
|
||||||
|
signer: AmberEventSigner(
|
||||||
|
publicKey: pubkey,
|
||||||
|
amberFlutterDS: AmberFlutterDS(Amberflutter()),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
case AccountType.publicKey:
|
||||||
|
ndk.accounts.loginPublicKey(pubkey: pubkey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ndk.metadata.loadMetadata(pubkey);
|
||||||
|
ndk.follows.getContactList(pubkey);
|
||||||
|
} else {
|
||||||
|
ndk.accounts.logout();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await loginData.load();
|
||||||
|
}
|
86
lib/firebase_options.dart
Normal file
86
lib/firebase_options.dart
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
// File generated by FlutterFire CLI.
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
|
||||||
|
import 'package:flutter/foundation.dart'
|
||||||
|
show defaultTargetPlatform, kIsWeb, TargetPlatform;
|
||||||
|
|
||||||
|
/// Default [FirebaseOptions] for use with your Firebase apps.
|
||||||
|
///
|
||||||
|
/// Example:
|
||||||
|
/// ```dart
|
||||||
|
/// import 'firebase_options.dart';
|
||||||
|
/// // ...
|
||||||
|
/// await Firebase.initializeApp(
|
||||||
|
/// options: DefaultFirebaseOptions.currentPlatform,
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
|
class DefaultFirebaseOptions {
|
||||||
|
static FirebaseOptions get currentPlatform {
|
||||||
|
if (kIsWeb) {
|
||||||
|
return web;
|
||||||
|
}
|
||||||
|
switch (defaultTargetPlatform) {
|
||||||
|
case TargetPlatform.android:
|
||||||
|
return android;
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
return ios;
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
return macos;
|
||||||
|
case TargetPlatform.windows:
|
||||||
|
return windows;
|
||||||
|
case TargetPlatform.linux:
|
||||||
|
throw UnsupportedError(
|
||||||
|
'DefaultFirebaseOptions have not been configured for linux - '
|
||||||
|
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
throw UnsupportedError(
|
||||||
|
'DefaultFirebaseOptions are not supported for this platform.',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const FirebaseOptions web = FirebaseOptions(
|
||||||
|
apiKey: 'AIzaSyDd9GBruNVBv2qrwv0CGvYeby0ALtTlFKk',
|
||||||
|
appId: '1:953923151748:web:f04633c33f9343b19e9fd1',
|
||||||
|
messagingSenderId: '953923151748',
|
||||||
|
projectId: 'nostrlabs',
|
||||||
|
authDomain: 'nostrlabs.firebaseapp.com',
|
||||||
|
storageBucket: 'nostrlabs.firebasestorage.app',
|
||||||
|
);
|
||||||
|
|
||||||
|
static const FirebaseOptions android = FirebaseOptions(
|
||||||
|
apiKey: 'AIzaSyAdpxIN8DR1-mh8MCjHU0mDtaUAk6xda6w',
|
||||||
|
appId: '1:953923151748:android:8536cdc7f75edc9f9e9fd1',
|
||||||
|
messagingSenderId: '953923151748',
|
||||||
|
projectId: 'nostrlabs',
|
||||||
|
storageBucket: 'nostrlabs.firebasestorage.app',
|
||||||
|
);
|
||||||
|
|
||||||
|
static const FirebaseOptions ios = FirebaseOptions(
|
||||||
|
apiKey: 'AIzaSyByygErXpki6Q7NXOXTHbRgg3-Tw-KCVO0',
|
||||||
|
appId: '1:953923151748:ios:30ec9a230e55fe139e9fd1',
|
||||||
|
messagingSenderId: '953923151748',
|
||||||
|
projectId: 'nostrlabs',
|
||||||
|
storageBucket: 'nostrlabs.firebasestorage.app',
|
||||||
|
iosBundleId: 'io.nostrlabs.zapStreamFlutter',
|
||||||
|
);
|
||||||
|
|
||||||
|
static const FirebaseOptions macos = FirebaseOptions(
|
||||||
|
apiKey: 'AIzaSyByygErXpki6Q7NXOXTHbRgg3-Tw-KCVO0',
|
||||||
|
appId: '1:953923151748:ios:19516d42a1cc02229e9fd1',
|
||||||
|
messagingSenderId: '953923151748',
|
||||||
|
projectId: 'nostrlabs',
|
||||||
|
storageBucket: 'nostrlabs.firebasestorage.app',
|
||||||
|
iosBundleId: 'com.example.zapStreamFlutter',
|
||||||
|
);
|
||||||
|
|
||||||
|
static const FirebaseOptions windows = FirebaseOptions(
|
||||||
|
apiKey: 'AIzaSyDd9GBruNVBv2qrwv0CGvYeby0ALtTlFKk',
|
||||||
|
appId: '1:953923151748:web:6b9a6be6798644909e9fd1',
|
||||||
|
messagingSenderId: '953923151748',
|
||||||
|
projectId: 'nostrlabs',
|
||||||
|
authDomain: 'nostrlabs.firebaseapp.com',
|
||||||
|
storageBucket: 'nostrlabs.firebasestorage.app',
|
||||||
|
);
|
||||||
|
}
|
12
lib/flavours/free/main.dart
Normal file
12
lib/flavours/free/main.dart
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:zap_stream_flutter/app.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
|
||||||
|
Future<void> main() async {
|
||||||
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
LocaleSettings.useDeviceLocale();
|
||||||
|
await initLogin();
|
||||||
|
|
||||||
|
runZapStream();
|
||||||
|
}
|
122
lib/i18n/en.i18n.yaml
Normal file
122
lib/i18n/en.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: "Username"
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
573
lib/i18n/strings.g.dart
Normal file
573
lib/i18n/strings.g.dart
Normal file
@ -0,0 +1,573 @@
|
|||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
/// Source: lib/i18n
|
||||||
|
/// To regenerate, run: `dart run slang`
|
||||||
|
///
|
||||||
|
/// Locales: 28
|
||||||
|
/// Strings: 1764 (63 per locale)
|
||||||
|
///
|
||||||
|
/// Built on 2025-05-20 at 16:08 UTC
|
||||||
|
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'package:slang_flutter/slang_flutter.dart';
|
||||||
|
export 'package:slang_flutter/slang_flutter.dart';
|
||||||
|
|
||||||
|
import 'strings_af.g.dart' deferred as l_af;
|
||||||
|
import 'strings_ar.g.dart' deferred as l_ar;
|
||||||
|
import 'strings_ca.g.dart' deferred as l_ca;
|
||||||
|
import 'strings_cs.g.dart' deferred as l_cs;
|
||||||
|
import 'strings_da.g.dart' deferred as l_da;
|
||||||
|
import 'strings_de.g.dart' deferred as l_de;
|
||||||
|
import 'strings_el.g.dart' deferred as l_el;
|
||||||
|
import 'strings_es.g.dart' deferred as l_es;
|
||||||
|
import 'strings_fi.g.dart' deferred as l_fi;
|
||||||
|
import 'strings_fr.g.dart' deferred as l_fr;
|
||||||
|
import 'strings_he.g.dart' deferred as l_he;
|
||||||
|
import 'strings_hu.g.dart' deferred as l_hu;
|
||||||
|
import 'strings_it.g.dart' deferred as l_it;
|
||||||
|
import 'strings_ja.g.dart' deferred as l_ja;
|
||||||
|
import 'strings_ko.g.dart' deferred as l_ko;
|
||||||
|
import 'strings_nl.g.dart' deferred as l_nl;
|
||||||
|
import 'strings_no.g.dart' deferred as l_no;
|
||||||
|
import 'strings_pl.g.dart' deferred as l_pl;
|
||||||
|
import 'strings_pt.g.dart' deferred as l_pt;
|
||||||
|
import 'strings_ro.g.dart' deferred as l_ro;
|
||||||
|
import 'strings_ru.g.dart' deferred as l_ru;
|
||||||
|
import 'strings_sr.g.dart' deferred as l_sr;
|
||||||
|
import 'strings_sv.g.dart' deferred as l_sv;
|
||||||
|
import 'strings_tr.g.dart' deferred as l_tr;
|
||||||
|
import 'strings_uk.g.dart' deferred as l_uk;
|
||||||
|
import 'strings_vi.g.dart' deferred as l_vi;
|
||||||
|
import 'strings_zh.g.dart' deferred as l_zh;
|
||||||
|
part 'strings_en.g.dart';
|
||||||
|
|
||||||
|
/// Supported locales.
|
||||||
|
///
|
||||||
|
/// Usage:
|
||||||
|
/// - LocaleSettings.setLocale(AppLocale.en) // set locale
|
||||||
|
/// - Locale locale = AppLocale.en.flutterLocale // get flutter locale from enum
|
||||||
|
/// - if (LocaleSettings.currentLocale == AppLocale.en) // locale check
|
||||||
|
enum AppLocale with BaseAppLocale<AppLocale, Translations> {
|
||||||
|
en(languageCode: 'en'),
|
||||||
|
af(languageCode: 'af'),
|
||||||
|
ar(languageCode: 'ar'),
|
||||||
|
ca(languageCode: 'ca'),
|
||||||
|
cs(languageCode: 'cs'),
|
||||||
|
da(languageCode: 'da'),
|
||||||
|
de(languageCode: 'de'),
|
||||||
|
el(languageCode: 'el'),
|
||||||
|
es(languageCode: 'es'),
|
||||||
|
fi(languageCode: 'fi'),
|
||||||
|
fr(languageCode: 'fr'),
|
||||||
|
he(languageCode: 'he'),
|
||||||
|
hu(languageCode: 'hu'),
|
||||||
|
it(languageCode: 'it'),
|
||||||
|
ja(languageCode: 'ja'),
|
||||||
|
ko(languageCode: 'ko'),
|
||||||
|
nl(languageCode: 'nl'),
|
||||||
|
no(languageCode: 'no'),
|
||||||
|
pl(languageCode: 'pl'),
|
||||||
|
pt(languageCode: 'pt'),
|
||||||
|
ro(languageCode: 'ro'),
|
||||||
|
ru(languageCode: 'ru'),
|
||||||
|
sr(languageCode: 'sr'),
|
||||||
|
sv(languageCode: 'sv'),
|
||||||
|
tr(languageCode: 'tr'),
|
||||||
|
uk(languageCode: 'uk'),
|
||||||
|
vi(languageCode: 'vi'),
|
||||||
|
zh(languageCode: 'zh');
|
||||||
|
|
||||||
|
const AppLocale({
|
||||||
|
required this.languageCode,
|
||||||
|
this.scriptCode, // ignore: unused_element, unused_element_parameter
|
||||||
|
this.countryCode, // ignore: unused_element, unused_element_parameter
|
||||||
|
});
|
||||||
|
|
||||||
|
@override final String languageCode;
|
||||||
|
@override final String? scriptCode;
|
||||||
|
@override final String? countryCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Translations> build({
|
||||||
|
Map<String, Node>? overrides,
|
||||||
|
PluralResolver? cardinalResolver,
|
||||||
|
PluralResolver? ordinalResolver,
|
||||||
|
}) async {
|
||||||
|
switch (this) {
|
||||||
|
case AppLocale.en:
|
||||||
|
return TranslationsEn(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.af:
|
||||||
|
await l_af.loadLibrary();
|
||||||
|
return l_af.TranslationsAf(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ar:
|
||||||
|
await l_ar.loadLibrary();
|
||||||
|
return l_ar.TranslationsAr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ca:
|
||||||
|
await l_ca.loadLibrary();
|
||||||
|
return l_ca.TranslationsCa(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.cs:
|
||||||
|
await l_cs.loadLibrary();
|
||||||
|
return l_cs.TranslationsCs(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.da:
|
||||||
|
await l_da.loadLibrary();
|
||||||
|
return l_da.TranslationsDa(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.de:
|
||||||
|
await l_de.loadLibrary();
|
||||||
|
return l_de.TranslationsDe(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.el:
|
||||||
|
await l_el.loadLibrary();
|
||||||
|
return l_el.TranslationsEl(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.es:
|
||||||
|
await l_es.loadLibrary();
|
||||||
|
return l_es.TranslationsEs(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.fi:
|
||||||
|
await l_fi.loadLibrary();
|
||||||
|
return l_fi.TranslationsFi(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.fr:
|
||||||
|
await l_fr.loadLibrary();
|
||||||
|
return l_fr.TranslationsFr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.he:
|
||||||
|
await l_he.loadLibrary();
|
||||||
|
return l_he.TranslationsHe(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.hu:
|
||||||
|
await l_hu.loadLibrary();
|
||||||
|
return l_hu.TranslationsHu(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.it:
|
||||||
|
await l_it.loadLibrary();
|
||||||
|
return l_it.TranslationsIt(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ja:
|
||||||
|
await l_ja.loadLibrary();
|
||||||
|
return l_ja.TranslationsJa(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ko:
|
||||||
|
await l_ko.loadLibrary();
|
||||||
|
return l_ko.TranslationsKo(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.nl:
|
||||||
|
await l_nl.loadLibrary();
|
||||||
|
return l_nl.TranslationsNl(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.no:
|
||||||
|
await l_no.loadLibrary();
|
||||||
|
return l_no.TranslationsNo(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.pl:
|
||||||
|
await l_pl.loadLibrary();
|
||||||
|
return l_pl.TranslationsPl(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.pt:
|
||||||
|
await l_pt.loadLibrary();
|
||||||
|
return l_pt.TranslationsPt(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ro:
|
||||||
|
await l_ro.loadLibrary();
|
||||||
|
return l_ro.TranslationsRo(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ru:
|
||||||
|
await l_ru.loadLibrary();
|
||||||
|
return l_ru.TranslationsRu(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.sr:
|
||||||
|
await l_sr.loadLibrary();
|
||||||
|
return l_sr.TranslationsSr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.sv:
|
||||||
|
await l_sv.loadLibrary();
|
||||||
|
return l_sv.TranslationsSv(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.tr:
|
||||||
|
await l_tr.loadLibrary();
|
||||||
|
return l_tr.TranslationsTr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.uk:
|
||||||
|
await l_uk.loadLibrary();
|
||||||
|
return l_uk.TranslationsUk(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.vi:
|
||||||
|
await l_vi.loadLibrary();
|
||||||
|
return l_vi.TranslationsVi(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.zh:
|
||||||
|
await l_zh.loadLibrary();
|
||||||
|
return l_zh.TranslationsZh(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Translations buildSync({
|
||||||
|
Map<String, Node>? overrides,
|
||||||
|
PluralResolver? cardinalResolver,
|
||||||
|
PluralResolver? ordinalResolver,
|
||||||
|
}) {
|
||||||
|
switch (this) {
|
||||||
|
case AppLocale.en:
|
||||||
|
return TranslationsEn(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.af:
|
||||||
|
return l_af.TranslationsAf(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ar:
|
||||||
|
return l_ar.TranslationsAr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ca:
|
||||||
|
return l_ca.TranslationsCa(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.cs:
|
||||||
|
return l_cs.TranslationsCs(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.da:
|
||||||
|
return l_da.TranslationsDa(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.de:
|
||||||
|
return l_de.TranslationsDe(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.el:
|
||||||
|
return l_el.TranslationsEl(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.es:
|
||||||
|
return l_es.TranslationsEs(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.fi:
|
||||||
|
return l_fi.TranslationsFi(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.fr:
|
||||||
|
return l_fr.TranslationsFr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.he:
|
||||||
|
return l_he.TranslationsHe(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.hu:
|
||||||
|
return l_hu.TranslationsHu(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.it:
|
||||||
|
return l_it.TranslationsIt(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ja:
|
||||||
|
return l_ja.TranslationsJa(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ko:
|
||||||
|
return l_ko.TranslationsKo(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.nl:
|
||||||
|
return l_nl.TranslationsNl(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.no:
|
||||||
|
return l_no.TranslationsNo(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.pl:
|
||||||
|
return l_pl.TranslationsPl(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.pt:
|
||||||
|
return l_pt.TranslationsPt(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ro:
|
||||||
|
return l_ro.TranslationsRo(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.ru:
|
||||||
|
return l_ru.TranslationsRu(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.sr:
|
||||||
|
return l_sr.TranslationsSr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.sv:
|
||||||
|
return l_sv.TranslationsSv(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.tr:
|
||||||
|
return l_tr.TranslationsTr(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.uk:
|
||||||
|
return l_uk.TranslationsUk(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.vi:
|
||||||
|
return l_vi.TranslationsVi(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
case AppLocale.zh:
|
||||||
|
return l_zh.TranslationsZh(
|
||||||
|
overrides: overrides,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets current instance managed by [LocaleSettings].
|
||||||
|
Translations get translations => LocaleSettings.instance.getTranslations(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Method A: Simple
|
||||||
|
///
|
||||||
|
/// No rebuild after locale change.
|
||||||
|
/// Translation happens during initialization of the widget (call of t).
|
||||||
|
/// Configurable via 'translate_var'.
|
||||||
|
///
|
||||||
|
/// Usage:
|
||||||
|
/// String a = t.someKey.anotherKey;
|
||||||
|
/// String b = t['someKey.anotherKey']; // Only for edge cases!
|
||||||
|
Translations get t => LocaleSettings.instance.currentTranslations;
|
||||||
|
|
||||||
|
/// Method B: Advanced
|
||||||
|
///
|
||||||
|
/// All widgets using this method will trigger a rebuild when locale changes.
|
||||||
|
/// Use this if you have e.g. a settings page where the user can select the locale during runtime.
|
||||||
|
///
|
||||||
|
/// Step 1:
|
||||||
|
/// wrap your App with
|
||||||
|
/// TranslationProvider(
|
||||||
|
/// child: MyApp()
|
||||||
|
/// );
|
||||||
|
///
|
||||||
|
/// Step 2:
|
||||||
|
/// final t = Translations.of(context); // Get t variable.
|
||||||
|
/// String a = t.someKey.anotherKey; // Use t variable.
|
||||||
|
/// String b = t['someKey.anotherKey']; // Only for edge cases!
|
||||||
|
class TranslationProvider extends BaseTranslationProvider<AppLocale, Translations> {
|
||||||
|
TranslationProvider({required super.child}) : super(settings: LocaleSettings.instance);
|
||||||
|
|
||||||
|
static InheritedLocaleData<AppLocale, Translations> of(BuildContext context) => InheritedLocaleData.of<AppLocale, Translations>(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Method B shorthand via [BuildContext] extension method.
|
||||||
|
/// Configurable via 'translate_var'.
|
||||||
|
///
|
||||||
|
/// Usage (e.g. in a widget's build method):
|
||||||
|
/// context.t.someKey.anotherKey
|
||||||
|
extension BuildContextTranslationsExtension on BuildContext {
|
||||||
|
Translations get t => TranslationProvider.of(this).translations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Manages all translation instances and the current locale
|
||||||
|
class LocaleSettings extends BaseFlutterLocaleSettings<AppLocale, Translations> {
|
||||||
|
LocaleSettings._() : super(
|
||||||
|
utils: AppLocaleUtils.instance,
|
||||||
|
lazy: true,
|
||||||
|
);
|
||||||
|
|
||||||
|
static final instance = LocaleSettings._();
|
||||||
|
|
||||||
|
// static aliases (checkout base methods for documentation)
|
||||||
|
static AppLocale get currentLocale => instance.currentLocale;
|
||||||
|
static Stream<AppLocale> getLocaleStream() => instance.getLocaleStream();
|
||||||
|
static Future<AppLocale> setLocale(AppLocale locale, {bool? listenToDeviceLocale = false}) => instance.setLocale(locale, listenToDeviceLocale: listenToDeviceLocale);
|
||||||
|
static Future<AppLocale> setLocaleRaw(String rawLocale, {bool? listenToDeviceLocale = false}) => instance.setLocaleRaw(rawLocale, listenToDeviceLocale: listenToDeviceLocale);
|
||||||
|
static Future<AppLocale> useDeviceLocale() => instance.useDeviceLocale();
|
||||||
|
static Future<void> setPluralResolver({String? language, AppLocale? locale, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) => instance.setPluralResolver(
|
||||||
|
language: language,
|
||||||
|
locale: locale,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
|
||||||
|
// synchronous versions
|
||||||
|
static AppLocale setLocaleSync(AppLocale locale, {bool? listenToDeviceLocale = false}) => instance.setLocaleSync(locale, listenToDeviceLocale: listenToDeviceLocale);
|
||||||
|
static AppLocale setLocaleRawSync(String rawLocale, {bool? listenToDeviceLocale = false}) => instance.setLocaleRawSync(rawLocale, listenToDeviceLocale: listenToDeviceLocale);
|
||||||
|
static AppLocale useDeviceLocaleSync() => instance.useDeviceLocaleSync();
|
||||||
|
static void setPluralResolverSync({String? language, AppLocale? locale, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) => instance.setPluralResolverSync(
|
||||||
|
language: language,
|
||||||
|
locale: locale,
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Provides utility functions without any side effects.
|
||||||
|
class AppLocaleUtils extends BaseAppLocaleUtils<AppLocale, Translations> {
|
||||||
|
AppLocaleUtils._() : super(
|
||||||
|
baseLocale: AppLocale.en,
|
||||||
|
locales: AppLocale.values,
|
||||||
|
);
|
||||||
|
|
||||||
|
static final instance = AppLocaleUtils._();
|
||||||
|
|
||||||
|
// static aliases (checkout base methods for documentation)
|
||||||
|
static AppLocale parse(String rawLocale) => instance.parse(rawLocale);
|
||||||
|
static AppLocale parseLocaleParts({required String languageCode, String? scriptCode, String? countryCode}) => instance.parseLocaleParts(languageCode: languageCode, scriptCode: scriptCode, countryCode: countryCode);
|
||||||
|
static AppLocale findDeviceLocale() => instance.findDeviceLocale();
|
||||||
|
static List<Locale> get supportedLocales => instance.supportedLocales;
|
||||||
|
static List<String> get supportedLocalesRaw => instance.supportedLocalesRaw;
|
||||||
|
}
|
416
lib/i18n/strings_af.g.dart
Normal file
416
lib/i18n/strings_af.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsAf implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsAf({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.af,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <af>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsAf _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsAf $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsAf(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
@override String get upload_avatar => 'Upload Avatar';
|
||||||
|
|
||||||
|
/// Heading over listed top streamers by zaps
|
||||||
|
@override String get most_zapped_streamers => 'Most Zapped Streamers';
|
||||||
|
|
||||||
|
/// No user found when searching
|
||||||
|
@override String get no_user_found => 'No user found';
|
||||||
|
|
||||||
|
/// An anonymous user
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Number of viewers of the stream
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('af'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamAf stream = _TranslationsStreamAf._(_root);
|
||||||
|
@override late final _TranslationsGoalAf goal = _TranslationsGoalAf._(_root);
|
||||||
|
@override late final _TranslationsButtonAf button = _TranslationsButtonAf._(_root);
|
||||||
|
@override late final _TranslationsEmbedAf embed = _TranslationsEmbedAf._(_root);
|
||||||
|
|
||||||
|
/// Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
@override late final _TranslationsStreamListAf stream_list = _TranslationsStreamListAf._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapAf zap = _TranslationsZapAf._(_root);
|
||||||
|
@override late final _TranslationsProfileAf profile = _TranslationsProfileAf._(_root);
|
||||||
|
@override late final _TranslationsLoginAf login = _TranslationsLoginAf._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamAf implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusAf status = _TranslationsStreamStatusAf._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatAf chat = _TranslationsStreamChatAf._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalAf implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonAf implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Button text for the login button
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Logout';
|
||||||
|
@override String get edit_profile => 'Edit Profile';
|
||||||
|
|
||||||
|
/// Button text for the follow button
|
||||||
|
@override String get follow => 'Follow';
|
||||||
|
|
||||||
|
/// Button text for the unfollow button
|
||||||
|
@override String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
@override String get mute => 'Mute';
|
||||||
|
@override String get unmute => 'Unmute';
|
||||||
|
@override String get share => 'Share';
|
||||||
|
@override String get save => 'Save';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedAf implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Article by ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note by ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListAf implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Following';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planned';
|
||||||
|
@override String get ended => 'Ended';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapAf implements TranslationsZapEn {
|
||||||
|
_TranslationsZapAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Custom Amount';
|
||||||
|
@override String get confirm => 'Confirm';
|
||||||
|
@override String get comment => 'Comment';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Open in Wallet';
|
||||||
|
@override String get copy => 'Copied to clipboard';
|
||||||
|
@override late final _TranslationsZapErrorAf error = _TranslationsZapErrorAf._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileAf implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Past Streams';
|
||||||
|
@override late final _TranslationsProfileEditAf edit = _TranslationsProfileEditAf._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginAf implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Username';
|
||||||
|
@override String get amber => 'Login with Amber';
|
||||||
|
@override String get key => 'Login with Key';
|
||||||
|
@override String get create => 'Create Account';
|
||||||
|
@override late final _TranslationsLoginErrorAf error = _TranslationsLoginErrorAf._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusAf implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'PLANNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatAf implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABLED';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timeout expires: ${time}';
|
||||||
|
|
||||||
|
/// Chat message showing timeout events
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Chat message showing stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteAf write = _TranslationsStreamChatWriteAf._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeAf badge = _TranslationsStreamChatBadgeAf._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidAf raid = _TranslationsStreamChatRaidAf._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorAf implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Invalid custom amount';
|
||||||
|
@override String get no_wallet => 'No lightning wallet installed';
|
||||||
|
@override String get no_lud16 => 'No lightning address found';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditAf implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Display Name';
|
||||||
|
@override String get about => 'About';
|
||||||
|
@override String get nip05 => 'Nostr Address';
|
||||||
|
@override String get lud16 => 'Lightning Address';
|
||||||
|
@override late final _TranslationsProfileEditErrorAf error = _TranslationsProfileEditErrorAf._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorAf implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Invalid key';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteAf implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label on the chat message input box
|
||||||
|
@override String get label => 'Write message';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged in only with pubkey
|
||||||
|
@override String get no_signer => 'Can\'t write messages with npub login';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged out
|
||||||
|
@override String get login => 'Please login to send messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeAf implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Heading over list of users who are awarded a badge
|
||||||
|
@override String get awarded_to => 'Awarded to:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidAf implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid message to another stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid message from another stream
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Countdown timer for auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Raiding in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorAf implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorAf._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAf _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Cant edit profile when logged out';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsAf {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Most Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'No user found';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('af'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'PLANNED';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Write message';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Can\'t write messages with npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Please login to send messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Awarded to:';
|
||||||
|
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 in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Edit Profile';
|
||||||
|
case 'button.follow': return 'Follow';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mute';
|
||||||
|
case 'button.unmute': return 'Unmute';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Save';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article by ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note by ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return 'Following';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planned';
|
||||||
|
case 'stream_list.ended': return 'Ended';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Custom Amount';
|
||||||
|
case 'zap.confirm': return 'Confirm';
|
||||||
|
case 'zap.comment': return 'Comment';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Open in Wallet';
|
||||||
|
case 'zap.copy': return 'Copied to clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Invalid custom amount';
|
||||||
|
case 'zap.error.no_wallet': return 'No lightning wallet installed';
|
||||||
|
case 'zap.error.no_lud16': return 'No lightning address found';
|
||||||
|
case 'profile.past_streams': return 'Past Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Display Name';
|
||||||
|
case 'profile.edit.about': return 'About';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Address';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Address';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Cant edit profile when logged out';
|
||||||
|
case 'login.username': return 'Username';
|
||||||
|
case 'login.amber': return 'Login with Amber';
|
||||||
|
case 'login.key': return 'Login with Key';
|
||||||
|
case 'login.create': return 'Create Account';
|
||||||
|
case 'login.error.invalid_key': return 'Invalid key';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_ar.g.dart
Normal file
416
lib/i18n/strings_ar.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsAr implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsAr({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.ar,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <ar>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsAr _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsAr $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsAr(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// نص يطالب المستخدم بالضغط على العنصر النائب للصورة الرمزية لبدء التحميل
|
||||||
|
@override String get upload_avatar => 'تحميل الصورة الرمزية';
|
||||||
|
|
||||||
|
/// التوجه فوق اللافتات العلوية المدرجة من قبل zaps
|
||||||
|
@override String get most_zapped_streamers => 'معظم اللافتات التي يتم بثها';
|
||||||
|
|
||||||
|
/// لم يتم العثور على مستخدم عند البحث
|
||||||
|
@override String get no_user_found => 'لم يتم العثور على مستخدم';
|
||||||
|
|
||||||
|
/// مستخدم مجهول
|
||||||
|
@override String get anon => 'هوية مخفية';
|
||||||
|
|
||||||
|
/// عدد مشاهدي البث
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ar'))(n,
|
||||||
|
one: '1 مشاهد',
|
||||||
|
other: '${n} المشاهدون',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamAr stream = _TranslationsStreamAr._(_root);
|
||||||
|
@override late final _TranslationsGoalAr goal = _TranslationsGoalAr._(_root);
|
||||||
|
@override late final _TranslationsButtonAr button = _TranslationsButtonAr._(_root);
|
||||||
|
@override late final _TranslationsEmbedAr embed = _TranslationsEmbedAr._(_root);
|
||||||
|
|
||||||
|
/// العناوين في قوائم البث حسب نوع البث المباشر/المُنتهي/المخطط له وما إلى ذلك.
|
||||||
|
@override late final _TranslationsStreamListAr stream_list = _TranslationsStreamListAr._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapAr zap = _TranslationsZapAr._(_root);
|
||||||
|
@override late final _TranslationsProfileAr profile = _TranslationsProfileAr._(_root);
|
||||||
|
@override late final _TranslationsLoginAr login = _TranslationsLoginAr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamAr implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusAr status = _TranslationsStreamStatusAr._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'بدأ ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatAr chat = _TranslationsStreamChatAr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalAr implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'الهدف: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'المتبقي: ${amount}';
|
||||||
|
@override String get complete => 'مكتمل';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonAr implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// نص الزر الخاص بزر تسجيل الدخول
|
||||||
|
@override String get login => 'تسجيل الدخول';
|
||||||
|
|
||||||
|
@override String get logout => 'تسجيل الخروج';
|
||||||
|
@override String get edit_profile => 'تعديل الملف الشخصي';
|
||||||
|
|
||||||
|
/// نص الزر الخاص بزر المتابعة
|
||||||
|
@override String get follow => 'متابعة';
|
||||||
|
|
||||||
|
/// نص الزر لزر إلغاء المتابعة
|
||||||
|
@override String get unfollow => 'الغاء المتابعة';
|
||||||
|
|
||||||
|
@override String get mute => 'كتم';
|
||||||
|
@override String get unmute => 'رفع الكتم';
|
||||||
|
@override String get share => 'مشاركة';
|
||||||
|
@override String get save => 'حفظ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedAr implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'مقال بقلم ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'ملاحظة من ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'بث مباشر من ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListAr implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'المتابَعون';
|
||||||
|
@override String get live => 'بث مباشر';
|
||||||
|
@override String get planned => 'مخطط';
|
||||||
|
@override String get ended => 'انتهى';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapAr implements TranslationsZapEn {
|
||||||
|
_TranslationsZapAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'زاب ${name}';
|
||||||
|
@override String get custom_amount => 'المبلغ المخصص';
|
||||||
|
@override String get confirm => 'تأكيد';
|
||||||
|
@override String get comment => 'تعليق';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'أومض ${amount} ساتوشي';
|
||||||
|
@override String get button_zap => 'زاب';
|
||||||
|
@override String get button_open_wallet => 'فتح في المحفظة';
|
||||||
|
@override String get copy => 'نسخ إلى الحافظة';
|
||||||
|
@override late final _TranslationsZapErrorAr error = _TranslationsZapErrorAr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileAr implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'التدفقات السابقة';
|
||||||
|
@override late final _TranslationsProfileEditAr edit = _TranslationsProfileEditAr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginAr implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'اسم المستخدم';
|
||||||
|
@override String get amber => 'تسجيل الدخول مع آمبر';
|
||||||
|
@override String get key => 'تسجيل الدخول بالمفتاح';
|
||||||
|
@override String get create => 'إنشاء حساب';
|
||||||
|
@override late final _TranslationsLoginErrorAr error = _TranslationsLoginErrorAr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusAr implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'بث مباشر';
|
||||||
|
@override String get ended => 'انتهى';
|
||||||
|
@override String get planned => 'مخطط';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatAr implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'تم تعطيل الدردشة';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'تنتهي المهلة: ${time}';
|
||||||
|
|
||||||
|
/// رسالة دردشة تظهر أحداث المهلة
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' انتهى الوقت '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' لـ '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// تيار انتهى التذييل في أسفل الدردشة
|
||||||
|
@override String get ended => 'انتهى البث';
|
||||||
|
|
||||||
|
/// رسالة الدردشة التي تُظهر البث المباشر
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' انطلق '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' ساتس'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteAr write = _TranslationsStreamChatWriteAr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeAr badge = _TranslationsStreamChatBadgeAr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidAr raid = _TranslationsStreamChatRaidAr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorAr implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'مبلغ مخصص غير صالح';
|
||||||
|
@override String get no_wallet => 'لا توجد محفظة برق مثبتة';
|
||||||
|
@override String get no_lud16 => 'لم يتم العثور على عنوان البرق';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditAr implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'اسم العرض';
|
||||||
|
@override String get about => 'نبذة';
|
||||||
|
@override String get nip05 => 'عنوان نوستر';
|
||||||
|
@override String get lud16 => 'عنوان البرق';
|
||||||
|
@override late final _TranslationsProfileEditErrorAr error = _TranslationsProfileEditErrorAr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorAr implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'مفتاح غير صالح';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteAr implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// التسمية على مربع إدخال رسالة الدردشة
|
||||||
|
@override String get label => 'اكتب رسالة';
|
||||||
|
|
||||||
|
/// تظهر رسالة إدخال الدردشة عندما يقوم المستخدم بتسجيل الدخول باستخدام مفتاح الحانة فقط
|
||||||
|
@override String get no_signer => 'لا يمكن كتابة الرسائل باستخدام تسجيل الدخول إلى npub';
|
||||||
|
|
||||||
|
/// تظهر رسالة إدخال الدردشة عند تسجيل خروج المستخدم من المحادثة
|
||||||
|
@override String get login => 'الرجاء تسجيل الدخول لإرسال الرسائل';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeAr implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// العنوان فوق قائمة المستخدمين الذين حصلوا على شارة
|
||||||
|
@override String get awarded_to => 'مُنحت الجائزة لـ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidAr implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// رسالة غارة الدردشة إلى دفق آخر
|
||||||
|
@override String to({ required Object name}) => 'التصفح ${name}';
|
||||||
|
|
||||||
|
/// رسالة غارة الدردشة من دفق آخر
|
||||||
|
@override String from({ required Object name}) => 'RAID من ${name}';
|
||||||
|
|
||||||
|
/// مؤقت العد التنازلي للقيادة التلقائية
|
||||||
|
@override String countdown({ required Object time}) => 'الإغارة في ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorAr implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorAr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsAr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'لا يمكن تحرير ملف التعريف عند تسجيل الخروج';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsAr {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'تحميل الصورة الرمزية';
|
||||||
|
case 'most_zapped_streamers': return 'معظم اللافتات التي يتم بثها';
|
||||||
|
case 'no_user_found': return 'لم يتم العثور على مستخدم';
|
||||||
|
case 'anon': return 'هوية مخفية';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ar'))(n,
|
||||||
|
one: '1 مشاهد',
|
||||||
|
other: '${n} المشاهدون',
|
||||||
|
);
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' انتهى الوقت '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' لـ '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'انتهى البث';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' انطلق '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' ساتس'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'اكتب رسالة';
|
||||||
|
case 'stream.chat.write.no_signer': return 'لا يمكن كتابة الرسائل باستخدام تسجيل الدخول إلى npub';
|
||||||
|
case 'stream.chat.write.login': return 'الرجاء تسجيل الدخول لإرسال الرسائل';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'مُنحت الجائزة لـ';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'التصفح ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID من ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'الإغارة في ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'الهدف: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'المتبقي: ${amount}';
|
||||||
|
case 'goal.complete': return 'مكتمل';
|
||||||
|
case 'button.login': return 'تسجيل الدخول';
|
||||||
|
case 'button.logout': return 'تسجيل الخروج';
|
||||||
|
case 'button.edit_profile': return 'تعديل الملف الشخصي';
|
||||||
|
case 'button.follow': return 'متابعة';
|
||||||
|
case 'button.unfollow': return 'الغاء المتابعة';
|
||||||
|
case 'button.mute': return 'كتم';
|
||||||
|
case 'button.unmute': return 'رفع الكتم';
|
||||||
|
case 'button.share': return 'مشاركة';
|
||||||
|
case 'button.save': return 'حفظ';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'مقال بقلم ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'ملاحظة من ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'بث مباشر من ${name}';
|
||||||
|
case 'stream_list.following': return 'المتابَعون';
|
||||||
|
case 'stream_list.live': return 'بث مباشر';
|
||||||
|
case 'stream_list.planned': return 'مخطط';
|
||||||
|
case 'stream_list.ended': return 'انتهى';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'زاب ${name}';
|
||||||
|
case 'zap.custom_amount': return 'المبلغ المخصص';
|
||||||
|
case 'zap.confirm': return 'تأكيد';
|
||||||
|
case 'zap.comment': return 'تعليق';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'أومض ${amount} ساتوشي';
|
||||||
|
case 'zap.button_zap': return 'زاب';
|
||||||
|
case 'zap.button_open_wallet': return 'فتح في المحفظة';
|
||||||
|
case 'zap.copy': return 'نسخ إلى الحافظة';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'مبلغ مخصص غير صالح';
|
||||||
|
case 'zap.error.no_wallet': return 'لا توجد محفظة برق مثبتة';
|
||||||
|
case 'zap.error.no_lud16': return 'لم يتم العثور على عنوان البرق';
|
||||||
|
case 'profile.past_streams': return 'التدفقات السابقة';
|
||||||
|
case 'profile.edit.display_name': return 'اسم العرض';
|
||||||
|
case 'profile.edit.about': return 'نبذة';
|
||||||
|
case 'profile.edit.nip05': return 'عنوان نوستر';
|
||||||
|
case 'profile.edit.lud16': return 'عنوان البرق';
|
||||||
|
case 'profile.edit.error.logged_out': return 'لا يمكن تحرير ملف التعريف عند تسجيل الخروج';
|
||||||
|
case 'login.username': return 'اسم المستخدم';
|
||||||
|
case 'login.amber': return 'تسجيل الدخول مع آمبر';
|
||||||
|
case 'login.key': return 'تسجيل الدخول بالمفتاح';
|
||||||
|
case 'login.create': return 'إنشاء حساب';
|
||||||
|
case 'login.error.invalid_key': return 'مفتاح غير صالح';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_ca.g.dart
Normal file
416
lib/i18n/strings_ca.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsCa implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsCa({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.ca,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <ca>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsCa _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsCa $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsCa(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
@override String get upload_avatar => 'Upload Avatar';
|
||||||
|
|
||||||
|
/// Heading over listed top streamers by zaps
|
||||||
|
@override String get most_zapped_streamers => 'Most Zapped Streamers';
|
||||||
|
|
||||||
|
/// No user found when searching
|
||||||
|
@override String get no_user_found => 'No user found';
|
||||||
|
|
||||||
|
/// An anonymous user
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Number of viewers of the stream
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ca'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamCa stream = _TranslationsStreamCa._(_root);
|
||||||
|
@override late final _TranslationsGoalCa goal = _TranslationsGoalCa._(_root);
|
||||||
|
@override late final _TranslationsButtonCa button = _TranslationsButtonCa._(_root);
|
||||||
|
@override late final _TranslationsEmbedCa embed = _TranslationsEmbedCa._(_root);
|
||||||
|
|
||||||
|
/// Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
@override late final _TranslationsStreamListCa stream_list = _TranslationsStreamListCa._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapCa zap = _TranslationsZapCa._(_root);
|
||||||
|
@override late final _TranslationsProfileCa profile = _TranslationsProfileCa._(_root);
|
||||||
|
@override late final _TranslationsLoginCa login = _TranslationsLoginCa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamCa implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusCa status = _TranslationsStreamStatusCa._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatCa chat = _TranslationsStreamChatCa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalCa implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonCa implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Button text for the login button
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Logout';
|
||||||
|
@override String get edit_profile => 'Edit Profile';
|
||||||
|
|
||||||
|
/// Button text for the follow button
|
||||||
|
@override String get follow => 'Follow';
|
||||||
|
|
||||||
|
/// Button text for the unfollow button
|
||||||
|
@override String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
@override String get mute => 'Mute';
|
||||||
|
@override String get unmute => 'Unmute';
|
||||||
|
@override String get share => 'Share';
|
||||||
|
@override String get save => 'Save';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedCa implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Article by ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note by ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListCa implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Following';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planned';
|
||||||
|
@override String get ended => 'Ended';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapCa implements TranslationsZapEn {
|
||||||
|
_TranslationsZapCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Custom Amount';
|
||||||
|
@override String get confirm => 'Confirm';
|
||||||
|
@override String get comment => 'Comment';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Open in Wallet';
|
||||||
|
@override String get copy => 'Copied to clipboard';
|
||||||
|
@override late final _TranslationsZapErrorCa error = _TranslationsZapErrorCa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileCa implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Past Streams';
|
||||||
|
@override late final _TranslationsProfileEditCa edit = _TranslationsProfileEditCa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginCa implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Username';
|
||||||
|
@override String get amber => 'Login with Amber';
|
||||||
|
@override String get key => 'Login with Key';
|
||||||
|
@override String get create => 'Create Account';
|
||||||
|
@override late final _TranslationsLoginErrorCa error = _TranslationsLoginErrorCa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusCa implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'PLANNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatCa implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABLED';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timeout expires: ${time}';
|
||||||
|
|
||||||
|
/// Chat message showing timeout events
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Chat message showing stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteCa write = _TranslationsStreamChatWriteCa._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeCa badge = _TranslationsStreamChatBadgeCa._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidCa raid = _TranslationsStreamChatRaidCa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorCa implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Invalid custom amount';
|
||||||
|
@override String get no_wallet => 'No lightning wallet installed';
|
||||||
|
@override String get no_lud16 => 'No lightning address found';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditCa implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Display Name';
|
||||||
|
@override String get about => 'About';
|
||||||
|
@override String get nip05 => 'Nostr Address';
|
||||||
|
@override String get lud16 => 'Lightning Address';
|
||||||
|
@override late final _TranslationsProfileEditErrorCa error = _TranslationsProfileEditErrorCa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorCa implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Invalid key';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteCa implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label on the chat message input box
|
||||||
|
@override String get label => 'Write message';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged in only with pubkey
|
||||||
|
@override String get no_signer => 'Can\'t write messages with npub login';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged out
|
||||||
|
@override String get login => 'Please login to send messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeCa implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Heading over list of users who are awarded a badge
|
||||||
|
@override String get awarded_to => 'Awarded to:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidCa implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid message to another stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid message from another stream
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Countdown timer for auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Raiding in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorCa implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorCa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Cant edit profile when logged out';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsCa {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Most Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'No user found';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ca'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'PLANNED';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Write message';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Can\'t write messages with npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Please login to send messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Awarded to:';
|
||||||
|
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 in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Edit Profile';
|
||||||
|
case 'button.follow': return 'Follow';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mute';
|
||||||
|
case 'button.unmute': return 'Unmute';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Save';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article by ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note by ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return 'Following';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planned';
|
||||||
|
case 'stream_list.ended': return 'Ended';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Custom Amount';
|
||||||
|
case 'zap.confirm': return 'Confirm';
|
||||||
|
case 'zap.comment': return 'Comment';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Open in Wallet';
|
||||||
|
case 'zap.copy': return 'Copied to clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Invalid custom amount';
|
||||||
|
case 'zap.error.no_wallet': return 'No lightning wallet installed';
|
||||||
|
case 'zap.error.no_lud16': return 'No lightning address found';
|
||||||
|
case 'profile.past_streams': return 'Past Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Display Name';
|
||||||
|
case 'profile.edit.about': return 'About';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Address';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Address';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Cant edit profile when logged out';
|
||||||
|
case 'login.username': return 'Username';
|
||||||
|
case 'login.amber': return 'Login with Amber';
|
||||||
|
case 'login.key': return 'Login with Key';
|
||||||
|
case 'login.create': return 'Create Account';
|
||||||
|
case 'login.error.invalid_key': return 'Invalid key';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_cs.g.dart
Normal file
416
lib/i18n/strings_cs.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsCs implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsCs({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.cs,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <cs>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsCs _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsCs $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsCs(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text vyzývající uživatele, aby stiskl zástupný symbol avatara pro zahájení nahrávání
|
||||||
|
@override String get upload_avatar => 'Nahrát avatar';
|
||||||
|
|
||||||
|
/// Směřování přes uvedené horní streamery podle zaps
|
||||||
|
@override String get most_zapped_streamers => 'Nejvíce zapnutých streamerů';
|
||||||
|
|
||||||
|
/// Při vyhledávání nebyl nalezen žádný uživatel
|
||||||
|
@override String get no_user_found => 'Nebyl nalezen žádný uživatel';
|
||||||
|
|
||||||
|
/// Anonymní uživatel
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Počet diváků streamu
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('cs'))(n,
|
||||||
|
one: '1 divák',
|
||||||
|
other: '${n} diváci',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamCs stream = _TranslationsStreamCs._(_root);
|
||||||
|
@override late final _TranslationsGoalCs goal = _TranslationsGoalCs._(_root);
|
||||||
|
@override late final _TranslationsButtonCs button = _TranslationsButtonCs._(_root);
|
||||||
|
@override late final _TranslationsEmbedCs embed = _TranslationsEmbedCs._(_root);
|
||||||
|
|
||||||
|
/// Nadpisy v seznamech proudů podle typu proudu živě/konec/plánovaně atd.
|
||||||
|
@override late final _TranslationsStreamListCs stream_list = _TranslationsStreamListCs._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapCs zap = _TranslationsZapCs._(_root);
|
||||||
|
@override late final _TranslationsProfileCs profile = _TranslationsProfileCs._(_root);
|
||||||
|
@override late final _TranslationsLoginCs login = _TranslationsLoginCs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamCs implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusCs status = _TranslationsStreamStatusCs._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Založeno ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatCs chat = _TranslationsStreamChatCs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalCs implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Cíl: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Zbývá: ${amount}';
|
||||||
|
@override String get complete => 'KOMPLETNÍ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonCs implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text tlačítka pro přihlašovací tlačítko
|
||||||
|
@override String get login => 'Přihlášení';
|
||||||
|
|
||||||
|
@override String get logout => 'Odhlášení';
|
||||||
|
@override String get edit_profile => 'Upravit profil';
|
||||||
|
|
||||||
|
/// Text tlačítka pro tlačítko sledovat
|
||||||
|
@override String get follow => 'Sledujte';
|
||||||
|
|
||||||
|
/// Text tlačítka pro zrušení sledování
|
||||||
|
@override String get unfollow => 'Zrušit sledování';
|
||||||
|
|
||||||
|
@override String get mute => 'Ztlumit';
|
||||||
|
@override String get unmute => 'Zrušit ztlumení';
|
||||||
|
@override String get share => 'Sdílet';
|
||||||
|
@override String get save => 'Uložit';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedCs implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Článek na ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Poznámka ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Přímý přenos na adrese ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListCs implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Po';
|
||||||
|
@override String get live => 'Živě';
|
||||||
|
@override String get planned => 'Plánované';
|
||||||
|
@override String get ended => 'Ukončeno';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapCs implements TranslationsZapEn {
|
||||||
|
_TranslationsZapCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Vlastní částka';
|
||||||
|
@override String get confirm => 'Potvrďte';
|
||||||
|
@override String get comment => 'Komentář:';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Otevřít v peněžence';
|
||||||
|
@override String get copy => 'Zkopírováno do schránky';
|
||||||
|
@override late final _TranslationsZapErrorCs error = _TranslationsZapErrorCs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileCs implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Minulé proudy';
|
||||||
|
@override late final _TranslationsProfileEditCs edit = _TranslationsProfileEditCs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginCs implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Uživatelské jméno';
|
||||||
|
@override String get amber => 'Přihlášení pomocí Amber';
|
||||||
|
@override String get key => 'Přihlášení pomocí klíče';
|
||||||
|
@override String get create => 'Vytvořit účet';
|
||||||
|
@override late final _TranslationsLoginErrorCs error = _TranslationsLoginErrorCs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusCs implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'KONEC';
|
||||||
|
@override String get planned => 'PLÁNOVANÉ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatCs implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT ZRUŠEN';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Časový limit vyprší: ${time}';
|
||||||
|
|
||||||
|
/// Zpráva chatu zobrazující události časového limitu
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' vypršel čas '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' pro '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Zápatí v dolní části chatu ukončilo stream
|
||||||
|
@override String get ended => 'STREAM UKONČEN';
|
||||||
|
|
||||||
|
/// Zpráva chatu zobrazující proud zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' Zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteCs write = _TranslationsStreamChatWriteCs._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeCs badge = _TranslationsStreamChatBadgeCs._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidCs raid = _TranslationsStreamChatRaidCs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorCs implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Neplatná vlastní částka';
|
||||||
|
@override String get no_wallet => 'Není nainstalována blesková peněženka';
|
||||||
|
@override String get no_lud16 => 'Nebyla nalezena žádná adresa blesku';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditCs implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Zobrazení názvu';
|
||||||
|
@override String get about => 'O stránkách';
|
||||||
|
@override String get nip05 => 'Adresa Nostr';
|
||||||
|
@override String get lud16 => 'Adresa blesku';
|
||||||
|
@override late final _TranslationsProfileEditErrorCs error = _TranslationsProfileEditErrorCs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorCs implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Neplatný klíč';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteCs implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Popisek na vstupním poli zprávy chatu
|
||||||
|
@override String get label => 'Napište zprávu';
|
||||||
|
|
||||||
|
/// Vstupní zpráva chatu se zobrazí, když je uživatel přihlášen pouze pomocí pubkey
|
||||||
|
@override String get no_signer => 'Nelze psát zprávy s přihlášením npub';
|
||||||
|
|
||||||
|
/// Vstupní zpráva chatu zobrazená při odhlášení uživatele
|
||||||
|
@override String get login => 'Pro odesílání zpráv se prosím přihlaste';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeCs implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Záhlaví nad seznamem uživatelů, kterým byl udělen odznak
|
||||||
|
@override String get awarded_to => 'Uděleno:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidCs implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Zpráva o nájezdu chatu do jiného proudu
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Zpráva o nájezdu chatu z jiného proudu
|
||||||
|
@override String from({ required Object name}) => 'RAID Z ${name}';
|
||||||
|
|
||||||
|
/// Časovač odpočítávání pro automatický nájezd
|
||||||
|
@override String countdown({ required Object time}) => 'Nájezdy na ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorCs implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorCs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsCs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Nelze upravit profil, když je odhlášený';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsCs {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Nahrát avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Nejvíce zapnutých streamerů';
|
||||||
|
case 'no_user_found': return 'Nebyl nalezen žádný uživatel';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('cs'))(n,
|
||||||
|
one: '1 divák',
|
||||||
|
other: '${n} diváci',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' vypršel čas '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' pro '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM UKONČEN';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' Zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Napište zprávu';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Nelze psát zprávy s přihlášením npub';
|
||||||
|
case 'stream.chat.write.login': return 'Pro odesílání zpráv se prosím přihlaste';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Uděleno:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID Z ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Nájezdy na ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Cíl: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Zbývá: ${amount}';
|
||||||
|
case 'goal.complete': return 'KOMPLETNÍ';
|
||||||
|
case 'button.login': return 'Přihlášení';
|
||||||
|
case 'button.logout': return 'Odhlášení';
|
||||||
|
case 'button.edit_profile': return 'Upravit profil';
|
||||||
|
case 'button.follow': return 'Sledujte';
|
||||||
|
case 'button.unfollow': return 'Zrušit sledování';
|
||||||
|
case 'button.mute': return 'Ztlumit';
|
||||||
|
case 'button.unmute': return 'Zrušit ztlumení';
|
||||||
|
case 'button.share': return 'Sdílet';
|
||||||
|
case 'button.save': return 'Uložit';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Článek na ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Poznámka ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Přímý přenos na adrese ${name}';
|
||||||
|
case 'stream_list.following': return 'Po';
|
||||||
|
case 'stream_list.live': return 'Živě';
|
||||||
|
case 'stream_list.planned': return 'Plánované';
|
||||||
|
case 'stream_list.ended': return 'Ukončeno';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Vlastní částka';
|
||||||
|
case 'zap.confirm': return 'Potvrďte';
|
||||||
|
case 'zap.comment': return 'Komentář:';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Otevřít v peněžence';
|
||||||
|
case 'zap.copy': return 'Zkopírováno do schránky';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Neplatná vlastní částka';
|
||||||
|
case 'zap.error.no_wallet': return 'Není nainstalována blesková peněženka';
|
||||||
|
case 'zap.error.no_lud16': return 'Nebyla nalezena žádná adresa blesku';
|
||||||
|
case 'profile.past_streams': return 'Minulé proudy';
|
||||||
|
case 'profile.edit.display_name': return 'Zobrazení názvu';
|
||||||
|
case 'profile.edit.about': return 'O stránkách';
|
||||||
|
case 'profile.edit.nip05': return 'Adresa Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Adresa blesku';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Nelze upravit profil, když je odhlášený';
|
||||||
|
case 'login.username': return 'Uživatelské jméno';
|
||||||
|
case 'login.amber': return 'Přihlášení pomocí Amber';
|
||||||
|
case 'login.key': return 'Přihlášení pomocí klíče';
|
||||||
|
case 'login.create': return 'Vytvořit účet';
|
||||||
|
case 'login.error.invalid_key': return 'Neplatný klíč';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_da.g.dart
Normal file
416
lib/i18n/strings_da.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsDa implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsDa({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.da,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <da>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsDa _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsDa $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsDa(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Tekst, der beder brugeren om at trykke på avatar-pladsholderen for at begynde at uploade
|
||||||
|
@override String get upload_avatar => 'Upload avatar';
|
||||||
|
|
||||||
|
/// På vej over listede topstreamere af zaps
|
||||||
|
@override String get most_zapped_streamers => 'De fleste zappede streamere';
|
||||||
|
|
||||||
|
/// Ingen bruger fundet ved søgning
|
||||||
|
@override String get no_user_found => 'Ingen bruger fundet';
|
||||||
|
|
||||||
|
/// En anonym bruger
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Antal seere af streamingen
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n,
|
||||||
|
one: '1 seer',
|
||||||
|
other: '${n} Seere',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamDa stream = _TranslationsStreamDa._(_root);
|
||||||
|
@override late final _TranslationsGoalDa goal = _TranslationsGoalDa._(_root);
|
||||||
|
@override late final _TranslationsButtonDa button = _TranslationsButtonDa._(_root);
|
||||||
|
@override late final _TranslationsEmbedDa embed = _TranslationsEmbedDa._(_root);
|
||||||
|
|
||||||
|
/// Overskrifter på streaminglister efter streamingtype live/afsluttet/planlagt osv.
|
||||||
|
@override late final _TranslationsStreamListDa stream_list = _TranslationsStreamListDa._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapDa zap = _TranslationsZapDa._(_root);
|
||||||
|
@override late final _TranslationsProfileDa profile = _TranslationsProfileDa._(_root);
|
||||||
|
@override late final _TranslationsLoginDa login = _TranslationsLoginDa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamDa implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusDa status = _TranslationsStreamStatusDa._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Startet ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatDa chat = _TranslationsStreamChatDa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalDa implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Mål: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Resterende: ${amount}';
|
||||||
|
@override String get complete => 'KOMPLET';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonDa implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Knaptekst til login-knappen
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Log ud';
|
||||||
|
@override String get edit_profile => 'Rediger profil';
|
||||||
|
|
||||||
|
/// Knaptekst til følg-knappen
|
||||||
|
@override String get follow => 'Følg med';
|
||||||
|
|
||||||
|
/// Knaptekst til unfollow-knappen
|
||||||
|
@override String get unfollow => 'Ikke følge';
|
||||||
|
|
||||||
|
@override String get mute => 'Dæmpet';
|
||||||
|
@override String get unmute => 'Slå lyden fra';
|
||||||
|
@override String get share => 'Del';
|
||||||
|
@override String get save => 'Gemme';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedDa implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artikel af ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note fra ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Livestream på ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListDa implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Efterfølgende';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planlagt';
|
||||||
|
@override String get ended => 'Afsluttet';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapDa implements TranslationsZapEn {
|
||||||
|
_TranslationsZapDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Brugerdefineret beløb';
|
||||||
|
@override String get confirm => 'Bekræft';
|
||||||
|
@override String get comment => 'Kommentar';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Åbn i tegnebogen';
|
||||||
|
@override String get copy => 'Kopieret til udklipsholder';
|
||||||
|
@override late final _TranslationsZapErrorDa error = _TranslationsZapErrorDa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileDa implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Tidligere strømme';
|
||||||
|
@override late final _TranslationsProfileEditDa edit = _TranslationsProfileEditDa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginDa implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Brugernavn';
|
||||||
|
@override String get amber => 'Log ind med Amber';
|
||||||
|
@override String get key => 'Login med nøgle';
|
||||||
|
@override String get create => 'Opret konto';
|
||||||
|
@override late final _TranslationsLoginErrorDa error = _TranslationsLoginErrorDa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusDa implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'AFSLUTTET';
|
||||||
|
@override String get planned => 'PLANLAGT';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatDa implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DEAKTIVERET';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timeout udløber: ${time}';
|
||||||
|
|
||||||
|
/// Chatbesked, der viser timeout-hændelser
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' udløbet '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream afsluttede footer i bunden af chatten
|
||||||
|
@override String get ended => 'STREAM AFSLUTTET';
|
||||||
|
|
||||||
|
/// Chatbesked, der viser stream-zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zappet '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteDa write = _TranslationsStreamChatWriteDa._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeDa badge = _TranslationsStreamChatBadgeDa._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidDa raid = _TranslationsStreamChatRaidDa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorDa implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Ugyldigt brugerdefineret beløb';
|
||||||
|
@override String get no_wallet => 'Ingen lightning wallet installeret';
|
||||||
|
@override String get no_lud16 => 'Ingen lyn-adresse fundet';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditDa implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Vis navn';
|
||||||
|
@override String get about => 'Omkring';
|
||||||
|
@override String get nip05 => 'Nostr-adresse';
|
||||||
|
@override String get lud16 => 'Adresse for lynnedslag';
|
||||||
|
@override late final _TranslationsProfileEditErrorDa error = _TranslationsProfileEditErrorDa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorDa implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Ugyldig nøgle';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteDa implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label på chatbeskedens inputfelt
|
||||||
|
@override String get label => 'Skriv en besked';
|
||||||
|
|
||||||
|
/// Chat-inputmeddelelse vises, når brugeren kun er logget ind med pubkey
|
||||||
|
@override String get no_signer => 'Kan ikke skrive beskeder med npub-login';
|
||||||
|
|
||||||
|
/// Chat-inputmeddelelse vises, når brugeren er logget ud
|
||||||
|
@override String get login => 'Log ind for at sende beskeder';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeDa implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Overskrift over liste over brugere, der har fået tildelt et badge
|
||||||
|
@override String get awarded_to => 'Tildelt til:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidDa implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid-besked til en anden stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid-besked fra en anden stream
|
||||||
|
@override String from({ required Object name}) => 'RAID FRA ${name}';
|
||||||
|
|
||||||
|
/// Nedtællingstimer til auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Raiding i ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorDa implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorDa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Kan ikke redigere profil, når jeg er logget ud';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsDa {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload avatar';
|
||||||
|
case 'most_zapped_streamers': return 'De fleste zappede streamere';
|
||||||
|
case 'no_user_found': return 'Ingen bruger fundet';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('da'))(n,
|
||||||
|
one: '1 seer',
|
||||||
|
other: '${n} Seere',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'AFSLUTTET';
|
||||||
|
case 'stream.status.planned': return 'PLANLAGT';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Startet ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' udløbet '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM AFSLUTTET';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zappet '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Skriv en besked';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Kan ikke skrive beskeder med npub-login';
|
||||||
|
case 'stream.chat.write.login': return 'Log ind for at sende beskeder';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Tildelt til:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID FRA ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Raiding i ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Mål: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Resterende: ${amount}';
|
||||||
|
case 'goal.complete': return 'KOMPLET';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Log ud';
|
||||||
|
case 'button.edit_profile': return 'Rediger profil';
|
||||||
|
case 'button.follow': return 'Følg med';
|
||||||
|
case 'button.unfollow': return 'Ikke følge';
|
||||||
|
case 'button.mute': return 'Dæmpet';
|
||||||
|
case 'button.unmute': return 'Slå lyden fra';
|
||||||
|
case 'button.share': return 'Del';
|
||||||
|
case 'button.save': return 'Gemme';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artikel af ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note fra ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Livestream på ${name}';
|
||||||
|
case 'stream_list.following': return 'Efterfølgende';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planlagt';
|
||||||
|
case 'stream_list.ended': return 'Afsluttet';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Brugerdefineret beløb';
|
||||||
|
case 'zap.confirm': return 'Bekræft';
|
||||||
|
case 'zap.comment': return 'Kommentar';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Åbn i tegnebogen';
|
||||||
|
case 'zap.copy': return 'Kopieret til udklipsholder';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Ugyldigt brugerdefineret beløb';
|
||||||
|
case 'zap.error.no_wallet': return 'Ingen lightning wallet installeret';
|
||||||
|
case 'zap.error.no_lud16': return 'Ingen lyn-adresse fundet';
|
||||||
|
case 'profile.past_streams': return 'Tidligere strømme';
|
||||||
|
case 'profile.edit.display_name': return 'Vis navn';
|
||||||
|
case 'profile.edit.about': return 'Omkring';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr-adresse';
|
||||||
|
case 'profile.edit.lud16': return 'Adresse for lynnedslag';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Kan ikke redigere profil, når jeg er logget ud';
|
||||||
|
case 'login.username': return 'Brugernavn';
|
||||||
|
case 'login.amber': return 'Log ind med Amber';
|
||||||
|
case 'login.key': return 'Login med nøgle';
|
||||||
|
case 'login.create': return 'Opret konto';
|
||||||
|
case 'login.error.invalid_key': return 'Ugyldig nøgle';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_de.g.dart
Normal file
416
lib/i18n/strings_de.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsDe implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsDe({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.de,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <de>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsDe _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsDe $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsDe(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// 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
|
||||||
|
@override String get most_zapped_streamers => 'Meistgezappte Streamer';
|
||||||
|
|
||||||
|
/// Kein Benutzer bei der Suche gefunden
|
||||||
|
@override String get no_user_found => 'Kein Benutzer gefunden';
|
||||||
|
|
||||||
|
/// Ein anonymer Benutzer
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Anzahl der Betrachter des Streams
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n,
|
||||||
|
one: '1 Zuschauer',
|
||||||
|
other: '${n} Zuschauer',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamDe stream = _TranslationsStreamDe._(_root);
|
||||||
|
@override late final _TranslationsGoalDe goal = _TranslationsGoalDe._(_root);
|
||||||
|
@override late final _TranslationsButtonDe button = _TranslationsButtonDe._(_root);
|
||||||
|
@override late final _TranslationsEmbedDe embed = _TranslationsEmbedDe._(_root);
|
||||||
|
|
||||||
|
/// Überschriften auf Stream-Listen nach Stream-Typ live/beendet/geplant usw.
|
||||||
|
@override late final _TranslationsStreamListDe stream_list = _TranslationsStreamListDe._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapDe zap = _TranslationsZapDe._(_root);
|
||||||
|
@override late final _TranslationsProfileDe profile = _TranslationsProfileDe._(_root);
|
||||||
|
@override late final _TranslationsLoginDe login = _TranslationsLoginDe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamDe implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusDe status = _TranslationsStreamStatusDe._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Gestartet ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatDe chat = _TranslationsStreamChatDe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalDe implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Ziel: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Verbleibend: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonDe implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Schaltflächentext für die Anmeldeschaltfläche
|
||||||
|
@override String get login => 'Anmelden';
|
||||||
|
|
||||||
|
@override String get logout => 'Abmelden';
|
||||||
|
@override String get edit_profile => 'Profil anpassen';
|
||||||
|
|
||||||
|
/// Schaltflächentext für die Schaltfläche "Folgen
|
||||||
|
@override String get follow => 'Folgen';
|
||||||
|
|
||||||
|
/// Schaltflächentext für die "Unfollow"-Schaltfläche
|
||||||
|
@override String get unfollow => 'Entfolgen';
|
||||||
|
|
||||||
|
@override String get mute => 'Stummschalten';
|
||||||
|
@override String get unmute => 'Entstummen';
|
||||||
|
@override String get share => 'Teilen';
|
||||||
|
@override String get save => 'Speichern';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedDe implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artikel von ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note von ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live-Stream von ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListDe implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Folge ich';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Geplant';
|
||||||
|
@override String get ended => 'Beendet';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapDe implements TranslationsZapEn {
|
||||||
|
_TranslationsZapDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => '${name} zappen';
|
||||||
|
@override String get custom_amount => 'Benutzerdefinierter Betrag';
|
||||||
|
@override String get confirm => 'Bestätigen';
|
||||||
|
@override String get comment => 'Kommentar';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => '${amount} sats zappen';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'In Brieftasche öffnen';
|
||||||
|
@override String get copy => 'In die Zwischenablage kopiert';
|
||||||
|
@override late final _TranslationsZapErrorDe error = _TranslationsZapErrorDe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileDe implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Vergangene Streams';
|
||||||
|
@override late final _TranslationsProfileEditDe edit = _TranslationsProfileEditDe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginDe implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Benutzername';
|
||||||
|
@override String get amber => 'Anmeldung mit Amber';
|
||||||
|
@override String get key => 'Anmeldung mit Schlüssel';
|
||||||
|
@override String get create => 'Konto erstellen';
|
||||||
|
@override late final _TranslationsLoginErrorDe error = _TranslationsLoginErrorDe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusDe implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'GEPLANT';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatDe implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DEAKTIVIERT';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Die Zeitüberschreitung läuft ab: ${time}';
|
||||||
|
|
||||||
|
/// Chat-Nachricht mit Zeitüberschreitungsereignissen
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' Zeitüberschreitung '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' für '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream beendet Fußzeile am Ende des Chats
|
||||||
|
@override String get ended => 'STREAM BEENDET';
|
||||||
|
|
||||||
|
/// Chatnachricht mit Stream Zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' hat '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats gezappt'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteDe write = _TranslationsStreamChatWriteDe._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeDe badge = _TranslationsStreamChatBadgeDe._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidDe raid = _TranslationsStreamChatRaidDe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorDe implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Ungültiger benutzerdefinierter Betrag';
|
||||||
|
@override String get no_wallet => 'Keine Lightning-Brieftasche installiert';
|
||||||
|
@override String get no_lud16 => 'Keine Blitzadresse gefunden';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditDe implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Name anzeigen';
|
||||||
|
@override String get about => 'Über';
|
||||||
|
@override String get nip05 => 'Nostr-Adresse';
|
||||||
|
@override String get lud16 => 'Lightning-Adresse';
|
||||||
|
@override late final _TranslationsProfileEditErrorDe error = _TranslationsProfileEditErrorDe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorDe implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Ungültiger Schlüssel';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteDe implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Beschriftung des Eingabefeldes für Chatnachrichten
|
||||||
|
@override String get label => 'Nachricht schreiben';
|
||||||
|
|
||||||
|
/// Chat-Eingabemeldung wird angezeigt, wenn der Benutzer nur mit Pubkey eingeloggt ist
|
||||||
|
@override String get no_signer => 'Mit npub-Login können keine Nachrichten geschrieben werden';
|
||||||
|
|
||||||
|
/// Chat-Eingabemeldung wird angezeigt, wenn der Benutzer abgemeldet ist
|
||||||
|
@override String get login => 'Bitte anmelden, um Nachrichten zu senden';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeDe implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Überschrift über der Liste der Benutzer, die ein Abzeichen erhalten haben
|
||||||
|
@override String get awarded_to => 'Verliehen an:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidDe implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat-Überfallnachricht an einen anderen Stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat-Raid-Nachricht aus einem anderen Stream
|
||||||
|
@override String from({ required Object name}) => 'RAID VON ${name}';
|
||||||
|
|
||||||
|
/// Countdown-Timer für automatisches Reiten
|
||||||
|
@override String countdown({ required Object time}) => 'Raubzüge auf ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorDe implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorDe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsDe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Profil kann nicht bearbeitet werden, wenn es abgemeldet ist';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsDe {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Avatar hochladen';
|
||||||
|
case 'most_zapped_streamers': return 'Meistgezappte Streamer';
|
||||||
|
case 'no_user_found': return 'Kein Benutzer gefunden';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('de'))(n,
|
||||||
|
one: '1 Zuschauer',
|
||||||
|
other: '${n} Zuschauer',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'GEPLANT';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Gestartet ${timestamp}';
|
||||||
|
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.timeout': return ({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' Zeitüberschreitung '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' für '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM BEENDET';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' hat '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats gezappt'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Nachricht schreiben';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Mit npub-Login können keine Nachrichten geschrieben werden';
|
||||||
|
case 'stream.chat.write.login': return 'Bitte anmelden, um Nachrichten zu senden';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Verliehen an:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID VON ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Raubzüge auf ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Ziel: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Verbleibend: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Anmelden';
|
||||||
|
case 'button.logout': return 'Abmelden';
|
||||||
|
case 'button.edit_profile': return 'Profil anpassen';
|
||||||
|
case 'button.follow': return 'Folgen';
|
||||||
|
case 'button.unfollow': return 'Entfolgen';
|
||||||
|
case 'button.mute': return 'Stummschalten';
|
||||||
|
case 'button.unmute': return 'Entstummen';
|
||||||
|
case 'button.share': return 'Teilen';
|
||||||
|
case 'button.save': return 'Speichern';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artikel von ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note von ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live-Stream von ${name}';
|
||||||
|
case 'stream_list.following': return 'Folge ich';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Geplant';
|
||||||
|
case 'stream_list.ended': return 'Beendet';
|
||||||
|
case 'zap.title': return ({ required Object name}) => '${name} zappen';
|
||||||
|
case 'zap.custom_amount': return 'Benutzerdefinierter Betrag';
|
||||||
|
case 'zap.confirm': return 'Bestätigen';
|
||||||
|
case 'zap.comment': return 'Kommentar';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => '${amount} sats zappen';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'In Brieftasche öffnen';
|
||||||
|
case 'zap.copy': return 'In die Zwischenablage kopiert';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Ungültiger benutzerdefinierter Betrag';
|
||||||
|
case 'zap.error.no_wallet': return 'Keine Lightning-Brieftasche installiert';
|
||||||
|
case 'zap.error.no_lud16': return 'Keine Blitzadresse gefunden';
|
||||||
|
case 'profile.past_streams': return 'Vergangene Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Name anzeigen';
|
||||||
|
case 'profile.edit.about': return 'Über';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr-Adresse';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning-Adresse';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Profil kann nicht bearbeitet werden, wenn es abgemeldet ist';
|
||||||
|
case 'login.username': return 'Benutzername';
|
||||||
|
case 'login.amber': return 'Anmeldung mit Amber';
|
||||||
|
case 'login.key': return 'Anmeldung mit Schlüssel';
|
||||||
|
case 'login.create': return 'Konto erstellen';
|
||||||
|
case 'login.error.invalid_key': return 'Ungültiger Schlüssel';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_el.g.dart
Normal file
416
lib/i18n/strings_el.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsEl implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsEl({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.el,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <el>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsEl _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsEl $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsEl(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Κείμενο που προτρέπει τον χρήστη να πατήσει το εικονίδιο avatar για να ξεκινήσει το ανέβασμα
|
||||||
|
@override String get upload_avatar => 'Ανέβασμα Avatar';
|
||||||
|
|
||||||
|
/// Επικεφαλής πάνω από τα αναφερόμενα κορυφαία streamers από zaps
|
||||||
|
@override String get most_zapped_streamers => 'Τα περισσότερα Zapped Streamers';
|
||||||
|
|
||||||
|
/// Δεν βρέθηκε χρήστης κατά την αναζήτηση
|
||||||
|
@override String get no_user_found => 'Δεν βρέθηκε χρήστης';
|
||||||
|
|
||||||
|
/// Ένας ανώνυμος χρήστης
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Αριθμός θεατών της ροής
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('el'))(n,
|
||||||
|
one: '1 θεατής',
|
||||||
|
other: '${n} θεατές',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamEl stream = _TranslationsStreamEl._(_root);
|
||||||
|
@override late final _TranslationsGoalEl goal = _TranslationsGoalEl._(_root);
|
||||||
|
@override late final _TranslationsButtonEl button = _TranslationsButtonEl._(_root);
|
||||||
|
@override late final _TranslationsEmbedEl embed = _TranslationsEmbedEl._(_root);
|
||||||
|
|
||||||
|
/// Επικεφαλίδες στις λίστες ροής ανά τύπο ροής ζωντανή/τελειωμένη/προγραμματισμένη κ.λπ.
|
||||||
|
@override late final _TranslationsStreamListEl stream_list = _TranslationsStreamListEl._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapEl zap = _TranslationsZapEl._(_root);
|
||||||
|
@override late final _TranslationsProfileEl profile = _TranslationsProfileEl._(_root);
|
||||||
|
@override late final _TranslationsLoginEl login = _TranslationsLoginEl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamEl implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusEl status = _TranslationsStreamStatusEl._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Ξεκίνησε ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatEl chat = _TranslationsStreamChatEl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalEl implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Στόχος: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Υπόλοιπο: ${amount}';
|
||||||
|
@override String get complete => 'ΠΛΗΡΗΣ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonEl implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Κείμενο κουμπιού για το κουμπί σύνδεσης
|
||||||
|
@override String get login => 'Σύνδεση';
|
||||||
|
|
||||||
|
@override String get logout => 'Αποσύνδεση';
|
||||||
|
@override String get edit_profile => 'Επεξεργασία προφίλ';
|
||||||
|
|
||||||
|
/// Κείμενο κουμπιού για το κουμπί follow
|
||||||
|
@override String get follow => 'Ακολουθήστε το';
|
||||||
|
|
||||||
|
/// Κείμενο κουμπιού για το κουμπί unfollow
|
||||||
|
@override String get unfollow => 'Ακολουθήστε το';
|
||||||
|
|
||||||
|
@override String get mute => 'Σίγαση';
|
||||||
|
@override String get unmute => 'Αποσυνδέστε τη φωνή σας από το';
|
||||||
|
@override String get share => 'Μοιραστείτε το';
|
||||||
|
@override String get save => 'Αποθήκευση';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedEl implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Άρθρο από ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Σημείωση του ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Ζωντανή μετάδοση από το ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListEl implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Ακολουθώντας το';
|
||||||
|
@override String get live => 'Ζωντανό';
|
||||||
|
@override String get planned => 'Προγραμματισμένο';
|
||||||
|
@override String get ended => 'Τελείωσε';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapEl implements TranslationsZapEn {
|
||||||
|
_TranslationsZapEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Προσαρμοσμένο ποσό';
|
||||||
|
@override String get confirm => 'Επιβεβαίωση';
|
||||||
|
@override String get comment => 'Σχόλιο';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Άνοιγμα στο πορτοφόλι';
|
||||||
|
@override String get copy => 'Αντιγραφή στο πρόχειρο';
|
||||||
|
@override late final _TranslationsZapErrorEl error = _TranslationsZapErrorEl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileEl implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Προηγούμενα ρεύματα';
|
||||||
|
@override late final _TranslationsProfileEditEl edit = _TranslationsProfileEditEl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginEl implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Όνομα χρήστη';
|
||||||
|
@override String get amber => 'Σύνδεση με Amber';
|
||||||
|
@override String get key => 'Σύνδεση με κλειδί';
|
||||||
|
@override String get create => 'Δημιουργία λογαριασμού';
|
||||||
|
@override late final _TranslationsLoginErrorEl error = _TranslationsLoginErrorEl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusEl implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'ΣΧΕΔΙΑΣΜΟΣ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatEl implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'ΑΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ ΣΥΝΟΜΙΛΊΑ';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Το χρονικό όριο λήγει: ${time}';
|
||||||
|
|
||||||
|
/// Μήνυμα συνομιλίας που εμφανίζει συμβάντα timeout
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' χρονομετρημένη λήξη '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' για '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Η ροή τελείωσε το υποσέλιδο στο κάτω μέρος της συνομιλίας
|
||||||
|
@override String get ended => 'STREAM ΤΕΛΕΙΩΣΕ';
|
||||||
|
|
||||||
|
/// Μήνυμα συνομιλίας που δείχνει ροή ροής zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteEl write = _TranslationsStreamChatWriteEl._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeEl badge = _TranslationsStreamChatBadgeEl._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidEl raid = _TranslationsStreamChatRaidEl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorEl implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Μη έγκυρο προσαρμοσμένο ποσό';
|
||||||
|
@override String get no_wallet => 'Δεν έχει εγκατασταθεί πορτοφόλι αστραπής';
|
||||||
|
@override String get no_lud16 => 'Δεν βρέθηκε διεύθυνση κεραυνού';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditEl implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Όνομα οθόνης';
|
||||||
|
@override String get about => 'Σχετικά με το';
|
||||||
|
@override String get nip05 => 'Διεύθυνση Nostr';
|
||||||
|
@override String get lud16 => 'Διεύθυνση Lightning';
|
||||||
|
@override late final _TranslationsProfileEditErrorEl error = _TranslationsProfileEditErrorEl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorEl implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Μη έγκυρο κλειδί';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteEl implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Ετικέτα στο πλαίσιο εισαγωγής μηνύματος συνομιλίας
|
||||||
|
@override String get label => 'Γράψτε μήνυμα';
|
||||||
|
|
||||||
|
/// Μήνυμα εισόδου συνομιλίας που εμφανίζεται όταν ο χρήστης είναι συνδεδεμένος μόνο με το κλειδί pubkey
|
||||||
|
@override String get no_signer => 'Δεν μπορείτε να γράψετε μηνύματα με σύνδεση στο npub';
|
||||||
|
|
||||||
|
/// Μήνυμα εισόδου συνομιλίας που εμφανίζεται όταν ο χρήστης έχει αποσυνδεθεί
|
||||||
|
@override String get login => 'Παρακαλώ συνδεθείτε για να στείλετε μηνύματα';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeEl implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Επικεφαλίδα πάνω από τη λίστα των χρηστών στους οποίους έχει απονεμηθεί ένα σήμα
|
||||||
|
@override String get awarded_to => 'Απονέμεται σε:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidEl implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Μήνυμα επιδρομής συνομιλίας σε άλλη ροή
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Μήνυμα επιδρομής συνομιλίας από άλλη ροή
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Χρονοδιακόπτης αντίστροφης μέτρησης για αυτόματη ιππασία
|
||||||
|
@override String countdown({ required Object time}) => 'Επιδρομές στο ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorEl implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorEl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Δεν μπορείτε να επεξεργαστείτε το προφίλ όταν έχετε αποσυνδεθεί';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsEl {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Ανέβασμα Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Τα περισσότερα Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'Δεν βρέθηκε χρήστης';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('el'))(n,
|
||||||
|
one: '1 θεατής',
|
||||||
|
other: '${n} θεατές',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'ΣΧΕΔΙΑΣΜΟΣ';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Ξεκίνησε ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' χρονομετρημένη λήξη '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' για '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ΤΕΛΕΙΩΣΕ';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Γράψτε μήνυμα';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Δεν μπορείτε να γράψετε μηνύματα με σύνδεση στο npub';
|
||||||
|
case 'stream.chat.write.login': return 'Παρακαλώ συνδεθείτε για να στείλετε μηνύματα';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Απονέμεται σε:';
|
||||||
|
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}) => 'Επιδρομές στο ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Στόχος: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Υπόλοιπο: ${amount}';
|
||||||
|
case 'goal.complete': return 'ΠΛΗΡΗΣ';
|
||||||
|
case 'button.login': return 'Σύνδεση';
|
||||||
|
case 'button.logout': return 'Αποσύνδεση';
|
||||||
|
case 'button.edit_profile': return 'Επεξεργασία προφίλ';
|
||||||
|
case 'button.follow': return 'Ακολουθήστε το';
|
||||||
|
case 'button.unfollow': return 'Ακολουθήστε το';
|
||||||
|
case 'button.mute': return 'Σίγαση';
|
||||||
|
case 'button.unmute': return 'Αποσυνδέστε τη φωνή σας από το';
|
||||||
|
case 'button.share': return 'Μοιραστείτε το';
|
||||||
|
case 'button.save': return 'Αποθήκευση';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Άρθρο από ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Σημείωση του ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Ζωντανή μετάδοση από το ${name}';
|
||||||
|
case 'stream_list.following': return 'Ακολουθώντας το';
|
||||||
|
case 'stream_list.live': return 'Ζωντανό';
|
||||||
|
case 'stream_list.planned': return 'Προγραμματισμένο';
|
||||||
|
case 'stream_list.ended': return 'Τελείωσε';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Προσαρμοσμένο ποσό';
|
||||||
|
case 'zap.confirm': return 'Επιβεβαίωση';
|
||||||
|
case 'zap.comment': return 'Σχόλιο';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Άνοιγμα στο πορτοφόλι';
|
||||||
|
case 'zap.copy': return 'Αντιγραφή στο πρόχειρο';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Μη έγκυρο προσαρμοσμένο ποσό';
|
||||||
|
case 'zap.error.no_wallet': return 'Δεν έχει εγκατασταθεί πορτοφόλι αστραπής';
|
||||||
|
case 'zap.error.no_lud16': return 'Δεν βρέθηκε διεύθυνση κεραυνού';
|
||||||
|
case 'profile.past_streams': return 'Προηγούμενα ρεύματα';
|
||||||
|
case 'profile.edit.display_name': return 'Όνομα οθόνης';
|
||||||
|
case 'profile.edit.about': return 'Σχετικά με το';
|
||||||
|
case 'profile.edit.nip05': return 'Διεύθυνση Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Διεύθυνση Lightning';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Δεν μπορείτε να επεξεργαστείτε το προφίλ όταν έχετε αποσυνδεθεί';
|
||||||
|
case 'login.username': return 'Όνομα χρήστη';
|
||||||
|
case 'login.amber': return 'Σύνδεση με Amber';
|
||||||
|
case 'login.key': return 'Σύνδεση με κλειδί';
|
||||||
|
case 'login.create': return 'Δημιουργία λογαριασμού';
|
||||||
|
case 'login.error.invalid_key': return 'Μη έγκυρο κλειδί';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
418
lib/i18n/strings_en.g.dart
Normal file
418
lib/i18n/strings_en.g.dart
Normal file
@ -0,0 +1,418 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
part of 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
typedef TranslationsEn = Translations; // ignore: unused_element
|
||||||
|
class Translations implements BaseTranslations<AppLocale, Translations> {
|
||||||
|
/// Returns the current translations of the given [context].
|
||||||
|
///
|
||||||
|
/// Usage:
|
||||||
|
/// final t = Translations.of(context);
|
||||||
|
static Translations of(BuildContext context) => InheritedLocaleData.of<AppLocale, Translations>(context).translations;
|
||||||
|
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
Translations({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.en,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <en>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final Translations _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
Translations $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => Translations(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
String get upload_avatar => 'Upload Avatar';
|
||||||
|
|
||||||
|
/// Heading over listed top streamers by zaps
|
||||||
|
String get most_zapped_streamers => 'Most Zapped Streamers';
|
||||||
|
|
||||||
|
/// No user found when searching
|
||||||
|
String get no_user_found => 'No user found';
|
||||||
|
|
||||||
|
/// An anonymous user
|
||||||
|
String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Number of viewers of the stream
|
||||||
|
String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
|
||||||
|
late final TranslationsStreamEn stream = TranslationsStreamEn._(_root);
|
||||||
|
late final TranslationsGoalEn goal = TranslationsGoalEn._(_root);
|
||||||
|
late final TranslationsButtonEn button = TranslationsButtonEn._(_root);
|
||||||
|
late final TranslationsEmbedEn embed = TranslationsEmbedEn._(_root);
|
||||||
|
|
||||||
|
/// Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
late final TranslationsStreamListEn stream_list = TranslationsStreamListEn._(_root);
|
||||||
|
|
||||||
|
late final TranslationsZapEn zap = TranslationsZapEn._(_root);
|
||||||
|
late final TranslationsProfileEn profile = TranslationsProfileEn._(_root);
|
||||||
|
late final TranslationsLoginEn login = TranslationsLoginEn._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class TranslationsStreamEn {
|
||||||
|
TranslationsStreamEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
late final TranslationsStreamStatusEn status = TranslationsStreamStatusEn._(_root);
|
||||||
|
String started({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
late final TranslationsStreamChatEn chat = TranslationsStreamChatEn._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class TranslationsGoalEn {
|
||||||
|
TranslationsGoalEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String title({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
String remaining({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class TranslationsButtonEn {
|
||||||
|
TranslationsButtonEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Button text for the login button
|
||||||
|
String get login => 'Login';
|
||||||
|
|
||||||
|
String get logout => 'Logout';
|
||||||
|
String get edit_profile => 'Edit Profile';
|
||||||
|
|
||||||
|
/// Button text for the follow button
|
||||||
|
String get follow => 'Follow';
|
||||||
|
|
||||||
|
/// Button text for the unfollow button
|
||||||
|
String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
String get mute => 'Mute';
|
||||||
|
String get unmute => 'Unmute';
|
||||||
|
String get share => 'Share';
|
||||||
|
String get save => 'Save';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class TranslationsEmbedEn {
|
||||||
|
TranslationsEmbedEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String article_by({ required Object name}) => 'Article by ${name}';
|
||||||
|
String note_by({ required Object name}) => 'Note by ${name}';
|
||||||
|
String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class TranslationsStreamListEn {
|
||||||
|
TranslationsStreamListEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get following => 'Following';
|
||||||
|
String get live => 'Live';
|
||||||
|
String get planned => 'Planned';
|
||||||
|
String get ended => 'Ended';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class TranslationsZapEn {
|
||||||
|
TranslationsZapEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
String get custom_amount => 'Custom Amount';
|
||||||
|
String get confirm => 'Confirm';
|
||||||
|
String get comment => 'Comment';
|
||||||
|
String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
String get button_zap => 'Zap';
|
||||||
|
String get button_open_wallet => 'Open in Wallet';
|
||||||
|
String get copy => 'Copied to clipboard';
|
||||||
|
late final TranslationsZapErrorEn error = TranslationsZapErrorEn._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class TranslationsProfileEn {
|
||||||
|
TranslationsProfileEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get past_streams => 'Past Streams';
|
||||||
|
late final TranslationsProfileEditEn edit = TranslationsProfileEditEn._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class TranslationsLoginEn {
|
||||||
|
TranslationsLoginEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get username => 'Username';
|
||||||
|
String get amber => 'Login with Amber';
|
||||||
|
String get key => 'Login with Key';
|
||||||
|
String get create => 'Create Account';
|
||||||
|
late final TranslationsLoginErrorEn error = TranslationsLoginErrorEn._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class TranslationsStreamStatusEn {
|
||||||
|
TranslationsStreamStatusEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get live => 'LIVE';
|
||||||
|
String get ended => 'ENDED';
|
||||||
|
String get planned => 'PLANNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class TranslationsStreamChatEn {
|
||||||
|
TranslationsStreamChatEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get disabled => 'CHAT DISABLED';
|
||||||
|
String disabled_timeout({ required Object time}) => 'Timeout expires: ${time}';
|
||||||
|
|
||||||
|
/// Chat message showing timeout events
|
||||||
|
TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Chat message showing stream zaps
|
||||||
|
TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
late final TranslationsStreamChatWriteEn write = TranslationsStreamChatWriteEn._(_root);
|
||||||
|
late final TranslationsStreamChatBadgeEn badge = TranslationsStreamChatBadgeEn._(_root);
|
||||||
|
late final TranslationsStreamChatRaidEn raid = TranslationsStreamChatRaidEn._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class TranslationsZapErrorEn {
|
||||||
|
TranslationsZapErrorEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get invalid_custom_amount => 'Invalid custom amount';
|
||||||
|
String get no_wallet => 'No lightning wallet installed';
|
||||||
|
String get no_lud16 => 'No lightning address found';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class TranslationsProfileEditEn {
|
||||||
|
TranslationsProfileEditEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get display_name => 'Display Name';
|
||||||
|
String get about => 'About';
|
||||||
|
String get nip05 => 'Nostr Address';
|
||||||
|
String get lud16 => 'Lightning Address';
|
||||||
|
late final TranslationsProfileEditErrorEn error = TranslationsProfileEditErrorEn._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class TranslationsLoginErrorEn {
|
||||||
|
TranslationsLoginErrorEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get invalid_key => 'Invalid key';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class TranslationsStreamChatWriteEn {
|
||||||
|
TranslationsStreamChatWriteEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label on the chat message input box
|
||||||
|
String get label => 'Write message';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged in only with pubkey
|
||||||
|
String get no_signer => 'Can\'t write messages with npub login';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged out
|
||||||
|
String get login => 'Please login to send messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class TranslationsStreamChatBadgeEn {
|
||||||
|
TranslationsStreamChatBadgeEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Heading over list of users who are awarded a badge
|
||||||
|
String get awarded_to => 'Awarded to:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class TranslationsStreamChatRaidEn {
|
||||||
|
TranslationsStreamChatRaidEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid message to another stream
|
||||||
|
String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid message from another stream
|
||||||
|
String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Countdown timer for auto-raiding
|
||||||
|
String countdown({ required Object time}) => 'Raiding in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class TranslationsProfileEditErrorEn {
|
||||||
|
TranslationsProfileEditErrorEn._(this._root);
|
||||||
|
|
||||||
|
final Translations _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
String get logged_out => 'Cant edit profile when logged out';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on Translations {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Most Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'No user found';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('en'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'PLANNED';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Write message';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Can\'t write messages with npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Please login to send messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Awarded to:';
|
||||||
|
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 in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Edit Profile';
|
||||||
|
case 'button.follow': return 'Follow';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mute';
|
||||||
|
case 'button.unmute': return 'Unmute';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Save';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article by ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note by ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return 'Following';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planned';
|
||||||
|
case 'stream_list.ended': return 'Ended';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Custom Amount';
|
||||||
|
case 'zap.confirm': return 'Confirm';
|
||||||
|
case 'zap.comment': return 'Comment';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Open in Wallet';
|
||||||
|
case 'zap.copy': return 'Copied to clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Invalid custom amount';
|
||||||
|
case 'zap.error.no_wallet': return 'No lightning wallet installed';
|
||||||
|
case 'zap.error.no_lud16': return 'No lightning address found';
|
||||||
|
case 'profile.past_streams': return 'Past Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Display Name';
|
||||||
|
case 'profile.edit.about': return 'About';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Address';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Address';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Cant edit profile when logged out';
|
||||||
|
case 'login.username': return 'Username';
|
||||||
|
case 'login.amber': return 'Login with Amber';
|
||||||
|
case 'login.key': return 'Login with Key';
|
||||||
|
case 'login.create': return 'Create Account';
|
||||||
|
case 'login.error.invalid_key': return 'Invalid key';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_es.g.dart
Normal file
416
lib/i18n/strings_es.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsEs implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsEs({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.es,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <es>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsEs _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsEs $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsEs(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Texto que indica al usuario que pulse el marcador de avatar para iniciar la carga
|
||||||
|
@override String get upload_avatar => 'Subir avatar';
|
||||||
|
|
||||||
|
/// Encabezando streamers superiores listados por zaps
|
||||||
|
@override String get most_zapped_streamers => 'Serpentinas más derribadas';
|
||||||
|
|
||||||
|
/// No se ha encontrado ningún usuario al realizar la búsqueda
|
||||||
|
@override String get no_user_found => 'No se ha encontrado ningún usuario';
|
||||||
|
|
||||||
|
/// Un usuario anónimo
|
||||||
|
@override String get anon => 'Anónimo';
|
||||||
|
|
||||||
|
/// Número de espectadores del flujo
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n,
|
||||||
|
one: '1 espectador',
|
||||||
|
other: '${n} espectadores',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamEs stream = _TranslationsStreamEs._(_root);
|
||||||
|
@override late final _TranslationsGoalEs goal = _TranslationsGoalEs._(_root);
|
||||||
|
@override late final _TranslationsButtonEs button = _TranslationsButtonEs._(_root);
|
||||||
|
@override late final _TranslationsEmbedEs embed = _TranslationsEmbedEs._(_root);
|
||||||
|
|
||||||
|
/// Encabezamientos en las listas de flujos por tipo de flujo en directo/finalizado/planificado, etc.
|
||||||
|
@override late final _TranslationsStreamListEs stream_list = _TranslationsStreamListEs._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapEs zap = _TranslationsZapEs._(_root);
|
||||||
|
@override late final _TranslationsProfileEs profile = _TranslationsProfileEs._(_root);
|
||||||
|
@override late final _TranslationsLoginEs login = _TranslationsLoginEs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamEs implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusEs status = _TranslationsStreamStatusEs._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Comenzó ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatEs chat = _TranslationsStreamChatEs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalEs implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Objetivo: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Resto: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETAR';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonEs implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Texto del botón de inicio de sesión
|
||||||
|
@override String get login => 'Iniciar Sesión';
|
||||||
|
|
||||||
|
@override String get logout => 'Cerrar sesión';
|
||||||
|
@override String get edit_profile => 'Editar Perfil';
|
||||||
|
|
||||||
|
/// Texto del botón de seguimiento
|
||||||
|
@override String get follow => 'Seguir';
|
||||||
|
|
||||||
|
/// Texto del botón "Dejar de seguir
|
||||||
|
@override String get unfollow => 'Dejar de seguir';
|
||||||
|
|
||||||
|
@override String get mute => 'Silenciar';
|
||||||
|
@override String get unmute => 'Dejar de silenciar';
|
||||||
|
@override String get share => 'Compartir';
|
||||||
|
@override String get save => 'Guardar';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedEs implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artículo de ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Nota de ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Transmisión en directo por ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListEs implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Siguiendo';
|
||||||
|
@override String get live => 'En directo';
|
||||||
|
@override String get planned => 'Planificado';
|
||||||
|
@override String get ended => 'Finalizado';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapEs implements TranslationsZapEn {
|
||||||
|
_TranslationsZapEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Importe personalizado';
|
||||||
|
@override String get confirm => 'Confirmar';
|
||||||
|
@override String get comment => 'Comentario';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zapear ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Abrir en cartera';
|
||||||
|
@override String get copy => 'Copiado al portapapeles';
|
||||||
|
@override late final _TranslationsZapErrorEs error = _TranslationsZapErrorEs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileEs implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Transmisiones anteriores';
|
||||||
|
@override late final _TranslationsProfileEditEs edit = _TranslationsProfileEditEs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginEs implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Usuario';
|
||||||
|
@override String get amber => 'Iniciar sesión con Amber';
|
||||||
|
@override String get key => 'Inicio de sesión con clave';
|
||||||
|
@override String get create => 'Crear una cuenta';
|
||||||
|
@override late final _TranslationsLoginErrorEs error = _TranslationsLoginErrorEs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusEs implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'EN VIVO';
|
||||||
|
@override String get ended => 'FIN';
|
||||||
|
@override String get planned => 'PLANIFICADO';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatEs implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DESHABILITADO';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'El tiempo de espera expira: ${time}';
|
||||||
|
|
||||||
|
/// Mensaje de chat que muestra los eventos de tiempo de espera
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' para '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream finalizó en la parte inferior del chat
|
||||||
|
@override String get ended => 'STREAM FINED';
|
||||||
|
|
||||||
|
/// Mensaje de chat que muestra zaps de flujo
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapearon '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteEs write = _TranslationsStreamChatWriteEs._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeEs badge = _TranslationsStreamChatBadgeEs._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidEs raid = _TranslationsStreamChatRaidEs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorEs implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Importe personalizado no válido';
|
||||||
|
@override String get no_wallet => 'Sin monedero relámpago instalado';
|
||||||
|
@override String get no_lud16 => 'No se ha encontrado ninguna dirección de rayos';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditEs implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Mostrar nombre';
|
||||||
|
@override String get about => 'Sobre ti';
|
||||||
|
@override String get nip05 => 'Dirección Nostr';
|
||||||
|
@override String get lud16 => 'Dirección del rayo';
|
||||||
|
@override late final _TranslationsProfileEditErrorEs error = _TranslationsProfileEditErrorEs._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorEs implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Clave no válida';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteEs implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Etiqueta del cuadro de entrada de mensajes de chat
|
||||||
|
@override String get label => 'Escribir mensaje';
|
||||||
|
|
||||||
|
/// Mensaje de entrada en el chat que se muestra cuando el usuario está conectado sólo con pubkey
|
||||||
|
@override String get no_signer => 'No se pueden escribir mensajes con el login npub';
|
||||||
|
|
||||||
|
/// Mensaje de entrada al chat que se muestra cuando el usuario cierra la sesión
|
||||||
|
@override String get login => 'Inicie sesión para enviar mensajes';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeEs implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Encabezamiento de la lista de usuarios a los que se ha concedido una insignia
|
||||||
|
@override String get awarded_to => 'Concedido a:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidEs implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Mensaje de raid de chat a otro flujo
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Mensaje de incursión en el chat desde otro flujo
|
||||||
|
@override String from({ required Object name}) => 'RAID DESDE ${name}';
|
||||||
|
|
||||||
|
/// Temporizador de cuenta atrás para auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Incursiones en ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorEs implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorEs._(this._root);
|
||||||
|
|
||||||
|
final TranslationsEs _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'No se puede editar el perfil cuando se cierra la sesión';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsEs {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Subir avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Serpentinas más derribadas';
|
||||||
|
case 'no_user_found': return 'No se ha encontrado ningún usuario';
|
||||||
|
case 'anon': return 'Anónimo';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('es'))(n,
|
||||||
|
one: '1 espectador',
|
||||||
|
other: '${n} espectadores',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'EN VIVO';
|
||||||
|
case 'stream.status.ended': return 'FIN';
|
||||||
|
case 'stream.status.planned': return 'PLANIFICADO';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Comenzó ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' para '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM FINED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapearon '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Escribir mensaje';
|
||||||
|
case 'stream.chat.write.no_signer': return 'No se pueden escribir mensajes con el login npub';
|
||||||
|
case 'stream.chat.write.login': return 'Inicie sesión para enviar mensajes';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Concedido a:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID DESDE ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Incursiones en ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Objetivo: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Resto: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETAR';
|
||||||
|
case 'button.login': return 'Iniciar Sesión';
|
||||||
|
case 'button.logout': return 'Cerrar sesión';
|
||||||
|
case 'button.edit_profile': return 'Editar Perfil';
|
||||||
|
case 'button.follow': return 'Seguir';
|
||||||
|
case 'button.unfollow': return 'Dejar de seguir';
|
||||||
|
case 'button.mute': return 'Silenciar';
|
||||||
|
case 'button.unmute': return 'Dejar de silenciar';
|
||||||
|
case 'button.share': return 'Compartir';
|
||||||
|
case 'button.save': return 'Guardar';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artículo de ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Nota de ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Transmisión en directo por ${name}';
|
||||||
|
case 'stream_list.following': return 'Siguiendo';
|
||||||
|
case 'stream_list.live': return 'En directo';
|
||||||
|
case 'stream_list.planned': return 'Planificado';
|
||||||
|
case 'stream_list.ended': return 'Finalizado';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Importe personalizado';
|
||||||
|
case 'zap.confirm': return 'Confirmar';
|
||||||
|
case 'zap.comment': return 'Comentario';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zapear ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Abrir en cartera';
|
||||||
|
case 'zap.copy': return 'Copiado al portapapeles';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Importe personalizado no válido';
|
||||||
|
case 'zap.error.no_wallet': return 'Sin monedero relámpago instalado';
|
||||||
|
case 'zap.error.no_lud16': return 'No se ha encontrado ninguna dirección de rayos';
|
||||||
|
case 'profile.past_streams': return 'Transmisiones anteriores';
|
||||||
|
case 'profile.edit.display_name': return 'Mostrar nombre';
|
||||||
|
case 'profile.edit.about': return 'Sobre ti';
|
||||||
|
case 'profile.edit.nip05': return 'Dirección Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Dirección del rayo';
|
||||||
|
case 'profile.edit.error.logged_out': return 'No se puede editar el perfil cuando se cierra la sesión';
|
||||||
|
case 'login.username': return 'Usuario';
|
||||||
|
case 'login.amber': return 'Iniciar sesión con Amber';
|
||||||
|
case 'login.key': return 'Inicio de sesión con clave';
|
||||||
|
case 'login.create': return 'Crear una cuenta';
|
||||||
|
case 'login.error.invalid_key': return 'Clave no válida';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_fi.g.dart
Normal file
416
lib/i18n/strings_fi.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsFi implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsFi({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.fi,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <fi>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsFi _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsFi $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsFi(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Teksti, joka kehottaa käyttäjää painamaan avatar-merkkiä aloittaakseen lataamisen.
|
||||||
|
@override String get upload_avatar => 'Lataa avatar';
|
||||||
|
|
||||||
|
/// Päällekkäin lueteltujen alkuun streamers by zaps
|
||||||
|
@override String get most_zapped_streamers => 'Eniten Zapped Streamers';
|
||||||
|
|
||||||
|
/// Käyttäjää ei löytynyt haun yhteydessä
|
||||||
|
@override String get no_user_found => 'Käyttäjää ei löytynyt';
|
||||||
|
|
||||||
|
/// Nimetön käyttäjä
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Streamin katsojien määrä
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fi'))(n,
|
||||||
|
one: '1 katsoja',
|
||||||
|
other: '${n} katsojaa',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamFi stream = _TranslationsStreamFi._(_root);
|
||||||
|
@override late final _TranslationsGoalFi goal = _TranslationsGoalFi._(_root);
|
||||||
|
@override late final _TranslationsButtonFi button = _TranslationsButtonFi._(_root);
|
||||||
|
@override late final _TranslationsEmbedFi embed = _TranslationsEmbedFi._(_root);
|
||||||
|
|
||||||
|
/// Stream-luetteloiden otsikot stream-tyypeittäin live/päättynyt/suunniteltu jne.
|
||||||
|
@override late final _TranslationsStreamListFi stream_list = _TranslationsStreamListFi._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapFi zap = _TranslationsZapFi._(_root);
|
||||||
|
@override late final _TranslationsProfileFi profile = _TranslationsProfileFi._(_root);
|
||||||
|
@override late final _TranslationsLoginFi login = _TranslationsLoginFi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamFi implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusFi status = _TranslationsStreamStatusFi._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Aloitettu ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatFi chat = _TranslationsStreamChatFi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalFi implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Tavoite: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Jäljellä: ${amount}';
|
||||||
|
@override String get complete => 'TÄYDELLINEN';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonFi implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Kirjautumispainikkeen teksti
|
||||||
|
@override String get login => 'Kirjaudu sisään';
|
||||||
|
|
||||||
|
@override String get logout => 'Kirjaudu ulos';
|
||||||
|
@override String get edit_profile => 'Muokkaa profiilia';
|
||||||
|
|
||||||
|
/// Seuraa-painikkeen painikkeen teksti
|
||||||
|
@override String get follow => 'Seuraa';
|
||||||
|
|
||||||
|
/// Seuraa-painikkeen teksti
|
||||||
|
@override String get unfollow => 'Älä seuraa';
|
||||||
|
|
||||||
|
@override String get mute => 'Mykistä';
|
||||||
|
@override String get unmute => 'Poista mykistys';
|
||||||
|
@override String get share => 'Jaa';
|
||||||
|
@override String get save => 'Tallenna';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedFi implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artikkeli ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Viesti lähettäjältä ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Suora lähetys osoitteessa ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListFi implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Seuraa';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Suunniteltu';
|
||||||
|
@override String get ended => 'Päättynyt';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapFi implements TranslationsZapEn {
|
||||||
|
_TranslationsZapFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Mukautettu määrä';
|
||||||
|
@override String get confirm => 'Vahvista';
|
||||||
|
@override String get comment => 'Kommentoi';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} satsia';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Avaa lompakossa';
|
||||||
|
@override String get copy => 'Kopioitu leikepöydälle';
|
||||||
|
@override late final _TranslationsZapErrorFi error = _TranslationsZapErrorFi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileFi implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Aikaisemmat lähetykset';
|
||||||
|
@override late final _TranslationsProfileEditFi edit = _TranslationsProfileEditFi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginFi implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Käyttäjätunnus';
|
||||||
|
@override String get amber => 'Kirjaudu sisään Amber kanssa';
|
||||||
|
@override String get key => 'Kirjaudu sisään avaimella';
|
||||||
|
@override String get create => 'Luo tili';
|
||||||
|
@override late final _TranslationsLoginErrorFi error = _TranslationsLoginErrorFi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusFi implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'SUUNNITELTU';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatFi implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT POISTETTU KÄYTÖSTÄ';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Aikakatkaisu päättyy: ${time}';
|
||||||
|
|
||||||
|
/// Chat-viesti, joka näyttää aikakatkaisutapahtumat
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' ajastettu '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Virta päättyi alatunnisteen alareunaan chatissa
|
||||||
|
@override String get ended => 'STREAM PÄÄTTYNYT';
|
||||||
|
|
||||||
|
/// Chat-viestin näyttäminen stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zappasi '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' satsia'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteFi write = _TranslationsStreamChatWriteFi._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeFi badge = _TranslationsStreamChatBadgeFi._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidFi raid = _TranslationsStreamChatRaidFi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorFi implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Virheellinen mukautettu määrä';
|
||||||
|
@override String get no_wallet => 'Ei asennettua salamalompakkoa';
|
||||||
|
@override String get no_lud16 => 'Salamaosoitetta ei löytynyt';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditFi implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Näytön nimi';
|
||||||
|
@override String get about => 'Tietoja';
|
||||||
|
@override String get nip05 => 'Nostr-osoite';
|
||||||
|
@override String get lud16 => 'Lightning-osoite';
|
||||||
|
@override late final _TranslationsProfileEditErrorFi error = _TranslationsProfileEditErrorFi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorFi implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Virheellinen avain';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteFi implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat-viestin syöttöruudun tarra
|
||||||
|
@override String get label => 'Kirjoita viesti';
|
||||||
|
|
||||||
|
/// Chat-syöttöviesti näytetään, kun käyttäjä on kirjautunut sisään vain pubkey-avaimella.
|
||||||
|
@override String get no_signer => 'Ei voi kirjoittaa viestejä npub-kirjautumisella';
|
||||||
|
|
||||||
|
/// Chat-syötteen viesti näytetään, kun käyttäjä on kirjautunut ulos.
|
||||||
|
@override String get login => 'Kirjaudu sisään lähettääksesi viestejä';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeFi implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Merkin saaneiden käyttäjien luettelon otsikko
|
||||||
|
@override String get awarded_to => 'Myönnetty:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidFi implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat-viesti toiseen streamiin
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid viesti toisesta virrasta
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Lähtölaskenta ajastin automaattista ratsastusta varten
|
||||||
|
@override String countdown({ required Object time}) => 'Ryöstöretket osoitteessa ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorFi implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorFi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Ei voi muokata profiilia, kun on kirjautunut ulos';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsFi {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Lataa avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Eniten Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'Käyttäjää ei löytynyt';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fi'))(n,
|
||||||
|
one: '1 katsoja',
|
||||||
|
other: '${n} katsojaa',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'SUUNNITELTU';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Aloitettu ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' ajastettu '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM PÄÄTTYNYT';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zappasi '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' satsia'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Kirjoita viesti';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Ei voi kirjoittaa viestejä npub-kirjautumisella';
|
||||||
|
case 'stream.chat.write.login': return 'Kirjaudu sisään lähettääksesi viestejä';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Myönnetty:';
|
||||||
|
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}) => 'Ryöstöretket osoitteessa ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Tavoite: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Jäljellä: ${amount}';
|
||||||
|
case 'goal.complete': return 'TÄYDELLINEN';
|
||||||
|
case 'button.login': return 'Kirjaudu sisään';
|
||||||
|
case 'button.logout': return 'Kirjaudu ulos';
|
||||||
|
case 'button.edit_profile': return 'Muokkaa profiilia';
|
||||||
|
case 'button.follow': return 'Seuraa';
|
||||||
|
case 'button.unfollow': return 'Älä seuraa';
|
||||||
|
case 'button.mute': return 'Mykistä';
|
||||||
|
case 'button.unmute': return 'Poista mykistys';
|
||||||
|
case 'button.share': return 'Jaa';
|
||||||
|
case 'button.save': return 'Tallenna';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artikkeli ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Viesti lähettäjältä ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Suora lähetys osoitteessa ${name}';
|
||||||
|
case 'stream_list.following': return 'Seuraa';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Suunniteltu';
|
||||||
|
case 'stream_list.ended': return 'Päättynyt';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Mukautettu määrä';
|
||||||
|
case 'zap.confirm': return 'Vahvista';
|
||||||
|
case 'zap.comment': return 'Kommentoi';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} satsia';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Avaa lompakossa';
|
||||||
|
case 'zap.copy': return 'Kopioitu leikepöydälle';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Virheellinen mukautettu määrä';
|
||||||
|
case 'zap.error.no_wallet': return 'Ei asennettua salamalompakkoa';
|
||||||
|
case 'zap.error.no_lud16': return 'Salamaosoitetta ei löytynyt';
|
||||||
|
case 'profile.past_streams': return 'Aikaisemmat lähetykset';
|
||||||
|
case 'profile.edit.display_name': return 'Näytön nimi';
|
||||||
|
case 'profile.edit.about': return 'Tietoja';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr-osoite';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning-osoite';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Ei voi muokata profiilia, kun on kirjautunut ulos';
|
||||||
|
case 'login.username': return 'Käyttäjätunnus';
|
||||||
|
case 'login.amber': return 'Kirjaudu sisään Amber kanssa';
|
||||||
|
case 'login.key': return 'Kirjaudu sisään avaimella';
|
||||||
|
case 'login.create': return 'Luo tili';
|
||||||
|
case 'login.error.invalid_key': return 'Virheellinen avain';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_fr.g.dart
Normal file
416
lib/i18n/strings_fr.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsFr implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsFr({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.fr,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <fr>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsFr _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsFr $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsFr(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Texte invitant l'utilisateur à cliquer sur l'espace réservé à l'avatar pour commencer le téléchargement
|
||||||
|
@override String get upload_avatar => 'Télécharger l\'avatar';
|
||||||
|
|
||||||
|
/// Les têtes d'affiche sont listées par zaps.
|
||||||
|
@override String get most_zapped_streamers => 'Les Streamers les plus zappés';
|
||||||
|
|
||||||
|
/// Aucun utilisateur n'a été trouvé lors de la recherche
|
||||||
|
@override String get no_user_found => 'Aucun utilisateur trouvé';
|
||||||
|
|
||||||
|
/// Un utilisateur anonyme
|
||||||
|
@override String get anon => 'Anonyme';
|
||||||
|
|
||||||
|
/// Nombre de spectateurs du flux
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n,
|
||||||
|
one: '1 téléspectateur',
|
||||||
|
other: '${n} spectateurs',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamFr stream = _TranslationsStreamFr._(_root);
|
||||||
|
@override late final _TranslationsGoalFr goal = _TranslationsGoalFr._(_root);
|
||||||
|
@override late final _TranslationsButtonFr button = _TranslationsButtonFr._(_root);
|
||||||
|
@override late final _TranslationsEmbedFr embed = _TranslationsEmbedFr._(_root);
|
||||||
|
|
||||||
|
/// Rubriques sur les listes de flux par type de flux en direct/fini/prévu, etc.
|
||||||
|
@override late final _TranslationsStreamListFr stream_list = _TranslationsStreamListFr._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapFr zap = _TranslationsZapFr._(_root);
|
||||||
|
@override late final _TranslationsProfileFr profile = _TranslationsProfileFr._(_root);
|
||||||
|
@override late final _TranslationsLoginFr login = _TranslationsLoginFr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamFr implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusFr status = _TranslationsStreamStatusFr._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Commencé à ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatFr chat = _TranslationsStreamChatFr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalFr implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Objectif : ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Reste : ${amount}';
|
||||||
|
@override String get complete => 'COMPLET';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonFr implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Texte du bouton de connexion
|
||||||
|
@override String get login => 'Se Connecter';
|
||||||
|
|
||||||
|
@override String get logout => 'Se déconnecter';
|
||||||
|
@override String get edit_profile => 'Modifier le Profil';
|
||||||
|
|
||||||
|
/// Texte du bouton de suivi
|
||||||
|
@override String get follow => 'Suivre';
|
||||||
|
|
||||||
|
/// Texte du bouton pour le bouton "unfollow
|
||||||
|
@override String get unfollow => 'Ne plus suivre';
|
||||||
|
|
||||||
|
@override String get mute => 'Muet';
|
||||||
|
@override String get unmute => 'Retirer sourdine';
|
||||||
|
@override String get share => 'Partager';
|
||||||
|
@override String get save => 'Sauvegarder';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedFr implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Article par ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note par ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Retransmission en direct sur ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListFr implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Abonnements';
|
||||||
|
@override String get live => 'En direct';
|
||||||
|
@override String get planned => 'Planifié';
|
||||||
|
@override String get ended => 'Terminé';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapFr implements TranslationsZapEn {
|
||||||
|
_TranslationsZapFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Montant personnalisé';
|
||||||
|
@override String get confirm => 'Confirmer';
|
||||||
|
@override String get comment => 'Commenter';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zapper ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Ouvrir dans le portefeuille';
|
||||||
|
@override String get copy => 'Copié dans le presse-papiers';
|
||||||
|
@override late final _TranslationsZapErrorFr error = _TranslationsZapErrorFr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileFr implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Streams passés';
|
||||||
|
@override late final _TranslationsProfileEditFr edit = _TranslationsProfileEditFr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginFr implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Nom d’utilisateur';
|
||||||
|
@override String get amber => 'Se connecter avec Amber';
|
||||||
|
@override String get key => 'Connexion avec la clé';
|
||||||
|
@override String get create => 'Créer un Compte';
|
||||||
|
@override late final _TranslationsLoginErrorFr error = _TranslationsLoginErrorFr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusFr implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'VIVRE';
|
||||||
|
@override String get ended => 'FINI';
|
||||||
|
@override String get planned => 'PRÉVU';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatFr implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABLED';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Le délai expire : ${time}';
|
||||||
|
|
||||||
|
/// Message de chat indiquant les événements de dépassement de délai
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' a expiré dans le temps pour '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Message de chat montrant des zaps de flux
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' a zappé '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteFr write = _TranslationsStreamChatWriteFr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeFr badge = _TranslationsStreamChatBadgeFr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidFr raid = _TranslationsStreamChatRaidFr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorFr implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Montant personnalisé non valide';
|
||||||
|
@override String get no_wallet => 'Pas de porte-monnaie électronique installé';
|
||||||
|
@override String get no_lud16 => 'Pas d\'adresse éclair trouvée';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditFr implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Nom d\'affichage';
|
||||||
|
@override String get about => 'À propos';
|
||||||
|
@override String get nip05 => 'Adresse Nostr';
|
||||||
|
@override String get lud16 => 'Adresse Lightning';
|
||||||
|
@override late final _TranslationsProfileEditErrorFr error = _TranslationsProfileEditErrorFr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorFr implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Clé non valide';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteFr implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Étiquette sur la boîte de saisie du message de chat
|
||||||
|
@override String get label => 'Message écrit';
|
||||||
|
|
||||||
|
/// Message d'entrée du chat affiché lorsque l'utilisateur n'est connecté qu'avec pubkey
|
||||||
|
@override String get no_signer => 'Impossible d\'écrire des messages avec le login npub';
|
||||||
|
|
||||||
|
/// Message d'entrée du chat affiché lorsque l'utilisateur est déconnecté
|
||||||
|
@override String get login => 'Veuillez vous connecter pour envoyer des messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeFr implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Titre sur la liste des utilisateurs qui ont reçu un badge
|
||||||
|
@override String get awarded_to => 'Attribué à :';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidFr implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Message de raid par chat vers un autre flux
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Message de raid sur le chat à partir d'un autre flux
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Compte à rebours pour l'auto-raid
|
||||||
|
@override String countdown({ required Object time}) => 'Raid sur ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorFr implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorFr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsFr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Impossible de modifier le profil lorsque l\'on est déconnecté';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsFr {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Télécharger l\'avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Les Streamers les plus zappés';
|
||||||
|
case 'no_user_found': return 'Aucun utilisateur trouvé';
|
||||||
|
case 'anon': return 'Anonyme';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('fr'))(n,
|
||||||
|
one: '1 téléspectateur',
|
||||||
|
other: '${n} 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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' a expiré dans le temps pour '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' a zappé '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Message écrit';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Impossible d\'écrire des messages avec le login npub';
|
||||||
|
case 'stream.chat.write.login': return 'Veuillez vous connecter pour envoyer des messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Attribué à :';
|
||||||
|
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}) => 'Raid sur ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Objectif : ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Reste : ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLET';
|
||||||
|
case 'button.login': return 'Se Connecter';
|
||||||
|
case 'button.logout': return 'Se déconnecter';
|
||||||
|
case 'button.edit_profile': return 'Modifier le Profil';
|
||||||
|
case 'button.follow': return 'Suivre';
|
||||||
|
case 'button.unfollow': return 'Ne plus suivre';
|
||||||
|
case 'button.mute': return 'Muet';
|
||||||
|
case 'button.unmute': return 'Retirer sourdine';
|
||||||
|
case 'button.share': return 'Partager';
|
||||||
|
case 'button.save': return 'Sauvegarder';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article par ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note par ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Retransmission en direct sur ${name}';
|
||||||
|
case 'stream_list.following': return 'Abonnements';
|
||||||
|
case 'stream_list.live': return 'En direct';
|
||||||
|
case 'stream_list.planned': return 'Planifié';
|
||||||
|
case 'stream_list.ended': return 'Terminé';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Montant personnalisé';
|
||||||
|
case 'zap.confirm': return 'Confirmer';
|
||||||
|
case 'zap.comment': return 'Commenter';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zapper ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Ouvrir dans le portefeuille';
|
||||||
|
case 'zap.copy': return 'Copié dans le presse-papiers';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Montant personnalisé non valide';
|
||||||
|
case 'zap.error.no_wallet': return 'Pas de porte-monnaie électronique installé';
|
||||||
|
case 'zap.error.no_lud16': return 'Pas d\'adresse éclair trouvée';
|
||||||
|
case 'profile.past_streams': return 'Streams passés';
|
||||||
|
case 'profile.edit.display_name': return 'Nom d\'affichage';
|
||||||
|
case 'profile.edit.about': return 'À propos';
|
||||||
|
case 'profile.edit.nip05': return 'Adresse Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Adresse Lightning';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Impossible de modifier le profil lorsque l\'on est déconnecté';
|
||||||
|
case 'login.username': return 'Nom d’utilisateur';
|
||||||
|
case 'login.amber': return 'Se connecter avec Amber';
|
||||||
|
case 'login.key': return 'Connexion avec la clé';
|
||||||
|
case 'login.create': return 'Créer un Compte';
|
||||||
|
case 'login.error.invalid_key': return 'Clé non valide';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_he.g.dart
Normal file
416
lib/i18n/strings_he.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsHe implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsHe({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.he,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <he>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsHe _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsHe $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsHe(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
@override String get upload_avatar => 'Upload Avatar';
|
||||||
|
|
||||||
|
/// Heading over listed top streamers by zaps
|
||||||
|
@override String get most_zapped_streamers => 'Most Zapped Streamers';
|
||||||
|
|
||||||
|
/// No user found when searching
|
||||||
|
@override String get no_user_found => 'No user found';
|
||||||
|
|
||||||
|
/// An anonymous user
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Number of viewers of the stream
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('he'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamHe stream = _TranslationsStreamHe._(_root);
|
||||||
|
@override late final _TranslationsGoalHe goal = _TranslationsGoalHe._(_root);
|
||||||
|
@override late final _TranslationsButtonHe button = _TranslationsButtonHe._(_root);
|
||||||
|
@override late final _TranslationsEmbedHe embed = _TranslationsEmbedHe._(_root);
|
||||||
|
|
||||||
|
/// Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
@override late final _TranslationsStreamListHe stream_list = _TranslationsStreamListHe._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapHe zap = _TranslationsZapHe._(_root);
|
||||||
|
@override late final _TranslationsProfileHe profile = _TranslationsProfileHe._(_root);
|
||||||
|
@override late final _TranslationsLoginHe login = _TranslationsLoginHe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamHe implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusHe status = _TranslationsStreamStatusHe._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatHe chat = _TranslationsStreamChatHe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalHe implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonHe implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Button text for the login button
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Logout';
|
||||||
|
@override String get edit_profile => 'Edit Profile';
|
||||||
|
|
||||||
|
/// Button text for the follow button
|
||||||
|
@override String get follow => 'Follow';
|
||||||
|
|
||||||
|
/// Button text for the unfollow button
|
||||||
|
@override String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
@override String get mute => 'Mute';
|
||||||
|
@override String get unmute => 'Unmute';
|
||||||
|
@override String get share => 'Share';
|
||||||
|
@override String get save => 'Save';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedHe implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Article by ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note by ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListHe implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Following';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planned';
|
||||||
|
@override String get ended => 'Ended';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapHe implements TranslationsZapEn {
|
||||||
|
_TranslationsZapHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Custom Amount';
|
||||||
|
@override String get confirm => 'Confirm';
|
||||||
|
@override String get comment => 'Comment';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Open in Wallet';
|
||||||
|
@override String get copy => 'Copied to clipboard';
|
||||||
|
@override late final _TranslationsZapErrorHe error = _TranslationsZapErrorHe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileHe implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Past Streams';
|
||||||
|
@override late final _TranslationsProfileEditHe edit = _TranslationsProfileEditHe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginHe implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Username';
|
||||||
|
@override String get amber => 'Login with Amber';
|
||||||
|
@override String get key => 'Login with Key';
|
||||||
|
@override String get create => 'Create Account';
|
||||||
|
@override late final _TranslationsLoginErrorHe error = _TranslationsLoginErrorHe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusHe implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'PLANNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatHe implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABLED';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timeout expires: ${time}';
|
||||||
|
|
||||||
|
/// Chat message showing timeout events
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Chat message showing stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteHe write = _TranslationsStreamChatWriteHe._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeHe badge = _TranslationsStreamChatBadgeHe._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidHe raid = _TranslationsStreamChatRaidHe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorHe implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Invalid custom amount';
|
||||||
|
@override String get no_wallet => 'No lightning wallet installed';
|
||||||
|
@override String get no_lud16 => 'No lightning address found';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditHe implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Display Name';
|
||||||
|
@override String get about => 'About';
|
||||||
|
@override String get nip05 => 'Nostr Address';
|
||||||
|
@override String get lud16 => 'Lightning Address';
|
||||||
|
@override late final _TranslationsProfileEditErrorHe error = _TranslationsProfileEditErrorHe._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorHe implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Invalid key';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteHe implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label on the chat message input box
|
||||||
|
@override String get label => 'Write message';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged in only with pubkey
|
||||||
|
@override String get no_signer => 'Can\'t write messages with npub login';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged out
|
||||||
|
@override String get login => 'Please login to send messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeHe implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Heading over list of users who are awarded a badge
|
||||||
|
@override String get awarded_to => 'Awarded to:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidHe implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid message to another stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid message from another stream
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Countdown timer for auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Raiding in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorHe implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorHe._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHe _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Cant edit profile when logged out';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsHe {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Most Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'No user found';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('he'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'PLANNED';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Write message';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Can\'t write messages with npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Please login to send messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Awarded to:';
|
||||||
|
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 in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Edit Profile';
|
||||||
|
case 'button.follow': return 'Follow';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mute';
|
||||||
|
case 'button.unmute': return 'Unmute';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Save';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article by ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note by ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return 'Following';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planned';
|
||||||
|
case 'stream_list.ended': return 'Ended';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Custom Amount';
|
||||||
|
case 'zap.confirm': return 'Confirm';
|
||||||
|
case 'zap.comment': return 'Comment';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Open in Wallet';
|
||||||
|
case 'zap.copy': return 'Copied to clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Invalid custom amount';
|
||||||
|
case 'zap.error.no_wallet': return 'No lightning wallet installed';
|
||||||
|
case 'zap.error.no_lud16': return 'No lightning address found';
|
||||||
|
case 'profile.past_streams': return 'Past Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Display Name';
|
||||||
|
case 'profile.edit.about': return 'About';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Address';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Address';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Cant edit profile when logged out';
|
||||||
|
case 'login.username': return 'Username';
|
||||||
|
case 'login.amber': return 'Login with Amber';
|
||||||
|
case 'login.key': return 'Login with Key';
|
||||||
|
case 'login.create': return 'Create Account';
|
||||||
|
case 'login.error.invalid_key': return 'Invalid key';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
418
lib/i18n/strings_hu.g.dart
Normal file
418
lib/i18n/strings_hu.g.dart
Normal file
@ -0,0 +1,418 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsHu implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsHu({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.hu,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <hu>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsHu _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsHu $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsHu(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Szöveg, amely arra kéri a felhasználót, hogy a feltöltés megkezdéséhez nyomja meg az avatar helyőrzőt
|
||||||
|
@override String get upload_avatar => 'Avatár feltöltése';
|
||||||
|
|
||||||
|
/// Irány a felsorolt top streamerek fölött zaps által
|
||||||
|
@override String get most_zapped_streamers => 'A legtöbb Zapped Streamers';
|
||||||
|
|
||||||
|
/// Kereséskor nem talált felhasználó
|
||||||
|
@override String get no_user_found => 'Nem talált felhasználó';
|
||||||
|
|
||||||
|
/// Egy névtelen felhasználó
|
||||||
|
@override String get anon => 'Névtelen';
|
||||||
|
|
||||||
|
/// A stream nézőinek száma
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hu'))(n,
|
||||||
|
one: '1 néző',
|
||||||
|
other: '${n} néző',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamHu stream = _TranslationsStreamHu._(_root);
|
||||||
|
@override late final _TranslationsGoalHu goal = _TranslationsGoalHu._(_root);
|
||||||
|
@override late final _TranslationsButtonHu button = _TranslationsButtonHu._(_root);
|
||||||
|
@override late final _TranslationsEmbedHu embed = _TranslationsEmbedHu._(_root);
|
||||||
|
|
||||||
|
/// A stream-listák címsorai stream-típusonként élő/befejezett/tervezett stb.
|
||||||
|
@override late final _TranslationsStreamListHu stream_list = _TranslationsStreamListHu._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapHu zap = _TranslationsZapHu._(_root);
|
||||||
|
@override late final _TranslationsProfileHu profile = _TranslationsProfileHu._(_root);
|
||||||
|
@override late final _TranslationsLoginHu login = _TranslationsLoginHu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamHu implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusHu status = _TranslationsStreamStatusHu._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Elindult ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatHu chat = _TranslationsStreamChatHu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalHu implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Cél: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Maradék: ${amount}';
|
||||||
|
@override String get complete => 'TELJES';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonHu implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// A bejelentkezési gomb szövege
|
||||||
|
@override String get login => 'Bejelentkezés';
|
||||||
|
|
||||||
|
@override String get logout => 'Kijelentkezés';
|
||||||
|
@override String get edit_profile => 'Profil szerkesztése';
|
||||||
|
|
||||||
|
/// A követés gomb szövege
|
||||||
|
@override String get follow => 'Követés';
|
||||||
|
|
||||||
|
/// A követés megszüntetése gomb szövege
|
||||||
|
@override String get unfollow => 'Követés megszüntetése';
|
||||||
|
|
||||||
|
@override String get mute => 'Némítás';
|
||||||
|
@override String get unmute => 'Némítás visszavonása';
|
||||||
|
@override String get share => 'Megosztás';
|
||||||
|
@override String get save => 'Mentés';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedHu implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'A ${name} cikke.';
|
||||||
|
@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';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListHu implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Követettek bejegyzései';
|
||||||
|
@override String get live => 'Élő';
|
||||||
|
@override String get planned => 'Tervezett';
|
||||||
|
@override String get ended => 'Véget ért';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapHu implements TranslationsZapEn {
|
||||||
|
_TranslationsZapHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Egyéni összeg';
|
||||||
|
@override String get confirm => 'Megerősítés';
|
||||||
|
@override String get comment => 'Hozzászólás';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} satoshi';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Megnyitás a pénztárcában';
|
||||||
|
@override String get copy => 'Vágólapra másolva';
|
||||||
|
@override late final _TranslationsZapErrorHu error = _TranslationsZapErrorHu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileHu implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Múltbeli Streamek';
|
||||||
|
@override late final _TranslationsProfileEditHu edit = _TranslationsProfileEditHu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginHu implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Felhasználónév';
|
||||||
|
@override String get amber => 'Bejelentkezés Amber segítségével';
|
||||||
|
@override String get key => 'Bejelentkezés kulccsal';
|
||||||
|
@override String get create => 'Fiók Létrehozása';
|
||||||
|
@override late final _TranslationsLoginErrorHu error = _TranslationsLoginErrorHu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusHu implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'ÉLŐ';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'TERVEZETT';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatHu implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT KIKAPCSOLVA';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Az időkorlát lejár: ${time}';
|
||||||
|
|
||||||
|
/// Chat üzenet az időkorlátos események megjelenítésével
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' időzített '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' a '),
|
||||||
|
time,
|
||||||
|
const TextSpan(text: ' számára'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// A stream véget ért lábléc a chat alján
|
||||||
|
@override String get ended => 'STREAM MEGSZÜNTETETT';
|
||||||
|
|
||||||
|
/// Csevegőüzenet, amely stream zapokat mutat
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zap-elt '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteHu write = _TranslationsStreamChatWriteHu._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeHu badge = _TranslationsStreamChatBadgeHu._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidHu raid = _TranslationsStreamChatRaidHu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorHu implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Érvénytelen egyéni összeg';
|
||||||
|
@override String get no_wallet => 'Nincs telepített villám tárca';
|
||||||
|
@override String get no_lud16 => 'Nem talált villámcím';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditHu implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Megjelenített név';
|
||||||
|
@override String get about => 'Névjegy';
|
||||||
|
@override String get nip05 => 'Nostr-cím';
|
||||||
|
@override String get lud16 => 'Lightning-cím';
|
||||||
|
@override late final _TranslationsProfileEditErrorHu error = _TranslationsProfileEditErrorHu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorHu implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Érvénytelen kulcs';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteHu implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Címke a csevegőüzenet beviteli mezőjén
|
||||||
|
@override String get label => 'Üzenet írása';
|
||||||
|
|
||||||
|
/// A csevegés bemeneti üzenete megjelenik, ha a felhasználó csak pubkey-vel van bejelentkezve
|
||||||
|
@override String get no_signer => 'Nem tud üzeneteket írni az npub bejelentkezéssel';
|
||||||
|
|
||||||
|
/// A felhasználó kijelentkezésekor megjelenő csevegési beviteli üzenet
|
||||||
|
@override String get login => 'Kérjük, jelentkezzen be az üzenetek küldéséhez';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeHu implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Fejléc a jelvényt kapott felhasználók listája fölött
|
||||||
|
@override String get awarded_to => 'Elnyerte:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidHu implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid üzenet egy másik folyamba
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid üzenet egy másik folyamból
|
||||||
|
@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';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorHu implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorHu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsHu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Kijelentkezve nem lehet profilt szerkeszteni';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsHu {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Avatár feltöltése';
|
||||||
|
case 'most_zapped_streamers': return 'A legtöbb Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'Nem talált felhasználó';
|
||||||
|
case 'anon': return 'Névtelen';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('hu'))(n,
|
||||||
|
one: '1 néző',
|
||||||
|
other: '${n} néző',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'ÉLŐ';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'TERVEZETT';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Elindult ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' időzített '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' a '),
|
||||||
|
time,
|
||||||
|
const TextSpan(text: ' számára'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM MEGSZÜNTETETT';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zap-elt '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Üzenet írása';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Nem tud üzeneteket írni az npub bejelentkezéssel';
|
||||||
|
case 'stream.chat.write.login': return 'Kérjük, jelentkezzen be az üzenetek küldéséhez';
|
||||||
|
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 'goal.title': return ({ required Object amount}) => 'Cél: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Maradék: ${amount}';
|
||||||
|
case 'goal.complete': return 'TELJES';
|
||||||
|
case 'button.login': return 'Bejelentkezés';
|
||||||
|
case 'button.logout': return 'Kijelentkezés';
|
||||||
|
case 'button.edit_profile': return 'Profil szerkesztése';
|
||||||
|
case 'button.follow': return 'Követés';
|
||||||
|
case 'button.unfollow': return 'Követés megszüntetése';
|
||||||
|
case 'button.mute': return 'Némítás';
|
||||||
|
case 'button.unmute': return 'Némítás visszavonása';
|
||||||
|
case 'button.share': return 'Megosztás';
|
||||||
|
case 'button.save': return 'Mentés';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'A ${name} cikke.';
|
||||||
|
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 'stream_list.following': return 'Követettek bejegyzései';
|
||||||
|
case 'stream_list.live': return 'Élő';
|
||||||
|
case 'stream_list.planned': return 'Tervezett';
|
||||||
|
case 'stream_list.ended': return 'Véget ért';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Egyéni összeg';
|
||||||
|
case 'zap.confirm': return 'Megerősítés';
|
||||||
|
case 'zap.comment': return 'Hozzászólás';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} satoshi';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Megnyitás a pénztárcában';
|
||||||
|
case 'zap.copy': return 'Vágólapra másolva';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Érvénytelen egyéni összeg';
|
||||||
|
case 'zap.error.no_wallet': return 'Nincs telepített villám tárca';
|
||||||
|
case 'zap.error.no_lud16': return 'Nem talált villámcím';
|
||||||
|
case 'profile.past_streams': return 'Múltbeli Streamek';
|
||||||
|
case 'profile.edit.display_name': return 'Megjelenített név';
|
||||||
|
case 'profile.edit.about': return 'Névjegy';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr-cím';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning-cím';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Kijelentkezve nem lehet profilt szerkeszteni';
|
||||||
|
case 'login.username': return 'Felhasználónév';
|
||||||
|
case 'login.amber': return 'Bejelentkezés Amber segítségével';
|
||||||
|
case 'login.key': return 'Bejelentkezés kulccsal';
|
||||||
|
case 'login.create': return 'Fiók Létrehozása';
|
||||||
|
case 'login.error.invalid_key': return 'Érvénytelen kulcs';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_it.g.dart
Normal file
416
lib/i18n/strings_it.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsIt implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsIt({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.it,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <it>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsIt _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsIt $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsIt(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Testo che richiede all'utente di premere il segnaposto dell'avatar per iniziare il caricamento
|
||||||
|
@override String get upload_avatar => 'Carica Avatar';
|
||||||
|
|
||||||
|
/// Direzione sopra elencata top streamers da zaps
|
||||||
|
@override String get most_zapped_streamers => 'Il maggior numero di streamer bloccati';
|
||||||
|
|
||||||
|
/// Nessun utente trovato durante la ricerca
|
||||||
|
@override String get no_user_found => 'Nessun utente trovato';
|
||||||
|
|
||||||
|
/// Un utente anonimo
|
||||||
|
@override String get anon => 'Anonimo';
|
||||||
|
|
||||||
|
/// Numero di spettatori del flusso
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n,
|
||||||
|
one: '1 spettatore',
|
||||||
|
other: '${n} spettatori',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamIt stream = _TranslationsStreamIt._(_root);
|
||||||
|
@override late final _TranslationsGoalIt goal = _TranslationsGoalIt._(_root);
|
||||||
|
@override late final _TranslationsButtonIt button = _TranslationsButtonIt._(_root);
|
||||||
|
@override late final _TranslationsEmbedIt embed = _TranslationsEmbedIt._(_root);
|
||||||
|
|
||||||
|
/// Titoli sugli elenchi dei flussi per tipo di flusso live/finito/pianificato ecc.
|
||||||
|
@override late final _TranslationsStreamListIt stream_list = _TranslationsStreamListIt._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapIt zap = _TranslationsZapIt._(_root);
|
||||||
|
@override late final _TranslationsProfileIt profile = _TranslationsProfileIt._(_root);
|
||||||
|
@override late final _TranslationsLoginIt login = _TranslationsLoginIt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamIt implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusIt status = _TranslationsStreamStatusIt._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Avviato ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatIt chat = _TranslationsStreamChatIt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalIt implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Obiettivo: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Restante: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETO';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonIt implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Testo del pulsante per il pulsante di accesso
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Logout';
|
||||||
|
@override String get edit_profile => 'Modifica profilo';
|
||||||
|
|
||||||
|
/// Testo del pulsante per il pulsante Segui
|
||||||
|
@override String get follow => 'Segui';
|
||||||
|
|
||||||
|
/// Testo del pulsante per il pulsante unfollow
|
||||||
|
@override String get unfollow => 'Smetti di seguire';
|
||||||
|
|
||||||
|
@override String get mute => 'Silenzia';
|
||||||
|
@override String get unmute => 'Riattiva';
|
||||||
|
@override String get share => 'Condividi';
|
||||||
|
@override String get save => 'Salva';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedIt implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Articolo di ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Nota di ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Streaming in diretta da ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListIt implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Seguiti';
|
||||||
|
@override String get live => 'Dal vivo';
|
||||||
|
@override String get planned => 'Pianificato';
|
||||||
|
@override String get ended => 'Terminato';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapIt implements TranslationsZapEn {
|
||||||
|
_TranslationsZapIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Importo personalizzato';
|
||||||
|
@override String get confirm => 'Conferma';
|
||||||
|
@override String get comment => 'Commenta';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Aprire nel portafoglio';
|
||||||
|
@override String get copy => 'Copiato negli appunti';
|
||||||
|
@override late final _TranslationsZapErrorIt error = _TranslationsZapErrorIt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileIt implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Flussi passati';
|
||||||
|
@override late final _TranslationsProfileEditIt edit = _TranslationsProfileEditIt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginIt implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Nome utente';
|
||||||
|
@override String get amber => 'Accesso con Amber';
|
||||||
|
@override String get key => 'Accesso con chiave';
|
||||||
|
@override String get create => 'Crea un account';
|
||||||
|
@override late final _TranslationsLoginErrorIt error = _TranslationsLoginErrorIt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusIt implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'IN DIRETTA';
|
||||||
|
@override String get ended => 'FINE';
|
||||||
|
@override String get planned => 'PREVISTO';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatIt implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABILITATA';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Il timeout scade: ${time}';
|
||||||
|
|
||||||
|
/// Messaggio di chat che mostra gli eventi di timeout
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' time out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' per '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Il flusso si è concluso con un piè di pagina in fondo alla chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Messaggio di chat che mostra gli zap del flusso
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' ha effettuato uno zap di '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteIt write = _TranslationsStreamChatWriteIt._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeIt badge = _TranslationsStreamChatBadgeIt._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidIt raid = _TranslationsStreamChatRaidIt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorIt implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Importo personalizzato non valido';
|
||||||
|
@override String get no_wallet => 'Nessun portafoglio Lightning installato';
|
||||||
|
@override String get no_lud16 => 'Nessun indirizzo di fulmine trovato';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditIt implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Nome visualizzato';
|
||||||
|
@override String get about => 'Info';
|
||||||
|
@override String get nip05 => 'Indirizzo Nostr';
|
||||||
|
@override String get lud16 => 'Indirizzo del fulmine';
|
||||||
|
@override late final _TranslationsProfileEditErrorIt error = _TranslationsProfileEditErrorIt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorIt implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Chiave non valida';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteIt implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Etichetta della casella di immissione del messaggio di chat
|
||||||
|
@override String get label => 'Scrivi il messaggio';
|
||||||
|
|
||||||
|
/// Messaggio di ingresso alla chat mostrato quando l'utente è connesso solo con la pubkey
|
||||||
|
@override String get no_signer => 'Impossibile scrivere messaggi con il login npub';
|
||||||
|
|
||||||
|
/// Messaggio di input della chat mostrato quando l'utente è disconnesso
|
||||||
|
@override String get login => 'Effettuare il login per inviare messaggi';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeIt implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Intestazione dell'elenco degli utenti a cui è stato assegnato un badge
|
||||||
|
@override String get awarded_to => 'Assegnato a:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidIt implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Messaggio di chat raid in un altro flusso
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Messaggio di chat raid da un altro flusso
|
||||||
|
@override String from({ required Object name}) => 'RAID DA ${name}';
|
||||||
|
|
||||||
|
/// Timer per il conto alla rovescia per l'auto-raid
|
||||||
|
@override String countdown({ required Object time}) => 'Raid in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorIt implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorIt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsIt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Impossibile modificare il profilo quando si è disconnessi';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsIt {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Carica Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Il maggior numero di streamer bloccati';
|
||||||
|
case 'no_user_found': return 'Nessun utente trovato';
|
||||||
|
case 'anon': return 'Anonimo';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('it'))(n,
|
||||||
|
one: '1 spettatore',
|
||||||
|
other: '${n} spettatori',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'IN DIRETTA';
|
||||||
|
case 'stream.status.ended': return 'FINE';
|
||||||
|
case 'stream.status.planned': return 'PREVISTO';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Avviato ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' time out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' per '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' ha effettuato uno zap di '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Scrivi il messaggio';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Impossibile scrivere messaggi con il login npub';
|
||||||
|
case 'stream.chat.write.login': return 'Effettuare il login per inviare messaggi';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Assegnato a:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID DA ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Raid in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Obiettivo: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Restante: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETO';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Modifica profilo';
|
||||||
|
case 'button.follow': return 'Segui';
|
||||||
|
case 'button.unfollow': return 'Smetti di seguire';
|
||||||
|
case 'button.mute': return 'Silenzia';
|
||||||
|
case 'button.unmute': return 'Riattiva';
|
||||||
|
case 'button.share': return 'Condividi';
|
||||||
|
case 'button.save': return 'Salva';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Articolo di ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Nota di ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Streaming in diretta da ${name}';
|
||||||
|
case 'stream_list.following': return 'Seguiti';
|
||||||
|
case 'stream_list.live': return 'Dal vivo';
|
||||||
|
case 'stream_list.planned': return 'Pianificato';
|
||||||
|
case 'stream_list.ended': return 'Terminato';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Importo personalizzato';
|
||||||
|
case 'zap.confirm': return 'Conferma';
|
||||||
|
case 'zap.comment': return 'Commenta';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Aprire nel portafoglio';
|
||||||
|
case 'zap.copy': return 'Copiato negli appunti';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Importo personalizzato non valido';
|
||||||
|
case 'zap.error.no_wallet': return 'Nessun portafoglio Lightning installato';
|
||||||
|
case 'zap.error.no_lud16': return 'Nessun indirizzo di fulmine trovato';
|
||||||
|
case 'profile.past_streams': return 'Flussi passati';
|
||||||
|
case 'profile.edit.display_name': return 'Nome visualizzato';
|
||||||
|
case 'profile.edit.about': return 'Info';
|
||||||
|
case 'profile.edit.nip05': return 'Indirizzo Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Indirizzo del fulmine';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Impossibile modificare il profilo quando si è disconnessi';
|
||||||
|
case 'login.username': return 'Nome utente';
|
||||||
|
case 'login.amber': return 'Accesso con Amber';
|
||||||
|
case 'login.key': return 'Accesso con chiave';
|
||||||
|
case 'login.create': return 'Crea un account';
|
||||||
|
case 'login.error.invalid_key': return 'Chiave non valida';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_ja.g.dart
Normal file
416
lib/i18n/strings_ja.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsJa implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsJa({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.ja,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <ja>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsJa _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsJa $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsJa(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// アバターのプレースホルダーを押してアップロードを開始するよう促すテキスト
|
||||||
|
@override String get upload_avatar => 'アバターのアップロード';
|
||||||
|
|
||||||
|
/// ザップによるリストの上のストリーマーに向かう
|
||||||
|
@override String get most_zapped_streamers => '最もザッピングされたストリーマー';
|
||||||
|
|
||||||
|
/// 検索してもユーザーが見つからない
|
||||||
|
@override String get no_user_found => 'ユーザーが見つかりません';
|
||||||
|
|
||||||
|
/// 匿名ユーザー
|
||||||
|
@override String get anon => '匿名';
|
||||||
|
|
||||||
|
/// ストリームの視聴者数
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n,
|
||||||
|
one: '1 視聴者',
|
||||||
|
other: '${n} 人が視聴中',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamJa stream = _TranslationsStreamJa._(_root);
|
||||||
|
@override late final _TranslationsGoalJa goal = _TranslationsGoalJa._(_root);
|
||||||
|
@override late final _TranslationsButtonJa button = _TranslationsButtonJa._(_root);
|
||||||
|
@override late final _TranslationsEmbedJa embed = _TranslationsEmbedJa._(_root);
|
||||||
|
|
||||||
|
/// ライブ/終了/予定など、ストリーム・タイプ別のストリーム・リストの見出し。
|
||||||
|
@override late final _TranslationsStreamListJa stream_list = _TranslationsStreamListJa._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapJa zap = _TranslationsZapJa._(_root);
|
||||||
|
@override late final _TranslationsProfileJa profile = _TranslationsProfileJa._(_root);
|
||||||
|
@override late final _TranslationsLoginJa login = _TranslationsLoginJa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamJa implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusJa status = _TranslationsStreamStatusJa._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => '${timestamp} を開始';
|
||||||
|
@override late final _TranslationsStreamChatJa chat = _TranslationsStreamChatJa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalJa implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => '目標額: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => '残り: ${amount}';
|
||||||
|
@override String get complete => '完了';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonJa implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// ログインボタンのテキスト
|
||||||
|
@override String get login => 'ログイン';
|
||||||
|
|
||||||
|
@override String get logout => 'ログアウト';
|
||||||
|
@override String get edit_profile => 'プロフィールを編集';
|
||||||
|
|
||||||
|
/// フォローボタンのテキスト
|
||||||
|
@override String get follow => 'フォロー';
|
||||||
|
|
||||||
|
/// フォロー解除ボタンのテキスト
|
||||||
|
@override String get unfollow => 'フォロー解除';
|
||||||
|
|
||||||
|
@override String get mute => 'ミュート';
|
||||||
|
@override String get unmute => 'ミュート解除';
|
||||||
|
@override String get share => '共有';
|
||||||
|
@override String get save => '保存';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedJa implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => '記事: ${name}';
|
||||||
|
@override String note_by({ required Object name}) => '${name} の投稿';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'ライブ・ストリーム ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListJa implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'フォロー中';
|
||||||
|
@override String get live => 'ライブ配信中';
|
||||||
|
@override String get planned => '予定あり';
|
||||||
|
@override String get ended => '終了しました';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapJa implements TranslationsZapEn {
|
||||||
|
_TranslationsZapJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => '${name} をザップ';
|
||||||
|
@override String get custom_amount => 'カスタム金額';
|
||||||
|
@override String get confirm => '確認';
|
||||||
|
@override String get comment => 'コメント';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => '${amount} satsをザップする';
|
||||||
|
@override String get button_zap => 'ザップ';
|
||||||
|
@override String get button_open_wallet => 'ウォレットで開く';
|
||||||
|
@override String get copy => 'クリップボードにコピー';
|
||||||
|
@override late final _TranslationsZapErrorJa error = _TranslationsZapErrorJa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileJa implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => '過去の配信';
|
||||||
|
@override late final _TranslationsProfileEditJa edit = _TranslationsProfileEditJa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginJa implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'ユーザー名';
|
||||||
|
@override String get amber => '琥珀でログイン';
|
||||||
|
@override String get key => 'キーでログイン';
|
||||||
|
@override String get create => 'アカウントを作成する';
|
||||||
|
@override late final _TranslationsLoginErrorJa error = _TranslationsLoginErrorJa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusJa implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'ライブ';
|
||||||
|
@override String get ended => '終了';
|
||||||
|
@override String get planned => '予定';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatJa implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'チャット無効';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'タイムアウト: ${time}';
|
||||||
|
|
||||||
|
/// タイムアウトイベントを表示するチャットメッセージ
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' タイムアウト '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// チャットの下にストリーム終了のフッター
|
||||||
|
@override String get ended => '配信終了';
|
||||||
|
|
||||||
|
/// ストリームのザッピングを表示するチャットメッセージ
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' が '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats をザップしました'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteJa write = _TranslationsStreamChatWriteJa._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeJa badge = _TranslationsStreamChatBadgeJa._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidJa raid = _TranslationsStreamChatRaidJa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorJa implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => '無効なカスタム金額';
|
||||||
|
@override String get no_wallet => 'Lightningウォレット未装着';
|
||||||
|
@override String get no_lud16 => '雷アドレスが見つかりません';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditJa implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => '表示名';
|
||||||
|
@override String get about => '自己紹介';
|
||||||
|
@override String get nip05 => 'Nostrアドレス';
|
||||||
|
@override String get lud16 => 'ライトニングアドレス';
|
||||||
|
@override late final _TranslationsProfileEditErrorJa error = _TranslationsProfileEditErrorJa._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorJa implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => '無効なキー';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteJa implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// チャットメッセージ入力ボックスのラベル
|
||||||
|
@override String get label => 'メッセージを書く';
|
||||||
|
|
||||||
|
/// ユーザーがpubkeyのみでログインしている場合に表示されるチャット入力メッセージ
|
||||||
|
@override String get no_signer => 'npubログインでメッセージが書けない';
|
||||||
|
|
||||||
|
/// ログアウト時に表示されるチャット入力メッセージ
|
||||||
|
@override String get login => 'メッセージを送信するにはログインしてください';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeJa implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// バッジを授与されたユーザーのリスト上の見出し
|
||||||
|
@override String get awarded_to => '受賞者';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidJa implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 別のストリームへのチャット襲撃メッセージ
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// 他のストリームからのチャット襲撃メッセージ
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// 自動騎乗のカウントダウン・タイマー
|
||||||
|
@override String countdown({ required Object time}) => '${time}における襲撃';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorJa implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorJa._(this._root);
|
||||||
|
|
||||||
|
final TranslationsJa _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'ログアウトするとプロフィールが編集できない';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsJa {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'アバターのアップロード';
|
||||||
|
case 'most_zapped_streamers': return '最もザッピングされたストリーマー';
|
||||||
|
case 'no_user_found': return 'ユーザーが見つかりません';
|
||||||
|
case 'anon': return '匿名';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ja'))(n,
|
||||||
|
one: '1 視聴者',
|
||||||
|
other: '${n} 人が視聴中',
|
||||||
|
);
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' タイムアウト '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return '配信終了';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' が '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats をザップしました'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'メッセージを書く';
|
||||||
|
case 'stream.chat.write.no_signer': return 'npubログインでメッセージが書けない';
|
||||||
|
case 'stream.chat.write.login': return 'メッセージを送信するにはログインしてください';
|
||||||
|
case 'stream.chat.badge.awarded_to': return '受賞者';
|
||||||
|
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}) => '${time}における襲撃';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => '目標額: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => '残り: ${amount}';
|
||||||
|
case 'goal.complete': return '完了';
|
||||||
|
case 'button.login': return 'ログイン';
|
||||||
|
case 'button.logout': return 'ログアウト';
|
||||||
|
case 'button.edit_profile': return 'プロフィールを編集';
|
||||||
|
case 'button.follow': return 'フォロー';
|
||||||
|
case 'button.unfollow': return 'フォロー解除';
|
||||||
|
case 'button.mute': return 'ミュート';
|
||||||
|
case 'button.unmute': return 'ミュート解除';
|
||||||
|
case 'button.share': return '共有';
|
||||||
|
case 'button.save': return '保存';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => '記事: ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => '${name} の投稿';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'ライブ・ストリーム ${name}';
|
||||||
|
case 'stream_list.following': return 'フォロー中';
|
||||||
|
case 'stream_list.live': return 'ライブ配信中';
|
||||||
|
case 'stream_list.planned': return '予定あり';
|
||||||
|
case 'stream_list.ended': return '終了しました';
|
||||||
|
case 'zap.title': return ({ required Object name}) => '${name} をザップ';
|
||||||
|
case 'zap.custom_amount': return 'カスタム金額';
|
||||||
|
case 'zap.confirm': return '確認';
|
||||||
|
case 'zap.comment': return 'コメント';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => '${amount} satsをザップする';
|
||||||
|
case 'zap.button_zap': return 'ザップ';
|
||||||
|
case 'zap.button_open_wallet': return 'ウォレットで開く';
|
||||||
|
case 'zap.copy': return 'クリップボードにコピー';
|
||||||
|
case 'zap.error.invalid_custom_amount': return '無効なカスタム金額';
|
||||||
|
case 'zap.error.no_wallet': return 'Lightningウォレット未装着';
|
||||||
|
case 'zap.error.no_lud16': return '雷アドレスが見つかりません';
|
||||||
|
case 'profile.past_streams': return '過去の配信';
|
||||||
|
case 'profile.edit.display_name': return '表示名';
|
||||||
|
case 'profile.edit.about': return '自己紹介';
|
||||||
|
case 'profile.edit.nip05': return 'Nostrアドレス';
|
||||||
|
case 'profile.edit.lud16': return 'ライトニングアドレス';
|
||||||
|
case 'profile.edit.error.logged_out': return 'ログアウトするとプロフィールが編集できない';
|
||||||
|
case 'login.username': return 'ユーザー名';
|
||||||
|
case 'login.amber': return '琥珀でログイン';
|
||||||
|
case 'login.key': return 'キーでログイン';
|
||||||
|
case 'login.create': return 'アカウントを作成する';
|
||||||
|
case 'login.error.invalid_key': return '無効なキー';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_ko.g.dart
Normal file
416
lib/i18n/strings_ko.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsKo implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsKo({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.ko,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <ko>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsKo _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsKo $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsKo(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 아바타 플레이스홀더를 눌러 업로드를 시작하라는 메시지를 표시하는 텍스트
|
||||||
|
@override String get upload_avatar => '아바타 업로드';
|
||||||
|
|
||||||
|
/// 나열된 상위 스트리머를 잽별로 살펴보기
|
||||||
|
@override String get most_zapped_streamers => '가장 많이 재핑된 스트리머';
|
||||||
|
|
||||||
|
/// 검색 시 사용자를 찾을 수 없음
|
||||||
|
@override String get no_user_found => '사용자를 찾을 수 없습니다.';
|
||||||
|
|
||||||
|
/// 익명 사용자
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// 스트림 시청자 수
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n,
|
||||||
|
one: '시청자 1명',
|
||||||
|
other: '${n} 시청자',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamKo stream = _TranslationsStreamKo._(_root);
|
||||||
|
@override late final _TranslationsGoalKo goal = _TranslationsGoalKo._(_root);
|
||||||
|
@override late final _TranslationsButtonKo button = _TranslationsButtonKo._(_root);
|
||||||
|
@override late final _TranslationsEmbedKo embed = _TranslationsEmbedKo._(_root);
|
||||||
|
|
||||||
|
/// 실시간/종료/예정 등 스트림 유형별로 스트림 목록의 제목을 표시합니다.
|
||||||
|
@override late final _TranslationsStreamListKo stream_list = _TranslationsStreamListKo._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapKo zap = _TranslationsZapKo._(_root);
|
||||||
|
@override late final _TranslationsProfileKo profile = _TranslationsProfileKo._(_root);
|
||||||
|
@override late final _TranslationsLoginKo login = _TranslationsLoginKo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamKo implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusKo status = _TranslationsStreamStatusKo._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => '시작 ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatKo chat = _TranslationsStreamChatKo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalKo implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => '목표: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => '남음: ${amount}';
|
||||||
|
@override String get complete => '완료';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonKo implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 로그인 버튼의 버튼 텍스트
|
||||||
|
@override String get login => '로그인';
|
||||||
|
|
||||||
|
@override String get logout => '로그아웃';
|
||||||
|
@override String get edit_profile => '프로필 수정';
|
||||||
|
|
||||||
|
/// 팔로우 버튼의 버튼 텍스트
|
||||||
|
@override String get follow => '팔로우';
|
||||||
|
|
||||||
|
/// 언팔로우 버튼의 버튼 텍스트
|
||||||
|
@override String get unfollow => '언팔로우';
|
||||||
|
|
||||||
|
@override String get mute => '뮤트';
|
||||||
|
@override String get unmute => '뮤트 해제';
|
||||||
|
@override String get share => '공유';
|
||||||
|
@override String get save => '저장';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedKo implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => '작성자: ${name}';
|
||||||
|
@override String note_by({ required Object name}) => '노트 작성됨: ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => '라이브 스트리밍: ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListKo implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => '팔로잉';
|
||||||
|
@override String get live => '라이브';
|
||||||
|
@override String get planned => '계획된';
|
||||||
|
@override String get ended => '종료됨';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapKo implements TranslationsZapEn {
|
||||||
|
_TranslationsZapKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => '사용자 지정 금액';
|
||||||
|
@override String get confirm => '확인';
|
||||||
|
@override String get comment => '댓글';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => '지갑에서 열기';
|
||||||
|
@override String get copy => '클립보드에 복사';
|
||||||
|
@override late final _TranslationsZapErrorKo error = _TranslationsZapErrorKo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileKo implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => '과거 스트림';
|
||||||
|
@override late final _TranslationsProfileEditKo edit = _TranslationsProfileEditKo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginKo implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => '사용자 이름';
|
||||||
|
@override String get amber => 'Amber로 로그인';
|
||||||
|
@override String get key => '키로 로그인';
|
||||||
|
@override String get create => '계정 만들기';
|
||||||
|
@override late final _TranslationsLoginErrorKo error = _TranslationsLoginErrorKo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusKo implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => '라이브';
|
||||||
|
@override String get ended => '종료';
|
||||||
|
@override String get planned => '계획된';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatKo implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => '채팅 사용 안 함';
|
||||||
|
@override String disabled_timeout({ required Object time}) => '시간 초과가 만료되었습니다: ${time}';
|
||||||
|
|
||||||
|
/// 시간 초과 이벤트를 표시하는 채팅 메시지
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' 시간 초과됨 '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// 채팅 하단의 스트림 종료 푸터
|
||||||
|
@override String get ended => '스트림 종료';
|
||||||
|
|
||||||
|
/// 채팅 메시지 스트림 끊김 표시
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' ZAPP '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' SATS'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteKo write = _TranslationsStreamChatWriteKo._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeKo badge = _TranslationsStreamChatBadgeKo._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidKo raid = _TranslationsStreamChatRaidKo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorKo implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => '잘못된 사용자 지정 금액';
|
||||||
|
@override String get no_wallet => '라이트닝 월렛이 설치되지 않았습니다.';
|
||||||
|
@override String get no_lud16 => '번개 주소를 찾을 수 없습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditKo implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => '표시 이름';
|
||||||
|
@override String get about => '정보';
|
||||||
|
@override String get nip05 => '노스트르 주소';
|
||||||
|
@override String get lud16 => '라이트닝 주소';
|
||||||
|
@override late final _TranslationsProfileEditErrorKo error = _TranslationsProfileEditErrorKo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorKo implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => '잘못된 키';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteKo implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 채팅 메시지 입력 상자의 라벨
|
||||||
|
@override String get label => '메시지 작성';
|
||||||
|
|
||||||
|
/// 사용자가 공개 키로만 로그인한 경우에 표시되는 채팅 입력 메시지
|
||||||
|
@override String get no_signer => 'npub 로그인으로 메시지를 작성할 수 없습니다.';
|
||||||
|
|
||||||
|
/// 사용자가 로그아웃할 때 표시되는 채팅 입력 메시지
|
||||||
|
@override String get login => '메시지를 보내려면 로그인하세요.';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeKo implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 배지를 받은 사용자 목록으로 이동하기
|
||||||
|
@override String get awarded_to => '수상 대상';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidKo implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 다른 스트림으로 채팅 레이드 메시지 보내기
|
||||||
|
@override String to({ required Object name}) => 'RAIDing ${name}';
|
||||||
|
|
||||||
|
/// 다른 스트림의 채팅 레이드 메시지
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// 자동 레이드를 위한 카운트다운 타이머
|
||||||
|
@override String countdown({ required Object time}) => '${time}에서 레이드';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorKo implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorKo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsKo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => '로그아웃 시 프로필 수정 불가';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsKo {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return '아바타 업로드';
|
||||||
|
case 'most_zapped_streamers': return '가장 많이 재핑된 스트리머';
|
||||||
|
case 'no_user_found': return '사용자를 찾을 수 없습니다.';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n,
|
||||||
|
one: '시청자 1명',
|
||||||
|
other: '${n} 시청자',
|
||||||
|
);
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' 시간 초과됨 '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return '스트림 종료';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' ZAPP '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' SATS'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return '메시지 작성';
|
||||||
|
case 'stream.chat.write.no_signer': return 'npub 로그인으로 메시지를 작성할 수 없습니다.';
|
||||||
|
case 'stream.chat.write.login': return '메시지를 보내려면 로그인하세요.';
|
||||||
|
case 'stream.chat.badge.awarded_to': return '수상 대상';
|
||||||
|
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}) => '${time}에서 레이드';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => '목표: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => '남음: ${amount}';
|
||||||
|
case 'goal.complete': return '완료';
|
||||||
|
case 'button.login': return '로그인';
|
||||||
|
case 'button.logout': return '로그아웃';
|
||||||
|
case 'button.edit_profile': return '프로필 수정';
|
||||||
|
case 'button.follow': return '팔로우';
|
||||||
|
case 'button.unfollow': return '언팔로우';
|
||||||
|
case 'button.mute': return '뮤트';
|
||||||
|
case 'button.unmute': return '뮤트 해제';
|
||||||
|
case 'button.share': return '공유';
|
||||||
|
case 'button.save': return '저장';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => '작성자: ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => '노트 작성됨: ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => '라이브 스트리밍: ${name}';
|
||||||
|
case 'stream_list.following': return '팔로잉';
|
||||||
|
case 'stream_list.live': return '라이브';
|
||||||
|
case 'stream_list.planned': return '계획된';
|
||||||
|
case 'stream_list.ended': return '종료됨';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return '사용자 지정 금액';
|
||||||
|
case 'zap.confirm': return '확인';
|
||||||
|
case 'zap.comment': return '댓글';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return '지갑에서 열기';
|
||||||
|
case 'zap.copy': return '클립보드에 복사';
|
||||||
|
case 'zap.error.invalid_custom_amount': return '잘못된 사용자 지정 금액';
|
||||||
|
case 'zap.error.no_wallet': return '라이트닝 월렛이 설치되지 않았습니다.';
|
||||||
|
case 'zap.error.no_lud16': return '번개 주소를 찾을 수 없습니다.';
|
||||||
|
case 'profile.past_streams': return '과거 스트림';
|
||||||
|
case 'profile.edit.display_name': return '표시 이름';
|
||||||
|
case 'profile.edit.about': return '정보';
|
||||||
|
case 'profile.edit.nip05': return '노스트르 주소';
|
||||||
|
case 'profile.edit.lud16': return '라이트닝 주소';
|
||||||
|
case 'profile.edit.error.logged_out': return '로그아웃 시 프로필 수정 불가';
|
||||||
|
case 'login.username': return '사용자 이름';
|
||||||
|
case 'login.amber': return 'Amber로 로그인';
|
||||||
|
case 'login.key': return '키로 로그인';
|
||||||
|
case 'login.create': return '계정 만들기';
|
||||||
|
case 'login.error.invalid_key': return '잘못된 키';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_nl.g.dart
Normal file
416
lib/i18n/strings_nl.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsNl implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsNl({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.nl,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <nl>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsNl _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsNl $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsNl(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Tekst die de gebruiker vraagt om op de avatar-plaatshouder te klikken om te beginnen met uploaden
|
||||||
|
@override String get upload_avatar => 'Avatar uploaden';
|
||||||
|
|
||||||
|
/// Koers over beursgenoteerde topstreamers door zaps
|
||||||
|
@override String get most_zapped_streamers => 'Meeste Zapped Streamers';
|
||||||
|
|
||||||
|
/// Geen gebruiker gevonden bij het zoeken
|
||||||
|
@override String get no_user_found => 'Geen gebruiker gevonden';
|
||||||
|
|
||||||
|
/// Een anonieme gebruiker
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Aantal kijkers van de stream
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n,
|
||||||
|
one: '1 kijker',
|
||||||
|
other: '${n} kijkers',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamNl stream = _TranslationsStreamNl._(_root);
|
||||||
|
@override late final _TranslationsGoalNl goal = _TranslationsGoalNl._(_root);
|
||||||
|
@override late final _TranslationsButtonNl button = _TranslationsButtonNl._(_root);
|
||||||
|
@override late final _TranslationsEmbedNl embed = _TranslationsEmbedNl._(_root);
|
||||||
|
|
||||||
|
/// Rubrieken op streamlijsten per streamtype live/beëindigd/gepland etc.
|
||||||
|
@override late final _TranslationsStreamListNl stream_list = _TranslationsStreamListNl._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapNl zap = _TranslationsZapNl._(_root);
|
||||||
|
@override late final _TranslationsProfileNl profile = _TranslationsProfileNl._(_root);
|
||||||
|
@override late final _TranslationsLoginNl login = _TranslationsLoginNl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamNl implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusNl status = _TranslationsStreamStatusNl._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Begonnen met ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatNl chat = _TranslationsStreamChatNl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalNl implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Doel: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Overblijvend: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonNl implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Knoptekst voor de aanmeldknop
|
||||||
|
@override String get login => 'Inloggen';
|
||||||
|
|
||||||
|
@override String get logout => 'Uitloggen';
|
||||||
|
@override String get edit_profile => 'Bewerk Profiel';
|
||||||
|
|
||||||
|
/// Knoptekst voor de volgknop
|
||||||
|
@override String get follow => 'Volgen';
|
||||||
|
|
||||||
|
/// Knoptekst voor de knop Ontvolgen
|
||||||
|
@override String get unfollow => 'Ontvolgen';
|
||||||
|
|
||||||
|
@override String get mute => 'Dempen';
|
||||||
|
@override String get unmute => 'Niet langer negeren';
|
||||||
|
@override String get share => 'Deel';
|
||||||
|
@override String get save => 'Opslaan';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedNl implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artikel door ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Opmerking door ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream via ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListNl implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Volgt';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Gepland';
|
||||||
|
@override String get ended => 'Beëindigd';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapNl implements TranslationsZapEn {
|
||||||
|
_TranslationsZapNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Aangepast bedrag';
|
||||||
|
@override String get confirm => 'Bevestig';
|
||||||
|
@override String get comment => 'Opmerking';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Openen in portefeuille';
|
||||||
|
@override String get copy => 'Gekopieerd naar klembord';
|
||||||
|
@override late final _TranslationsZapErrorNl error = _TranslationsZapErrorNl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileNl implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Afgelopen Streams';
|
||||||
|
@override late final _TranslationsProfileEditNl edit = _TranslationsProfileEditNl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginNl implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Gebruikersnaam';
|
||||||
|
@override String get amber => 'Inloggen met Amber';
|
||||||
|
@override String get key => 'Inloggen met sleutel';
|
||||||
|
@override String get create => 'Account aanmaken';
|
||||||
|
@override late final _TranslationsLoginErrorNl error = _TranslationsLoginErrorNl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusNl implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'GESLOTEN';
|
||||||
|
@override String get planned => 'GEPLAND';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatNl implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT UITGESCHAKELD';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Time-out loopt af: ${time}';
|
||||||
|
|
||||||
|
/// Chatbericht met time-outgebeurtenissen
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' voor '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Voettekst einde stream onderaan chat
|
||||||
|
@override String get ended => 'STREAM BEËINDIGD';
|
||||||
|
|
||||||
|
/// Chatbericht met stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteNl write = _TranslationsStreamChatWriteNl._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeNl badge = _TranslationsStreamChatBadgeNl._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidNl raid = _TranslationsStreamChatRaidNl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorNl implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Ongeldig aangepast bedrag';
|
||||||
|
@override String get no_wallet => 'Geen bliksemportemonnee geïnstalleerd';
|
||||||
|
@override String get no_lud16 => 'Geen bliksemadres gevonden';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditNl implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Naam weergeven';
|
||||||
|
@override String get about => 'Over ons';
|
||||||
|
@override String get nip05 => 'Nostr Adres';
|
||||||
|
@override String get lud16 => 'Lightning adres';
|
||||||
|
@override late final _TranslationsProfileEditErrorNl error = _TranslationsProfileEditErrorNl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorNl implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Ongeldige sleutel';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteNl implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label op het invoerveld voor chatberichten
|
||||||
|
@override String get label => 'Schrijf bericht';
|
||||||
|
|
||||||
|
/// Chatinvoerbericht getoond wanneer de gebruiker alleen is ingelogd met pubkey
|
||||||
|
@override String get no_signer => 'Kan geen berichten schrijven met npub login';
|
||||||
|
|
||||||
|
/// Chatinvoerbericht dat wordt weergegeven wanneer de gebruiker is uitgelogd
|
||||||
|
@override String get login => 'Log in om berichten te verzenden';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeNl implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Kop boven de lijst met gebruikers die een badge hebben gekregen
|
||||||
|
@override String get awarded_to => 'Toegekend aan:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidNl implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid bericht naar een andere stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat invalbericht van een andere stream
|
||||||
|
@override String from({ required Object name}) => 'RAID VAN ${name}';
|
||||||
|
|
||||||
|
/// Afteltimer voor automatisch rijden
|
||||||
|
@override String countdown({ required Object time}) => 'Overvallen in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorNl implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorNl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Kan profiel niet bewerken als ik ben uitgelogd';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsNl {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Avatar uploaden';
|
||||||
|
case 'most_zapped_streamers': return 'Meeste Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'Geen gebruiker gevonden';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('nl'))(n,
|
||||||
|
one: '1 kijker',
|
||||||
|
other: '${n} kijkers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'GESLOTEN';
|
||||||
|
case 'stream.status.planned': return 'GEPLAND';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Begonnen met ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' voor '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM BEËINDIGD';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Schrijf bericht';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Kan geen berichten schrijven met npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Log in om berichten te verzenden';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Toegekend aan:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID VAN ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Overvallen in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Doel: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Overblijvend: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Inloggen';
|
||||||
|
case 'button.logout': return 'Uitloggen';
|
||||||
|
case 'button.edit_profile': return 'Bewerk Profiel';
|
||||||
|
case 'button.follow': return 'Volgen';
|
||||||
|
case 'button.unfollow': return 'Ontvolgen';
|
||||||
|
case 'button.mute': return 'Dempen';
|
||||||
|
case 'button.unmute': return 'Niet langer negeren';
|
||||||
|
case 'button.share': return 'Deel';
|
||||||
|
case 'button.save': return 'Opslaan';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artikel door ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Opmerking door ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream via ${name}';
|
||||||
|
case 'stream_list.following': return 'Volgt';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Gepland';
|
||||||
|
case 'stream_list.ended': return 'Beëindigd';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Aangepast bedrag';
|
||||||
|
case 'zap.confirm': return 'Bevestig';
|
||||||
|
case 'zap.comment': return 'Opmerking';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Openen in portefeuille';
|
||||||
|
case 'zap.copy': return 'Gekopieerd naar klembord';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Ongeldig aangepast bedrag';
|
||||||
|
case 'zap.error.no_wallet': return 'Geen bliksemportemonnee geïnstalleerd';
|
||||||
|
case 'zap.error.no_lud16': return 'Geen bliksemadres gevonden';
|
||||||
|
case 'profile.past_streams': return 'Afgelopen Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Naam weergeven';
|
||||||
|
case 'profile.edit.about': return 'Over ons';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Adres';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning adres';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Kan profiel niet bewerken als ik ben uitgelogd';
|
||||||
|
case 'login.username': return 'Gebruikersnaam';
|
||||||
|
case 'login.amber': return 'Inloggen met Amber';
|
||||||
|
case 'login.key': return 'Inloggen met sleutel';
|
||||||
|
case 'login.create': return 'Account aanmaken';
|
||||||
|
case 'login.error.invalid_key': return 'Ongeldige sleutel';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_no.g.dart
Normal file
416
lib/i18n/strings_no.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsNo implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsNo({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.no,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <no>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsNo _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsNo $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsNo(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
@override String get upload_avatar => 'Upload Avatar';
|
||||||
|
|
||||||
|
/// Heading over listed top streamers by zaps
|
||||||
|
@override String get most_zapped_streamers => 'Most Zapped Streamers';
|
||||||
|
|
||||||
|
/// No user found when searching
|
||||||
|
@override String get no_user_found => 'No user found';
|
||||||
|
|
||||||
|
/// An anonymous user
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Number of viewers of the stream
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('no'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamNo stream = _TranslationsStreamNo._(_root);
|
||||||
|
@override late final _TranslationsGoalNo goal = _TranslationsGoalNo._(_root);
|
||||||
|
@override late final _TranslationsButtonNo button = _TranslationsButtonNo._(_root);
|
||||||
|
@override late final _TranslationsEmbedNo embed = _TranslationsEmbedNo._(_root);
|
||||||
|
|
||||||
|
/// Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
@override late final _TranslationsStreamListNo stream_list = _TranslationsStreamListNo._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapNo zap = _TranslationsZapNo._(_root);
|
||||||
|
@override late final _TranslationsProfileNo profile = _TranslationsProfileNo._(_root);
|
||||||
|
@override late final _TranslationsLoginNo login = _TranslationsLoginNo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamNo implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusNo status = _TranslationsStreamStatusNo._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatNo chat = _TranslationsStreamChatNo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalNo implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonNo implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Button text for the login button
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Logout';
|
||||||
|
@override String get edit_profile => 'Edit Profile';
|
||||||
|
|
||||||
|
/// Button text for the follow button
|
||||||
|
@override String get follow => 'Follow';
|
||||||
|
|
||||||
|
/// Button text for the unfollow button
|
||||||
|
@override String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
@override String get mute => 'Mute';
|
||||||
|
@override String get unmute => 'Unmute';
|
||||||
|
@override String get share => 'Share';
|
||||||
|
@override String get save => 'Save';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedNo implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Article by ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note by ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListNo implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Following';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planned';
|
||||||
|
@override String get ended => 'Ended';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapNo implements TranslationsZapEn {
|
||||||
|
_TranslationsZapNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Custom Amount';
|
||||||
|
@override String get confirm => 'Confirm';
|
||||||
|
@override String get comment => 'Comment';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Open in Wallet';
|
||||||
|
@override String get copy => 'Copied to clipboard';
|
||||||
|
@override late final _TranslationsZapErrorNo error = _TranslationsZapErrorNo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileNo implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Past Streams';
|
||||||
|
@override late final _TranslationsProfileEditNo edit = _TranslationsProfileEditNo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginNo implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Username';
|
||||||
|
@override String get amber => 'Login with Amber';
|
||||||
|
@override String get key => 'Login with Key';
|
||||||
|
@override String get create => 'Create Account';
|
||||||
|
@override late final _TranslationsLoginErrorNo error = _TranslationsLoginErrorNo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusNo implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'PLANNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatNo implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABLED';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timeout expires: ${time}';
|
||||||
|
|
||||||
|
/// Chat message showing timeout events
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Chat message showing stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteNo write = _TranslationsStreamChatWriteNo._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeNo badge = _TranslationsStreamChatBadgeNo._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidNo raid = _TranslationsStreamChatRaidNo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorNo implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Invalid custom amount';
|
||||||
|
@override String get no_wallet => 'No lightning wallet installed';
|
||||||
|
@override String get no_lud16 => 'No lightning address found';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditNo implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Display Name';
|
||||||
|
@override String get about => 'About';
|
||||||
|
@override String get nip05 => 'Nostr Address';
|
||||||
|
@override String get lud16 => 'Lightning Address';
|
||||||
|
@override late final _TranslationsProfileEditErrorNo error = _TranslationsProfileEditErrorNo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorNo implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Invalid key';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteNo implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label on the chat message input box
|
||||||
|
@override String get label => 'Write message';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged in only with pubkey
|
||||||
|
@override String get no_signer => 'Can\'t write messages with npub login';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged out
|
||||||
|
@override String get login => 'Please login to send messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeNo implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Heading over list of users who are awarded a badge
|
||||||
|
@override String get awarded_to => 'Awarded to:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidNo implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid message to another stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid message from another stream
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Countdown timer for auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Raiding in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorNo implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorNo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsNo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Cant edit profile when logged out';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsNo {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Most Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'No user found';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('no'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'PLANNED';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Write message';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Can\'t write messages with npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Please login to send messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Awarded to:';
|
||||||
|
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 in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Edit Profile';
|
||||||
|
case 'button.follow': return 'Follow';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mute';
|
||||||
|
case 'button.unmute': return 'Unmute';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Save';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article by ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note by ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return 'Following';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planned';
|
||||||
|
case 'stream_list.ended': return 'Ended';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Custom Amount';
|
||||||
|
case 'zap.confirm': return 'Confirm';
|
||||||
|
case 'zap.comment': return 'Comment';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Open in Wallet';
|
||||||
|
case 'zap.copy': return 'Copied to clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Invalid custom amount';
|
||||||
|
case 'zap.error.no_wallet': return 'No lightning wallet installed';
|
||||||
|
case 'zap.error.no_lud16': return 'No lightning address found';
|
||||||
|
case 'profile.past_streams': return 'Past Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Display Name';
|
||||||
|
case 'profile.edit.about': return 'About';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Address';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Address';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Cant edit profile when logged out';
|
||||||
|
case 'login.username': return 'Username';
|
||||||
|
case 'login.amber': return 'Login with Amber';
|
||||||
|
case 'login.key': return 'Login with Key';
|
||||||
|
case 'login.create': return 'Create Account';
|
||||||
|
case 'login.error.invalid_key': return 'Invalid key';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_pl.g.dart
Normal file
416
lib/i18n/strings_pl.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsPl implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsPl({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.pl,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <pl>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsPl _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsPl $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsPl(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Tekst zachęcający użytkownika do kliknięcia symbolu zastępczego awatara w celu rozpoczęcia przesyłania.
|
||||||
|
@override String get upload_avatar => 'Prześlij awatar';
|
||||||
|
|
||||||
|
/// Przechodzenie nad wymienionymi topowymi streamerami przez zapy
|
||||||
|
@override String get most_zapped_streamers => 'Większość zapped streamerów';
|
||||||
|
|
||||||
|
/// Nie znaleziono użytkownika podczas wyszukiwania
|
||||||
|
@override String get no_user_found => 'Nie znaleziono użytkownika';
|
||||||
|
|
||||||
|
/// Anonimowy użytkownik
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Liczba widzów strumienia
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n,
|
||||||
|
one: '1 przeglądarka',
|
||||||
|
other: '${n} widzowie',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamPl stream = _TranslationsStreamPl._(_root);
|
||||||
|
@override late final _TranslationsGoalPl goal = _TranslationsGoalPl._(_root);
|
||||||
|
@override late final _TranslationsButtonPl button = _TranslationsButtonPl._(_root);
|
||||||
|
@override late final _TranslationsEmbedPl embed = _TranslationsEmbedPl._(_root);
|
||||||
|
|
||||||
|
/// Nagłówki na listach strumieni według typu strumienia na żywo / zakończony / planowany itp.
|
||||||
|
@override late final _TranslationsStreamListPl stream_list = _TranslationsStreamListPl._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapPl zap = _TranslationsZapPl._(_root);
|
||||||
|
@override late final _TranslationsProfilePl profile = _TranslationsProfilePl._(_root);
|
||||||
|
@override late final _TranslationsLoginPl login = _TranslationsLoginPl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamPl implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusPl status = _TranslationsStreamStatusPl._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Start ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatPl chat = _TranslationsStreamChatPl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalPl implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Cel: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Pozostałe: ${amount}';
|
||||||
|
@override String get complete => 'ZAKOŃCZONE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonPl implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Tekst przycisku logowania
|
||||||
|
@override String get login => 'Logowanie';
|
||||||
|
|
||||||
|
@override String get logout => 'Wylogowanie';
|
||||||
|
@override String get edit_profile => 'Edytuj profil';
|
||||||
|
|
||||||
|
/// Tekst przycisku dla przycisku śledzenia
|
||||||
|
@override String get follow => 'Śledź';
|
||||||
|
|
||||||
|
/// Tekst przycisku cofnięcia obserwowania
|
||||||
|
@override String get unfollow => 'Nie obserwuj';
|
||||||
|
|
||||||
|
@override String get mute => 'Wyciszenie';
|
||||||
|
@override String get unmute => 'Wyłącz wyciszenie';
|
||||||
|
@override String get share => 'Udział';
|
||||||
|
@override String get save => 'Zapisz';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedPl implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artykuł autorstwa ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Uwaga ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Transmisja na żywo przez ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListPl implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Następujący';
|
||||||
|
@override String get live => 'Na żywo';
|
||||||
|
@override String get planned => 'Planowane';
|
||||||
|
@override String get ended => 'Zakończony';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapPl implements TranslationsZapEn {
|
||||||
|
_TranslationsZapPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Kwota niestandardowa';
|
||||||
|
@override String get confirm => 'Potwierdzenie';
|
||||||
|
@override String get comment => 'Komentarz';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Otwórz w portfelu';
|
||||||
|
@override String get copy => 'Skopiowane do schowka';
|
||||||
|
@override late final _TranslationsZapErrorPl error = _TranslationsZapErrorPl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfilePl implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfilePl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Poprzednie strumienie';
|
||||||
|
@override late final _TranslationsProfileEditPl edit = _TranslationsProfileEditPl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginPl implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Nazwa użytkownika';
|
||||||
|
@override String get amber => 'Zaloguj się za pomocą Amber';
|
||||||
|
@override String get key => 'Logowanie za pomocą klucza';
|
||||||
|
@override String get create => 'Utwórz konto';
|
||||||
|
@override late final _TranslationsLoginErrorPl error = _TranslationsLoginErrorPl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusPl implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'NA ŻYWO';
|
||||||
|
@override String get ended => 'ZAKOŃCZONY';
|
||||||
|
@override String get planned => 'PLANOWANE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatPl implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CZAT WYŁĄCZONY';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Upłynął limit czasu: ${time}';
|
||||||
|
|
||||||
|
/// Komunikat czatu pokazujący zdarzenia przekroczenia limitu czasu
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' upłynął limit czasu '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' dla '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream zakończył stopkę na dole czatu
|
||||||
|
@override String get ended => 'TRANSMISJA ZAKOŃCZONA';
|
||||||
|
|
||||||
|
/// Wiadomość na czacie pokazująca zapy strumienia
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWritePl write = _TranslationsStreamChatWritePl._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgePl badge = _TranslationsStreamChatBadgePl._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidPl raid = _TranslationsStreamChatRaidPl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorPl implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Nieprawidłowa kwota niestandardowa';
|
||||||
|
@override String get no_wallet => 'Brak zainstalowanego portfela Lightning';
|
||||||
|
@override String get no_lud16 => 'Nie znaleziono adresu pioruna';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditPl implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Wyświetlana nazwa';
|
||||||
|
@override String get about => 'O';
|
||||||
|
@override String get nip05 => 'Adres Nostr';
|
||||||
|
@override String get lud16 => 'Adres błyskawicy';
|
||||||
|
@override late final _TranslationsProfileEditErrorPl error = _TranslationsProfileEditErrorPl._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorPl implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Nieprawidłowy klucz';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWritePl implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWritePl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Etykieta w polu wprowadzania wiadomości czatu
|
||||||
|
@override String get label => 'Napisz wiadomość';
|
||||||
|
|
||||||
|
/// Komunikat wejściowy czatu wyświetlany, gdy użytkownik jest zalogowany tylko za pomocą klucza pubkey
|
||||||
|
@override String get no_signer => 'Nie można pisać wiadomości z loginem npub';
|
||||||
|
|
||||||
|
/// Komunikat wejściowy czatu wyświetlany, gdy użytkownik jest wylogowany
|
||||||
|
@override String get login => 'Zaloguj się, aby wysyłać wiadomości';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgePl implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgePl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Nagłówek nad listą użytkowników, którzy otrzymali odznakę
|
||||||
|
@override String get awarded_to => 'Przyznano:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidPl implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Przesyłanie wiadomości na czacie do innego strumienia
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Nalot na czat z innego strumienia
|
||||||
|
@override String from({ required Object name}) => 'RAID Z ${name}';
|
||||||
|
|
||||||
|
/// Zegar odliczający czas do automatycznej jazdy
|
||||||
|
@override String countdown({ required Object time}) => 'Naloty w ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorPl implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorPl._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPl _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Nie można edytować profilu po wylogowaniu';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsPl {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Prześlij awatar';
|
||||||
|
case 'most_zapped_streamers': return 'Większość zapped streamerów';
|
||||||
|
case 'no_user_found': return 'Nie znaleziono użytkownika';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pl'))(n,
|
||||||
|
one: '1 przeglądarka',
|
||||||
|
other: '${n} widzowie',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'NA ŻYWO';
|
||||||
|
case 'stream.status.ended': return 'ZAKOŃCZONY';
|
||||||
|
case 'stream.status.planned': return 'PLANOWANE';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Start ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' upłynął limit czasu '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' dla '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'TRANSMISJA ZAKOŃCZONA';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Napisz wiadomość';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Nie można pisać wiadomości z loginem npub';
|
||||||
|
case 'stream.chat.write.login': return 'Zaloguj się, aby wysyłać wiadomości';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Przyznano:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID Z ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Naloty w ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Cel: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Pozostałe: ${amount}';
|
||||||
|
case 'goal.complete': return 'ZAKOŃCZONE';
|
||||||
|
case 'button.login': return 'Logowanie';
|
||||||
|
case 'button.logout': return 'Wylogowanie';
|
||||||
|
case 'button.edit_profile': return 'Edytuj profil';
|
||||||
|
case 'button.follow': return 'Śledź';
|
||||||
|
case 'button.unfollow': return 'Nie obserwuj';
|
||||||
|
case 'button.mute': return 'Wyciszenie';
|
||||||
|
case 'button.unmute': return 'Wyłącz wyciszenie';
|
||||||
|
case 'button.share': return 'Udział';
|
||||||
|
case 'button.save': return 'Zapisz';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artykuł autorstwa ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Uwaga ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Transmisja na żywo przez ${name}';
|
||||||
|
case 'stream_list.following': return 'Następujący';
|
||||||
|
case 'stream_list.live': return 'Na żywo';
|
||||||
|
case 'stream_list.planned': return 'Planowane';
|
||||||
|
case 'stream_list.ended': return 'Zakończony';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Kwota niestandardowa';
|
||||||
|
case 'zap.confirm': return 'Potwierdzenie';
|
||||||
|
case 'zap.comment': return 'Komentarz';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Otwórz w portfelu';
|
||||||
|
case 'zap.copy': return 'Skopiowane do schowka';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Nieprawidłowa kwota niestandardowa';
|
||||||
|
case 'zap.error.no_wallet': return 'Brak zainstalowanego portfela Lightning';
|
||||||
|
case 'zap.error.no_lud16': return 'Nie znaleziono adresu pioruna';
|
||||||
|
case 'profile.past_streams': return 'Poprzednie strumienie';
|
||||||
|
case 'profile.edit.display_name': return 'Wyświetlana nazwa';
|
||||||
|
case 'profile.edit.about': return 'O';
|
||||||
|
case 'profile.edit.nip05': return 'Adres Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Adres błyskawicy';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Nie można edytować profilu po wylogowaniu';
|
||||||
|
case 'login.username': return 'Nazwa użytkownika';
|
||||||
|
case 'login.amber': return 'Zaloguj się za pomocą Amber';
|
||||||
|
case 'login.key': return 'Logowanie za pomocą klucza';
|
||||||
|
case 'login.create': return 'Utwórz konto';
|
||||||
|
case 'login.error.invalid_key': return 'Nieprawidłowy klucz';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_pt.g.dart
Normal file
416
lib/i18n/strings_pt.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsPt implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsPt({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.pt,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <pt>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsPt _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsPt $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsPt(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Texto solicitando que o usuário clique no espaço reservado do avatar para iniciar o upload
|
||||||
|
@override String get upload_avatar => 'Carregar Avatar';
|
||||||
|
|
||||||
|
/// Dirigindo-se para as principais serpentinas listadas por zaps
|
||||||
|
@override String get most_zapped_streamers => 'Streamers mais afetados';
|
||||||
|
|
||||||
|
/// Nenhum usuário foi encontrado durante a pesquisa
|
||||||
|
@override String get no_user_found => 'Nenhum usuário encontrado';
|
||||||
|
|
||||||
|
/// Um usuário anônimo
|
||||||
|
@override String get anon => 'Anônimo';
|
||||||
|
|
||||||
|
/// Número de espectadores da transmissão
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n,
|
||||||
|
one: '1 visualizador',
|
||||||
|
other: '${n} espectadores',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamPt stream = _TranslationsStreamPt._(_root);
|
||||||
|
@override late final _TranslationsGoalPt goal = _TranslationsGoalPt._(_root);
|
||||||
|
@override late final _TranslationsButtonPt button = _TranslationsButtonPt._(_root);
|
||||||
|
@override late final _TranslationsEmbedPt embed = _TranslationsEmbedPt._(_root);
|
||||||
|
|
||||||
|
/// Cabeçalhos nas listas de transmissões por tipo de transmissão ao vivo/terminada/planejada etc.
|
||||||
|
@override late final _TranslationsStreamListPt stream_list = _TranslationsStreamListPt._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapPt zap = _TranslationsZapPt._(_root);
|
||||||
|
@override late final _TranslationsProfilePt profile = _TranslationsProfilePt._(_root);
|
||||||
|
@override late final _TranslationsLoginPt login = _TranslationsLoginPt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamPt implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusPt status = _TranslationsStreamStatusPt._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Iniciado em ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatPt chat = _TranslationsStreamChatPt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalPt implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Meta: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Restante: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETO';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonPt implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Texto do botão para o botão de login
|
||||||
|
@override String get login => 'Entrar';
|
||||||
|
|
||||||
|
@override String get logout => 'Sair';
|
||||||
|
@override String get edit_profile => 'Editar perfil';
|
||||||
|
|
||||||
|
/// Texto do botão para o botão Seguir
|
||||||
|
@override String get follow => 'Seguir';
|
||||||
|
|
||||||
|
/// Texto do botão para o botão deixar de seguir
|
||||||
|
@override String get unfollow => 'Deixar de seguir';
|
||||||
|
|
||||||
|
@override String get mute => 'Silenciar';
|
||||||
|
@override String get unmute => 'Desmutar';
|
||||||
|
@override String get share => 'Compartilhar';
|
||||||
|
@override String get save => 'Salvar';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedPt implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artigo de ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Nota de ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Transmissão ao vivo pelo site ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListPt implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Seguindo';
|
||||||
|
@override String get live => 'Ao vivo';
|
||||||
|
@override String get planned => 'Planejado';
|
||||||
|
@override String get ended => 'Encerrado';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapPt implements TranslationsZapEn {
|
||||||
|
_TranslationsZapPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Valor personalizado';
|
||||||
|
@override String get confirm => 'Confirmar';
|
||||||
|
@override String get comment => 'Comentar';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Enviar Zap de ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Abrir na carteira';
|
||||||
|
@override String get copy => 'Copiado para a área de transferência';
|
||||||
|
@override late final _TranslationsZapErrorPt error = _TranslationsZapErrorPt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfilePt implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfilePt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Transmissões Passadas';
|
||||||
|
@override late final _TranslationsProfileEditPt edit = _TranslationsProfileEditPt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginPt implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Nome de usuário';
|
||||||
|
@override String get amber => 'Faça login com o Amber';
|
||||||
|
@override String get key => 'Login com chave';
|
||||||
|
@override String get create => 'Criar Conta';
|
||||||
|
@override late final _TranslationsLoginErrorPt error = _TranslationsLoginErrorPt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusPt implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'AO VIVO';
|
||||||
|
@override String get ended => 'FINALIZADO';
|
||||||
|
@override String get planned => 'PLANEJADO';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatPt implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'BATE-PAPO DESATIVADO';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'O tempo limite expira: ${time}';
|
||||||
|
|
||||||
|
/// Mensagem de bate-papo mostrando eventos de tempo limite
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' Tempo esgotado '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' para '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// O rodapé do fluxo terminou na parte inferior do bate-papo
|
||||||
|
@override String get ended => 'TRANSMISSÃO ENCERRADA';
|
||||||
|
|
||||||
|
/// Mensagem de bate-papo mostrando zaps de fluxo
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapeou '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWritePt write = _TranslationsStreamChatWritePt._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgePt badge = _TranslationsStreamChatBadgePt._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidPt raid = _TranslationsStreamChatRaidPt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorPt implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Valor personalizado inválido';
|
||||||
|
@override String get no_wallet => 'Nenhuma carteira lightning instalada';
|
||||||
|
@override String get no_lud16 => 'Nenhum endereço de raio encontrado';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditPt implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Nome de exibição';
|
||||||
|
@override String get about => 'Sobre';
|
||||||
|
@override String get nip05 => 'Endereço do Nostr';
|
||||||
|
@override String get lud16 => 'Endereço Lightning';
|
||||||
|
@override late final _TranslationsProfileEditErrorPt error = _TranslationsProfileEditErrorPt._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorPt implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Chave inválida';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWritePt implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWritePt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Rótulo na caixa de entrada da mensagem de bate-papo
|
||||||
|
@override String get label => 'Escrever mensagem';
|
||||||
|
|
||||||
|
/// Mensagem de entrada de bate-papo exibida quando o usuário está conectado apenas com a pubkey
|
||||||
|
@override String get no_signer => 'Não é possível escrever mensagens com o login do npub';
|
||||||
|
|
||||||
|
/// Mensagem de entrada de chat exibida quando o usuário está desconectado
|
||||||
|
@override String get login => 'Faça login para enviar mensagens';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgePt implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgePt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Cabeçalho sobre a lista de usuários que receberam um emblema
|
||||||
|
@override String get awarded_to => 'Prêmio concedido a:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidPt implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Mensagem de invasão de bate-papo para outro fluxo
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Mensagem de invasão de bate-papo de outro fluxo
|
||||||
|
@override String from({ required Object name}) => 'RAID DE ${name}';
|
||||||
|
|
||||||
|
/// Cronômetro de contagem regressiva para o ataque automático
|
||||||
|
@override String countdown({ required Object time}) => 'Incursões em ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorPt implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorPt._(this._root);
|
||||||
|
|
||||||
|
final TranslationsPt _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Não é possível editar o perfil quando se está desconectado';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsPt {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Carregar Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Streamers mais afetados';
|
||||||
|
case 'no_user_found': return 'Nenhum usuário encontrado';
|
||||||
|
case 'anon': return 'Anônimo';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('pt'))(n,
|
||||||
|
one: '1 visualizador',
|
||||||
|
other: '${n} espectadores',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'AO VIVO';
|
||||||
|
case 'stream.status.ended': return 'FINALIZADO';
|
||||||
|
case 'stream.status.planned': return 'PLANEJADO';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Iniciado em ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' Tempo esgotado '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' para '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'TRANSMISSÃO ENCERRADA';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapeou '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Escrever mensagem';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Não é possível escrever mensagens com o login do npub';
|
||||||
|
case 'stream.chat.write.login': return 'Faça login para enviar mensagens';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Prêmio concedido a:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID DE ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Incursões em ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Meta: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Restante: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETO';
|
||||||
|
case 'button.login': return 'Entrar';
|
||||||
|
case 'button.logout': return 'Sair';
|
||||||
|
case 'button.edit_profile': return 'Editar perfil';
|
||||||
|
case 'button.follow': return 'Seguir';
|
||||||
|
case 'button.unfollow': return 'Deixar de seguir';
|
||||||
|
case 'button.mute': return 'Silenciar';
|
||||||
|
case 'button.unmute': return 'Desmutar';
|
||||||
|
case 'button.share': return 'Compartilhar';
|
||||||
|
case 'button.save': return 'Salvar';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artigo de ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Nota de ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Transmissão ao vivo pelo site ${name}';
|
||||||
|
case 'stream_list.following': return 'Seguindo';
|
||||||
|
case 'stream_list.live': return 'Ao vivo';
|
||||||
|
case 'stream_list.planned': return 'Planejado';
|
||||||
|
case 'stream_list.ended': return 'Encerrado';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Valor personalizado';
|
||||||
|
case 'zap.confirm': return 'Confirmar';
|
||||||
|
case 'zap.comment': return 'Comentar';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Enviar Zap de ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Abrir na carteira';
|
||||||
|
case 'zap.copy': return 'Copiado para a área de transferência';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Valor personalizado inválido';
|
||||||
|
case 'zap.error.no_wallet': return 'Nenhuma carteira lightning instalada';
|
||||||
|
case 'zap.error.no_lud16': return 'Nenhum endereço de raio encontrado';
|
||||||
|
case 'profile.past_streams': return 'Transmissões Passadas';
|
||||||
|
case 'profile.edit.display_name': return 'Nome de exibição';
|
||||||
|
case 'profile.edit.about': return 'Sobre';
|
||||||
|
case 'profile.edit.nip05': return 'Endereço do Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Endereço Lightning';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Não é possível editar o perfil quando se está desconectado';
|
||||||
|
case 'login.username': return 'Nome de usuário';
|
||||||
|
case 'login.amber': return 'Faça login com o Amber';
|
||||||
|
case 'login.key': return 'Login com chave';
|
||||||
|
case 'login.create': return 'Criar Conta';
|
||||||
|
case 'login.error.invalid_key': return 'Chave inválida';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_ro.g.dart
Normal file
416
lib/i18n/strings_ro.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsRo implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsRo({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.ro,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <ro>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsRo _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsRo $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsRo(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text care solicită utilizatorului să atingă marcajul avatar pentru a începe încărcarea
|
||||||
|
@override String get upload_avatar => 'Încărcați Avatar';
|
||||||
|
|
||||||
|
/// Cap peste streamers de top enumerate de zaps
|
||||||
|
@override String get most_zapped_streamers => 'Cele mai multe Streamers Zapped';
|
||||||
|
|
||||||
|
/// Nu s-a găsit niciun utilizator la căutare
|
||||||
|
@override String get no_user_found => 'Niciun utilizator găsit';
|
||||||
|
|
||||||
|
/// Un utilizator anonim
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Numărul de telespectatori ai fluxului
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ro'))(n,
|
||||||
|
one: '1 vizualizator',
|
||||||
|
other: '${n} telespectatori',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamRo stream = _TranslationsStreamRo._(_root);
|
||||||
|
@override late final _TranslationsGoalRo goal = _TranslationsGoalRo._(_root);
|
||||||
|
@override late final _TranslationsButtonRo button = _TranslationsButtonRo._(_root);
|
||||||
|
@override late final _TranslationsEmbedRo embed = _TranslationsEmbedRo._(_root);
|
||||||
|
|
||||||
|
/// Rubrici pe listele de fluxuri în funcție de tipul fluxului în direct/terminat/planificat etc.
|
||||||
|
@override late final _TranslationsStreamListRo stream_list = _TranslationsStreamListRo._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapRo zap = _TranslationsZapRo._(_root);
|
||||||
|
@override late final _TranslationsProfileRo profile = _TranslationsProfileRo._(_root);
|
||||||
|
@override late final _TranslationsLoginRo login = _TranslationsLoginRo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamRo implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusRo status = _TranslationsStreamStatusRo._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'A început ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatRo chat = _TranslationsStreamChatRo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalRo implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Obiectiv: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Rămase: ${amount}';
|
||||||
|
@override String get complete => 'COMPLET';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonRo implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Textul butonului pentru butonul de conectare
|
||||||
|
@override String get login => 'Autentificare';
|
||||||
|
|
||||||
|
@override String get logout => 'Ieșire';
|
||||||
|
@override String get edit_profile => 'Editare profil';
|
||||||
|
|
||||||
|
/// Textul butonului pentru butonul de urmărire
|
||||||
|
@override String get follow => 'Urmați';
|
||||||
|
|
||||||
|
/// Textul butonului pentru butonul unfollow
|
||||||
|
@override String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
@override String get mute => 'Mut';
|
||||||
|
@override String get unmute => 'Dezactivați';
|
||||||
|
@override String get share => 'Share';
|
||||||
|
@override String get save => 'Salvați';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedRo implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Articol de ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Notă de la ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Transmisiune live prin ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListRo implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'În urma';
|
||||||
|
@override String get live => 'În direct';
|
||||||
|
@override String get planned => 'Planificate';
|
||||||
|
@override String get ended => 'Încheiat';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapRo implements TranslationsZapEn {
|
||||||
|
_TranslationsZapRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Sumă personalizată';
|
||||||
|
@override String get confirm => 'Confirmați';
|
||||||
|
@override String get comment => 'Comentariu';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Deschide în portofel';
|
||||||
|
@override String get copy => 'Copiat în clipboard';
|
||||||
|
@override late final _TranslationsZapErrorRo error = _TranslationsZapErrorRo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileRo implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Fluxuri trecute';
|
||||||
|
@override late final _TranslationsProfileEditRo edit = _TranslationsProfileEditRo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginRo implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Nume utilizator';
|
||||||
|
@override String get amber => 'Conectați-vă cu Amber';
|
||||||
|
@override String get key => 'Autentificare cu cheie';
|
||||||
|
@override String get create => 'Creare cont';
|
||||||
|
@override late final _TranslationsLoginErrorRo error = _TranslationsLoginErrorRo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusRo implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'ÎN DIRECT';
|
||||||
|
@override String get ended => 'TERMINAT';
|
||||||
|
@override String get planned => 'PLANIFICATE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatRo implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DEZACTIVAT';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timpul expiră: ${time}';
|
||||||
|
|
||||||
|
/// Mesaj de chat care afișează evenimentele de timeout
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' Timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' pentru '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream a încheiat footer-ul în partea de jos a chat-ului
|
||||||
|
@override String get ended => 'STREAM ÎNCHEIAT';
|
||||||
|
|
||||||
|
/// Mesaj de chat care arată zapsuri de flux
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteRo write = _TranslationsStreamChatWriteRo._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeRo badge = _TranslationsStreamChatBadgeRo._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidRo raid = _TranslationsStreamChatRaidRo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorRo implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Sumă personalizată invalidă';
|
||||||
|
@override String get no_wallet => 'Nu este instalat niciun portofel Lightning';
|
||||||
|
@override String get no_lud16 => 'Nu a fost găsită nicio adresă de fulgere';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditRo implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Nume afișat';
|
||||||
|
@override String get about => 'Despre';
|
||||||
|
@override String get nip05 => 'Adresa Nostr';
|
||||||
|
@override String get lud16 => 'Adresa fulgerului';
|
||||||
|
@override late final _TranslationsProfileEditErrorRo error = _TranslationsProfileEditErrorRo._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorRo implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Cheie invalidă';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteRo implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Etichetă pe caseta de introducere a mesajului de chat
|
||||||
|
@override String get label => 'Scrieți mesajul';
|
||||||
|
|
||||||
|
/// Mesajul de intrare în chat afișat atunci când utilizatorul este conectat doar cu pubkey
|
||||||
|
@override String get no_signer => 'Nu se pot scrie mesaje cu autentificarea npub';
|
||||||
|
|
||||||
|
/// Mesajul de intrare în chat afișat atunci când utilizatorul este deconectat
|
||||||
|
@override String get login => 'Vă rugăm să vă autentificați pentru a trimite mesaje';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeRo implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Antet peste lista de utilizatori care au primit o insignă
|
||||||
|
@override String get awarded_to => 'Premiat pentru:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidRo implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat mesaj raid la un alt flux
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid mesaj din alt flux
|
||||||
|
@override String from({ required Object name}) => 'RAID DE LA ${name}';
|
||||||
|
|
||||||
|
/// Cronometru cu numărătoare inversă pentru auto-raid
|
||||||
|
@override String countdown({ required Object time}) => 'Raiduri în ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorRo implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorRo._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRo _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Nu pot edita profilul când sunt deconectat';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsRo {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Încărcați Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Cele mai multe Streamers Zapped';
|
||||||
|
case 'no_user_found': return 'Niciun utilizator găsit';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ro'))(n,
|
||||||
|
one: '1 vizualizator',
|
||||||
|
other: '${n} telespectatori',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'ÎN DIRECT';
|
||||||
|
case 'stream.status.ended': return 'TERMINAT';
|
||||||
|
case 'stream.status.planned': return 'PLANIFICATE';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'A început ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' Timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' pentru '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ÎNCHEIAT';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Scrieți mesajul';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Nu se pot scrie mesaje cu autentificarea npub';
|
||||||
|
case 'stream.chat.write.login': return 'Vă rugăm să vă autentificați pentru a trimite mesaje';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Premiat pentru:';
|
||||||
|
case 'stream.chat.raid.to': return ({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
case 'stream.chat.raid.from': return ({ required Object name}) => 'RAID DE LA ${name}';
|
||||||
|
case 'stream.chat.raid.countdown': return ({ required Object time}) => 'Raiduri în ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Obiectiv: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Rămase: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLET';
|
||||||
|
case 'button.login': return 'Autentificare';
|
||||||
|
case 'button.logout': return 'Ieșire';
|
||||||
|
case 'button.edit_profile': return 'Editare profil';
|
||||||
|
case 'button.follow': return 'Urmați';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mut';
|
||||||
|
case 'button.unmute': return 'Dezactivați';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Salvați';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Articol de ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Notă de la ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Transmisiune live prin ${name}';
|
||||||
|
case 'stream_list.following': return 'În urma';
|
||||||
|
case 'stream_list.live': return 'În direct';
|
||||||
|
case 'stream_list.planned': return 'Planificate';
|
||||||
|
case 'stream_list.ended': return 'Încheiat';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Sumă personalizată';
|
||||||
|
case 'zap.confirm': return 'Confirmați';
|
||||||
|
case 'zap.comment': return 'Comentariu';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Deschide în portofel';
|
||||||
|
case 'zap.copy': return 'Copiat în clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Sumă personalizată invalidă';
|
||||||
|
case 'zap.error.no_wallet': return 'Nu este instalat niciun portofel Lightning';
|
||||||
|
case 'zap.error.no_lud16': return 'Nu a fost găsită nicio adresă de fulgere';
|
||||||
|
case 'profile.past_streams': return 'Fluxuri trecute';
|
||||||
|
case 'profile.edit.display_name': return 'Nume afișat';
|
||||||
|
case 'profile.edit.about': return 'Despre';
|
||||||
|
case 'profile.edit.nip05': return 'Adresa Nostr';
|
||||||
|
case 'profile.edit.lud16': return 'Adresa fulgerului';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Nu pot edita profilul când sunt deconectat';
|
||||||
|
case 'login.username': return 'Nume utilizator';
|
||||||
|
case 'login.amber': return 'Conectați-vă cu Amber';
|
||||||
|
case 'login.key': return 'Autentificare cu cheie';
|
||||||
|
case 'login.create': return 'Creare cont';
|
||||||
|
case 'login.error.invalid_key': return 'Cheie invalidă';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_ru.g.dart
Normal file
416
lib/i18n/strings_ru.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsRu implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsRu({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.ru,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <ru>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsRu _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsRu $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsRu(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Текст, побуждающий пользователя нажать кнопку с изображением аватара, чтобы начать загрузку
|
||||||
|
@override String get upload_avatar => 'Загрузить аватар';
|
||||||
|
|
||||||
|
/// Направляясь по перечисленным верхним стримерам с помощью запс
|
||||||
|
@override String get most_zapped_streamers => 'Самые прыткие стримеры';
|
||||||
|
|
||||||
|
/// Пользователь не найден при поиске
|
||||||
|
@override String get no_user_found => 'Пользователь не найден';
|
||||||
|
|
||||||
|
/// Анонимный пользователь
|
||||||
|
@override String get anon => 'Аноним';
|
||||||
|
|
||||||
|
/// Количество зрителей потока
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n,
|
||||||
|
one: '1 зритель',
|
||||||
|
other: '${n} зрителей',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamRu stream = _TranslationsStreamRu._(_root);
|
||||||
|
@override late final _TranslationsGoalRu goal = _TranslationsGoalRu._(_root);
|
||||||
|
@override late final _TranslationsButtonRu button = _TranslationsButtonRu._(_root);
|
||||||
|
@override late final _TranslationsEmbedRu embed = _TranslationsEmbedRu._(_root);
|
||||||
|
|
||||||
|
/// Заголовки в списках потоков по типу потока - живой/законченный/запланированный и т. д.
|
||||||
|
@override late final _TranslationsStreamListRu stream_list = _TranslationsStreamListRu._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapRu zap = _TranslationsZapRu._(_root);
|
||||||
|
@override late final _TranslationsProfileRu profile = _TranslationsProfileRu._(_root);
|
||||||
|
@override late final _TranslationsLoginRu login = _TranslationsLoginRu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamRu implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusRu status = _TranslationsStreamStatusRu._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Начало ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatRu chat = _TranslationsStreamChatRu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalRu implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Цель: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Осталось: ${amount}';
|
||||||
|
@override String get complete => 'КОМПЛЕКТ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonRu implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Текст кнопки для входа в систему
|
||||||
|
@override String get login => 'Логин';
|
||||||
|
|
||||||
|
@override String get logout => 'Выйти';
|
||||||
|
@override String get edit_profile => 'Редактировать профиль';
|
||||||
|
|
||||||
|
/// Текст кнопки для кнопки следования
|
||||||
|
@override String get follow => 'Подписаться';
|
||||||
|
|
||||||
|
/// Текст кнопки для кнопки "Развернуть
|
||||||
|
@override String get unfollow => 'Отписаться';
|
||||||
|
|
||||||
|
@override String get mute => 'Заглушить';
|
||||||
|
@override String get unmute => 'Включить уведомления';
|
||||||
|
@override String get share => 'Поделиться';
|
||||||
|
@override String get save => 'Сохранить';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedRu implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Статья ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Заметка на сайте ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Прямая трансляция: ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListRu implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Подписки';
|
||||||
|
@override String get live => 'Прямой эфир';
|
||||||
|
@override String get planned => 'Запланировано';
|
||||||
|
@override String get ended => 'Завершено';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapRu implements TranslationsZapEn {
|
||||||
|
_TranslationsZapRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Запнуть (${name}';
|
||||||
|
@override String get custom_amount => 'Пользовательская сумма';
|
||||||
|
@override String get confirm => 'Подтвердить';
|
||||||
|
@override String get comment => 'Комментарий';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Запнуть ${amount} сат';
|
||||||
|
@override String get button_zap => 'Зап';
|
||||||
|
@override String get button_open_wallet => 'Открыть в кошельке';
|
||||||
|
@override String get copy => 'Скопировано в буфер обмена';
|
||||||
|
@override late final _TranslationsZapErrorRu error = _TranslationsZapErrorRu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileRu implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Предыдущие трансляции';
|
||||||
|
@override late final _TranslationsProfileEditRu edit = _TranslationsProfileEditRu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginRu implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Имя пользователя';
|
||||||
|
@override String get amber => 'Войти с помощью Amber';
|
||||||
|
@override String get key => 'Вход в систему с помощью ключа';
|
||||||
|
@override String get create => 'Создать аккаунт';
|
||||||
|
@override late final _TranslationsLoginErrorRu error = _TranslationsLoginErrorRu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusRu implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'КОНЕЦ';
|
||||||
|
@override String get planned => 'ПЛАНИРУЕМЫЙ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatRu implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'ЧАТ ОТКЛЮЧЕН';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Таймаут истекает: ${time}';
|
||||||
|
|
||||||
|
/// Сообщение в чате, показывающее события по тайм-ауту
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' тайм-аут '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' для '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Поток закончился в нижней части чата
|
||||||
|
@override String get ended => 'ТРАНСЛЯЦИЯ ОКОНЧЕНА';
|
||||||
|
|
||||||
|
/// Сообщение в чате, отображающее потоковые зазоры
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' запнул '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' сат'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteRu write = _TranslationsStreamChatWriteRu._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeRu badge = _TranslationsStreamChatBadgeRu._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidRu raid = _TranslationsStreamChatRaidRu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorRu implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Недопустимая пользовательская сумма';
|
||||||
|
@override String get no_wallet => 'Кошелек молнии не установлен';
|
||||||
|
@override String get no_lud16 => 'Адрес молнии не найден';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditRu implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Отображаемое имя';
|
||||||
|
@override String get about => 'О себе';
|
||||||
|
@override String get nip05 => 'Nostr адрес';
|
||||||
|
@override String get lud16 => 'Lightning Адрес';
|
||||||
|
@override late final _TranslationsProfileEditErrorRu error = _TranslationsProfileEditErrorRu._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorRu implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Неверный ключ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteRu implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Надпись на поле ввода сообщения чата
|
||||||
|
@override String get label => 'Написать сообщение';
|
||||||
|
|
||||||
|
/// Сообщение о входе в чат, отображаемое при входе пользователя только с pubkey
|
||||||
|
@override String get no_signer => 'Невозможно писать сообщения с логином npub';
|
||||||
|
|
||||||
|
/// Сообщение о входе в чат, отображаемое при выходе пользователя из системы
|
||||||
|
@override String get login => 'Пожалуйста, войдите в систему, чтобы отправлять сообщения';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeRu implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Заголовок над списком пользователей, награжденных значком
|
||||||
|
@override String get awarded_to => 'Награждается:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidRu implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Сообщение о рейде в чате в другой поток
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Сообщение о рейде в чате из другого потока
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Таймер обратного отсчета для автопоездки
|
||||||
|
@override String countdown({ required Object time}) => 'Рейды в ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorRu implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorRu._(this._root);
|
||||||
|
|
||||||
|
final TranslationsRu _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Невозможно редактировать профиль при выходе из системы';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsRu {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Загрузить аватар';
|
||||||
|
case 'most_zapped_streamers': return 'Самые прыткие стримеры';
|
||||||
|
case 'no_user_found': return 'Пользователь не найден';
|
||||||
|
case 'anon': return 'Аноним';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ru'))(n,
|
||||||
|
one: '1 зритель',
|
||||||
|
other: '${n} зрителей',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'КОНЕЦ';
|
||||||
|
case 'stream.status.planned': return 'ПЛАНИРУЕМЫЙ';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Начало ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' тайм-аут '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' для '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'ТРАНСЛЯЦИЯ ОКОНЧЕНА';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' запнул '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' сат'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Написать сообщение';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Невозможно писать сообщения с логином npub';
|
||||||
|
case 'stream.chat.write.login': return 'Пожалуйста, войдите в систему, чтобы отправлять сообщения';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Награждается:';
|
||||||
|
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}) => 'Рейды в ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Цель: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Осталось: ${amount}';
|
||||||
|
case 'goal.complete': return 'КОМПЛЕКТ';
|
||||||
|
case 'button.login': return 'Логин';
|
||||||
|
case 'button.logout': return 'Выйти';
|
||||||
|
case 'button.edit_profile': return 'Редактировать профиль';
|
||||||
|
case 'button.follow': return 'Подписаться';
|
||||||
|
case 'button.unfollow': return 'Отписаться';
|
||||||
|
case 'button.mute': return 'Заглушить';
|
||||||
|
case 'button.unmute': return 'Включить уведомления';
|
||||||
|
case 'button.share': return 'Поделиться';
|
||||||
|
case 'button.save': return 'Сохранить';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Статья ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Заметка на сайте ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Прямая трансляция: ${name}';
|
||||||
|
case 'stream_list.following': return 'Подписки';
|
||||||
|
case 'stream_list.live': return 'Прямой эфир';
|
||||||
|
case 'stream_list.planned': return 'Запланировано';
|
||||||
|
case 'stream_list.ended': return 'Завершено';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Запнуть (${name}';
|
||||||
|
case 'zap.custom_amount': return 'Пользовательская сумма';
|
||||||
|
case 'zap.confirm': return 'Подтвердить';
|
||||||
|
case 'zap.comment': return 'Комментарий';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Запнуть ${amount} сат';
|
||||||
|
case 'zap.button_zap': return 'Зап';
|
||||||
|
case 'zap.button_open_wallet': return 'Открыть в кошельке';
|
||||||
|
case 'zap.copy': return 'Скопировано в буфер обмена';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Недопустимая пользовательская сумма';
|
||||||
|
case 'zap.error.no_wallet': return 'Кошелек молнии не установлен';
|
||||||
|
case 'zap.error.no_lud16': return 'Адрес молнии не найден';
|
||||||
|
case 'profile.past_streams': return 'Предыдущие трансляции';
|
||||||
|
case 'profile.edit.display_name': return 'Отображаемое имя';
|
||||||
|
case 'profile.edit.about': return 'О себе';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr адрес';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Адрес';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Невозможно редактировать профиль при выходе из системы';
|
||||||
|
case 'login.username': return 'Имя пользователя';
|
||||||
|
case 'login.amber': return 'Войти с помощью Amber';
|
||||||
|
case 'login.key': return 'Вход в систему с помощью ключа';
|
||||||
|
case 'login.create': return 'Создать аккаунт';
|
||||||
|
case 'login.error.invalid_key': return 'Неверный ключ';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_sr.g.dart
Normal file
416
lib/i18n/strings_sr.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsSr implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsSr({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.sr,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <sr>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsSr _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsSr $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsSr(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
@override String get upload_avatar => 'Upload Avatar';
|
||||||
|
|
||||||
|
/// Heading over listed top streamers by zaps
|
||||||
|
@override String get most_zapped_streamers => 'Most Zapped Streamers';
|
||||||
|
|
||||||
|
/// No user found when searching
|
||||||
|
@override String get no_user_found => 'No user found';
|
||||||
|
|
||||||
|
/// An anonymous user
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Number of viewers of the stream
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sr'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamSr stream = _TranslationsStreamSr._(_root);
|
||||||
|
@override late final _TranslationsGoalSr goal = _TranslationsGoalSr._(_root);
|
||||||
|
@override late final _TranslationsButtonSr button = _TranslationsButtonSr._(_root);
|
||||||
|
@override late final _TranslationsEmbedSr embed = _TranslationsEmbedSr._(_root);
|
||||||
|
|
||||||
|
/// Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
@override late final _TranslationsStreamListSr stream_list = _TranslationsStreamListSr._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapSr zap = _TranslationsZapSr._(_root);
|
||||||
|
@override late final _TranslationsProfileSr profile = _TranslationsProfileSr._(_root);
|
||||||
|
@override late final _TranslationsLoginSr login = _TranslationsLoginSr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamSr implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusSr status = _TranslationsStreamStatusSr._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatSr chat = _TranslationsStreamChatSr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalSr implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonSr implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Button text for the login button
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Logout';
|
||||||
|
@override String get edit_profile => 'Edit Profile';
|
||||||
|
|
||||||
|
/// Button text for the follow button
|
||||||
|
@override String get follow => 'Follow';
|
||||||
|
|
||||||
|
/// Button text for the unfollow button
|
||||||
|
@override String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
@override String get mute => 'Mute';
|
||||||
|
@override String get unmute => 'Unmute';
|
||||||
|
@override String get share => 'Share';
|
||||||
|
@override String get save => 'Save';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedSr implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Article by ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note by ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListSr implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Following';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planned';
|
||||||
|
@override String get ended => 'Ended';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapSr implements TranslationsZapEn {
|
||||||
|
_TranslationsZapSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Custom Amount';
|
||||||
|
@override String get confirm => 'Confirm';
|
||||||
|
@override String get comment => 'Comment';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Open in Wallet';
|
||||||
|
@override String get copy => 'Copied to clipboard';
|
||||||
|
@override late final _TranslationsZapErrorSr error = _TranslationsZapErrorSr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileSr implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Past Streams';
|
||||||
|
@override late final _TranslationsProfileEditSr edit = _TranslationsProfileEditSr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginSr implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Username';
|
||||||
|
@override String get amber => 'Login with Amber';
|
||||||
|
@override String get key => 'Login with Key';
|
||||||
|
@override String get create => 'Create Account';
|
||||||
|
@override late final _TranslationsLoginErrorSr error = _TranslationsLoginErrorSr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusSr implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'PLANNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatSr implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABLED';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timeout expires: ${time}';
|
||||||
|
|
||||||
|
/// Chat message showing timeout events
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Chat message showing stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteSr write = _TranslationsStreamChatWriteSr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeSr badge = _TranslationsStreamChatBadgeSr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidSr raid = _TranslationsStreamChatRaidSr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorSr implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Invalid custom amount';
|
||||||
|
@override String get no_wallet => 'No lightning wallet installed';
|
||||||
|
@override String get no_lud16 => 'No lightning address found';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditSr implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Display Name';
|
||||||
|
@override String get about => 'About';
|
||||||
|
@override String get nip05 => 'Nostr Address';
|
||||||
|
@override String get lud16 => 'Lightning Address';
|
||||||
|
@override late final _TranslationsProfileEditErrorSr error = _TranslationsProfileEditErrorSr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorSr implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Invalid key';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteSr implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label on the chat message input box
|
||||||
|
@override String get label => 'Write message';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged in only with pubkey
|
||||||
|
@override String get no_signer => 'Can\'t write messages with npub login';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged out
|
||||||
|
@override String get login => 'Please login to send messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeSr implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Heading over list of users who are awarded a badge
|
||||||
|
@override String get awarded_to => 'Awarded to:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidSr implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid message to another stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid message from another stream
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Countdown timer for auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Raiding in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorSr implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorSr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Cant edit profile when logged out';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsSr {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Most Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'No user found';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sr'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'PLANNED';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Write message';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Can\'t write messages with npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Please login to send messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Awarded to:';
|
||||||
|
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 in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Edit Profile';
|
||||||
|
case 'button.follow': return 'Follow';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mute';
|
||||||
|
case 'button.unmute': return 'Unmute';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Save';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article by ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note by ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return 'Following';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planned';
|
||||||
|
case 'stream_list.ended': return 'Ended';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Custom Amount';
|
||||||
|
case 'zap.confirm': return 'Confirm';
|
||||||
|
case 'zap.comment': return 'Comment';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Open in Wallet';
|
||||||
|
case 'zap.copy': return 'Copied to clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Invalid custom amount';
|
||||||
|
case 'zap.error.no_wallet': return 'No lightning wallet installed';
|
||||||
|
case 'zap.error.no_lud16': return 'No lightning address found';
|
||||||
|
case 'profile.past_streams': return 'Past Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Display Name';
|
||||||
|
case 'profile.edit.about': return 'About';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Address';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Address';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Cant edit profile when logged out';
|
||||||
|
case 'login.username': return 'Username';
|
||||||
|
case 'login.amber': return 'Login with Amber';
|
||||||
|
case 'login.key': return 'Login with Key';
|
||||||
|
case 'login.create': return 'Create Account';
|
||||||
|
case 'login.error.invalid_key': return 'Invalid key';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_sv.g.dart
Normal file
416
lib/i18n/strings_sv.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsSv implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsSv({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.sv,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <sv>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsSv _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsSv $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsSv(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text som uppmanar användaren att trycka på avatarplatshå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';
|
||||||
|
|
||||||
|
/// 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';
|
||||||
|
|
||||||
|
/// Antal tittare på streamingen
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n,
|
||||||
|
one: '1 tittare',
|
||||||
|
other: '${n} tittare',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamSv stream = _TranslationsStreamSv._(_root);
|
||||||
|
@override late final _TranslationsGoalSv goal = _TranslationsGoalSv._(_root);
|
||||||
|
@override late final _TranslationsButtonSv button = _TranslationsButtonSv._(_root);
|
||||||
|
@override late final _TranslationsEmbedSv embed = _TranslationsEmbedSv._(_root);
|
||||||
|
|
||||||
|
/// Rubriker på strömlistor efter strömtyp live/avslutad/planerad etc.
|
||||||
|
@override late final _TranslationsStreamListSv stream_list = _TranslationsStreamListSv._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapSv zap = _TranslationsZapSv._(_root);
|
||||||
|
@override late final _TranslationsProfileSv profile = _TranslationsProfileSv._(_root);
|
||||||
|
@override late final _TranslationsLoginSv login = _TranslationsLoginSv._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamSv implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusSv status = _TranslationsStreamStatusSv._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Startade ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatSv chat = _TranslationsStreamChatSv._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalSv implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Mål: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Kvarvarande: ${amount}';
|
||||||
|
@override String get complete => 'KOMPLETT';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonSv implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Knapptext för inloggningsknappen
|
||||||
|
@override String get login => 'Logga in';
|
||||||
|
|
||||||
|
@override String get logout => 'Logga ut';
|
||||||
|
@override String get edit_profile => 'Redigera profil';
|
||||||
|
|
||||||
|
/// Knapptext för följ-knappen
|
||||||
|
@override String get follow => 'Följ';
|
||||||
|
|
||||||
|
/// Knapptext för avföljningsknappen
|
||||||
|
@override String get unfollow => 'Sluta följa';
|
||||||
|
|
||||||
|
@override String get mute => 'Tysta';
|
||||||
|
@override String get unmute => 'Avtysta';
|
||||||
|
@override String get share => 'Dela';
|
||||||
|
@override String get save => 'Spara';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedSv implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Artikel av ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Anteckning av ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Direktsändning via ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListSv implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Följer';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planerade';
|
||||||
|
@override String get ended => 'Avslutade';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapSv implements TranslationsZapEn {
|
||||||
|
_TranslationsZapSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Anpassat belopp';
|
||||||
|
@override String get confirm => 'Bekräfta';
|
||||||
|
@override String get comment => 'Kommentar';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Öppna i plånboken';
|
||||||
|
@override String get copy => 'Kopieras till urklipp';
|
||||||
|
@override late final _TranslationsZapErrorSv error = _TranslationsZapErrorSv._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileSv implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Tidigare streamar';
|
||||||
|
@override late final _TranslationsProfileEditSv edit = _TranslationsProfileEditSv._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginSv implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Användarnamn';
|
||||||
|
@override String get amber => 'Logga in med Amber';
|
||||||
|
@override String get key => 'Logga in med nyckel';
|
||||||
|
@override String get create => 'Skapa konto';
|
||||||
|
@override late final _TranslationsLoginErrorSv error = _TranslationsLoginErrorSv._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusSv implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'AVSLUTAD';
|
||||||
|
@override String get planned => 'PLANERADE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatSv implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT AVSTÄNGD';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Tidsgränsen går ut: ${time}';
|
||||||
|
|
||||||
|
/// Chattmeddelande som visar timeout-händelser
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' tidsbegränsad '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' för '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream avslutade sidfoten längst ner på chatten
|
||||||
|
@override String get ended => 'STREAM AVSLUTAD';
|
||||||
|
|
||||||
|
/// Chattmeddelande som visar strömavbrott
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteSv write = _TranslationsStreamChatWriteSv._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeSv badge = _TranslationsStreamChatBadgeSv._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidSv raid = _TranslationsStreamChatRaidSv._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorSv implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Ogiltigt anpassat belopp';
|
||||||
|
@override String get no_wallet => 'Ingen blixtplånbok installerad';
|
||||||
|
@override String get no_lud16 => 'Ingen blixtadress hittades';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditSv implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Visa namn';
|
||||||
|
@override String get about => 'Om';
|
||||||
|
@override String get nip05 => 'Nostr Adress';
|
||||||
|
@override String get lud16 => 'Lightning-adress';
|
||||||
|
@override late final _TranslationsProfileEditErrorSv error = _TranslationsProfileEditErrorSv._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorSv implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Ogiltig nyckel';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteSv implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 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 är utloggad
|
||||||
|
@override String get login => 'Logga in för att skicka meddelanden';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeSv implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Rubrik över lista över användare som tilldelats en badge
|
||||||
|
@override String get awarded_to => 'Tilldelas till:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidSv implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chatta raidmeddelande till en annan ström
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat 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}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorSv implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorSv._(this._root);
|
||||||
|
|
||||||
|
final TranslationsSv _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Kan inte redigera profil när jag är utloggad';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
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 'no_user_found': return 'Ingen användare hittades';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('sv'))(n,
|
||||||
|
one: '1 tittare',
|
||||||
|
other: '${n} tittare',
|
||||||
|
);
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' tidsbegränsad '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' för '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM AVSLUTAD';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
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.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 'goal.title': return ({ required Object amount}) => 'Mål: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Kvarvarande: ${amount}';
|
||||||
|
case 'goal.complete': return 'KOMPLETT';
|
||||||
|
case 'button.login': return 'Logga in';
|
||||||
|
case 'button.logout': return 'Logga ut';
|
||||||
|
case 'button.edit_profile': return 'Redigera profil';
|
||||||
|
case 'button.follow': return 'Följ';
|
||||||
|
case 'button.unfollow': return 'Sluta följa';
|
||||||
|
case 'button.mute': return 'Tysta';
|
||||||
|
case 'button.unmute': return 'Avtysta';
|
||||||
|
case 'button.share': return 'Dela';
|
||||||
|
case 'button.save': return 'Spara';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Artikel av ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Anteckning av ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Direktsändning via ${name}';
|
||||||
|
case 'stream_list.following': return 'Följer';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planerade';
|
||||||
|
case 'stream_list.ended': return 'Avslutade';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Anpassat belopp';
|
||||||
|
case 'zap.confirm': return 'Bekräfta';
|
||||||
|
case 'zap.comment': return 'Kommentar';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Öppna i plånboken';
|
||||||
|
case 'zap.copy': return 'Kopieras till urklipp';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Ogiltigt anpassat belopp';
|
||||||
|
case 'zap.error.no_wallet': return 'Ingen blixtplånbok installerad';
|
||||||
|
case 'zap.error.no_lud16': return 'Ingen blixtadress hittades';
|
||||||
|
case 'profile.past_streams': return 'Tidigare streamar';
|
||||||
|
case 'profile.edit.display_name': return 'Visa namn';
|
||||||
|
case 'profile.edit.about': return 'Om';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Adress';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning-adress';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Kan inte redigera profil när jag är utloggad';
|
||||||
|
case 'login.username': return 'Användarnamn';
|
||||||
|
case 'login.amber': return 'Logga in med Amber';
|
||||||
|
case 'login.key': return 'Logga in med nyckel';
|
||||||
|
case 'login.create': return 'Skapa konto';
|
||||||
|
case 'login.error.invalid_key': return 'Ogiltig nyckel';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_tr.g.dart
Normal file
416
lib/i18n/strings_tr.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsTr implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsTr({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.tr,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <tr>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsTr _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsTr $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsTr(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Kullanıcının yüklemeye başlamak için avatar yer tutucusuna basmasını isteyen metin
|
||||||
|
@override String get upload_avatar => 'Avatar Yükle';
|
||||||
|
|
||||||
|
/// Zaps tarafından listelenen üst flamalar üzerinde ilerliyor
|
||||||
|
@override String get most_zapped_streamers => 'En Çok Zaplanan Flamalar';
|
||||||
|
|
||||||
|
/// Arama yaparken kullanıcı bulunamadı
|
||||||
|
@override String get no_user_found => 'Kullanıcı bulunamadı';
|
||||||
|
|
||||||
|
/// Anonim bir kullanıcı
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Akışı izleyenlerin sayısı
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('tr'))(n,
|
||||||
|
one: '1 izleyici',
|
||||||
|
other: '${n} izleyiciler',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamTr stream = _TranslationsStreamTr._(_root);
|
||||||
|
@override late final _TranslationsGoalTr goal = _TranslationsGoalTr._(_root);
|
||||||
|
@override late final _TranslationsButtonTr button = _TranslationsButtonTr._(_root);
|
||||||
|
@override late final _TranslationsEmbedTr embed = _TranslationsEmbedTr._(_root);
|
||||||
|
|
||||||
|
/// Akış türüne göre akış listelerindeki başlıklar canlı/bitmiş/planlanan vb.
|
||||||
|
@override late final _TranslationsStreamListTr stream_list = _TranslationsStreamListTr._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapTr zap = _TranslationsZapTr._(_root);
|
||||||
|
@override late final _TranslationsProfileTr profile = _TranslationsProfileTr._(_root);
|
||||||
|
@override late final _TranslationsLoginTr login = _TranslationsLoginTr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamTr implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusTr status = _TranslationsStreamStatusTr._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Başlatıldı ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatTr chat = _TranslationsStreamChatTr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalTr implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Hedef: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Kalan: ${amount}';
|
||||||
|
@override String get complete => 'TAMAMLANDI';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonTr implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Oturum açma düğmesi için düğme metni
|
||||||
|
@override String get login => 'Giriş';
|
||||||
|
|
||||||
|
@override String get logout => 'Oturum Kapatma';
|
||||||
|
@override String get edit_profile => 'Profil Düzenle';
|
||||||
|
|
||||||
|
/// Takip et düğmesi için düğme metni
|
||||||
|
@override String get follow => 'Takip et';
|
||||||
|
|
||||||
|
/// Takibi bırak düğmesi için düğme metni
|
||||||
|
@override String get unfollow => 'Takibi bırak';
|
||||||
|
|
||||||
|
@override String get mute => 'Sessiz';
|
||||||
|
@override String get unmute => 'Sesi aç';
|
||||||
|
@override String get share => 'Paylaş';
|
||||||
|
@override String get save => 'Kaydet';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedTr implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Makale ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Not: ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Canlı yayın: ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListTr implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Aşağıdaki';
|
||||||
|
@override String get live => 'Canlı';
|
||||||
|
@override String get planned => 'Planlanmış';
|
||||||
|
@override String get ended => 'Bitti';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapTr implements TranslationsZapEn {
|
||||||
|
_TranslationsZapTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Özel Tutar';
|
||||||
|
@override String get confirm => 'Onaylayın';
|
||||||
|
@override String get comment => 'Yorum';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Cüzdanda Aç';
|
||||||
|
@override String get copy => 'Panoya kopyalandı';
|
||||||
|
@override late final _TranslationsZapErrorTr error = _TranslationsZapErrorTr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileTr implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Geçmiş Akışlar';
|
||||||
|
@override late final _TranslationsProfileEditTr edit = _TranslationsProfileEditTr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginTr implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Kullanıcı Adı';
|
||||||
|
@override String get amber => 'Amber ile Giriş Yapın';
|
||||||
|
@override String get key => 'Anahtar ile Giriş Yapın';
|
||||||
|
@override String get create => 'Hesap Oluştur';
|
||||||
|
@override late final _TranslationsLoginErrorTr error = _TranslationsLoginErrorTr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusTr implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'CANLI';
|
||||||
|
@override String get ended => 'SONLANDI';
|
||||||
|
@override String get planned => 'PLANLANMIŞ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatTr implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'SOHBET DEVRE DIŞI';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Zaman aşımı sona eriyor: ${time}';
|
||||||
|
|
||||||
|
/// Zaman aşımı olaylarını gösteren sohbet mesajı
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' zaman aşımına uğradı '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' için '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Sohbetin alt kısmında akış sona erdi altbilgisi
|
||||||
|
@override String get ended => 'YAYIN SONLANDI';
|
||||||
|
|
||||||
|
/// Akış zaplarını gösteren sohbet mesajı
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteTr write = _TranslationsStreamChatWriteTr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeTr badge = _TranslationsStreamChatBadgeTr._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidTr raid = _TranslationsStreamChatRaidTr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorTr implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Geçersiz özel tutar';
|
||||||
|
@override String get no_wallet => 'Lightning cüzdan yüklü değil';
|
||||||
|
@override String get no_lud16 => 'Yıldırım adresi bulunamadı';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditTr implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Ekran Adı';
|
||||||
|
@override String get about => 'Hakkında';
|
||||||
|
@override String get nip05 => 'Nostr Adres';
|
||||||
|
@override String get lud16 => 'Yıldırım Adres';
|
||||||
|
@override late final _TranslationsProfileEditErrorTr error = _TranslationsProfileEditErrorTr._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorTr implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Geçersiz anahtar';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteTr implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Sohbet mesajı giriş kutusundaki etiket
|
||||||
|
@override String get label => 'Mesaj yaz';
|
||||||
|
|
||||||
|
/// Kullanıcı yalnızca pubkey ile oturum açtığında gösterilen sohbet giriş mesajı
|
||||||
|
@override String get no_signer => 'Npub girişi ile mesaj yazılamıyor';
|
||||||
|
|
||||||
|
/// Kullanıcı oturumu kapatıldığında gösterilen sohbet giriş mesajı
|
||||||
|
@override String get login => 'Mesaj göndermek için lütfen giriş yapın';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeTr implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Rozet verilen kullanıcıların listesi üzerinde başlık
|
||||||
|
@override String get awarded_to => 'Ödüllendirildi:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidTr implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Başka bir akışa sohbet baskını mesajı
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}S';
|
||||||
|
|
||||||
|
/// Başka bir akıştan sohbet baskını mesajı
|
||||||
|
@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';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorTr implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorTr._(this._root);
|
||||||
|
|
||||||
|
final TranslationsTr _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Çıkış yapıldığında profil düzenlenemiyor';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsTr {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Avatar Yükle';
|
||||||
|
case 'most_zapped_streamers': return 'En Çok Zaplanan Flamalar';
|
||||||
|
case 'no_user_found': return 'Kullanıcı bulunamadı';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('tr'))(n,
|
||||||
|
one: '1 izleyici',
|
||||||
|
other: '${n} izleyiciler',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'CANLI';
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' zaman aşımına uğradı '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' için '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'YAYIN SONLANDI';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Mesaj yaz';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Npub girişi ile mesaj yazılamıyor';
|
||||||
|
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}S';
|
||||||
|
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}';
|
||||||
|
case 'goal.complete': return 'TAMAMLANDI';
|
||||||
|
case 'button.login': return 'Giriş';
|
||||||
|
case 'button.logout': return 'Oturum Kapatma';
|
||||||
|
case 'button.edit_profile': return 'Profil Düzenle';
|
||||||
|
case 'button.follow': return 'Takip et';
|
||||||
|
case 'button.unfollow': return 'Takibi bırak';
|
||||||
|
case 'button.mute': return 'Sessiz';
|
||||||
|
case 'button.unmute': return 'Sesi aç';
|
||||||
|
case 'button.share': return 'Paylaş';
|
||||||
|
case 'button.save': return 'Kaydet';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Makale ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Not: ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Canlı yayın: ${name}';
|
||||||
|
case 'stream_list.following': return 'Aşağıdaki';
|
||||||
|
case 'stream_list.live': return 'Canlı';
|
||||||
|
case 'stream_list.planned': return 'Planlanmış';
|
||||||
|
case 'stream_list.ended': return 'Bitti';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Özel Tutar';
|
||||||
|
case 'zap.confirm': return 'Onaylayın';
|
||||||
|
case 'zap.comment': return 'Yorum';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Cüzdanda Aç';
|
||||||
|
case 'zap.copy': return 'Panoya kopyalandı';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Geçersiz özel tutar';
|
||||||
|
case 'zap.error.no_wallet': return 'Lightning cüzdan yüklü değil';
|
||||||
|
case 'zap.error.no_lud16': return 'Yıldırım adresi bulunamadı';
|
||||||
|
case 'profile.past_streams': return 'Geçmiş Akışlar';
|
||||||
|
case 'profile.edit.display_name': return 'Ekran Adı';
|
||||||
|
case 'profile.edit.about': return 'Hakkında';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Adres';
|
||||||
|
case 'profile.edit.lud16': return 'Yıldırım Adres';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Çıkış yapıldığında profil düzenlenemiyor';
|
||||||
|
case 'login.username': return 'Kullanıcı Adı';
|
||||||
|
case 'login.amber': return 'Amber ile Giriş Yapın';
|
||||||
|
case 'login.key': return 'Anahtar ile Giriş Yapın';
|
||||||
|
case 'login.create': return 'Hesap Oluştur';
|
||||||
|
case 'login.error.invalid_key': return 'Geçersiz anahtar';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_uk.g.dart
Normal file
416
lib/i18n/strings_uk.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsUk implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsUk({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.uk,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <uk>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsUk _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsUk $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsUk(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Текст, що пропонує користувачеві натиснути на заповнювач аватара, щоб почати завантаження
|
||||||
|
@override String get upload_avatar => 'Завантажити аватар';
|
||||||
|
|
||||||
|
/// Перехід до переліку найкращих стрімерів за запитами
|
||||||
|
@override String get most_zapped_streamers => 'Більшість стримерів, які були під напругою';
|
||||||
|
|
||||||
|
/// Користувача не знайдено при пошуку
|
||||||
|
@override String get no_user_found => 'Користувача не знайдено';
|
||||||
|
|
||||||
|
/// Анонімний користувач
|
||||||
|
@override String get anon => 'Анонім.';
|
||||||
|
|
||||||
|
/// Кількість глядачів стріму
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('uk'))(n,
|
||||||
|
one: '1 глядач',
|
||||||
|
other: '${n} глядачі',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamUk stream = _TranslationsStreamUk._(_root);
|
||||||
|
@override late final _TranslationsGoalUk goal = _TranslationsGoalUk._(_root);
|
||||||
|
@override late final _TranslationsButtonUk button = _TranslationsButtonUk._(_root);
|
||||||
|
@override late final _TranslationsEmbedUk embed = _TranslationsEmbedUk._(_root);
|
||||||
|
|
||||||
|
/// Заголовки у списках трансляцій за типом трансляції: наживо/закінчилася/запланована тощо.
|
||||||
|
@override late final _TranslationsStreamListUk stream_list = _TranslationsStreamListUk._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapUk zap = _TranslationsZapUk._(_root);
|
||||||
|
@override late final _TranslationsProfileUk profile = _TranslationsProfileUk._(_root);
|
||||||
|
@override late final _TranslationsLoginUk login = _TranslationsLoginUk._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamUk implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusUk status = _TranslationsStreamStatusUk._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Запустив ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatUk chat = _TranslationsStreamChatUk._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalUk implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Мета: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Залишилося: ${amount}';
|
||||||
|
@override String get complete => 'ЗАВЕРШИТИ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonUk implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Текст для кнопки входу в систему
|
||||||
|
@override String get login => 'Логін';
|
||||||
|
|
||||||
|
@override String get logout => 'Вийти з системи';
|
||||||
|
@override String get edit_profile => 'Редагувати профіль';
|
||||||
|
|
||||||
|
/// Текст для кнопки переходу
|
||||||
|
@override String get follow => 'Підпишіться';
|
||||||
|
|
||||||
|
/// Текст для кнопки відписки
|
||||||
|
@override String get unfollow => 'Скасувати відповідь';
|
||||||
|
|
||||||
|
@override String get mute => 'Вимкнути звук.';
|
||||||
|
@override String get unmute => 'Увімкнути звук.';
|
||||||
|
@override String get share => 'Поділіться';
|
||||||
|
@override String get save => 'Зберегти';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedUk implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Стаття за посиланням ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Примітка ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Пряма трансляція на ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListUk implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Після того, як';
|
||||||
|
@override String get live => 'Наживо';
|
||||||
|
@override String get planned => 'Заплановано';
|
||||||
|
@override String get ended => 'Закінчилося';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapUk implements TranslationsZapEn {
|
||||||
|
_TranslationsZapUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Нестандартна сума';
|
||||||
|
@override String get confirm => 'Підтвердити';
|
||||||
|
@override String get comment => 'Коментар';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap!';
|
||||||
|
@override String get button_open_wallet => 'Відкрити в Гаманці';
|
||||||
|
@override String get copy => 'Скопійовано в буфер обміну';
|
||||||
|
@override late final _TranslationsZapErrorUk error = _TranslationsZapErrorUk._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileUk implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Минулі потоки';
|
||||||
|
@override late final _TranslationsProfileEditUk edit = _TranslationsProfileEditUk._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginUk implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Ім\'я користувача';
|
||||||
|
@override String get amber => 'Увійдіть за допомогою Amber';
|
||||||
|
@override String get key => 'Увійдіть за допомогою ключа';
|
||||||
|
@override String get create => 'Створити обліковий запис';
|
||||||
|
@override late final _TranslationsLoginErrorUk error = _TranslationsLoginErrorUk._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusUk implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'НАЖИВО';
|
||||||
|
@override String get ended => 'ЗАКІНЧЕНО';
|
||||||
|
@override String get planned => 'ЗАПЛАНОВАНО';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatUk implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'ЧАТ ВІДКЛЮЧЕНО';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Тайм-аут закінчився: ${time}';
|
||||||
|
|
||||||
|
/// Повідомлення в чаті про події тайм-ауту
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' таймінг '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' для '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Нижній колонтитул кінця потоку внизу чату
|
||||||
|
@override String get ended => 'СТРІМ ЗАКІНЧИВСЯ';
|
||||||
|
|
||||||
|
/// Повідомлення в чаті, що показує затримки потоку
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteUk write = _TranslationsStreamChatWriteUk._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeUk badge = _TranslationsStreamChatBadgeUk._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidUk raid = _TranslationsStreamChatRaidUk._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorUk implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Неправильна сума замовлення';
|
||||||
|
@override String get no_wallet => 'Не встановлено гаманець-блискавку';
|
||||||
|
@override String get no_lud16 => 'Адреса блискавки не знайдена';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditUk implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Ім\'я користувача';
|
||||||
|
@override String get about => 'Про';
|
||||||
|
@override String get nip05 => 'Nostr Адреса';
|
||||||
|
@override String get lud16 => 'Блискавична адреса';
|
||||||
|
@override late final _TranslationsProfileEditErrorUk error = _TranslationsProfileEditErrorUk._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorUk implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Неправильний ключ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteUk implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Мітка у вікні введення повідомлення чату
|
||||||
|
@override String get label => 'Написати повідомлення';
|
||||||
|
|
||||||
|
/// Повідомлення в чаті, що відображається, коли користувач увійшов до системи лише з ключем pubkey
|
||||||
|
@override String get no_signer => 'Неможливо писати повідомлення з логіном npub';
|
||||||
|
|
||||||
|
/// Повідомлення для введення в чаті, що відображається, коли користувач вийшов з системи
|
||||||
|
@override String get login => 'Будь ласка, авторизуйтесь, щоб надсилати повідомлення';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeUk implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Над списком користувачів, яким присвоєно бейдж
|
||||||
|
@override String get awarded_to => 'Нагороджується:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidUk implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Повідомлення про рейд чату в інший потік
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Повідомлення про наліт на чат з іншого потоку
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Таймер зворотного відліку для авторейду
|
||||||
|
@override String countdown({ required Object time}) => 'Рейд у ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorUk implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorUk._(this._root);
|
||||||
|
|
||||||
|
final TranslationsUk _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Неможливо редагувати профіль, коли ви вийшли з системи';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsUk {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Завантажити аватар';
|
||||||
|
case 'most_zapped_streamers': return 'Більшість стримерів, які були під напругою';
|
||||||
|
case 'no_user_found': return 'Користувача не знайдено';
|
||||||
|
case 'anon': return 'Анонім.';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('uk'))(n,
|
||||||
|
one: '1 глядач',
|
||||||
|
other: '${n} глядачі',
|
||||||
|
);
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' таймінг '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' для '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'СТРІМ ЗАКІНЧИВСЯ';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Написати повідомлення';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Неможливо писати повідомлення з логіном npub';
|
||||||
|
case 'stream.chat.write.login': return 'Будь ласка, авторизуйтесь, щоб надсилати повідомлення';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Нагороджується:';
|
||||||
|
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}) => 'Рейд у ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Мета: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Залишилося: ${amount}';
|
||||||
|
case 'goal.complete': return 'ЗАВЕРШИТИ';
|
||||||
|
case 'button.login': return 'Логін';
|
||||||
|
case 'button.logout': return 'Вийти з системи';
|
||||||
|
case 'button.edit_profile': return 'Редагувати профіль';
|
||||||
|
case 'button.follow': return 'Підпишіться';
|
||||||
|
case 'button.unfollow': return 'Скасувати відповідь';
|
||||||
|
case 'button.mute': return 'Вимкнути звук.';
|
||||||
|
case 'button.unmute': return 'Увімкнути звук.';
|
||||||
|
case 'button.share': return 'Поділіться';
|
||||||
|
case 'button.save': return 'Зберегти';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Стаття за посиланням ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Примітка ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Пряма трансляція на ${name}';
|
||||||
|
case 'stream_list.following': return 'Після того, як';
|
||||||
|
case 'stream_list.live': return 'Наживо';
|
||||||
|
case 'stream_list.planned': return 'Заплановано';
|
||||||
|
case 'stream_list.ended': return 'Закінчилося';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Нестандартна сума';
|
||||||
|
case 'zap.confirm': return 'Підтвердити';
|
||||||
|
case 'zap.comment': return 'Коментар';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap!';
|
||||||
|
case 'zap.button_open_wallet': return 'Відкрити в Гаманці';
|
||||||
|
case 'zap.copy': return 'Скопійовано в буфер обміну';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Неправильна сума замовлення';
|
||||||
|
case 'zap.error.no_wallet': return 'Не встановлено гаманець-блискавку';
|
||||||
|
case 'zap.error.no_lud16': return 'Адреса блискавки не знайдена';
|
||||||
|
case 'profile.past_streams': return 'Минулі потоки';
|
||||||
|
case 'profile.edit.display_name': return 'Ім\'я користувача';
|
||||||
|
case 'profile.edit.about': return 'Про';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Адреса';
|
||||||
|
case 'profile.edit.lud16': return 'Блискавична адреса';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Неможливо редагувати профіль, коли ви вийшли з системи';
|
||||||
|
case 'login.username': return 'Ім\'я користувача';
|
||||||
|
case 'login.amber': return 'Увійдіть за допомогою Amber';
|
||||||
|
case 'login.key': return 'Увійдіть за допомогою ключа';
|
||||||
|
case 'login.create': return 'Створити обліковий запис';
|
||||||
|
case 'login.error.invalid_key': return 'Неправильний ключ';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_vi.g.dart
Normal file
416
lib/i18n/strings_vi.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsVi implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsVi({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.vi,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <vi>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsVi _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsVi $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsVi(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
@override String get upload_avatar => 'Upload Avatar';
|
||||||
|
|
||||||
|
/// Heading over listed top streamers by zaps
|
||||||
|
@override String get most_zapped_streamers => 'Most Zapped Streamers';
|
||||||
|
|
||||||
|
/// No user found when searching
|
||||||
|
@override String get no_user_found => 'No user found';
|
||||||
|
|
||||||
|
/// An anonymous user
|
||||||
|
@override String get anon => 'Anon';
|
||||||
|
|
||||||
|
/// Number of viewers of the stream
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('vi'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamVi stream = _TranslationsStreamVi._(_root);
|
||||||
|
@override late final _TranslationsGoalVi goal = _TranslationsGoalVi._(_root);
|
||||||
|
@override late final _TranslationsButtonVi button = _TranslationsButtonVi._(_root);
|
||||||
|
@override late final _TranslationsEmbedVi embed = _TranslationsEmbedVi._(_root);
|
||||||
|
|
||||||
|
/// Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
@override late final _TranslationsStreamListVi stream_list = _TranslationsStreamListVi._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapVi zap = _TranslationsZapVi._(_root);
|
||||||
|
@override late final _TranslationsProfileVi profile = _TranslationsProfileVi._(_root);
|
||||||
|
@override late final _TranslationsLoginVi login = _TranslationsLoginVi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamVi implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusVi status = _TranslationsStreamStatusVi._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatVi chat = _TranslationsStreamChatVi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalVi implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
@override String get complete => 'COMPLETE';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonVi implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Button text for the login button
|
||||||
|
@override String get login => 'Login';
|
||||||
|
|
||||||
|
@override String get logout => 'Logout';
|
||||||
|
@override String get edit_profile => 'Edit Profile';
|
||||||
|
|
||||||
|
/// Button text for the follow button
|
||||||
|
@override String get follow => 'Follow';
|
||||||
|
|
||||||
|
/// Button text for the unfollow button
|
||||||
|
@override String get unfollow => 'Unfollow';
|
||||||
|
|
||||||
|
@override String get mute => 'Mute';
|
||||||
|
@override String get unmute => 'Unmute';
|
||||||
|
@override String get share => 'Share';
|
||||||
|
@override String get save => 'Save';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedVi implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => 'Article by ${name}';
|
||||||
|
@override String note_by({ required Object name}) => 'Note by ${name}';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListVi implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => 'Following';
|
||||||
|
@override String get live => 'Live';
|
||||||
|
@override String get planned => 'Planned';
|
||||||
|
@override String get ended => 'Ended';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapVi implements TranslationsZapEn {
|
||||||
|
_TranslationsZapVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => 'Zap ${name}';
|
||||||
|
@override String get custom_amount => 'Custom Amount';
|
||||||
|
@override String get confirm => 'Confirm';
|
||||||
|
@override String get comment => 'Comment';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
@override String get button_zap => 'Zap';
|
||||||
|
@override String get button_open_wallet => 'Open in Wallet';
|
||||||
|
@override String get copy => 'Copied to clipboard';
|
||||||
|
@override late final _TranslationsZapErrorVi error = _TranslationsZapErrorVi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileVi implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => 'Past Streams';
|
||||||
|
@override late final _TranslationsProfileEditVi edit = _TranslationsProfileEditVi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginVi implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => 'Username';
|
||||||
|
@override String get amber => 'Login with Amber';
|
||||||
|
@override String get key => 'Login with Key';
|
||||||
|
@override String get create => 'Create Account';
|
||||||
|
@override late final _TranslationsLoginErrorVi error = _TranslationsLoginErrorVi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusVi implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => 'LIVE';
|
||||||
|
@override String get ended => 'ENDED';
|
||||||
|
@override String get planned => 'PLANNED';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatVi implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => 'CHAT DISABLED';
|
||||||
|
@override String disabled_timeout({ required Object time}) => 'Timeout expires: ${time}';
|
||||||
|
|
||||||
|
/// Chat message showing timeout events
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// Stream ended footer at bottom of chat
|
||||||
|
@override String get ended => 'STREAM ENDED';
|
||||||
|
|
||||||
|
/// Chat message showing stream zaps
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteVi write = _TranslationsStreamChatWriteVi._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeVi badge = _TranslationsStreamChatBadgeVi._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidVi raid = _TranslationsStreamChatRaidVi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorVi implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => 'Invalid custom amount';
|
||||||
|
@override String get no_wallet => 'No lightning wallet installed';
|
||||||
|
@override String get no_lud16 => 'No lightning address found';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditVi implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => 'Display Name';
|
||||||
|
@override String get about => 'About';
|
||||||
|
@override String get nip05 => 'Nostr Address';
|
||||||
|
@override String get lud16 => 'Lightning Address';
|
||||||
|
@override late final _TranslationsProfileEditErrorVi error = _TranslationsProfileEditErrorVi._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorVi implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => 'Invalid key';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteVi implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Label on the chat message input box
|
||||||
|
@override String get label => 'Write message';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged in only with pubkey
|
||||||
|
@override String get no_signer => 'Can\'t write messages with npub login';
|
||||||
|
|
||||||
|
/// Chat input message shown when the user is logged out
|
||||||
|
@override String get login => 'Please login to send messages';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeVi implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Heading over list of users who are awarded a badge
|
||||||
|
@override String get awarded_to => 'Awarded to:';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidVi implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// Chat raid message to another stream
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// Chat raid message from another stream
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// Countdown timer for auto-raiding
|
||||||
|
@override String countdown({ required Object time}) => 'Raiding in ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorVi implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorVi._(this._root);
|
||||||
|
|
||||||
|
final TranslationsVi _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => 'Cant edit profile when logged out';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsVi {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return 'Upload Avatar';
|
||||||
|
case 'most_zapped_streamers': return 'Most Zapped Streamers';
|
||||||
|
case 'no_user_found': return 'No user found';
|
||||||
|
case 'anon': return 'Anon';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('vi'))(n,
|
||||||
|
one: '1 viewer',
|
||||||
|
other: '${n} viewers',
|
||||||
|
);
|
||||||
|
case 'stream.status.live': return 'LIVE';
|
||||||
|
case 'stream.status.ended': return 'ENDED';
|
||||||
|
case 'stream.status.planned': return 'PLANNED';
|
||||||
|
case 'stream.started': return ({ required Object timestamp}) => 'Started ${timestamp}';
|
||||||
|
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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' timed out '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return 'STREAM ENDED';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' zapped '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' sats'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return 'Write message';
|
||||||
|
case 'stream.chat.write.no_signer': return 'Can\'t write messages with npub login';
|
||||||
|
case 'stream.chat.write.login': return 'Please login to send messages';
|
||||||
|
case 'stream.chat.badge.awarded_to': return 'Awarded to:';
|
||||||
|
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 in ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => 'Goal: ${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => 'Remaining: ${amount}';
|
||||||
|
case 'goal.complete': return 'COMPLETE';
|
||||||
|
case 'button.login': return 'Login';
|
||||||
|
case 'button.logout': return 'Logout';
|
||||||
|
case 'button.edit_profile': return 'Edit Profile';
|
||||||
|
case 'button.follow': return 'Follow';
|
||||||
|
case 'button.unfollow': return 'Unfollow';
|
||||||
|
case 'button.mute': return 'Mute';
|
||||||
|
case 'button.unmute': return 'Unmute';
|
||||||
|
case 'button.share': return 'Share';
|
||||||
|
case 'button.save': return 'Save';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => 'Article by ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => 'Note by ${name}';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return 'Following';
|
||||||
|
case 'stream_list.live': return 'Live';
|
||||||
|
case 'stream_list.planned': return 'Planned';
|
||||||
|
case 'stream_list.ended': return 'Ended';
|
||||||
|
case 'zap.title': return ({ required Object name}) => 'Zap ${name}';
|
||||||
|
case 'zap.custom_amount': return 'Custom Amount';
|
||||||
|
case 'zap.confirm': return 'Confirm';
|
||||||
|
case 'zap.comment': return 'Comment';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => 'Zap ${amount} sats';
|
||||||
|
case 'zap.button_zap': return 'Zap';
|
||||||
|
case 'zap.button_open_wallet': return 'Open in Wallet';
|
||||||
|
case 'zap.copy': return 'Copied to clipboard';
|
||||||
|
case 'zap.error.invalid_custom_amount': return 'Invalid custom amount';
|
||||||
|
case 'zap.error.no_wallet': return 'No lightning wallet installed';
|
||||||
|
case 'zap.error.no_lud16': return 'No lightning address found';
|
||||||
|
case 'profile.past_streams': return 'Past Streams';
|
||||||
|
case 'profile.edit.display_name': return 'Display Name';
|
||||||
|
case 'profile.edit.about': return 'About';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr Address';
|
||||||
|
case 'profile.edit.lud16': return 'Lightning Address';
|
||||||
|
case 'profile.edit.error.logged_out': return 'Cant edit profile when logged out';
|
||||||
|
case 'login.username': return 'Username';
|
||||||
|
case 'login.amber': return 'Login with Amber';
|
||||||
|
case 'login.key': return 'Login with Key';
|
||||||
|
case 'login.create': return 'Create Account';
|
||||||
|
case 'login.error.invalid_key': return 'Invalid key';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
416
lib/i18n/strings_zh.g.dart
Normal file
416
lib/i18n/strings_zh.g.dart
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
///
|
||||||
|
/// Generated file. Do not edit.
|
||||||
|
///
|
||||||
|
// coverage:ignore-file
|
||||||
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:slang/generated.dart';
|
||||||
|
import 'strings.g.dart';
|
||||||
|
|
||||||
|
// Path: <root>
|
||||||
|
class TranslationsZh implements Translations {
|
||||||
|
/// You can call this constructor and build your own translation instance of this locale.
|
||||||
|
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||||
|
TranslationsZh({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||||
|
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||||
|
$meta = meta ?? TranslationMetadata(
|
||||||
|
locale: AppLocale.zh,
|
||||||
|
overrides: overrides ?? {},
|
||||||
|
cardinalResolver: cardinalResolver,
|
||||||
|
ordinalResolver: ordinalResolver,
|
||||||
|
) {
|
||||||
|
$meta.setFlatMapFunction(_flatMapFunction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Metadata for the translations of <zh>.
|
||||||
|
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||||
|
|
||||||
|
/// Access flat map
|
||||||
|
@override dynamic operator[](String key) => $meta.getTranslation(key);
|
||||||
|
|
||||||
|
late final TranslationsZh _root = this; // ignore: unused_field
|
||||||
|
|
||||||
|
@override
|
||||||
|
TranslationsZh $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsZh(meta: meta ?? this.$meta);
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 提示使用者點擊頭像占位符開始上傳的文字
|
||||||
|
@override String get upload_avatar => '上傳頭像';
|
||||||
|
|
||||||
|
/// ヘッドランドから列されている頂幡からずった
|
||||||
|
@override String get most_zapped_streamers => '最多被擊中的溪流';
|
||||||
|
|
||||||
|
/// 搜尋時未找到使用者
|
||||||
|
@override String get no_user_found => '未找到使用者';
|
||||||
|
|
||||||
|
/// 匿名使用者
|
||||||
|
@override String get anon => '匿名';
|
||||||
|
|
||||||
|
/// 串流的觀看者人數
|
||||||
|
@override String viewers({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n,
|
||||||
|
one: '1 個檢視器',
|
||||||
|
other: '${n} 觀眾',
|
||||||
|
);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamZh stream = _TranslationsStreamZh._(_root);
|
||||||
|
@override late final _TranslationsGoalZh goal = _TranslationsGoalZh._(_root);
|
||||||
|
@override late final _TranslationsButtonZh button = _TranslationsButtonZh._(_root);
|
||||||
|
@override late final _TranslationsEmbedZh embed = _TranslationsEmbedZh._(_root);
|
||||||
|
|
||||||
|
/// 串流清單上的標題依串流類型為現場/結束/計劃中等。
|
||||||
|
@override late final _TranslationsStreamListZh stream_list = _TranslationsStreamListZh._(_root);
|
||||||
|
|
||||||
|
@override late final _TranslationsZapZh zap = _TranslationsZapZh._(_root);
|
||||||
|
@override late final _TranslationsProfileZh profile = _TranslationsProfileZh._(_root);
|
||||||
|
@override late final _TranslationsLoginZh login = _TranslationsLoginZh._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream
|
||||||
|
class _TranslationsStreamZh implements TranslationsStreamEn {
|
||||||
|
_TranslationsStreamZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override late final _TranslationsStreamStatusZh status = _TranslationsStreamStatusZh._(_root);
|
||||||
|
@override String started({ required Object timestamp}) => '開始 ${timestamp}';
|
||||||
|
@override late final _TranslationsStreamChatZh chat = _TranslationsStreamChatZh._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: goal
|
||||||
|
class _TranslationsGoalZh implements TranslationsGoalEn {
|
||||||
|
_TranslationsGoalZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object amount}) => '目標:${amount}';
|
||||||
|
@override String remaining({ required Object amount}) => '剩餘: ${amount}';
|
||||||
|
@override String get complete => '完成';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: button
|
||||||
|
class _TranslationsButtonZh implements TranslationsButtonEn {
|
||||||
|
_TranslationsButtonZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 登入按鈕的按鈕文字
|
||||||
|
@override String get login => '登錄';
|
||||||
|
|
||||||
|
@override String get logout => '登出';
|
||||||
|
@override String get edit_profile => '編輯個人檔案';
|
||||||
|
|
||||||
|
/// 跟蹤按鈕的按鈕文字
|
||||||
|
@override String get follow => '關注';
|
||||||
|
|
||||||
|
/// 取消關注按鈕的按鈕文字
|
||||||
|
@override String get unfollow => '取消關注';
|
||||||
|
|
||||||
|
@override String get mute => '靜音';
|
||||||
|
@override String get unmute => '解除静音';
|
||||||
|
@override String get share => '分享';
|
||||||
|
@override String get save => '保存';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: embed
|
||||||
|
class _TranslationsEmbedZh implements TranslationsEmbedEn {
|
||||||
|
_TranslationsEmbedZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String article_by({ required Object name}) => '文章來源: ${name}';
|
||||||
|
@override String note_by({ required Object name}) => '${name} 的筆記';
|
||||||
|
@override String live_stream_by({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream_list
|
||||||
|
class _TranslationsStreamListZh implements TranslationsStreamListEn {
|
||||||
|
_TranslationsStreamListZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get following => '已關注';
|
||||||
|
@override String get live => '直播';
|
||||||
|
@override String get planned => '已計畫';
|
||||||
|
@override String get ended => '已結束';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap
|
||||||
|
class _TranslationsZapZh implements TranslationsZapEn {
|
||||||
|
_TranslationsZapZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String title({ required Object name}) => '打閃${name}';
|
||||||
|
@override String get custom_amount => '自訂金額';
|
||||||
|
@override String get confirm => '確認';
|
||||||
|
@override String get comment => '評論';
|
||||||
|
@override String button_zap_ready({ required Object amount}) => '打閃 ${amount} 聰';
|
||||||
|
@override String get button_zap => '打閃';
|
||||||
|
@override String get button_open_wallet => '在錢包中開啟';
|
||||||
|
@override String get copy => '複製到剪貼簿';
|
||||||
|
@override late final _TranslationsZapErrorZh error = _TranslationsZapErrorZh._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile
|
||||||
|
class _TranslationsProfileZh implements TranslationsProfileEn {
|
||||||
|
_TranslationsProfileZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get past_streams => '過去的直播';
|
||||||
|
@override late final _TranslationsProfileEditZh edit = _TranslationsProfileEditZh._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login
|
||||||
|
class _TranslationsLoginZh implements TranslationsLoginEn {
|
||||||
|
_TranslationsLoginZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get username => '用戶名';
|
||||||
|
@override String get amber => '使用 Amber 登入';
|
||||||
|
@override String get key => '使用鑰匙登入';
|
||||||
|
@override String get create => '創建帳戶';
|
||||||
|
@override late final _TranslationsLoginErrorZh error = _TranslationsLoginErrorZh._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.status
|
||||||
|
class _TranslationsStreamStatusZh implements TranslationsStreamStatusEn {
|
||||||
|
_TranslationsStreamStatusZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get live => '直播';
|
||||||
|
@override String get ended => '結束';
|
||||||
|
@override String get planned => '計劃';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat
|
||||||
|
class _TranslationsStreamChatZh implements TranslationsStreamChatEn {
|
||||||
|
_TranslationsStreamChatZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get disabled => '關閉聊天';
|
||||||
|
@override String disabled_timeout({ required Object time}) => '超時過期: ${time}';
|
||||||
|
|
||||||
|
/// 顯示逾時事件的聊天訊息
|
||||||
|
@override TextSpan timeout({ required InlineSpan mod, required InlineSpan user, required InlineSpan time, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' 超時 '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
/// 聊天底部的流結束頁尾
|
||||||
|
@override String get ended => '串流結束';
|
||||||
|
|
||||||
|
/// 聊天訊息顯示串流斷點
|
||||||
|
@override TextSpan zap({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' 打閃了 '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' 聰'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
|
||||||
|
@override late final _TranslationsStreamChatWriteZh write = _TranslationsStreamChatWriteZh._(_root);
|
||||||
|
@override late final _TranslationsStreamChatBadgeZh badge = _TranslationsStreamChatBadgeZh._(_root);
|
||||||
|
@override late final _TranslationsStreamChatRaidZh raid = _TranslationsStreamChatRaidZh._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: zap.error
|
||||||
|
class _TranslationsZapErrorZh implements TranslationsZapErrorEn {
|
||||||
|
_TranslationsZapErrorZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_custom_amount => '無效自訂金額';
|
||||||
|
@override String get no_wallet => '未安裝閃電錢夾';
|
||||||
|
@override String get no_lud16 => '未找到閃電地址';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit
|
||||||
|
class _TranslationsProfileEditZh implements TranslationsProfileEditEn {
|
||||||
|
_TranslationsProfileEditZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get display_name => '顯示名稱';
|
||||||
|
@override String get about => '關於';
|
||||||
|
@override String get nip05 => 'Nostr 地址';
|
||||||
|
@override String get lud16 => '閃電地址';
|
||||||
|
@override late final _TranslationsProfileEditErrorZh error = _TranslationsProfileEditErrorZh._(_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: login.error
|
||||||
|
class _TranslationsLoginErrorZh implements TranslationsLoginErrorEn {
|
||||||
|
_TranslationsLoginErrorZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get invalid_key => '無效按鍵';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.write
|
||||||
|
class _TranslationsStreamChatWriteZh implements TranslationsStreamChatWriteEn {
|
||||||
|
_TranslationsStreamChatWriteZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 聊天訊息輸入方塊上的標籤
|
||||||
|
@override String get label => '寫訊息';
|
||||||
|
|
||||||
|
/// 當使用者僅使用 pubkey 登入時,會顯示聊天輸入訊息
|
||||||
|
@override String get no_signer => '無法使用 npub 登入撰寫訊息';
|
||||||
|
|
||||||
|
/// 使用者登出時顯示聊天輸入訊息
|
||||||
|
@override String get login => '請登入以傳送訊息';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.badge
|
||||||
|
class _TranslationsStreamChatBadgeZh implements TranslationsStreamChatBadgeEn {
|
||||||
|
_TranslationsStreamChatBadgeZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 被授予徽章的使用者清單上的標題
|
||||||
|
@override String get awarded_to => '頒發給';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: stream.chat.raid
|
||||||
|
class _TranslationsStreamChatRaidZh implements TranslationsStreamChatRaidEn {
|
||||||
|
_TranslationsStreamChatRaidZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
|
||||||
|
/// 聊天突擊消息到另一個串流
|
||||||
|
@override String to({ required Object name}) => 'RAIDING ${name}';
|
||||||
|
|
||||||
|
/// 來自其他串流的聊天突襲訊息
|
||||||
|
@override String from({ required Object name}) => 'RAID FROM ${name}';
|
||||||
|
|
||||||
|
/// 自動騎乘倒數計時器
|
||||||
|
@override String countdown({ required Object time}) => '突襲 ${time}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path: profile.edit.error
|
||||||
|
class _TranslationsProfileEditErrorZh implements TranslationsProfileEditErrorEn {
|
||||||
|
_TranslationsProfileEditErrorZh._(this._root);
|
||||||
|
|
||||||
|
final TranslationsZh _root; // ignore: unused_field
|
||||||
|
|
||||||
|
// Translations
|
||||||
|
@override String get logged_out => '登出時無法編輯個人資料';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Flat map(s) containing all translations.
|
||||||
|
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||||
|
extension on TranslationsZh {
|
||||||
|
dynamic _flatMapFunction(String path) {
|
||||||
|
switch (path) {
|
||||||
|
case 'upload_avatar': return '上傳頭像';
|
||||||
|
case 'most_zapped_streamers': return '最多被擊中的溪流';
|
||||||
|
case 'no_user_found': return '未找到使用者';
|
||||||
|
case 'anon': return '匿名';
|
||||||
|
case 'viewers': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('zh'))(n,
|
||||||
|
one: '1 個檢視器',
|
||||||
|
other: '${n} 觀眾',
|
||||||
|
);
|
||||||
|
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.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, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
mod,
|
||||||
|
const TextSpan(text: ' 超時 '),
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' for '),
|
||||||
|
time,
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.ended': return '串流結束';
|
||||||
|
case 'stream.chat.zap': return ({ required InlineSpan user, required InlineSpan amount, TextStyle? style, GestureRecognizer? recognizer}) => TextSpan(children: [
|
||||||
|
user,
|
||||||
|
const TextSpan(text: ' 打閃了 '),
|
||||||
|
amount,
|
||||||
|
const TextSpan(text: ' 聰'),
|
||||||
|
], style: style, recognizer: recognizer);
|
||||||
|
case 'stream.chat.write.label': return '寫訊息';
|
||||||
|
case 'stream.chat.write.no_signer': return '無法使用 npub 登入撰寫訊息';
|
||||||
|
case 'stream.chat.write.login': return '請登入以傳送訊息';
|
||||||
|
case 'stream.chat.badge.awarded_to': return '頒發給';
|
||||||
|
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}) => '突襲 ${time}';
|
||||||
|
case 'goal.title': return ({ required Object amount}) => '目標:${amount}';
|
||||||
|
case 'goal.remaining': return ({ required Object amount}) => '剩餘: ${amount}';
|
||||||
|
case 'goal.complete': return '完成';
|
||||||
|
case 'button.login': return '登錄';
|
||||||
|
case 'button.logout': return '登出';
|
||||||
|
case 'button.edit_profile': return '編輯個人檔案';
|
||||||
|
case 'button.follow': return '關注';
|
||||||
|
case 'button.unfollow': return '取消關注';
|
||||||
|
case 'button.mute': return '靜音';
|
||||||
|
case 'button.unmute': return '解除静音';
|
||||||
|
case 'button.share': return '分享';
|
||||||
|
case 'button.save': return '保存';
|
||||||
|
case 'embed.article_by': return ({ required Object name}) => '文章來源: ${name}';
|
||||||
|
case 'embed.note_by': return ({ required Object name}) => '${name} 的筆記';
|
||||||
|
case 'embed.live_stream_by': return ({ required Object name}) => 'Live stream by ${name}';
|
||||||
|
case 'stream_list.following': return '已關注';
|
||||||
|
case 'stream_list.live': return '直播';
|
||||||
|
case 'stream_list.planned': return '已計畫';
|
||||||
|
case 'stream_list.ended': return '已結束';
|
||||||
|
case 'zap.title': return ({ required Object name}) => '打閃${name}';
|
||||||
|
case 'zap.custom_amount': return '自訂金額';
|
||||||
|
case 'zap.confirm': return '確認';
|
||||||
|
case 'zap.comment': return '評論';
|
||||||
|
case 'zap.button_zap_ready': return ({ required Object amount}) => '打閃 ${amount} 聰';
|
||||||
|
case 'zap.button_zap': return '打閃';
|
||||||
|
case 'zap.button_open_wallet': return '在錢包中開啟';
|
||||||
|
case 'zap.copy': return '複製到剪貼簿';
|
||||||
|
case 'zap.error.invalid_custom_amount': return '無效自訂金額';
|
||||||
|
case 'zap.error.no_wallet': return '未安裝閃電錢夾';
|
||||||
|
case 'zap.error.no_lud16': return '未找到閃電地址';
|
||||||
|
case 'profile.past_streams': return '過去的直播';
|
||||||
|
case 'profile.edit.display_name': return '顯示名稱';
|
||||||
|
case 'profile.edit.about': return '關於';
|
||||||
|
case 'profile.edit.nip05': return 'Nostr 地址';
|
||||||
|
case 'profile.edit.lud16': return '閃電地址';
|
||||||
|
case 'profile.edit.error.logged_out': return '登出時無法編輯個人資料';
|
||||||
|
case 'login.username': return '用戶名';
|
||||||
|
case 'login.amber': return '使用 Amber 登入';
|
||||||
|
case 'login.key': return '使用鑰匙登入';
|
||||||
|
case 'login.create': return '創建帳戶';
|
||||||
|
case 'login.error.invalid_key': return '無效按鍵';
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
122
lib/i18n/translated/af.i18n.yaml
Normal file
122
lib/i18n/translated/af.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: Username
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
123
lib/i18n/translated/ar.i18n.yaml
Normal file
123
lib/i18n/translated/ar.i18n.yaml
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
upload_avatar: تحميل الصورة الرمزية
|
||||||
|
"@upload_avatar":
|
||||||
|
description: نص يطالب المستخدم بالضغط على العنصر النائب للصورة الرمزية لبدء التحميل
|
||||||
|
most_zapped_streamers: معظم اللافتات التي يتم بثها
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: التوجه فوق اللافتات العلوية المدرجة من قبل zaps
|
||||||
|
no_user_found: لم يتم العثور على مستخدم
|
||||||
|
"@no_user_found":
|
||||||
|
description: لم يتم العثور على مستخدم عند البحث
|
||||||
|
anon: هوية مخفية
|
||||||
|
viewers:
|
||||||
|
one: 1 مشاهد
|
||||||
|
other: $n المشاهدون
|
||||||
|
"@viewers":
|
||||||
|
description: عدد مشاهدي البث
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: في
|
||||||
|
"@anon":
|
||||||
|
description: مستخدم مجهول
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: بث مباشر
|
||||||
|
ended: انتهى
|
||||||
|
planned: مخطط
|
||||||
|
started: بدأ $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: تم تعطيل الدردشة
|
||||||
|
disabled_timeout: "تنتهي المهلة: $time"
|
||||||
|
timeout(rich): $mod انتهى الوقت $user لـ $time
|
||||||
|
"@timeout":
|
||||||
|
description: رسالة دردشة تظهر أحداث المهلة
|
||||||
|
ended: انتهى البث
|
||||||
|
"@ended":
|
||||||
|
description: تيار انتهى التذييل في أسفل الدردشة
|
||||||
|
zap(rich): $user انطلق $amount ساتس
|
||||||
|
"@zap":
|
||||||
|
description: رسالة الدردشة التي تُظهر البث المباشر
|
||||||
|
write:
|
||||||
|
label: اكتب رسالة
|
||||||
|
"@label":
|
||||||
|
description: التسمية على مربع إدخال رسالة الدردشة
|
||||||
|
no_signer: لا يمكن كتابة الرسائل باستخدام تسجيل الدخول إلى npub
|
||||||
|
"@no_signer":
|
||||||
|
description: تظهر رسالة إدخال الدردشة عندما يقوم المستخدم بتسجيل الدخول باستخدام
|
||||||
|
مفتاح الحانة فقط
|
||||||
|
login: الرجاء تسجيل الدخول لإرسال الرسائل
|
||||||
|
"@login":
|
||||||
|
description: تظهر رسالة إدخال الدردشة عند تسجيل خروج المستخدم من المحادثة
|
||||||
|
badge:
|
||||||
|
awarded_to: مُنحت الجائزة لـ
|
||||||
|
"@awarded_to":
|
||||||
|
description: العنوان فوق قائمة المستخدمين الذين حصلوا على شارة
|
||||||
|
raid:
|
||||||
|
to: التصفح $name
|
||||||
|
"@to":
|
||||||
|
description: رسالة غارة الدردشة إلى دفق آخر
|
||||||
|
from: RAID من $name
|
||||||
|
"@from":
|
||||||
|
description: رسالة غارة الدردشة من دفق آخر
|
||||||
|
countdown: الإغارة في $time
|
||||||
|
"@countdown":
|
||||||
|
description: مؤقت العد التنازلي للقيادة التلقائية
|
||||||
|
goal:
|
||||||
|
title: "الهدف: $amount"
|
||||||
|
remaining: "المتبقي: $amount"
|
||||||
|
complete: مكتمل
|
||||||
|
button:
|
||||||
|
login: تسجيل الدخول
|
||||||
|
logout: تسجيل الخروج
|
||||||
|
edit_profile: تعديل الملف الشخصي
|
||||||
|
"@login":
|
||||||
|
description: نص الزر الخاص بزر تسجيل الدخول
|
||||||
|
follow: متابعة
|
||||||
|
"@follow":
|
||||||
|
description: نص الزر الخاص بزر المتابعة
|
||||||
|
unfollow: الغاء المتابعة
|
||||||
|
"@unfollow":
|
||||||
|
description: نص الزر لزر إلغاء المتابعة
|
||||||
|
mute: كتم
|
||||||
|
unmute: رفع الكتم
|
||||||
|
share: مشاركة
|
||||||
|
save: حفظ
|
||||||
|
embed:
|
||||||
|
article_by: مقال بقلم $name
|
||||||
|
note_by: ملاحظة من $name
|
||||||
|
live_stream_by: بث مباشر من $name
|
||||||
|
stream_list:
|
||||||
|
following: المتابَعون
|
||||||
|
live: بث مباشر
|
||||||
|
planned: مخطط
|
||||||
|
ended: انتهى
|
||||||
|
"@stream_list":
|
||||||
|
description: العناوين في قوائم البث حسب نوع البث المباشر/المُنتهي/المخطط له وما إلى ذلك.
|
||||||
|
zap:
|
||||||
|
title: زاب $name
|
||||||
|
custom_amount: المبلغ المخصص
|
||||||
|
confirm: تأكيد
|
||||||
|
comment: تعليق
|
||||||
|
button_zap_ready: أومض $amount ساتوشي
|
||||||
|
button_zap: زاب
|
||||||
|
button_open_wallet: فتح في المحفظة
|
||||||
|
copy: نسخ إلى الحافظة
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: مبلغ مخصص غير صالح
|
||||||
|
no_wallet: لا توجد محفظة برق مثبتة
|
||||||
|
no_lud16: لم يتم العثور على عنوان البرق
|
||||||
|
profile:
|
||||||
|
past_streams: التدفقات السابقة
|
||||||
|
edit:
|
||||||
|
display_name: اسم العرض
|
||||||
|
about: نبذة
|
||||||
|
nip05: عنوان نوستر
|
||||||
|
lud16: عنوان البرق
|
||||||
|
error:
|
||||||
|
logged_out: لا يمكن تحرير ملف التعريف عند تسجيل الخروج
|
||||||
|
login:
|
||||||
|
username: اسم المستخدم
|
||||||
|
amber: تسجيل الدخول مع آمبر
|
||||||
|
key: تسجيل الدخول بالمفتاح
|
||||||
|
create: إنشاء حساب
|
||||||
|
error:
|
||||||
|
invalid_key: مفتاح غير صالح
|
122
lib/i18n/translated/ca.i18n.yaml
Normal file
122
lib/i18n/translated/ca.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: Username
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
124
lib/i18n/translated/cs.i18n.yaml
Normal file
124
lib/i18n/translated/cs.i18n.yaml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
upload_avatar: Nahrát avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text vyzývající uživatele, aby stiskl zástupný symbol avatara pro
|
||||||
|
zahájení nahrávání
|
||||||
|
most_zapped_streamers: Nejvíce zapnutých streamerů
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Směřování přes uvedené horní streamery podle zaps
|
||||||
|
no_user_found: Nebyl nalezen žádný uživatel
|
||||||
|
"@no_user_found":
|
||||||
|
description: Při vyhledávání nebyl nalezen žádný uživatel
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 divák
|
||||||
|
other: $n diváci
|
||||||
|
"@viewers":
|
||||||
|
description: Počet diváků streamu
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Anonymní uživatel
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: KONEC
|
||||||
|
planned: PLÁNOVANÉ
|
||||||
|
started: Založeno $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT ZRUŠEN
|
||||||
|
disabled_timeout: "Časový limit vyprší: $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
|
||||||
|
"@ended":
|
||||||
|
description: Zápatí v dolní části chatu ukončilo stream
|
||||||
|
zap(rich): $user Zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Zpráva chatu zobrazující proud zaps
|
||||||
|
write:
|
||||||
|
label: Napište zprávu
|
||||||
|
"@label":
|
||||||
|
description: Popisek na vstupním poli zprávy chatu
|
||||||
|
no_signer: Nelze psát zprávy s přihlášením npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Vstupní zpráva chatu se zobrazí, když je uživatel přihlášen pouze
|
||||||
|
pomocí pubkey
|
||||||
|
login: Pro odesílání zpráv se prosím přihlaste
|
||||||
|
"@login":
|
||||||
|
description: Vstupní zpráva chatu zobrazená při odhlášení uživatele
|
||||||
|
badge:
|
||||||
|
awarded_to: "Uděleno:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Záhlaví nad seznamem uživatelů, kterým byl udělen odznak
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Zpráva o nájezdu chatu do jiného proudu
|
||||||
|
from: RAID Z $name
|
||||||
|
"@from":
|
||||||
|
description: Zpráva o nájezdu chatu z jiného proudu
|
||||||
|
countdown: Nájezdy na $time
|
||||||
|
"@countdown":
|
||||||
|
description: Časovač odpočítávání pro automatický nájezd
|
||||||
|
goal:
|
||||||
|
title: "Cíl: $amount"
|
||||||
|
remaining: "Zbývá: $amount"
|
||||||
|
complete: KOMPLETNÍ
|
||||||
|
button:
|
||||||
|
login: Přihlášení
|
||||||
|
logout: Odhlášení
|
||||||
|
edit_profile: Upravit profil
|
||||||
|
"@login":
|
||||||
|
description: Text tlačítka pro přihlašovací tlačítko
|
||||||
|
follow: Sledujte
|
||||||
|
"@follow":
|
||||||
|
description: Text tlačítka pro tlačítko sledovat
|
||||||
|
unfollow: Zrušit sledování
|
||||||
|
"@unfollow":
|
||||||
|
description: Text tlačítka pro zrušení sledování
|
||||||
|
mute: Ztlumit
|
||||||
|
unmute: Zrušit ztlumení
|
||||||
|
share: Sdílet
|
||||||
|
save: Uložit
|
||||||
|
embed:
|
||||||
|
article_by: Článek na $name
|
||||||
|
note_by: Poznámka $name
|
||||||
|
live_stream_by: Přímý přenos na adrese $name
|
||||||
|
stream_list:
|
||||||
|
following: Po
|
||||||
|
live: Živě
|
||||||
|
planned: Plánované
|
||||||
|
ended: Ukončeno
|
||||||
|
"@stream_list":
|
||||||
|
description: Nadpisy v seznamech proudů podle typu proudu živě/konec/plánovaně atd.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Vlastní částka
|
||||||
|
confirm: Potvrďte
|
||||||
|
comment: "Komentář:"
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Otevřít v peněžence
|
||||||
|
copy: Zkopírováno do schránky
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Neplatná vlastní částka
|
||||||
|
no_wallet: Není nainstalována blesková peněženka
|
||||||
|
no_lud16: Nebyla nalezena žádná adresa blesku
|
||||||
|
profile:
|
||||||
|
past_streams: Minulé proudy
|
||||||
|
edit:
|
||||||
|
display_name: Zobrazení názvu
|
||||||
|
about: O stránkách
|
||||||
|
nip05: Adresa Nostr
|
||||||
|
lud16: Adresa blesku
|
||||||
|
error:
|
||||||
|
logged_out: Nelze upravit profil, když je odhlášený
|
||||||
|
login:
|
||||||
|
username: Uživatelské jméno
|
||||||
|
amber: Přihlášení pomocí Amber
|
||||||
|
key: Přihlášení pomocí klíče
|
||||||
|
create: Vytvořit účet
|
||||||
|
error:
|
||||||
|
invalid_key: Neplatný klíč
|
124
lib/i18n/translated/da.i18n.yaml
Normal file
124
lib/i18n/translated/da.i18n.yaml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
upload_avatar: Upload avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Tekst, der beder brugeren om at trykke på avatar-pladsholderen for
|
||||||
|
at begynde at uploade
|
||||||
|
most_zapped_streamers: De fleste zappede streamere
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: På vej over listede topstreamere af zaps
|
||||||
|
no_user_found: Ingen bruger fundet
|
||||||
|
"@no_user_found":
|
||||||
|
description: Ingen bruger fundet ved søgning
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 seer
|
||||||
|
other: $n Seere
|
||||||
|
"@viewers":
|
||||||
|
description: Antal seere af streamingen
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: En anonym bruger
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: AFSLUTTET
|
||||||
|
planned: PLANLAGT
|
||||||
|
started: Startet $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DEAKTIVERET
|
||||||
|
disabled_timeout: "Timeout udløber: $time"
|
||||||
|
timeout(rich): $mod udløbet $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chatbesked, der viser timeout-hændelser
|
||||||
|
ended: STREAM AFSLUTTET
|
||||||
|
"@ended":
|
||||||
|
description: Stream afsluttede footer i bunden af chatten
|
||||||
|
zap(rich): $user zappet $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chatbesked, der viser stream-zaps
|
||||||
|
write:
|
||||||
|
label: Skriv en besked
|
||||||
|
"@label":
|
||||||
|
description: Label på chatbeskedens inputfelt
|
||||||
|
no_signer: Kan ikke skrive beskeder med npub-login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat-inputmeddelelse vises, når brugeren kun er logget ind med pubkey
|
||||||
|
login: Log ind for at sende beskeder
|
||||||
|
"@login":
|
||||||
|
description: Chat-inputmeddelelse vises, når brugeren er logget ud
|
||||||
|
badge:
|
||||||
|
awarded_to: "Tildelt til:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Overskrift over liste over brugere, der har fået tildelt et badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid-besked til en anden stream
|
||||||
|
from: RAID FRA $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid-besked fra en anden stream
|
||||||
|
countdown: Raiding i $time
|
||||||
|
"@countdown":
|
||||||
|
description: Nedtællingstimer til auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Mål: $amount"
|
||||||
|
remaining: "Resterende: $amount"
|
||||||
|
complete: KOMPLET
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Log ud
|
||||||
|
edit_profile: Rediger profil
|
||||||
|
"@login":
|
||||||
|
description: Knaptekst til login-knappen
|
||||||
|
follow: Følg med
|
||||||
|
"@follow":
|
||||||
|
description: Knaptekst til følg-knappen
|
||||||
|
unfollow: Ikke følge
|
||||||
|
"@unfollow":
|
||||||
|
description: Knaptekst til unfollow-knappen
|
||||||
|
mute: Dæmpet
|
||||||
|
unmute: Slå lyden fra
|
||||||
|
share: Del
|
||||||
|
save: Gemme
|
||||||
|
embed:
|
||||||
|
article_by: Artikel af $name
|
||||||
|
note_by: Note fra $name
|
||||||
|
live_stream_by: Livestream på $name
|
||||||
|
stream_list:
|
||||||
|
following: Efterfølgende
|
||||||
|
live: Live
|
||||||
|
planned: Planlagt
|
||||||
|
ended: Afsluttet
|
||||||
|
"@stream_list":
|
||||||
|
description: Overskrifter på streaminglister efter streamingtype
|
||||||
|
live/afsluttet/planlagt osv.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Brugerdefineret beløb
|
||||||
|
confirm: Bekræft
|
||||||
|
comment: Kommentar
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Åbn i tegnebogen
|
||||||
|
copy: Kopieret til udklipsholder
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Ugyldigt brugerdefineret beløb
|
||||||
|
no_wallet: Ingen lightning wallet installeret
|
||||||
|
no_lud16: Ingen lyn-adresse fundet
|
||||||
|
profile:
|
||||||
|
past_streams: Tidligere strømme
|
||||||
|
edit:
|
||||||
|
display_name: Vis navn
|
||||||
|
about: Omkring
|
||||||
|
nip05: Nostr-adresse
|
||||||
|
lud16: Adresse for lynnedslag
|
||||||
|
error:
|
||||||
|
logged_out: Kan ikke redigere profil, når jeg er logget ud
|
||||||
|
login:
|
||||||
|
username: Brugernavn
|
||||||
|
amber: Log ind med Amber
|
||||||
|
key: Login med nøgle
|
||||||
|
create: Opret konto
|
||||||
|
error:
|
||||||
|
invalid_key: Ugyldig nøgle
|
125
lib/i18n/translated/de.i18n.yaml
Normal file
125
lib/i18n/translated/de.i18n.yaml
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
upload_avatar: Avatar hochladen
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text, der den Benutzer auffordert, auf den Avatar-Platzhalter zu
|
||||||
|
klicken, um den Upload zu starten
|
||||||
|
most_zapped_streamers: Meistgezappte Streamer
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Überschrift über gelistete Top-Streamer von zaps
|
||||||
|
no_user_found: Kein Benutzer gefunden
|
||||||
|
"@no_user_found":
|
||||||
|
description: Kein Benutzer bei der Suche gefunden
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 Zuschauer
|
||||||
|
other: $n Zuschauer
|
||||||
|
"@viewers":
|
||||||
|
description: Anzahl der Betrachter des Streams
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Ein anonymer Benutzer
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: GEPLANT
|
||||||
|
started: Gestartet $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DEAKTIVIERT
|
||||||
|
disabled_timeout: "Die Zeitüberschreitung läuft ab: $time"
|
||||||
|
timeout(rich): $mod Zeitüberschreitung $user für $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat-Nachricht mit Zeitüberschreitungsereignissen
|
||||||
|
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
|
||||||
|
write:
|
||||||
|
label: Nachricht schreiben
|
||||||
|
"@label":
|
||||||
|
description: Beschriftung des Eingabefeldes für Chatnachrichten
|
||||||
|
no_signer: Mit npub-Login können keine Nachrichten geschrieben werden
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat-Eingabemeldung wird angezeigt, wenn der Benutzer nur mit
|
||||||
|
Pubkey eingeloggt ist
|
||||||
|
login: Bitte anmelden, um Nachrichten zu senden
|
||||||
|
"@login":
|
||||||
|
description: Chat-Eingabemeldung wird angezeigt, wenn der Benutzer abgemeldet ist
|
||||||
|
badge:
|
||||||
|
awarded_to: "Verliehen an:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Überschrift über der Liste der Benutzer, die ein Abzeichen erhalten
|
||||||
|
haben
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat-Überfallnachricht an einen anderen Stream
|
||||||
|
from: RAID VON $name
|
||||||
|
"@from":
|
||||||
|
description: Chat-Raid-Nachricht aus einem anderen Stream
|
||||||
|
countdown: Raubzüge auf $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown-Timer für automatisches Reiten
|
||||||
|
goal:
|
||||||
|
title: "Ziel: $amount"
|
||||||
|
remaining: "Verbleibend: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Anmelden
|
||||||
|
logout: Abmelden
|
||||||
|
edit_profile: Profil anpassen
|
||||||
|
"@login":
|
||||||
|
description: Schaltflächentext für die Anmeldeschaltfläche
|
||||||
|
follow: Folgen
|
||||||
|
"@follow":
|
||||||
|
description: Schaltflächentext für die Schaltfläche "Folgen
|
||||||
|
unfollow: Entfolgen
|
||||||
|
"@unfollow":
|
||||||
|
description: Schaltflächentext für die "Unfollow"-Schaltfläche
|
||||||
|
mute: Stummschalten
|
||||||
|
unmute: Entstummen
|
||||||
|
share: Teilen
|
||||||
|
save: Speichern
|
||||||
|
embed:
|
||||||
|
article_by: Artikel von $name
|
||||||
|
note_by: Note von $name
|
||||||
|
live_stream_by: Live-Stream von $name
|
||||||
|
stream_list:
|
||||||
|
following: Folge ich
|
||||||
|
live: Live
|
||||||
|
planned: Geplant
|
||||||
|
ended: Beendet
|
||||||
|
"@stream_list":
|
||||||
|
description: Überschriften auf Stream-Listen nach Stream-Typ live/beendet/geplant usw.
|
||||||
|
zap:
|
||||||
|
title: $name zappen
|
||||||
|
custom_amount: Benutzerdefinierter Betrag
|
||||||
|
confirm: Bestätigen
|
||||||
|
comment: Kommentar
|
||||||
|
button_zap_ready: $amount sats zappen
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: In Brieftasche öffnen
|
||||||
|
copy: In die Zwischenablage kopiert
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Ungültiger benutzerdefinierter Betrag
|
||||||
|
no_wallet: Keine Lightning-Brieftasche installiert
|
||||||
|
no_lud16: Keine Blitzadresse gefunden
|
||||||
|
profile:
|
||||||
|
past_streams: Vergangene Streams
|
||||||
|
edit:
|
||||||
|
display_name: Name anzeigen
|
||||||
|
about: Über
|
||||||
|
nip05: Nostr-Adresse
|
||||||
|
lud16: Lightning-Adresse
|
||||||
|
error:
|
||||||
|
logged_out: Profil kann nicht bearbeitet werden, wenn es abgemeldet ist
|
||||||
|
login:
|
||||||
|
username: Benutzername
|
||||||
|
amber: Anmeldung mit Amber
|
||||||
|
key: Anmeldung mit Schlüssel
|
||||||
|
create: Konto erstellen
|
||||||
|
error:
|
||||||
|
invalid_key: Ungültiger Schlüssel
|
127
lib/i18n/translated/el.i18n.yaml
Normal file
127
lib/i18n/translated/el.i18n.yaml
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
upload_avatar: Ανέβασμα Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Κείμενο που προτρέπει τον χρήστη να πατήσει το εικονίδιο avatar για
|
||||||
|
να ξεκινήσει το ανέβασμα
|
||||||
|
most_zapped_streamers: Τα περισσότερα Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Επικεφαλής πάνω από τα αναφερόμενα κορυφαία streamers από zaps
|
||||||
|
no_user_found: Δεν βρέθηκε χρήστης
|
||||||
|
"@no_user_found":
|
||||||
|
description: Δεν βρέθηκε χρήστης κατά την αναζήτηση
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 θεατής
|
||||||
|
other: $n θεατές
|
||||||
|
"@viewers":
|
||||||
|
description: Αριθμός θεατών της ροής
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Ένας ανώνυμος χρήστης
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: ΣΧΕΔΙΑΣΜΟΣ
|
||||||
|
started: Ξεκίνησε $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: ΑΠΕΝΕΡΓΟΠΟΙΗΜΈΝΗ ΣΥΝΟΜΙΛΊΑ
|
||||||
|
disabled_timeout: "Το χρονικό όριο λήγει: $time"
|
||||||
|
timeout(rich): $mod χρονομετρημένη λήξη $user για $time
|
||||||
|
"@timeout":
|
||||||
|
description: Μήνυμα συνομιλίας που εμφανίζει συμβάντα timeout
|
||||||
|
ended: STREAM ΤΕΛΕΙΩΣΕ
|
||||||
|
"@ended":
|
||||||
|
description: Η ροή τελείωσε το υποσέλιδο στο κάτω μέρος της συνομιλίας
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Μήνυμα συνομιλίας που δείχνει ροή ροής zaps
|
||||||
|
write:
|
||||||
|
label: Γράψτε μήνυμα
|
||||||
|
"@label":
|
||||||
|
description: Ετικέτα στο πλαίσιο εισαγωγής μηνύματος συνομιλίας
|
||||||
|
no_signer: Δεν μπορείτε να γράψετε μηνύματα με σύνδεση στο npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Μήνυμα εισόδου συνομιλίας που εμφανίζεται όταν ο χρήστης είναι
|
||||||
|
συνδεδεμένος μόνο με το κλειδί pubkey
|
||||||
|
login: Παρακαλώ συνδεθείτε για να στείλετε μηνύματα
|
||||||
|
"@login":
|
||||||
|
description: Μήνυμα εισόδου συνομιλίας που εμφανίζεται όταν ο χρήστης έχει
|
||||||
|
αποσυνδεθεί
|
||||||
|
badge:
|
||||||
|
awarded_to: "Απονέμεται σε:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Επικεφαλίδα πάνω από τη λίστα των χρηστών στους οποίους έχει
|
||||||
|
απονεμηθεί ένα σήμα
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Μήνυμα επιδρομής συνομιλίας σε άλλη ροή
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Μήνυμα επιδρομής συνομιλίας από άλλη ροή
|
||||||
|
countdown: Επιδρομές στο $time
|
||||||
|
"@countdown":
|
||||||
|
description: Χρονοδιακόπτης αντίστροφης μέτρησης για αυτόματη ιππασία
|
||||||
|
goal:
|
||||||
|
title: "Στόχος: $amount"
|
||||||
|
remaining: "Υπόλοιπο: $amount"
|
||||||
|
complete: ΠΛΗΡΗΣ
|
||||||
|
button:
|
||||||
|
login: Σύνδεση
|
||||||
|
logout: Αποσύνδεση
|
||||||
|
edit_profile: Επεξεργασία προφίλ
|
||||||
|
"@login":
|
||||||
|
description: Κείμενο κουμπιού για το κουμπί σύνδεσης
|
||||||
|
follow: Ακολουθήστε το
|
||||||
|
"@follow":
|
||||||
|
description: Κείμενο κουμπιού για το κουμπί follow
|
||||||
|
unfollow: Ακολουθήστε το
|
||||||
|
"@unfollow":
|
||||||
|
description: Κείμενο κουμπιού για το κουμπί unfollow
|
||||||
|
mute: Σίγαση
|
||||||
|
unmute: Αποσυνδέστε τη φωνή σας από το
|
||||||
|
share: Μοιραστείτε το
|
||||||
|
save: Αποθήκευση
|
||||||
|
embed:
|
||||||
|
article_by: Άρθρο από $name
|
||||||
|
note_by: Σημείωση του $name
|
||||||
|
live_stream_by: Ζωντανή μετάδοση από το $name
|
||||||
|
stream_list:
|
||||||
|
following: Ακολουθώντας το
|
||||||
|
live: Ζωντανό
|
||||||
|
planned: Προγραμματισμένο
|
||||||
|
ended: Τελείωσε
|
||||||
|
"@stream_list":
|
||||||
|
description: Επικεφαλίδες στις λίστες ροής ανά τύπο ροής
|
||||||
|
ζωντανή/τελειωμένη/προγραμματισμένη κ.λπ.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Προσαρμοσμένο ποσό
|
||||||
|
confirm: Επιβεβαίωση
|
||||||
|
comment: Σχόλιο
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Άνοιγμα στο πορτοφόλι
|
||||||
|
copy: Αντιγραφή στο πρόχειρο
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Μη έγκυρο προσαρμοσμένο ποσό
|
||||||
|
no_wallet: Δεν έχει εγκατασταθεί πορτοφόλι αστραπής
|
||||||
|
no_lud16: Δεν βρέθηκε διεύθυνση κεραυνού
|
||||||
|
profile:
|
||||||
|
past_streams: Προηγούμενα ρεύματα
|
||||||
|
edit:
|
||||||
|
display_name: Όνομα οθόνης
|
||||||
|
about: Σχετικά με το
|
||||||
|
nip05: Διεύθυνση Nostr
|
||||||
|
lud16: Διεύθυνση Lightning
|
||||||
|
error:
|
||||||
|
logged_out: Δεν μπορείτε να επεξεργαστείτε το προφίλ όταν έχετε αποσυνδεθεί
|
||||||
|
login:
|
||||||
|
username: Όνομα χρήστη
|
||||||
|
amber: Σύνδεση με Amber
|
||||||
|
key: Σύνδεση με κλειδί
|
||||||
|
create: Δημιουργία λογαριασμού
|
||||||
|
error:
|
||||||
|
invalid_key: Μη έγκυρο κλειδί
|
122
lib/i18n/translated/en.i18n.yaml
Normal file
122
lib/i18n/translated/en.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: Username
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
127
lib/i18n/translated/es.i18n.yaml
Normal file
127
lib/i18n/translated/es.i18n.yaml
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
upload_avatar: Subir avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Texto que indica al usuario que pulse el marcador de avatar para
|
||||||
|
iniciar la carga
|
||||||
|
most_zapped_streamers: Serpentinas más derribadas
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Encabezando streamers superiores listados por zaps
|
||||||
|
no_user_found: No se ha encontrado ningún usuario
|
||||||
|
"@no_user_found":
|
||||||
|
description: No se ha encontrado ningún usuario al realizar la búsqueda
|
||||||
|
anon: Anónimo
|
||||||
|
viewers:
|
||||||
|
one: 1 espectador
|
||||||
|
other: $n espectadores
|
||||||
|
"@viewers":
|
||||||
|
description: Número de espectadores del flujo
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Un usuario anónimo
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: EN VIVO
|
||||||
|
ended: FIN
|
||||||
|
planned: PLANIFICADO
|
||||||
|
started: Comenzó $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DESHABILITADO
|
||||||
|
disabled_timeout: "El tiempo de espera expira: $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
|
||||||
|
"@ended":
|
||||||
|
description: Stream finalizó en la parte inferior del chat
|
||||||
|
zap(rich): $user zapearon $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Mensaje de chat que muestra zaps de flujo
|
||||||
|
write:
|
||||||
|
label: Escribir mensaje
|
||||||
|
"@label":
|
||||||
|
description: Etiqueta del cuadro de entrada de mensajes de chat
|
||||||
|
no_signer: No se pueden escribir mensajes con el login npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Mensaje de entrada en el chat que se muestra cuando el usuario está
|
||||||
|
conectado sólo con pubkey
|
||||||
|
login: Inicie sesión para enviar mensajes
|
||||||
|
"@login":
|
||||||
|
description: Mensaje de entrada al chat que se muestra cuando el usuario cierra
|
||||||
|
la sesión
|
||||||
|
badge:
|
||||||
|
awarded_to: "Concedido a:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Encabezamiento de la lista de usuarios a los que se ha concedido
|
||||||
|
una insignia
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Mensaje de raid de chat a otro flujo
|
||||||
|
from: RAID DESDE $name
|
||||||
|
"@from":
|
||||||
|
description: Mensaje de incursión en el chat desde otro flujo
|
||||||
|
countdown: Incursiones en $time
|
||||||
|
"@countdown":
|
||||||
|
description: Temporizador de cuenta atrás para auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Objetivo: $amount"
|
||||||
|
remaining: "Resto: $amount"
|
||||||
|
complete: COMPLETAR
|
||||||
|
button:
|
||||||
|
login: Iniciar Sesión
|
||||||
|
logout: Cerrar sesión
|
||||||
|
edit_profile: Editar Perfil
|
||||||
|
"@login":
|
||||||
|
description: Texto del botón de inicio de sesión
|
||||||
|
follow: Seguir
|
||||||
|
"@follow":
|
||||||
|
description: Texto del botón de seguimiento
|
||||||
|
unfollow: Dejar de seguir
|
||||||
|
"@unfollow":
|
||||||
|
description: Texto del botón "Dejar de seguir
|
||||||
|
mute: Silenciar
|
||||||
|
unmute: Dejar de silenciar
|
||||||
|
share: Compartir
|
||||||
|
save: Guardar
|
||||||
|
embed:
|
||||||
|
article_by: Artículo de $name
|
||||||
|
note_by: Nota de $name
|
||||||
|
live_stream_by: Transmisión en directo por $name
|
||||||
|
stream_list:
|
||||||
|
following: Siguiendo
|
||||||
|
live: En directo
|
||||||
|
planned: Planificado
|
||||||
|
ended: Finalizado
|
||||||
|
"@stream_list":
|
||||||
|
description: Encabezamientos en las listas de flujos por tipo de flujo en
|
||||||
|
directo/finalizado/planificado, etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Importe personalizado
|
||||||
|
confirm: Confirmar
|
||||||
|
comment: Comentario
|
||||||
|
button_zap_ready: Zapear $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Abrir en cartera
|
||||||
|
copy: Copiado al portapapeles
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Importe personalizado no válido
|
||||||
|
no_wallet: Sin monedero relámpago instalado
|
||||||
|
no_lud16: No se ha encontrado ninguna dirección de rayos
|
||||||
|
profile:
|
||||||
|
past_streams: Transmisiones anteriores
|
||||||
|
edit:
|
||||||
|
display_name: Mostrar nombre
|
||||||
|
about: Sobre ti
|
||||||
|
nip05: Dirección Nostr
|
||||||
|
lud16: Dirección del rayo
|
||||||
|
error:
|
||||||
|
logged_out: No se puede editar el perfil cuando se cierra la sesión
|
||||||
|
login:
|
||||||
|
username: Usuario
|
||||||
|
amber: Iniciar sesión con Amber
|
||||||
|
key: Inicio de sesión con clave
|
||||||
|
create: Crear una cuenta
|
||||||
|
error:
|
||||||
|
invalid_key: Clave no válida
|
125
lib/i18n/translated/fi.i18n.yaml
Normal file
125
lib/i18n/translated/fi.i18n.yaml
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
upload_avatar: Lataa avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Teksti, joka kehottaa käyttäjää painamaan avatar-merkkiä
|
||||||
|
aloittaakseen lataamisen.
|
||||||
|
most_zapped_streamers: Eniten Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Päällekkäin lueteltujen alkuun streamers by zaps
|
||||||
|
no_user_found: Käyttäjää ei löytynyt
|
||||||
|
"@no_user_found":
|
||||||
|
description: Käyttäjää ei löytynyt haun yhteydessä
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 katsoja
|
||||||
|
other: $n katsojaa
|
||||||
|
"@viewers":
|
||||||
|
description: Streamin katsojien määrä
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Nimetön käyttäjä
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: SUUNNITELTU
|
||||||
|
started: Aloitettu $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT POISTETTU KÄYTÖSTÄ
|
||||||
|
disabled_timeout: "Aikakatkaisu päättyy: $time"
|
||||||
|
timeout(rich): $mod ajastettu $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat-viesti, joka näyttää aikakatkaisutapahtumat
|
||||||
|
ended: STREAM PÄÄTTYNYT
|
||||||
|
"@ended":
|
||||||
|
description: Virta päättyi alatunnisteen alareunaan chatissa
|
||||||
|
zap(rich): $user zappasi $amount satsia
|
||||||
|
"@zap":
|
||||||
|
description: Chat-viestin näyttäminen stream zaps
|
||||||
|
write:
|
||||||
|
label: Kirjoita viesti
|
||||||
|
"@label":
|
||||||
|
description: Chat-viestin syöttöruudun tarra
|
||||||
|
no_signer: Ei voi kirjoittaa viestejä npub-kirjautumisella
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat-syöttöviesti näytetään, kun käyttäjä on kirjautunut sisään
|
||||||
|
vain pubkey-avaimella.
|
||||||
|
login: Kirjaudu sisään lähettääksesi viestejä
|
||||||
|
"@login":
|
||||||
|
description: Chat-syötteen viesti näytetään, kun käyttäjä on kirjautunut ulos.
|
||||||
|
badge:
|
||||||
|
awarded_to: "Myönnetty:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Merkin saaneiden käyttäjien luettelon otsikko
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat-viesti toiseen streamiin
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid viesti toisesta virrasta
|
||||||
|
countdown: Ryöstöretket osoitteessa $time
|
||||||
|
"@countdown":
|
||||||
|
description: Lähtölaskenta ajastin automaattista ratsastusta varten
|
||||||
|
goal:
|
||||||
|
title: "Tavoite: $amount"
|
||||||
|
remaining: "Jäljellä: $amount"
|
||||||
|
complete: TÄYDELLINEN
|
||||||
|
button:
|
||||||
|
login: Kirjaudu sisään
|
||||||
|
logout: Kirjaudu ulos
|
||||||
|
edit_profile: Muokkaa profiilia
|
||||||
|
"@login":
|
||||||
|
description: Kirjautumispainikkeen teksti
|
||||||
|
follow: Seuraa
|
||||||
|
"@follow":
|
||||||
|
description: Seuraa-painikkeen painikkeen teksti
|
||||||
|
unfollow: Älä seuraa
|
||||||
|
"@unfollow":
|
||||||
|
description: Seuraa-painikkeen teksti
|
||||||
|
mute: Mykistä
|
||||||
|
unmute: Poista mykistys
|
||||||
|
share: Jaa
|
||||||
|
save: Tallenna
|
||||||
|
embed:
|
||||||
|
article_by: Artikkeli $name
|
||||||
|
note_by: Viesti lähettäjältä $name
|
||||||
|
live_stream_by: Suora lähetys osoitteessa $name
|
||||||
|
stream_list:
|
||||||
|
following: Seuraa
|
||||||
|
live: Live
|
||||||
|
planned: Suunniteltu
|
||||||
|
ended: Päättynyt
|
||||||
|
"@stream_list":
|
||||||
|
description: Stream-luetteloiden otsikot stream-tyypeittäin
|
||||||
|
live/päättynyt/suunniteltu jne.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Mukautettu määrä
|
||||||
|
confirm: Vahvista
|
||||||
|
comment: Kommentoi
|
||||||
|
button_zap_ready: Zap $amount satsia
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Avaa lompakossa
|
||||||
|
copy: Kopioitu leikepöydälle
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Virheellinen mukautettu määrä
|
||||||
|
no_wallet: Ei asennettua salamalompakkoa
|
||||||
|
no_lud16: Salamaosoitetta ei löytynyt
|
||||||
|
profile:
|
||||||
|
past_streams: Aikaisemmat lähetykset
|
||||||
|
edit:
|
||||||
|
display_name: Näytön nimi
|
||||||
|
about: Tietoja
|
||||||
|
nip05: Nostr-osoite
|
||||||
|
lud16: Lightning-osoite
|
||||||
|
error:
|
||||||
|
logged_out: Ei voi muokata profiilia, kun on kirjautunut ulos
|
||||||
|
login:
|
||||||
|
username: Käyttäjätunnus
|
||||||
|
amber: Kirjaudu sisään Amber kanssa
|
||||||
|
key: Kirjaudu sisään avaimella
|
||||||
|
create: Luo tili
|
||||||
|
error:
|
||||||
|
invalid_key: Virheellinen avain
|
124
lib/i18n/translated/fr.i18n.yaml
Normal file
124
lib/i18n/translated/fr.i18n.yaml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
upload_avatar: Télécharger l'avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Texte invitant l'utilisateur à cliquer sur l'espace réservé à
|
||||||
|
l'avatar pour commencer le téléchargement
|
||||||
|
most_zapped_streamers: Les Streamers les plus zappés
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Les têtes d'affiche sont listées par zaps.
|
||||||
|
no_user_found: Aucun utilisateur trouvé
|
||||||
|
"@no_user_found":
|
||||||
|
description: Aucun utilisateur n'a été trouvé lors de la recherche
|
||||||
|
anon: Anonyme
|
||||||
|
viewers:
|
||||||
|
one: 1 téléspectateur
|
||||||
|
other: $n spectateurs
|
||||||
|
"@viewers":
|
||||||
|
description: Nombre de spectateurs du flux
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Un utilisateur anonyme
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: VIVRE
|
||||||
|
ended: FINI
|
||||||
|
planned: PRÉVU
|
||||||
|
started: Commencé à $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Le délai expire : $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
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user a zappé $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Message de chat montrant des zaps de flux
|
||||||
|
write:
|
||||||
|
label: Message écrit
|
||||||
|
"@label":
|
||||||
|
description: Étiquette sur la boîte de saisie du message de chat
|
||||||
|
no_signer: Impossible d'écrire des messages avec le login npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Message d'entrée du chat affiché lorsque l'utilisateur n'est
|
||||||
|
connecté qu'avec pubkey
|
||||||
|
login: Veuillez vous connecter pour envoyer des messages
|
||||||
|
"@login":
|
||||||
|
description: Message d'entrée du chat affiché lorsque l'utilisateur est déconnecté
|
||||||
|
badge:
|
||||||
|
awarded_to: "Attribué à :"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Titre sur la liste des utilisateurs qui ont reçu un badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Message de raid par chat vers un autre flux
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Message de raid sur le chat à partir d'un autre flux
|
||||||
|
countdown: Raid sur $time
|
||||||
|
"@countdown":
|
||||||
|
description: Compte à rebours pour l'auto-raid
|
||||||
|
goal:
|
||||||
|
title: "Objectif : $amount"
|
||||||
|
remaining: "Reste : $amount"
|
||||||
|
complete: COMPLET
|
||||||
|
button:
|
||||||
|
login: Se Connecter
|
||||||
|
logout: Se déconnecter
|
||||||
|
edit_profile: Modifier le Profil
|
||||||
|
"@login":
|
||||||
|
description: Texte du bouton de connexion
|
||||||
|
follow: Suivre
|
||||||
|
"@follow":
|
||||||
|
description: Texte du bouton de suivi
|
||||||
|
unfollow: Ne plus suivre
|
||||||
|
"@unfollow":
|
||||||
|
description: Texte du bouton pour le bouton "unfollow
|
||||||
|
mute: Muet
|
||||||
|
unmute: Retirer sourdine
|
||||||
|
share: Partager
|
||||||
|
save: Sauvegarder
|
||||||
|
embed:
|
||||||
|
article_by: Article par $name
|
||||||
|
note_by: Note par $name
|
||||||
|
live_stream_by: Retransmission en direct sur $name
|
||||||
|
stream_list:
|
||||||
|
following: Abonnements
|
||||||
|
live: En direct
|
||||||
|
planned: Planifié
|
||||||
|
ended: Terminé
|
||||||
|
"@stream_list":
|
||||||
|
description: Rubriques sur les listes de flux par type de flux en direct/fini/prévu, etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Montant personnalisé
|
||||||
|
confirm: Confirmer
|
||||||
|
comment: Commenter
|
||||||
|
button_zap_ready: Zapper $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Ouvrir dans le portefeuille
|
||||||
|
copy: Copié dans le presse-papiers
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Montant personnalisé non valide
|
||||||
|
no_wallet: Pas de porte-monnaie électronique installé
|
||||||
|
no_lud16: Pas d'adresse éclair trouvée
|
||||||
|
profile:
|
||||||
|
past_streams: Streams passés
|
||||||
|
edit:
|
||||||
|
display_name: Nom d'affichage
|
||||||
|
about: À propos
|
||||||
|
nip05: Adresse Nostr
|
||||||
|
lud16: Adresse Lightning
|
||||||
|
error:
|
||||||
|
logged_out: Impossible de modifier le profil lorsque l'on est déconnecté
|
||||||
|
login:
|
||||||
|
username: Nom d’utilisateur
|
||||||
|
amber: Se connecter avec Amber
|
||||||
|
key: Connexion avec la clé
|
||||||
|
create: Créer un Compte
|
||||||
|
error:
|
||||||
|
invalid_key: Clé non valide
|
122
lib/i18n/translated/he.i18n.yaml
Normal file
122
lib/i18n/translated/he.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: Username
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
124
lib/i18n/translated/hu.i18n.yaml
Normal file
124
lib/i18n/translated/hu.i18n.yaml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
upload_avatar: Avatár feltöltése
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Szöveg, amely arra kéri a felhasználót, hogy a feltöltés
|
||||||
|
megkezdéséhez nyomja meg az avatar helyőrzőt
|
||||||
|
most_zapped_streamers: A legtöbb Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Irány a felsorolt top streamerek fölött zaps által
|
||||||
|
no_user_found: Nem talált felhasználó
|
||||||
|
"@no_user_found":
|
||||||
|
description: Kereséskor nem talált felhasználó
|
||||||
|
anon: Névtelen
|
||||||
|
viewers:
|
||||||
|
one: 1 néző
|
||||||
|
other: $n néző
|
||||||
|
"@viewers":
|
||||||
|
description: A stream nézőinek száma
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Egy névtelen felhasználó
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: ÉLŐ
|
||||||
|
ended: ENDED
|
||||||
|
planned: TERVEZETT
|
||||||
|
started: Elindult $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT KIKAPCSOLVA
|
||||||
|
disabled_timeout: "Az időkorlát lejár: $time"
|
||||||
|
timeout(rich): $mod időzített $user a $time számára
|
||||||
|
"@timeout":
|
||||||
|
description: Chat üzenet az időkorlátos események megjelenítésével
|
||||||
|
ended: STREAM MEGSZÜNTETETT
|
||||||
|
"@ended":
|
||||||
|
description: A stream véget ért lábléc a chat alján
|
||||||
|
zap(rich): $user zap-elt $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Csevegőüzenet, amely stream zapokat mutat
|
||||||
|
write:
|
||||||
|
label: Üzenet írása
|
||||||
|
"@label":
|
||||||
|
description: Címke a csevegőüzenet beviteli mezőjén
|
||||||
|
no_signer: Nem tud üzeneteket írni az npub bejelentkezéssel
|
||||||
|
"@no_signer":
|
||||||
|
description: A csevegés bemeneti üzenete megjelenik, ha a felhasználó csak
|
||||||
|
pubkey-vel van bejelentkezve
|
||||||
|
login: Kérjük, jelentkezzen be az üzenetek küldéséhez
|
||||||
|
"@login":
|
||||||
|
description: A felhasználó kijelentkezésekor megjelenő csevegési beviteli üzenet
|
||||||
|
badge:
|
||||||
|
awarded_to: "Elnyerte:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Fejléc a jelvényt kapott felhasználók listája fölött
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid üzenet egy másik folyamba
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid üzenet egy másik folyamból
|
||||||
|
countdown: Raiding a $time oldalon
|
||||||
|
"@countdown":
|
||||||
|
description: Visszaszámláló időzítő az automatikus lovagláshoz
|
||||||
|
goal:
|
||||||
|
title: "Cél: $amount"
|
||||||
|
remaining: "Maradék: $amount"
|
||||||
|
complete: TELJES
|
||||||
|
button:
|
||||||
|
login: Bejelentkezés
|
||||||
|
logout: Kijelentkezés
|
||||||
|
edit_profile: Profil szerkesztése
|
||||||
|
"@login":
|
||||||
|
description: A bejelentkezési gomb szövege
|
||||||
|
follow: Követés
|
||||||
|
"@follow":
|
||||||
|
description: A követés gomb szövege
|
||||||
|
unfollow: Követés megszüntetése
|
||||||
|
"@unfollow":
|
||||||
|
description: A követés megszüntetése gomb szövege
|
||||||
|
mute: Némítás
|
||||||
|
unmute: Némítás visszavonása
|
||||||
|
share: Megosztás
|
||||||
|
save: Mentés
|
||||||
|
embed:
|
||||||
|
article_by: A $name cikke.
|
||||||
|
note_by: $name bejegyzése
|
||||||
|
live_stream_by: Élő közvetítés a $name oldalon
|
||||||
|
stream_list:
|
||||||
|
following: Követettek bejegyzései
|
||||||
|
live: Élő
|
||||||
|
planned: Tervezett
|
||||||
|
ended: Véget ért
|
||||||
|
"@stream_list":
|
||||||
|
description: A stream-listák címsorai stream-típusonként élő/befejezett/tervezett stb.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Egyéni összeg
|
||||||
|
confirm: Megerősítés
|
||||||
|
comment: Hozzászólás
|
||||||
|
button_zap_ready: Zap $amount satoshi
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Megnyitás a pénztárcában
|
||||||
|
copy: Vágólapra másolva
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Érvénytelen egyéni összeg
|
||||||
|
no_wallet: Nincs telepített villám tárca
|
||||||
|
no_lud16: Nem talált villámcím
|
||||||
|
profile:
|
||||||
|
past_streams: Múltbeli Streamek
|
||||||
|
edit:
|
||||||
|
display_name: Megjelenített név
|
||||||
|
about: Névjegy
|
||||||
|
nip05: Nostr-cím
|
||||||
|
lud16: Lightning-cím
|
||||||
|
error:
|
||||||
|
logged_out: Kijelentkezve nem lehet profilt szerkeszteni
|
||||||
|
login:
|
||||||
|
username: Felhasználónév
|
||||||
|
amber: Bejelentkezés Amber segítségével
|
||||||
|
key: Bejelentkezés kulccsal
|
||||||
|
create: Fiók Létrehozása
|
||||||
|
error:
|
||||||
|
invalid_key: Érvénytelen kulcs
|
125
lib/i18n/translated/it.i18n.yaml
Normal file
125
lib/i18n/translated/it.i18n.yaml
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
upload_avatar: Carica Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Testo che richiede all'utente di premere il segnaposto dell'avatar
|
||||||
|
per iniziare il caricamento
|
||||||
|
most_zapped_streamers: Il maggior numero di streamer bloccati
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Direzione sopra elencata top streamers da zaps
|
||||||
|
no_user_found: Nessun utente trovato
|
||||||
|
"@no_user_found":
|
||||||
|
description: Nessun utente trovato durante la ricerca
|
||||||
|
anon: Anonimo
|
||||||
|
viewers:
|
||||||
|
one: 1 spettatore
|
||||||
|
other: $n spettatori
|
||||||
|
"@viewers":
|
||||||
|
description: Numero di spettatori del flusso
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Un utente anonimo
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: IN DIRETTA
|
||||||
|
ended: FINE
|
||||||
|
planned: PREVISTO
|
||||||
|
started: Avviato $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABILITATA
|
||||||
|
disabled_timeout: "Il timeout scade: $time"
|
||||||
|
timeout(rich): $mod time out $user per $time
|
||||||
|
"@timeout":
|
||||||
|
description: Messaggio di chat che mostra gli eventi di timeout
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Il flusso si è concluso con un piè di pagina in fondo alla chat
|
||||||
|
zap(rich): $user ha effettuato uno zap di $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Messaggio di chat che mostra gli zap del flusso
|
||||||
|
write:
|
||||||
|
label: Scrivi il messaggio
|
||||||
|
"@label":
|
||||||
|
description: Etichetta della casella di immissione del messaggio di chat
|
||||||
|
no_signer: Impossibile scrivere messaggi con il login npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Messaggio di ingresso alla chat mostrato quando l'utente è connesso
|
||||||
|
solo con la pubkey
|
||||||
|
login: Effettuare il login per inviare messaggi
|
||||||
|
"@login":
|
||||||
|
description: Messaggio di input della chat mostrato quando l'utente è disconnesso
|
||||||
|
badge:
|
||||||
|
awarded_to: "Assegnato a:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Intestazione dell'elenco degli utenti a cui è stato assegnato un badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Messaggio di chat raid in un altro flusso
|
||||||
|
from: RAID DA $name
|
||||||
|
"@from":
|
||||||
|
description: Messaggio di chat raid da un altro flusso
|
||||||
|
countdown: Raid in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Timer per il conto alla rovescia per l'auto-raid
|
||||||
|
goal:
|
||||||
|
title: "Obiettivo: $amount"
|
||||||
|
remaining: "Restante: $amount"
|
||||||
|
complete: COMPLETO
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Modifica profilo
|
||||||
|
"@login":
|
||||||
|
description: Testo del pulsante per il pulsante di accesso
|
||||||
|
follow: Segui
|
||||||
|
"@follow":
|
||||||
|
description: Testo del pulsante per il pulsante Segui
|
||||||
|
unfollow: Smetti di seguire
|
||||||
|
"@unfollow":
|
||||||
|
description: Testo del pulsante per il pulsante unfollow
|
||||||
|
mute: Silenzia
|
||||||
|
unmute: Riattiva
|
||||||
|
share: Condividi
|
||||||
|
save: Salva
|
||||||
|
embed:
|
||||||
|
article_by: Articolo di $name
|
||||||
|
note_by: Nota di $name
|
||||||
|
live_stream_by: Streaming in diretta da $name
|
||||||
|
stream_list:
|
||||||
|
following: Seguiti
|
||||||
|
live: Dal vivo
|
||||||
|
planned: Pianificato
|
||||||
|
ended: Terminato
|
||||||
|
"@stream_list":
|
||||||
|
description: Titoli sugli elenchi dei flussi per tipo di flusso
|
||||||
|
live/finito/pianificato ecc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Importo personalizzato
|
||||||
|
confirm: Conferma
|
||||||
|
comment: Commenta
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Aprire nel portafoglio
|
||||||
|
copy: Copiato negli appunti
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Importo personalizzato non valido
|
||||||
|
no_wallet: Nessun portafoglio Lightning installato
|
||||||
|
no_lud16: Nessun indirizzo di fulmine trovato
|
||||||
|
profile:
|
||||||
|
past_streams: Flussi passati
|
||||||
|
edit:
|
||||||
|
display_name: Nome visualizzato
|
||||||
|
about: Info
|
||||||
|
nip05: Indirizzo Nostr
|
||||||
|
lud16: Indirizzo del fulmine
|
||||||
|
error:
|
||||||
|
logged_out: Impossibile modificare il profilo quando si è disconnessi
|
||||||
|
login:
|
||||||
|
username: Nome utente
|
||||||
|
amber: Accesso con Amber
|
||||||
|
key: Accesso con chiave
|
||||||
|
create: Crea un account
|
||||||
|
error:
|
||||||
|
invalid_key: Chiave non valida
|
122
lib/i18n/translated/ja.i18n.yaml
Normal file
122
lib/i18n/translated/ja.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: アバターのアップロード
|
||||||
|
"@upload_avatar":
|
||||||
|
description: アバターのプレースホルダーを押してアップロードを開始するよう促すテキスト
|
||||||
|
most_zapped_streamers: 最もザッピングされたストリーマー
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: ザップによるリストの上のストリーマーに向かう
|
||||||
|
no_user_found: ユーザーが見つかりません
|
||||||
|
"@no_user_found":
|
||||||
|
description: 検索してもユーザーが見つからない
|
||||||
|
anon: 匿名
|
||||||
|
viewers:
|
||||||
|
one: 1 視聴者
|
||||||
|
other: $n 人が視聴中
|
||||||
|
"@viewers":
|
||||||
|
description: ストリームの視聴者数
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: イント
|
||||||
|
"@anon":
|
||||||
|
description: 匿名ユーザー
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: ライブ
|
||||||
|
ended: 終了
|
||||||
|
planned: 予定
|
||||||
|
started: $timestamp を開始
|
||||||
|
chat:
|
||||||
|
disabled: チャット無効
|
||||||
|
disabled_timeout: タイムアウト: $time
|
||||||
|
timeout(rich): $mod タイムアウト $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: タイムアウトイベントを表示するチャットメッセージ
|
||||||
|
ended: 配信終了
|
||||||
|
"@ended":
|
||||||
|
description: チャットの下にストリーム終了のフッター
|
||||||
|
zap(rich): $user が $amount sats をザップしました
|
||||||
|
"@zap":
|
||||||
|
description: ストリームのザッピングを表示するチャットメッセージ
|
||||||
|
write:
|
||||||
|
label: メッセージを書く
|
||||||
|
"@label":
|
||||||
|
description: チャットメッセージ入力ボックスのラベル
|
||||||
|
no_signer: npubログインでメッセージが書けない
|
||||||
|
"@no_signer":
|
||||||
|
description: ユーザーがpubkeyのみでログインしている場合に表示されるチャット入力メッセージ
|
||||||
|
login: メッセージを送信するにはログインしてください
|
||||||
|
"@login":
|
||||||
|
description: ログアウト時に表示されるチャット入力メッセージ
|
||||||
|
badge:
|
||||||
|
awarded_to: 受賞者
|
||||||
|
"@awarded_to":
|
||||||
|
description: バッジを授与されたユーザーのリスト上の見出し
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: 別のストリームへのチャット襲撃メッセージ
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: 他のストリームからのチャット襲撃メッセージ
|
||||||
|
countdown: $timeにおける襲撃
|
||||||
|
"@countdown":
|
||||||
|
description: 自動騎乗のカウントダウン・タイマー
|
||||||
|
goal:
|
||||||
|
title: 目標額: $amount
|
||||||
|
remaining: 残り: $amount
|
||||||
|
complete: 完了
|
||||||
|
button:
|
||||||
|
login: ログイン
|
||||||
|
logout: ログアウト
|
||||||
|
edit_profile: プロフィールを編集
|
||||||
|
"@login":
|
||||||
|
description: ログインボタンのテキスト
|
||||||
|
follow: フォロー
|
||||||
|
"@follow":
|
||||||
|
description: フォローボタンのテキスト
|
||||||
|
unfollow: フォロー解除
|
||||||
|
"@unfollow":
|
||||||
|
description: フォロー解除ボタンのテキスト
|
||||||
|
mute: ミュート
|
||||||
|
unmute: ミュート解除
|
||||||
|
share: 共有
|
||||||
|
save: 保存
|
||||||
|
embed:
|
||||||
|
article_by: 記事: $name
|
||||||
|
note_by: $name の投稿
|
||||||
|
live_stream_by: ライブ・ストリーム $name
|
||||||
|
stream_list:
|
||||||
|
following: フォロー中
|
||||||
|
live: ライブ配信中
|
||||||
|
planned: 予定あり
|
||||||
|
ended: 終了しました
|
||||||
|
"@stream_list":
|
||||||
|
description: ライブ/終了/予定など、ストリーム・タイプ別のストリーム・リストの見出し。
|
||||||
|
zap:
|
||||||
|
title: $name をザップ
|
||||||
|
custom_amount: カスタム金額
|
||||||
|
confirm: 確認
|
||||||
|
comment: コメント
|
||||||
|
button_zap_ready: $amount satsをザップする
|
||||||
|
button_zap: ザップ
|
||||||
|
button_open_wallet: ウォレットで開く
|
||||||
|
copy: クリップボードにコピー
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: 無効なカスタム金額
|
||||||
|
no_wallet: Lightningウォレット未装着
|
||||||
|
no_lud16: 雷アドレスが見つかりません
|
||||||
|
profile:
|
||||||
|
past_streams: 過去の配信
|
||||||
|
edit:
|
||||||
|
display_name: 表示名
|
||||||
|
about: 自己紹介
|
||||||
|
nip05: Nostrアドレス
|
||||||
|
lud16: ライトニングアドレス
|
||||||
|
error:
|
||||||
|
logged_out: ログアウトするとプロフィールが編集できない
|
||||||
|
login:
|
||||||
|
username: ユーザー名
|
||||||
|
amber: 琥珀でログイン
|
||||||
|
key: キーでログイン
|
||||||
|
create: アカウントを作成する
|
||||||
|
error:
|
||||||
|
invalid_key: 無効なキー
|
122
lib/i18n/translated/ko.i18n.yaml
Normal file
122
lib/i18n/translated/ko.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: 아바타 업로드
|
||||||
|
"@upload_avatar":
|
||||||
|
description: 아바타 플레이스홀더를 눌러 업로드를 시작하라는 메시지를 표시하는 텍스트
|
||||||
|
most_zapped_streamers: 가장 많이 재핑된 스트리머
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: 나열된 상위 스트리머를 잽별로 살펴보기
|
||||||
|
no_user_found: 사용자를 찾을 수 없습니다.
|
||||||
|
"@no_user_found":
|
||||||
|
description: 검색 시 사용자를 찾을 수 없음
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 시청자 1명
|
||||||
|
other: $n 시청자
|
||||||
|
"@viewers":
|
||||||
|
description: 스트림 시청자 수
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: 익명 사용자
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: 라이브
|
||||||
|
ended: 종료
|
||||||
|
planned: 계획된
|
||||||
|
started: 시작 $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: 채팅 사용 안 함
|
||||||
|
disabled_timeout: "시간 초과가 만료되었습니다: $time"
|
||||||
|
timeout(rich): $mod 시간 초과됨 $user $time
|
||||||
|
"@timeout":
|
||||||
|
description: 시간 초과 이벤트를 표시하는 채팅 메시지
|
||||||
|
ended: 스트림 종료
|
||||||
|
"@ended":
|
||||||
|
description: 채팅 하단의 스트림 종료 푸터
|
||||||
|
zap(rich): $user ZAPP $amount SATS
|
||||||
|
"@zap":
|
||||||
|
description: 채팅 메시지 스트림 끊김 표시
|
||||||
|
write:
|
||||||
|
label: 메시지 작성
|
||||||
|
"@label":
|
||||||
|
description: 채팅 메시지 입력 상자의 라벨
|
||||||
|
no_signer: npub 로그인으로 메시지를 작성할 수 없습니다.
|
||||||
|
"@no_signer":
|
||||||
|
description: 사용자가 공개 키로만 로그인한 경우에 표시되는 채팅 입력 메시지
|
||||||
|
login: 메시지를 보내려면 로그인하세요.
|
||||||
|
"@login":
|
||||||
|
description: 사용자가 로그아웃할 때 표시되는 채팅 입력 메시지
|
||||||
|
badge:
|
||||||
|
awarded_to: 수상 대상
|
||||||
|
"@awarded_to":
|
||||||
|
description: 배지를 받은 사용자 목록으로 이동하기
|
||||||
|
raid:
|
||||||
|
to: RAIDing $name
|
||||||
|
"@to":
|
||||||
|
description: 다른 스트림으로 채팅 레이드 메시지 보내기
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: 다른 스트림의 채팅 레이드 메시지
|
||||||
|
countdown: $time에서 레이드
|
||||||
|
"@countdown":
|
||||||
|
description: 자동 레이드를 위한 카운트다운 타이머
|
||||||
|
goal:
|
||||||
|
title: "목표: $amount"
|
||||||
|
remaining: "남음: $amount"
|
||||||
|
complete: 완료
|
||||||
|
button:
|
||||||
|
login: 로그인
|
||||||
|
logout: 로그아웃
|
||||||
|
edit_profile: 프로필 수정
|
||||||
|
"@login":
|
||||||
|
description: 로그인 버튼의 버튼 텍스트
|
||||||
|
follow: 팔로우
|
||||||
|
"@follow":
|
||||||
|
description: 팔로우 버튼의 버튼 텍스트
|
||||||
|
unfollow: 언팔로우
|
||||||
|
"@unfollow":
|
||||||
|
description: 언팔로우 버튼의 버튼 텍스트
|
||||||
|
mute: 뮤트
|
||||||
|
unmute: 뮤트 해제
|
||||||
|
share: 공유
|
||||||
|
save: 저장
|
||||||
|
embed:
|
||||||
|
article_by: "작성자: $name"
|
||||||
|
note_by: "노트 작성됨: $name"
|
||||||
|
live_stream_by: "라이브 스트리밍: $name"
|
||||||
|
stream_list:
|
||||||
|
following: 팔로잉
|
||||||
|
live: 라이브
|
||||||
|
planned: 계획된
|
||||||
|
ended: 종료됨
|
||||||
|
"@stream_list":
|
||||||
|
description: 실시간/종료/예정 등 스트림 유형별로 스트림 목록의 제목을 표시합니다.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: 사용자 지정 금액
|
||||||
|
confirm: 확인
|
||||||
|
comment: 댓글
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: 지갑에서 열기
|
||||||
|
copy: 클립보드에 복사
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: 잘못된 사용자 지정 금액
|
||||||
|
no_wallet: 라이트닝 월렛이 설치되지 않았습니다.
|
||||||
|
no_lud16: 번개 주소를 찾을 수 없습니다.
|
||||||
|
profile:
|
||||||
|
past_streams: 과거 스트림
|
||||||
|
edit:
|
||||||
|
display_name: 표시 이름
|
||||||
|
about: 정보
|
||||||
|
nip05: 노스트르 주소
|
||||||
|
lud16: 라이트닝 주소
|
||||||
|
error:
|
||||||
|
logged_out: 로그아웃 시 프로필 수정 불가
|
||||||
|
login:
|
||||||
|
username: 사용자 이름
|
||||||
|
amber: Amber로 로그인
|
||||||
|
key: 키로 로그인
|
||||||
|
create: 계정 만들기
|
||||||
|
error:
|
||||||
|
invalid_key: 잘못된 키
|
125
lib/i18n/translated/nl.i18n.yaml
Normal file
125
lib/i18n/translated/nl.i18n.yaml
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
upload_avatar: Avatar uploaden
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Tekst die de gebruiker vraagt om op de avatar-plaatshouder te
|
||||||
|
klikken om te beginnen met uploaden
|
||||||
|
most_zapped_streamers: Meeste Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Koers over beursgenoteerde topstreamers door zaps
|
||||||
|
no_user_found: Geen gebruiker gevonden
|
||||||
|
"@no_user_found":
|
||||||
|
description: Geen gebruiker gevonden bij het zoeken
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 kijker
|
||||||
|
other: $n kijkers
|
||||||
|
"@viewers":
|
||||||
|
description: Aantal kijkers van de stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Een anonieme gebruiker
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: GESLOTEN
|
||||||
|
planned: GEPLAND
|
||||||
|
started: Begonnen met $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT UITGESCHAKELD
|
||||||
|
disabled_timeout: "Time-out loopt af: $time"
|
||||||
|
timeout(rich): $mod timed out $user voor $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chatbericht met time-outgebeurtenissen
|
||||||
|
ended: STREAM BEËINDIGD
|
||||||
|
"@ended":
|
||||||
|
description: Voettekst einde stream onderaan chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chatbericht met stream zaps
|
||||||
|
write:
|
||||||
|
label: Schrijf bericht
|
||||||
|
"@label":
|
||||||
|
description: Label op het invoerveld voor chatberichten
|
||||||
|
no_signer: Kan geen berichten schrijven met npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chatinvoerbericht getoond wanneer de gebruiker alleen is ingelogd
|
||||||
|
met pubkey
|
||||||
|
login: Log in om berichten te verzenden
|
||||||
|
"@login":
|
||||||
|
description: Chatinvoerbericht dat wordt weergegeven wanneer de gebruiker is
|
||||||
|
uitgelogd
|
||||||
|
badge:
|
||||||
|
awarded_to: "Toegekend aan:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Kop boven de lijst met gebruikers die een badge hebben gekregen
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid bericht naar een andere stream
|
||||||
|
from: RAID VAN $name
|
||||||
|
"@from":
|
||||||
|
description: Chat invalbericht van een andere stream
|
||||||
|
countdown: Overvallen in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Afteltimer voor automatisch rijden
|
||||||
|
goal:
|
||||||
|
title: "Doel: $amount"
|
||||||
|
remaining: "Overblijvend: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Inloggen
|
||||||
|
logout: Uitloggen
|
||||||
|
edit_profile: Bewerk Profiel
|
||||||
|
"@login":
|
||||||
|
description: Knoptekst voor de aanmeldknop
|
||||||
|
follow: Volgen
|
||||||
|
"@follow":
|
||||||
|
description: Knoptekst voor de volgknop
|
||||||
|
unfollow: Ontvolgen
|
||||||
|
"@unfollow":
|
||||||
|
description: Knoptekst voor de knop Ontvolgen
|
||||||
|
mute: Dempen
|
||||||
|
unmute: Niet langer negeren
|
||||||
|
share: Deel
|
||||||
|
save: Opslaan
|
||||||
|
embed:
|
||||||
|
article_by: Artikel door $name
|
||||||
|
note_by: Opmerking door $name
|
||||||
|
live_stream_by: Live stream via $name
|
||||||
|
stream_list:
|
||||||
|
following: Volgt
|
||||||
|
live: Live
|
||||||
|
planned: Gepland
|
||||||
|
ended: Beëindigd
|
||||||
|
"@stream_list":
|
||||||
|
description: Rubrieken op streamlijsten per streamtype live/beëindigd/gepland etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Aangepast bedrag
|
||||||
|
confirm: Bevestig
|
||||||
|
comment: Opmerking
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Openen in portefeuille
|
||||||
|
copy: Gekopieerd naar klembord
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Ongeldig aangepast bedrag
|
||||||
|
no_wallet: Geen bliksemportemonnee geïnstalleerd
|
||||||
|
no_lud16: Geen bliksemadres gevonden
|
||||||
|
profile:
|
||||||
|
past_streams: Afgelopen Streams
|
||||||
|
edit:
|
||||||
|
display_name: Naam weergeven
|
||||||
|
about: Over ons
|
||||||
|
nip05: Nostr Adres
|
||||||
|
lud16: Lightning adres
|
||||||
|
error:
|
||||||
|
logged_out: Kan profiel niet bewerken als ik ben uitgelogd
|
||||||
|
login:
|
||||||
|
username: Gebruikersnaam
|
||||||
|
amber: Inloggen met Amber
|
||||||
|
key: Inloggen met sleutel
|
||||||
|
create: Account aanmaken
|
||||||
|
error:
|
||||||
|
invalid_key: Ongeldige sleutel
|
122
lib/i18n/translated/no.i18n.yaml
Normal file
122
lib/i18n/translated/no.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: Username
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
125
lib/i18n/translated/pl.i18n.yaml
Normal file
125
lib/i18n/translated/pl.i18n.yaml
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
upload_avatar: Prześlij awatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Tekst zachęcający użytkownika do kliknięcia symbolu zastępczego
|
||||||
|
awatara w celu rozpoczęcia przesyłania.
|
||||||
|
most_zapped_streamers: Większość zapped streamerów
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Przechodzenie nad wymienionymi topowymi streamerami przez zapy
|
||||||
|
no_user_found: Nie znaleziono użytkownika
|
||||||
|
"@no_user_found":
|
||||||
|
description: Nie znaleziono użytkownika podczas wyszukiwania
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 przeglądarka
|
||||||
|
other: $n widzowie
|
||||||
|
"@viewers":
|
||||||
|
description: Liczba widzów strumienia
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Anonimowy użytkownik
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: NA ŻYWO
|
||||||
|
ended: ZAKOŃCZONY
|
||||||
|
planned: PLANOWANE
|
||||||
|
started: Start $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CZAT WYŁĄCZONY
|
||||||
|
disabled_timeout: "Upłynął limit czasu: $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
|
||||||
|
"@ended":
|
||||||
|
description: Stream zakończył stopkę na dole czatu
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Wiadomość na czacie pokazująca zapy strumienia
|
||||||
|
write:
|
||||||
|
label: Napisz wiadomość
|
||||||
|
"@label":
|
||||||
|
description: Etykieta w polu wprowadzania wiadomości czatu
|
||||||
|
no_signer: Nie można pisać wiadomości z loginem npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Komunikat wejściowy czatu wyświetlany, gdy użytkownik jest
|
||||||
|
zalogowany tylko za pomocą klucza pubkey
|
||||||
|
login: Zaloguj się, aby wysyłać wiadomości
|
||||||
|
"@login":
|
||||||
|
description: Komunikat wejściowy czatu wyświetlany, gdy użytkownik jest wylogowany
|
||||||
|
badge:
|
||||||
|
awarded_to: "Przyznano:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Nagłówek nad listą użytkowników, którzy otrzymali odznakę
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Przesyłanie wiadomości na czacie do innego strumienia
|
||||||
|
from: RAID Z $name
|
||||||
|
"@from":
|
||||||
|
description: Nalot na czat z innego strumienia
|
||||||
|
countdown: Naloty w $time
|
||||||
|
"@countdown":
|
||||||
|
description: Zegar odliczający czas do automatycznej jazdy
|
||||||
|
goal:
|
||||||
|
title: "Cel: $amount"
|
||||||
|
remaining: "Pozostałe: $amount"
|
||||||
|
complete: ZAKOŃCZONE
|
||||||
|
button:
|
||||||
|
login: Logowanie
|
||||||
|
logout: Wylogowanie
|
||||||
|
edit_profile: Edytuj profil
|
||||||
|
"@login":
|
||||||
|
description: Tekst przycisku logowania
|
||||||
|
follow: Śledź
|
||||||
|
"@follow":
|
||||||
|
description: Tekst przycisku dla przycisku śledzenia
|
||||||
|
unfollow: Nie obserwuj
|
||||||
|
"@unfollow":
|
||||||
|
description: Tekst przycisku cofnięcia obserwowania
|
||||||
|
mute: Wyciszenie
|
||||||
|
unmute: Wyłącz wyciszenie
|
||||||
|
share: Udział
|
||||||
|
save: Zapisz
|
||||||
|
embed:
|
||||||
|
article_by: Artykuł autorstwa $name
|
||||||
|
note_by: Uwaga $name
|
||||||
|
live_stream_by: Transmisja na żywo przez $name
|
||||||
|
stream_list:
|
||||||
|
following: Następujący
|
||||||
|
live: Na żywo
|
||||||
|
planned: Planowane
|
||||||
|
ended: Zakończony
|
||||||
|
"@stream_list":
|
||||||
|
description: Nagłówki na listach strumieni według typu strumienia na żywo /
|
||||||
|
zakończony / planowany itp.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Kwota niestandardowa
|
||||||
|
confirm: Potwierdzenie
|
||||||
|
comment: Komentarz
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Otwórz w portfelu
|
||||||
|
copy: Skopiowane do schowka
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Nieprawidłowa kwota niestandardowa
|
||||||
|
no_wallet: Brak zainstalowanego portfela Lightning
|
||||||
|
no_lud16: Nie znaleziono adresu pioruna
|
||||||
|
profile:
|
||||||
|
past_streams: Poprzednie strumienie
|
||||||
|
edit:
|
||||||
|
display_name: Wyświetlana nazwa
|
||||||
|
about: O
|
||||||
|
nip05: Adres Nostr
|
||||||
|
lud16: Adres błyskawicy
|
||||||
|
error:
|
||||||
|
logged_out: Nie można edytować profilu po wylogowaniu
|
||||||
|
login:
|
||||||
|
username: Nazwa użytkownika
|
||||||
|
amber: Zaloguj się za pomocą Amber
|
||||||
|
key: Logowanie za pomocą klucza
|
||||||
|
create: Utwórz konto
|
||||||
|
error:
|
||||||
|
invalid_key: Nieprawidłowy klucz
|
125
lib/i18n/translated/pt.i18n.yaml
Normal file
125
lib/i18n/translated/pt.i18n.yaml
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
upload_avatar: Carregar Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Texto solicitando que o usuário clique no espaço reservado do
|
||||||
|
avatar para iniciar o upload
|
||||||
|
most_zapped_streamers: Streamers mais afetados
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Dirigindo-se para as principais serpentinas listadas por zaps
|
||||||
|
no_user_found: Nenhum usuário encontrado
|
||||||
|
"@no_user_found":
|
||||||
|
description: Nenhum usuário foi encontrado durante a pesquisa
|
||||||
|
anon: Anônimo
|
||||||
|
viewers:
|
||||||
|
one: 1 visualizador
|
||||||
|
other: $n espectadores
|
||||||
|
"@viewers":
|
||||||
|
description: Número de espectadores da transmissão
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Um usuário anônimo
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: AO VIVO
|
||||||
|
ended: FINALIZADO
|
||||||
|
planned: PLANEJADO
|
||||||
|
started: Iniciado em $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: BATE-PAPO DESATIVADO
|
||||||
|
disabled_timeout: "O tempo limite expira: $time"
|
||||||
|
timeout(rich): $mod Tempo esgotado $user para $time
|
||||||
|
"@timeout":
|
||||||
|
description: Mensagem de bate-papo mostrando eventos de tempo limite
|
||||||
|
ended: TRANSMISSÃO ENCERRADA
|
||||||
|
"@ended":
|
||||||
|
description: O rodapé do fluxo terminou na parte inferior do bate-papo
|
||||||
|
zap(rich): $user zapeou $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Mensagem de bate-papo mostrando zaps de fluxo
|
||||||
|
write:
|
||||||
|
label: Escrever mensagem
|
||||||
|
"@label":
|
||||||
|
description: Rótulo na caixa de entrada da mensagem de bate-papo
|
||||||
|
no_signer: Não é possível escrever mensagens com o login do npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Mensagem de entrada de bate-papo exibida quando o usuário está
|
||||||
|
conectado apenas com a pubkey
|
||||||
|
login: Faça login para enviar mensagens
|
||||||
|
"@login":
|
||||||
|
description: Mensagem de entrada de chat exibida quando o usuário está desconectado
|
||||||
|
badge:
|
||||||
|
awarded_to: "Prêmio concedido a:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Cabeçalho sobre a lista de usuários que receberam um emblema
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Mensagem de invasão de bate-papo para outro fluxo
|
||||||
|
from: RAID DE $name
|
||||||
|
"@from":
|
||||||
|
description: Mensagem de invasão de bate-papo de outro fluxo
|
||||||
|
countdown: Incursões em $time
|
||||||
|
"@countdown":
|
||||||
|
description: Cronômetro de contagem regressiva para o ataque automático
|
||||||
|
goal:
|
||||||
|
title: "Meta: $amount"
|
||||||
|
remaining: "Restante: $amount"
|
||||||
|
complete: COMPLETO
|
||||||
|
button:
|
||||||
|
login: Entrar
|
||||||
|
logout: Sair
|
||||||
|
edit_profile: Editar perfil
|
||||||
|
"@login":
|
||||||
|
description: Texto do botão para o botão de login
|
||||||
|
follow: Seguir
|
||||||
|
"@follow":
|
||||||
|
description: Texto do botão para o botão Seguir
|
||||||
|
unfollow: Deixar de seguir
|
||||||
|
"@unfollow":
|
||||||
|
description: Texto do botão para o botão deixar de seguir
|
||||||
|
mute: Silenciar
|
||||||
|
unmute: Desmutar
|
||||||
|
share: Compartilhar
|
||||||
|
save: Salvar
|
||||||
|
embed:
|
||||||
|
article_by: Artigo de $name
|
||||||
|
note_by: Nota de $name
|
||||||
|
live_stream_by: Transmissão ao vivo pelo site $name
|
||||||
|
stream_list:
|
||||||
|
following: Seguindo
|
||||||
|
live: Ao vivo
|
||||||
|
planned: Planejado
|
||||||
|
ended: Encerrado
|
||||||
|
"@stream_list":
|
||||||
|
description: Cabeçalhos nas listas de transmissões por tipo de transmissão ao
|
||||||
|
vivo/terminada/planejada etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Valor personalizado
|
||||||
|
confirm: Confirmar
|
||||||
|
comment: Comentar
|
||||||
|
button_zap_ready: Enviar Zap de $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Abrir na carteira
|
||||||
|
copy: Copiado para a área de transferência
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Valor personalizado inválido
|
||||||
|
no_wallet: Nenhuma carteira lightning instalada
|
||||||
|
no_lud16: Nenhum endereço de raio encontrado
|
||||||
|
profile:
|
||||||
|
past_streams: Transmissões Passadas
|
||||||
|
edit:
|
||||||
|
display_name: Nome de exibição
|
||||||
|
about: Sobre
|
||||||
|
nip05: Endereço do Nostr
|
||||||
|
lud16: Endereço Lightning
|
||||||
|
error:
|
||||||
|
logged_out: Não é possível editar o perfil quando se está desconectado
|
||||||
|
login:
|
||||||
|
username: Nome de usuário
|
||||||
|
amber: Faça login com o Amber
|
||||||
|
key: Login com chave
|
||||||
|
create: Criar Conta
|
||||||
|
error:
|
||||||
|
invalid_key: Chave inválida
|
126
lib/i18n/translated/ro.i18n.yaml
Normal file
126
lib/i18n/translated/ro.i18n.yaml
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
upload_avatar: Încărcați Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text care solicită utilizatorului să atingă marcajul avatar pentru
|
||||||
|
a începe încărcarea
|
||||||
|
most_zapped_streamers: Cele mai multe Streamers Zapped
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Cap peste streamers de top enumerate de zaps
|
||||||
|
no_user_found: Niciun utilizator găsit
|
||||||
|
"@no_user_found":
|
||||||
|
description: Nu s-a găsit niciun utilizator la căutare
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 vizualizator
|
||||||
|
other: $n telespectatori
|
||||||
|
"@viewers":
|
||||||
|
description: Numărul de telespectatori ai fluxului
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Un utilizator anonim
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: ÎN DIRECT
|
||||||
|
ended: TERMINAT
|
||||||
|
planned: PLANIFICATE
|
||||||
|
started: A început $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DEZACTIVAT
|
||||||
|
disabled_timeout: "Timpul expiră: $time"
|
||||||
|
timeout(rich): $mod Timed out $user pentru $time
|
||||||
|
"@timeout":
|
||||||
|
description: Mesaj de chat care afișează evenimentele de timeout
|
||||||
|
ended: STREAM ÎNCHEIAT
|
||||||
|
"@ended":
|
||||||
|
description: Stream a încheiat footer-ul în partea de jos a chat-ului
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Mesaj de chat care arată zapsuri de flux
|
||||||
|
write:
|
||||||
|
label: Scrieți mesajul
|
||||||
|
"@label":
|
||||||
|
description: Etichetă pe caseta de introducere a mesajului de chat
|
||||||
|
no_signer: Nu se pot scrie mesaje cu autentificarea npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Mesajul de intrare în chat afișat atunci când utilizatorul este
|
||||||
|
conectat doar cu pubkey
|
||||||
|
login: Vă rugăm să vă autentificați pentru a trimite mesaje
|
||||||
|
"@login":
|
||||||
|
description: Mesajul de intrare în chat afișat atunci când utilizatorul este
|
||||||
|
deconectat
|
||||||
|
badge:
|
||||||
|
awarded_to: "Premiat pentru:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Antet peste lista de utilizatori care au primit o insignă
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat mesaj raid la un alt flux
|
||||||
|
from: RAID DE LA $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid mesaj din alt flux
|
||||||
|
countdown: Raiduri în $time
|
||||||
|
"@countdown":
|
||||||
|
description: Cronometru cu numărătoare inversă pentru auto-raid
|
||||||
|
goal:
|
||||||
|
title: "Obiectiv: $amount"
|
||||||
|
remaining: "Rămase: $amount"
|
||||||
|
complete: COMPLET
|
||||||
|
button:
|
||||||
|
login: Autentificare
|
||||||
|
logout: Ieșire
|
||||||
|
edit_profile: Editare profil
|
||||||
|
"@login":
|
||||||
|
description: Textul butonului pentru butonul de conectare
|
||||||
|
follow: Urmați
|
||||||
|
"@follow":
|
||||||
|
description: Textul butonului pentru butonul de urmărire
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Textul butonului pentru butonul unfollow
|
||||||
|
mute: Mut
|
||||||
|
unmute: Dezactivați
|
||||||
|
share: Share
|
||||||
|
save: Salvați
|
||||||
|
embed:
|
||||||
|
article_by: Articol de $name
|
||||||
|
note_by: Notă de la $name
|
||||||
|
live_stream_by: Transmisiune live prin $name
|
||||||
|
stream_list:
|
||||||
|
following: În urma
|
||||||
|
live: În direct
|
||||||
|
planned: Planificate
|
||||||
|
ended: Încheiat
|
||||||
|
"@stream_list":
|
||||||
|
description: Rubrici pe listele de fluxuri în funcție de tipul fluxului în
|
||||||
|
direct/terminat/planificat etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Sumă personalizată
|
||||||
|
confirm: Confirmați
|
||||||
|
comment: Comentariu
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Deschide în portofel
|
||||||
|
copy: Copiat în clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Sumă personalizată invalidă
|
||||||
|
no_wallet: Nu este instalat niciun portofel Lightning
|
||||||
|
no_lud16: Nu a fost găsită nicio adresă de fulgere
|
||||||
|
profile:
|
||||||
|
past_streams: Fluxuri trecute
|
||||||
|
edit:
|
||||||
|
display_name: Nume afișat
|
||||||
|
about: Despre
|
||||||
|
nip05: Adresa Nostr
|
||||||
|
lud16: Adresa fulgerului
|
||||||
|
error:
|
||||||
|
logged_out: Nu pot edita profilul când sunt deconectat
|
||||||
|
login:
|
||||||
|
username: Nume utilizator
|
||||||
|
amber: Conectați-vă cu Amber
|
||||||
|
key: Autentificare cu cheie
|
||||||
|
create: Creare cont
|
||||||
|
error:
|
||||||
|
invalid_key: Cheie invalidă
|
126
lib/i18n/translated/ru.i18n.yaml
Normal file
126
lib/i18n/translated/ru.i18n.yaml
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
upload_avatar: Загрузить аватар
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Текст, побуждающий пользователя нажать кнопку с изображением
|
||||||
|
аватара, чтобы начать загрузку
|
||||||
|
most_zapped_streamers: Самые прыткие стримеры
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Направляясь по перечисленным верхним стримерам с помощью запс
|
||||||
|
no_user_found: Пользователь не найден
|
||||||
|
"@no_user_found":
|
||||||
|
description: Пользователь не найден при поиске
|
||||||
|
anon: Аноним
|
||||||
|
viewers:
|
||||||
|
one: 1 зритель
|
||||||
|
other: $n зрителей
|
||||||
|
"@viewers":
|
||||||
|
description: Количество зрителей потока
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Анонимный пользователь
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: КОНЕЦ
|
||||||
|
planned: ПЛАНИРУЕМЫЙ
|
||||||
|
started: Начало $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: ЧАТ ОТКЛЮЧЕН
|
||||||
|
disabled_timeout: "Таймаут истекает: $time"
|
||||||
|
timeout(rich): $mod тайм-аут $user для $time
|
||||||
|
"@timeout":
|
||||||
|
description: Сообщение в чате, показывающее события по тайм-ауту
|
||||||
|
ended: ТРАНСЛЯЦИЯ ОКОНЧЕНА
|
||||||
|
"@ended":
|
||||||
|
description: Поток закончился в нижней части чата
|
||||||
|
zap(rich): $user запнул $amount сат
|
||||||
|
"@zap":
|
||||||
|
description: Сообщение в чате, отображающее потоковые зазоры
|
||||||
|
write:
|
||||||
|
label: Написать сообщение
|
||||||
|
"@label":
|
||||||
|
description: Надпись на поле ввода сообщения чата
|
||||||
|
no_signer: Невозможно писать сообщения с логином npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Сообщение о входе в чат, отображаемое при входе пользователя только
|
||||||
|
с pubkey
|
||||||
|
login: Пожалуйста, войдите в систему, чтобы отправлять сообщения
|
||||||
|
"@login":
|
||||||
|
description: Сообщение о входе в чат, отображаемое при выходе пользователя из
|
||||||
|
системы
|
||||||
|
badge:
|
||||||
|
awarded_to: "Награждается:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Заголовок над списком пользователей, награжденных значком
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Сообщение о рейде в чате в другой поток
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Сообщение о рейде в чате из другого потока
|
||||||
|
countdown: Рейды в $time
|
||||||
|
"@countdown":
|
||||||
|
description: Таймер обратного отсчета для автопоездки
|
||||||
|
goal:
|
||||||
|
title: "Цель: $amount"
|
||||||
|
remaining: "Осталось: $amount"
|
||||||
|
complete: КОМПЛЕКТ
|
||||||
|
button:
|
||||||
|
login: Логин
|
||||||
|
logout: Выйти
|
||||||
|
edit_profile: Редактировать профиль
|
||||||
|
"@login":
|
||||||
|
description: Текст кнопки для входа в систему
|
||||||
|
follow: Подписаться
|
||||||
|
"@follow":
|
||||||
|
description: Текст кнопки для кнопки следования
|
||||||
|
unfollow: Отписаться
|
||||||
|
"@unfollow":
|
||||||
|
description: Текст кнопки для кнопки "Развернуть
|
||||||
|
mute: Заглушить
|
||||||
|
unmute: Включить уведомления
|
||||||
|
share: Поделиться
|
||||||
|
save: Сохранить
|
||||||
|
embed:
|
||||||
|
article_by: Статья $name
|
||||||
|
note_by: Заметка на сайте $name
|
||||||
|
live_stream_by: "Прямая трансляция: $name"
|
||||||
|
stream_list:
|
||||||
|
following: Подписки
|
||||||
|
live: Прямой эфир
|
||||||
|
planned: Запланировано
|
||||||
|
ended: Завершено
|
||||||
|
"@stream_list":
|
||||||
|
description: Заголовки в списках потоков по типу потока -
|
||||||
|
живой/законченный/запланированный и т. д.
|
||||||
|
zap:
|
||||||
|
title: Запнуть ($name
|
||||||
|
custom_amount: Пользовательская сумма
|
||||||
|
confirm: Подтвердить
|
||||||
|
comment: Комментарий
|
||||||
|
button_zap_ready: Запнуть $amount сат
|
||||||
|
button_zap: Зап
|
||||||
|
button_open_wallet: Открыть в кошельке
|
||||||
|
copy: Скопировано в буфер обмена
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Недопустимая пользовательская сумма
|
||||||
|
no_wallet: Кошелек молнии не установлен
|
||||||
|
no_lud16: Адрес молнии не найден
|
||||||
|
profile:
|
||||||
|
past_streams: Предыдущие трансляции
|
||||||
|
edit:
|
||||||
|
display_name: Отображаемое имя
|
||||||
|
about: О себе
|
||||||
|
nip05: Nostr адрес
|
||||||
|
lud16: Lightning Адрес
|
||||||
|
error:
|
||||||
|
logged_out: Невозможно редактировать профиль при выходе из системы
|
||||||
|
login:
|
||||||
|
username: Имя пользователя
|
||||||
|
amber: Войти с помощью Amber
|
||||||
|
key: Вход в систему с помощью ключа
|
||||||
|
create: Создать аккаунт
|
||||||
|
error:
|
||||||
|
invalid_key: Неверный ключ
|
122
lib/i18n/translated/sr.i18n.yaml
Normal file
122
lib/i18n/translated/sr.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: Username
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
124
lib/i18n/translated/sv.i18n.yaml
Normal file
124
lib/i18n/translated/sv.i18n.yaml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
upload_avatar: Ladda upp avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text som uppmanar användaren att trycka på avatarplatshållaren för
|
||||||
|
att påbörja uppladdningen
|
||||||
|
most_zapped_streamers: De flesta zappade streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Rubrik över listade toppstreamers av zaps
|
||||||
|
no_user_found: Ingen användare hittades
|
||||||
|
"@no_user_found":
|
||||||
|
description: Ingen användare hittades vid sökning
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 tittare
|
||||||
|
other: $n tittare
|
||||||
|
"@viewers":
|
||||||
|
description: Antal tittare på streamingen
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: En anonym användare
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: AVSLUTAD
|
||||||
|
planned: PLANERADE
|
||||||
|
started: Startade $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT AVSTÄNGD
|
||||||
|
disabled_timeout: "Tidsgränsen går ut: $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
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chattmeddelande som visar strömavbrott
|
||||||
|
write:
|
||||||
|
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":
|
||||||
|
description: Chattinmatningsmeddelande som visas när användaren endast är
|
||||||
|
inloggad med pubkey
|
||||||
|
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
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chatta raidmeddelande 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
|
||||||
|
"@countdown":
|
||||||
|
description: Nedräkningstimer för auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Mål: $amount"
|
||||||
|
remaining: "Kvarvarande: $amount"
|
||||||
|
complete: KOMPLETT
|
||||||
|
button:
|
||||||
|
login: Logga in
|
||||||
|
logout: Logga ut
|
||||||
|
edit_profile: Redigera profil
|
||||||
|
"@login":
|
||||||
|
description: Knapptext för inloggningsknappen
|
||||||
|
follow: Följ
|
||||||
|
"@follow":
|
||||||
|
description: Knapptext för följ-knappen
|
||||||
|
unfollow: Sluta följa
|
||||||
|
"@unfollow":
|
||||||
|
description: Knapptext för avföljningsknappen
|
||||||
|
mute: Tysta
|
||||||
|
unmute: Avtysta
|
||||||
|
share: Dela
|
||||||
|
save: Spara
|
||||||
|
embed:
|
||||||
|
article_by: Artikel av $name
|
||||||
|
note_by: Anteckning av $name
|
||||||
|
live_stream_by: Direktsändning via $name
|
||||||
|
stream_list:
|
||||||
|
following: Följer
|
||||||
|
live: Live
|
||||||
|
planned: Planerade
|
||||||
|
ended: Avslutade
|
||||||
|
"@stream_list":
|
||||||
|
description: Rubriker på strömlistor efter strömtyp live/avslutad/planerad etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Anpassat belopp
|
||||||
|
confirm: Bekräfta
|
||||||
|
comment: Kommentar
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Öppna i plånboken
|
||||||
|
copy: Kopieras till urklipp
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Ogiltigt anpassat belopp
|
||||||
|
no_wallet: Ingen blixtplånbok installerad
|
||||||
|
no_lud16: Ingen blixtadress hittades
|
||||||
|
profile:
|
||||||
|
past_streams: Tidigare streamar
|
||||||
|
edit:
|
||||||
|
display_name: Visa namn
|
||||||
|
about: Om
|
||||||
|
nip05: Nostr Adress
|
||||||
|
lud16: Lightning-adress
|
||||||
|
error:
|
||||||
|
logged_out: Kan inte redigera profil när jag är utloggad
|
||||||
|
login:
|
||||||
|
username: Användarnamn
|
||||||
|
amber: Logga in med Amber
|
||||||
|
key: Logga in med nyckel
|
||||||
|
create: Skapa konto
|
||||||
|
error:
|
||||||
|
invalid_key: Ogiltig nyckel
|
124
lib/i18n/translated/tr.i18n.yaml
Normal file
124
lib/i18n/translated/tr.i18n.yaml
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
upload_avatar: Avatar Yükle
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Kullanıcının yüklemeye başlamak için avatar yer tutucusuna
|
||||||
|
basmasını isteyen metin
|
||||||
|
most_zapped_streamers: En Çok Zaplanan Flamalar
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Zaps tarafından listelenen üst flamalar üzerinde ilerliyor
|
||||||
|
no_user_found: Kullanıcı bulunamadı
|
||||||
|
"@no_user_found":
|
||||||
|
description: Arama yaparken kullanıcı bulunamadı
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 izleyici
|
||||||
|
other: $n izleyiciler
|
||||||
|
"@viewers":
|
||||||
|
description: Akışı izleyenlerin sayısı
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Anonim bir kullanıcı
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: CANLI
|
||||||
|
ended: SONLANDI
|
||||||
|
planned: PLANLANMIŞ
|
||||||
|
started: Başlatıldı $timestamp
|
||||||
|
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":
|
||||||
|
description: Zaman aşımı olaylarını gösteren sohbet mesajı
|
||||||
|
ended: YAYIN SONLANDI
|
||||||
|
"@ended":
|
||||||
|
description: Sohbetin alt kısmında akış sona erdi altbilgisi
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Akış zaplarını gösteren sohbet mesajı
|
||||||
|
write:
|
||||||
|
label: Mesaj yaz
|
||||||
|
"@label":
|
||||||
|
description: Sohbet mesajı giriş kutusundaki etiket
|
||||||
|
no_signer: Npub girişi ile mesaj yazılamıyor
|
||||||
|
"@no_signer":
|
||||||
|
description: Kullanıcı yalnızca pubkey ile oturum açtığında gösterilen sohbet
|
||||||
|
giriş mesajı
|
||||||
|
login: Mesaj göndermek için lütfen giriş yapın
|
||||||
|
"@login":
|
||||||
|
description: Kullanıcı oturumu kapatıldığında gösterilen sohbet giriş mesajı
|
||||||
|
badge:
|
||||||
|
awarded_to: "Ödüllendirildi:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Rozet verilen kullanıcıların listesi üzerinde başlık
|
||||||
|
raid:
|
||||||
|
to: RAIDING ${name}S
|
||||||
|
"@to":
|
||||||
|
description: Başka bir akışa sohbet baskını mesajı
|
||||||
|
from: $name ADRESINDEN RAID
|
||||||
|
"@from":
|
||||||
|
description: Başka bir akıştan sohbet baskını mesajı
|
||||||
|
countdown: $time adresinde baskın
|
||||||
|
"@countdown":
|
||||||
|
description: Otomatik sürüş için geri sayım sayacı
|
||||||
|
goal:
|
||||||
|
title: "Hedef: $amount"
|
||||||
|
remaining: "Kalan: $amount"
|
||||||
|
complete: TAMAMLANDI
|
||||||
|
button:
|
||||||
|
login: Giriş
|
||||||
|
logout: Oturum Kapatma
|
||||||
|
edit_profile: Profil Düzenle
|
||||||
|
"@login":
|
||||||
|
description: Oturum açma düğmesi için düğme metni
|
||||||
|
follow: Takip et
|
||||||
|
"@follow":
|
||||||
|
description: Takip et düğmesi için düğme metni
|
||||||
|
unfollow: Takibi bırak
|
||||||
|
"@unfollow":
|
||||||
|
description: Takibi bırak düğmesi için düğme metni
|
||||||
|
mute: Sessiz
|
||||||
|
unmute: Sesi aç
|
||||||
|
share: Paylaş
|
||||||
|
save: Kaydet
|
||||||
|
embed:
|
||||||
|
article_by: Makale $name
|
||||||
|
note_by: "Not: $name"
|
||||||
|
live_stream_by: "Canlı yayın: $name"
|
||||||
|
stream_list:
|
||||||
|
following: Aşağıdaki
|
||||||
|
live: Canlı
|
||||||
|
planned: Planlanmış
|
||||||
|
ended: Bitti
|
||||||
|
"@stream_list":
|
||||||
|
description: Akış türüne göre akış listelerindeki başlıklar canlı/bitmiş/planlanan vb.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Özel Tutar
|
||||||
|
confirm: Onaylayın
|
||||||
|
comment: Yorum
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Cüzdanda Aç
|
||||||
|
copy: Panoya kopyalandı
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Geçersiz özel tutar
|
||||||
|
no_wallet: Lightning cüzdan yüklü değil
|
||||||
|
no_lud16: Yıldırım adresi bulunamadı
|
||||||
|
profile:
|
||||||
|
past_streams: Geçmiş Akışlar
|
||||||
|
edit:
|
||||||
|
display_name: Ekran Adı
|
||||||
|
about: Hakkında
|
||||||
|
nip05: Nostr Adres
|
||||||
|
lud16: Yıldırım Adres
|
||||||
|
error:
|
||||||
|
logged_out: Çıkış yapıldığında profil düzenlenemiyor
|
||||||
|
login:
|
||||||
|
username: Kullanıcı Adı
|
||||||
|
amber: Amber ile Giriş Yapın
|
||||||
|
key: Anahtar ile Giriş Yapın
|
||||||
|
create: Hesap Oluştur
|
||||||
|
error:
|
||||||
|
invalid_key: Geçersiz anahtar
|
126
lib/i18n/translated/uk.i18n.yaml
Normal file
126
lib/i18n/translated/uk.i18n.yaml
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
upload_avatar: Завантажити аватар
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Текст, що пропонує користувачеві натиснути на заповнювач аватара,
|
||||||
|
щоб почати завантаження
|
||||||
|
most_zapped_streamers: Більшість стримерів, які були під напругою
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Перехід до переліку найкращих стрімерів за запитами
|
||||||
|
no_user_found: Користувача не знайдено
|
||||||
|
"@no_user_found":
|
||||||
|
description: Користувача не знайдено при пошуку
|
||||||
|
anon: Анонім.
|
||||||
|
viewers:
|
||||||
|
one: 1 глядач
|
||||||
|
other: $n глядачі
|
||||||
|
"@viewers":
|
||||||
|
description: Кількість глядачів стріму
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: Анонімний користувач
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: НАЖИВО
|
||||||
|
ended: ЗАКІНЧЕНО
|
||||||
|
planned: ЗАПЛАНОВАНО
|
||||||
|
started: Запустив $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: ЧАТ ВІДКЛЮЧЕНО
|
||||||
|
disabled_timeout: "Тайм-аут закінчився: $time"
|
||||||
|
timeout(rich): $mod таймінг $user для $time
|
||||||
|
"@timeout":
|
||||||
|
description: Повідомлення в чаті про події тайм-ауту
|
||||||
|
ended: СТРІМ ЗАКІНЧИВСЯ
|
||||||
|
"@ended":
|
||||||
|
description: Нижній колонтитул кінця потоку внизу чату
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Повідомлення в чаті, що показує затримки потоку
|
||||||
|
write:
|
||||||
|
label: Написати повідомлення
|
||||||
|
"@label":
|
||||||
|
description: Мітка у вікні введення повідомлення чату
|
||||||
|
no_signer: Неможливо писати повідомлення з логіном npub
|
||||||
|
"@no_signer":
|
||||||
|
description: Повідомлення в чаті, що відображається, коли користувач увійшов до
|
||||||
|
системи лише з ключем pubkey
|
||||||
|
login: Будь ласка, авторизуйтесь, щоб надсилати повідомлення
|
||||||
|
"@login":
|
||||||
|
description: Повідомлення для введення в чаті, що відображається, коли
|
||||||
|
користувач вийшов з системи
|
||||||
|
badge:
|
||||||
|
awarded_to: "Нагороджується:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Над списком користувачів, яким присвоєно бейдж
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Повідомлення про рейд чату в інший потік
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Повідомлення про наліт на чат з іншого потоку
|
||||||
|
countdown: Рейд у $time
|
||||||
|
"@countdown":
|
||||||
|
description: Таймер зворотного відліку для авторейду
|
||||||
|
goal:
|
||||||
|
title: "Мета: $amount"
|
||||||
|
remaining: "Залишилося: $amount"
|
||||||
|
complete: ЗАВЕРШИТИ
|
||||||
|
button:
|
||||||
|
login: Логін
|
||||||
|
logout: Вийти з системи
|
||||||
|
edit_profile: Редагувати профіль
|
||||||
|
"@login":
|
||||||
|
description: Текст для кнопки входу в систему
|
||||||
|
follow: Підпишіться
|
||||||
|
"@follow":
|
||||||
|
description: Текст для кнопки переходу
|
||||||
|
unfollow: Скасувати відповідь
|
||||||
|
"@unfollow":
|
||||||
|
description: Текст для кнопки відписки
|
||||||
|
mute: Вимкнути звук.
|
||||||
|
unmute: Увімкнути звук.
|
||||||
|
share: Поділіться
|
||||||
|
save: Зберегти
|
||||||
|
embed:
|
||||||
|
article_by: Стаття за посиланням $name
|
||||||
|
note_by: Примітка $name
|
||||||
|
live_stream_by: Пряма трансляція на $name
|
||||||
|
stream_list:
|
||||||
|
following: Після того, як
|
||||||
|
live: Наживо
|
||||||
|
planned: Заплановано
|
||||||
|
ended: Закінчилося
|
||||||
|
"@stream_list":
|
||||||
|
description: "Заголовки у списках трансляцій за типом трансляції:
|
||||||
|
наживо/закінчилася/запланована тощо."
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Нестандартна сума
|
||||||
|
confirm: Підтвердити
|
||||||
|
comment: Коментар
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap!
|
||||||
|
button_open_wallet: Відкрити в Гаманці
|
||||||
|
copy: Скопійовано в буфер обміну
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Неправильна сума замовлення
|
||||||
|
no_wallet: Не встановлено гаманець-блискавку
|
||||||
|
no_lud16: Адреса блискавки не знайдена
|
||||||
|
profile:
|
||||||
|
past_streams: Минулі потоки
|
||||||
|
edit:
|
||||||
|
display_name: Ім'я користувача
|
||||||
|
about: Про
|
||||||
|
nip05: Nostr Адреса
|
||||||
|
lud16: Блискавична адреса
|
||||||
|
error:
|
||||||
|
logged_out: Неможливо редагувати профіль, коли ви вийшли з системи
|
||||||
|
login:
|
||||||
|
username: Ім'я користувача
|
||||||
|
amber: Увійдіть за допомогою Amber
|
||||||
|
key: Увійдіть за допомогою ключа
|
||||||
|
create: Створити обліковий запис
|
||||||
|
error:
|
||||||
|
invalid_key: Неправильний ключ
|
122
lib/i18n/translated/vi.i18n.yaml
Normal file
122
lib/i18n/translated/vi.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: Upload Avatar
|
||||||
|
"@upload_avatar":
|
||||||
|
description: Text prompting user to hit avatar placeholder to begin upload
|
||||||
|
most_zapped_streamers: Most Zapped Streamers
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: Heading over listed top streamers by zaps
|
||||||
|
no_user_found: No user found
|
||||||
|
"@no_user_found":
|
||||||
|
description: No user found when searching
|
||||||
|
anon: Anon
|
||||||
|
viewers:
|
||||||
|
one: 1 viewer
|
||||||
|
other: $n viewers
|
||||||
|
"@viewers":
|
||||||
|
description: Number of viewers of the stream
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: An anonymous user
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: LIVE
|
||||||
|
ended: ENDED
|
||||||
|
planned: PLANNED
|
||||||
|
started: Started $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: CHAT DISABLED
|
||||||
|
disabled_timeout: "Timeout expires: $time"
|
||||||
|
timeout(rich): $mod timed out $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: Chat message showing timeout events
|
||||||
|
ended: STREAM ENDED
|
||||||
|
"@ended":
|
||||||
|
description: Stream ended footer at bottom of chat
|
||||||
|
zap(rich): $user zapped $amount sats
|
||||||
|
"@zap":
|
||||||
|
description: Chat message showing stream zaps
|
||||||
|
write:
|
||||||
|
label: Write message
|
||||||
|
"@label":
|
||||||
|
description: Label on the chat message input box
|
||||||
|
no_signer: Can't write messages with npub login
|
||||||
|
"@no_signer":
|
||||||
|
description: Chat input message shown when the user is logged in only with pubkey
|
||||||
|
login: Please login to send messages
|
||||||
|
"@login":
|
||||||
|
description: Chat input message shown when the user is logged out
|
||||||
|
badge:
|
||||||
|
awarded_to: "Awarded to:"
|
||||||
|
"@awarded_to":
|
||||||
|
description: Heading over list of users who are awarded a badge
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: Chat raid message to another stream
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: Chat raid message from another stream
|
||||||
|
countdown: Raiding in $time
|
||||||
|
"@countdown":
|
||||||
|
description: Countdown timer for auto-raiding
|
||||||
|
goal:
|
||||||
|
title: "Goal: $amount"
|
||||||
|
remaining: "Remaining: $amount"
|
||||||
|
complete: COMPLETE
|
||||||
|
button:
|
||||||
|
login: Login
|
||||||
|
logout: Logout
|
||||||
|
edit_profile: Edit Profile
|
||||||
|
"@login":
|
||||||
|
description: Button text for the login button
|
||||||
|
follow: Follow
|
||||||
|
"@follow":
|
||||||
|
description: Button text for the follow button
|
||||||
|
unfollow: Unfollow
|
||||||
|
"@unfollow":
|
||||||
|
description: Button text for the unfollow button
|
||||||
|
mute: Mute
|
||||||
|
unmute: Unmute
|
||||||
|
share: Share
|
||||||
|
save: Save
|
||||||
|
embed:
|
||||||
|
article_by: Article by $name
|
||||||
|
note_by: Note by $name
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: Following
|
||||||
|
live: Live
|
||||||
|
planned: Planned
|
||||||
|
ended: Ended
|
||||||
|
"@stream_list":
|
||||||
|
description: Headings on stream lists by stream type live/ended/planned etc.
|
||||||
|
zap:
|
||||||
|
title: Zap $name
|
||||||
|
custom_amount: Custom Amount
|
||||||
|
confirm: Confirm
|
||||||
|
comment: Comment
|
||||||
|
button_zap_ready: Zap $amount sats
|
||||||
|
button_zap: Zap
|
||||||
|
button_open_wallet: Open in Wallet
|
||||||
|
copy: Copied to clipboard
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: Invalid custom amount
|
||||||
|
no_wallet: No lightning wallet installed
|
||||||
|
no_lud16: No lightning address found
|
||||||
|
profile:
|
||||||
|
past_streams: Past Streams
|
||||||
|
edit:
|
||||||
|
display_name: Display Name
|
||||||
|
about: About
|
||||||
|
nip05: Nostr Address
|
||||||
|
lud16: Lightning Address
|
||||||
|
error:
|
||||||
|
logged_out: Cant edit profile when logged out
|
||||||
|
login:
|
||||||
|
username: Username
|
||||||
|
amber: Login with Amber
|
||||||
|
key: Login with Key
|
||||||
|
create: Create Account
|
||||||
|
error:
|
||||||
|
invalid_key: Invalid key
|
122
lib/i18n/translated/zh.i18n.yaml
Normal file
122
lib/i18n/translated/zh.i18n.yaml
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
upload_avatar: 上傳頭像
|
||||||
|
"@upload_avatar":
|
||||||
|
description: 提示使用者點擊頭像占位符開始上傳的文字
|
||||||
|
most_zapped_streamers: 最多被擊中的溪流
|
||||||
|
"@most_zapped_streamers":
|
||||||
|
description: ヘッドランドから列されている頂幡からずった
|
||||||
|
no_user_found: 未找到使用者
|
||||||
|
"@no_user_found":
|
||||||
|
description: 搜尋時未找到使用者
|
||||||
|
anon: 匿名
|
||||||
|
viewers:
|
||||||
|
one: 1 個檢視器
|
||||||
|
other: $n 觀眾
|
||||||
|
"@viewers":
|
||||||
|
description: 串流的觀看者人數
|
||||||
|
placeholders:
|
||||||
|
n:
|
||||||
|
type: int
|
||||||
|
"@anon":
|
||||||
|
description: 匿名使用者
|
||||||
|
stream:
|
||||||
|
status:
|
||||||
|
live: 直播
|
||||||
|
ended: 結束
|
||||||
|
planned: 計劃
|
||||||
|
started: 開始 $timestamp
|
||||||
|
chat:
|
||||||
|
disabled: 關閉聊天
|
||||||
|
disabled_timeout: 超時過期: $time
|
||||||
|
timeout(rich): $mod 超時 $user for $time
|
||||||
|
"@timeout":
|
||||||
|
description: 顯示逾時事件的聊天訊息
|
||||||
|
ended: 串流結束
|
||||||
|
"@ended":
|
||||||
|
description: 聊天底部的流結束頁尾
|
||||||
|
zap(rich): $user 打閃了 $amount 聰
|
||||||
|
"@zap":
|
||||||
|
description: 聊天訊息顯示串流斷點
|
||||||
|
write:
|
||||||
|
label: 寫訊息
|
||||||
|
"@label":
|
||||||
|
description: 聊天訊息輸入方塊上的標籤
|
||||||
|
no_signer: 無法使用 npub 登入撰寫訊息
|
||||||
|
"@no_signer":
|
||||||
|
description: 當使用者僅使用 pubkey 登入時,會顯示聊天輸入訊息
|
||||||
|
login: 請登入以傳送訊息
|
||||||
|
"@login":
|
||||||
|
description: 使用者登出時顯示聊天輸入訊息
|
||||||
|
badge:
|
||||||
|
awarded_to: 頒發給
|
||||||
|
"@awarded_to":
|
||||||
|
description: 被授予徽章的使用者清單上的標題
|
||||||
|
raid:
|
||||||
|
to: RAIDING $name
|
||||||
|
"@to":
|
||||||
|
description: 聊天突擊消息到另一個串流
|
||||||
|
from: RAID FROM $name
|
||||||
|
"@from":
|
||||||
|
description: 來自其他串流的聊天突襲訊息
|
||||||
|
countdown: 突襲 $time
|
||||||
|
"@countdown":
|
||||||
|
description: 自動騎乘倒數計時器
|
||||||
|
goal:
|
||||||
|
title: 目標:$amount
|
||||||
|
remaining: 剩餘: $amount
|
||||||
|
complete: 完成
|
||||||
|
button:
|
||||||
|
login: 登錄
|
||||||
|
logout: 登出
|
||||||
|
edit_profile: 編輯個人檔案
|
||||||
|
"@login":
|
||||||
|
description: 登入按鈕的按鈕文字
|
||||||
|
follow: 關注
|
||||||
|
"@follow":
|
||||||
|
description: 跟蹤按鈕的按鈕文字
|
||||||
|
unfollow: 取消關注
|
||||||
|
"@unfollow":
|
||||||
|
description: 取消關注按鈕的按鈕文字
|
||||||
|
mute: 靜音
|
||||||
|
unmute: 解除静音
|
||||||
|
share: 分享
|
||||||
|
save: 保存
|
||||||
|
embed:
|
||||||
|
article_by: 文章來源: $name
|
||||||
|
note_by: $name 的筆記
|
||||||
|
live_stream_by: Live stream by $name
|
||||||
|
stream_list:
|
||||||
|
following: 已關注
|
||||||
|
live: 直播
|
||||||
|
planned: 已計畫
|
||||||
|
ended: 已結束
|
||||||
|
"@stream_list":
|
||||||
|
description: 串流清單上的標題依串流類型為現場/結束/計劃中等。
|
||||||
|
zap:
|
||||||
|
title: 打閃$name
|
||||||
|
custom_amount: 自訂金額
|
||||||
|
confirm: 確認
|
||||||
|
comment: 評論
|
||||||
|
button_zap_ready: 打閃 $amount 聰
|
||||||
|
button_zap: 打閃
|
||||||
|
button_open_wallet: 在錢包中開啟
|
||||||
|
copy: 複製到剪貼簿
|
||||||
|
error:
|
||||||
|
invalid_custom_amount: 無效自訂金額
|
||||||
|
no_wallet: 未安裝閃電錢夾
|
||||||
|
no_lud16: 未找到閃電地址
|
||||||
|
profile:
|
||||||
|
past_streams: 過去的直播
|
||||||
|
edit:
|
||||||
|
display_name: 顯示名稱
|
||||||
|
about: 關於
|
||||||
|
nip05: Nostr 地址
|
||||||
|
lud16: 閃電地址
|
||||||
|
error:
|
||||||
|
logged_out: 登出時無法編輯個人資料
|
||||||
|
login:
|
||||||
|
username: 用戶名
|
||||||
|
amber: 使用 Amber 登入
|
||||||
|
key: 使用鑰匙登入
|
||||||
|
create: 創建帳戶
|
||||||
|
error:
|
||||||
|
invalid_key: 無效按鍵
|
@ -1,7 +1,10 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:convert/convert.dart';
|
import 'package:convert/convert.dart';
|
||||||
import 'package:crypto/crypto.dart';
|
import 'package:crypto/crypto.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
|
||||||
class ImgProxySettings {
|
class ImgProxySettings {
|
||||||
final String url;
|
final String url;
|
||||||
@ -12,11 +15,12 @@ class ImgProxySettings {
|
|||||||
|
|
||||||
static ImgProxySettings static() {
|
static ImgProxySettings static() {
|
||||||
return ImgProxySettings(
|
return ImgProxySettings(
|
||||||
url: "https://imgproxy.v0l.io",
|
url: "https://imgproxy.v0l.io",
|
||||||
key:
|
key:
|
||||||
"a82fcf26aa0ccb55dfc6b4bd6a1c90744d3be0f38429f21a8828b43449ce7cebe6bdc2b09a827311bef37b18ce35cb1e6b1c60387a254541afa9e5b4264ae942",
|
"a82fcf26aa0ccb55dfc6b4bd6a1c90744d3be0f38429f21a8828b43449ce7cebe6bdc2b09a827311bef37b18ce35cb1e6b1c60387a254541afa9e5b4264ae942",
|
||||||
salt:
|
salt:
|
||||||
"a897770d9abf163de055e9617891214e75a9016d748f8ef865e6ffbcb9ed932295659549773a22a019a5f06d0b440c320be411e3fddfe784e199e4f03d74bd9b");
|
"a897770d9abf163de055e9617891214e75a9016d748f8ef865e6ffbcb9ed932295659549773a22a019a5f06d0b440c320be411e3fddfe784e199e4f03d74bd9b",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,8 +39,14 @@ String signUrl(String u, ImgProxySettings settings) {
|
|||||||
return urlSafe(base64.encode(result.bytes));
|
return urlSafe(base64.encode(result.bytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
String proxyImg(BuildContext context, String url,
|
String proxyImg(
|
||||||
{ImgProxySettings? settings, int? resize, String? sha256, double? dpr}) {
|
BuildContext context,
|
||||||
|
String url, {
|
||||||
|
ImgProxySettings? settings,
|
||||||
|
int? resize,
|
||||||
|
String? sha256,
|
||||||
|
double? dpr,
|
||||||
|
}) {
|
||||||
final s = settings ?? ImgProxySettings.static();
|
final s = settings ?? ImgProxySettings.static();
|
||||||
|
|
||||||
if (url.startsWith("data:") || url.startsWith("blob:") || url.isEmpty) {
|
if (url.startsWith("data:") || url.startsWith("blob:") || url.isEmpty) {
|
||||||
@ -63,4 +73,47 @@ String proxyImg(BuildContext context, String url,
|
|||||||
final sig = signUrl(path, s);
|
final sig = signUrl(path, s);
|
||||||
|
|
||||||
return '${s.url}/$sig$path';
|
return '${s.url}/$sig$path';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ProxyImg extends StatelessWidget {
|
||||||
|
final String? url;
|
||||||
|
|
||||||
|
/// Size of the placeholder & error images
|
||||||
|
final double? placeholderSize;
|
||||||
|
|
||||||
|
/// request imgproxy to resize the image
|
||||||
|
final int? resize;
|
||||||
|
|
||||||
|
final double? width;
|
||||||
|
final double? height;
|
||||||
|
|
||||||
|
const ProxyImg({
|
||||||
|
super.key,
|
||||||
|
required this.url,
|
||||||
|
this.placeholderSize,
|
||||||
|
this.resize,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return CachedNetworkImage(
|
||||||
|
imageUrl: proxyImg(context, url ?? "", resize: resize),
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
placeholderFadeInDuration: Duration.zero,
|
||||||
|
fadeOutDuration: Duration.zero,
|
||||||
|
placeholder:
|
||||||
|
(ctx, url) =>
|
||||||
|
SvgPicture.asset("assets/svg/logo.svg", height: placeholderSize),
|
||||||
|
errorWidget:
|
||||||
|
(context, url, error) => SvgPicture.asset(
|
||||||
|
"assets/svg/logo.svg",
|
||||||
|
height: placeholderSize,
|
||||||
|
colorFilter: ColorFilter.mode(WARNING, BlendMode.srcATop),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -12,8 +12,14 @@ class LoginAccount {
|
|||||||
final AccountType type;
|
final AccountType type;
|
||||||
final String pubkey;
|
final String pubkey;
|
||||||
final String? privateKey;
|
final String? privateKey;
|
||||||
|
final List<String>? signerRelays;
|
||||||
|
|
||||||
LoginAccount._({required this.type, required this.pubkey, this.privateKey});
|
LoginAccount._({
|
||||||
|
required this.type,
|
||||||
|
required this.pubkey,
|
||||||
|
this.privateKey,
|
||||||
|
this.signerRelays,
|
||||||
|
});
|
||||||
|
|
||||||
static LoginAccount nip19(String key) {
|
static LoginAccount nip19(String key) {
|
||||||
final keyData = bech32ToHex(key);
|
final keyData = bech32ToHex(key);
|
||||||
@ -42,6 +48,19 @@ class LoginAccount {
|
|||||||
return LoginAccount._(type: AccountType.externalSigner, pubkey: key);
|
return LoginAccount._(type: AccountType.externalSigner, pubkey: key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LoginAccount bunker(
|
||||||
|
String privateKey,
|
||||||
|
String pubkey,
|
||||||
|
List<String> relays,
|
||||||
|
) {
|
||||||
|
return LoginAccount._(
|
||||||
|
type: AccountType.externalSigner,
|
||||||
|
pubkey: pubkey,
|
||||||
|
privateKey: privateKey,
|
||||||
|
signerRelays: relays,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static Map<String, dynamic> toJson(LoginAccount? acc) => {
|
static Map<String, dynamic> toJson(LoginAccount? acc) => {
|
||||||
"type": acc?.type.name,
|
"type": acc?.type.name,
|
||||||
"pubKey": acc?.pubkey,
|
"pubKey": acc?.pubkey,
|
||||||
@ -53,9 +72,11 @@ class LoginAccount {
|
|||||||
if ((json["pubKey"] as String).length != 64) {
|
if ((json["pubKey"] as String).length != 64) {
|
||||||
throw "Invalid pubkey, length != 64";
|
throw "Invalid pubkey, length != 64";
|
||||||
}
|
}
|
||||||
if (json.containsKey("privateKey") &&
|
if (json.containsKey("privateKey")) {
|
||||||
(json["privateKey"] as String).length != 64) {
|
final privKey = json["privateKey"] as String?;
|
||||||
throw "Invalid privateKey, length != 64";
|
if (privKey != null && privKey.length != 64) {
|
||||||
|
throw "Invalid privateKey, length != 64";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return LoginAccount._(
|
return LoginAccount._(
|
||||||
type: AccountType.values.firstWhere(
|
type: AccountType.values.firstWhere(
|
||||||
@ -75,14 +96,17 @@ class LoginData extends ValueNotifier<LoginAccount?> {
|
|||||||
|
|
||||||
LoginData() : super(null) {
|
LoginData() : super(null) {
|
||||||
super.addListener(() async {
|
super.addListener(() async {
|
||||||
final data = json.encode(LoginAccount.toJson(value));
|
if (value != null) {
|
||||||
await _storage.write(key: _storageKey, value: data);
|
final data = json.encode(LoginAccount.toJson(value));
|
||||||
|
await _storage.write(key: _storageKey, value: data);
|
||||||
|
} else {
|
||||||
|
await _storage.delete(key: _storageKey);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> logout() async {
|
void logout() {
|
||||||
super.value = null;
|
super.value = null;
|
||||||
await _storage.delete(key: _storageKey);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> load() async {
|
Future<void> load() async {
|
||||||
@ -95,4 +119,4 @@ class LoginData extends ValueNotifier<LoginAccount?> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
159
lib/main.dart
159
lib/main.dart
@ -1,154 +1,23 @@
|
|||||||
import 'package:amberflutter/amberflutter.dart';
|
import 'dart:developer' as developer;
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
import 'package:ndk/ndk.dart';
|
import 'package:zap_stream_flutter/app.dart';
|
||||||
import 'package:ndk_amber/ndk_amber.dart';
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
import 'package:ndk_objectbox/ndk_objectbox.dart';
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
import 'package:ndk_rust_verifier/ndk_rust_verifier.dart';
|
import 'package:zap_stream_flutter/notifications.dart';
|
||||||
import 'package:zap_stream_flutter/pages/login.dart';
|
|
||||||
import 'package:zap_stream_flutter/pages/login_input.dart';
|
|
||||||
import 'package:zap_stream_flutter/pages/new_account.dart';
|
|
||||||
import 'package:zap_stream_flutter/pages/profile.dart';
|
|
||||||
import 'package:zap_stream_flutter/pages/stream.dart';
|
|
||||||
import 'package:zap_stream_flutter/theme.dart';
|
|
||||||
import 'package:zap_stream_flutter/utils.dart';
|
|
||||||
|
|
||||||
import 'login.dart';
|
|
||||||
import 'pages/home.dart';
|
|
||||||
import 'pages/layout.dart';
|
|
||||||
|
|
||||||
class NoVerify extends EventVerifier {
|
|
||||||
@override
|
|
||||||
Future<bool> verify(Nip01Event event) {
|
|
||||||
return Future.value(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final ndkCache = DbObjectBox();
|
|
||||||
final eventVerifier = kDebugMode ? NoVerify() : RustEventVerifier();
|
|
||||||
var ndk = Ndk(NdkConfig(eventVerifier: eventVerifier, cache: ndkCache, bootstrapRelays: defaultRelays));
|
|
||||||
|
|
||||||
const userAgent = "zap.stream/1.0";
|
|
||||||
const defaultRelays = [
|
|
||||||
"wss://nos.lol",
|
|
||||||
"wss://relay.damus.io",
|
|
||||||
"wss://relay.primal.net",
|
|
||||||
"wss://relay.snort.social"
|
|
||||||
];
|
|
||||||
const searchRelays = ["wss://relay.nostr.band", "wss://search.nos.today"];
|
|
||||||
|
|
||||||
final loginData = LoginData();
|
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
LocaleSettings.useDeviceLocale();
|
||||||
|
await dotenv.load(fileName: kDebugMode ? ".env.development" : ".env");
|
||||||
|
|
||||||
// reload / cache login data
|
await initLogin();
|
||||||
loginData.addListener(() {
|
|
||||||
if (loginData.value != null) {
|
setupNotifications().catchError((e) {
|
||||||
final pubkey = loginData.value!.pubkey;
|
developer.log("Failed to setup notifications: $e");
|
||||||
if (!ndk.accounts.hasAccount(pubkey)) {
|
|
||||||
switch (loginData.value!.type) {
|
|
||||||
case AccountType.privateKey:
|
|
||||||
ndk.accounts.loginPrivateKey(
|
|
||||||
pubkey: pubkey,
|
|
||||||
privkey: loginData.value!.privateKey!,
|
|
||||||
);
|
|
||||||
case AccountType.externalSigner:
|
|
||||||
ndk.accounts.loginExternalSigner(
|
|
||||||
signer: AmberEventSigner(
|
|
||||||
publicKey: pubkey,
|
|
||||||
amberFlutterDS: AmberFlutterDS(Amberflutter()),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
case AccountType.publicKey:
|
|
||||||
ndk.accounts.loginPublicKey(pubkey: pubkey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ndk.metadata.loadMetadata(pubkey);
|
|
||||||
ndk.follows.getContactList(pubkey);
|
|
||||||
} else {
|
|
||||||
ndk.accounts.logout();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
await loginData.load();
|
runZapStream();
|
||||||
|
|
||||||
runApp(
|
|
||||||
MaterialApp.router(
|
|
||||||
theme: ThemeData.localize(
|
|
||||||
ThemeData(colorScheme: ColorScheme.dark(), highlightColor: PRIMARY_1),
|
|
||||||
TextTheme(),
|
|
||||||
),
|
|
||||||
routerConfig: GoRouter(
|
|
||||||
routes: [
|
|
||||||
StatefulShellRoute.indexedStack(
|
|
||||||
builder:
|
|
||||||
(context, state, navigationShell) =>
|
|
||||||
SafeArea(child: LayoutScreen(navigationShell)),
|
|
||||||
branches: [
|
|
||||||
StatefulShellBranch(
|
|
||||||
routes: [
|
|
||||||
GoRoute(path: "/", builder: (ctx, state) => HomePage()),
|
|
||||||
ShellRoute(
|
|
||||||
builder: (context, state, child) {
|
|
||||||
return Container(
|
|
||||||
margin: EdgeInsets.only(top: 50),
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 5),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
spacing: 20,
|
|
||||||
children: [
|
|
||||||
Center(
|
|
||||||
child: Image.asset(
|
|
||||||
"assets/logo.png",
|
|
||||||
height: 150,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child,
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
routes: [
|
|
||||||
GoRoute(
|
|
||||||
path: "/login",
|
|
||||||
builder: (ctx, state) => LoginPage(),
|
|
||||||
routes: [
|
|
||||||
GoRoute(
|
|
||||||
path: "key",
|
|
||||||
builder: (ctx, state) => LoginInputPage(),
|
|
||||||
),
|
|
||||||
GoRoute(
|
|
||||||
path: "new",
|
|
||||||
builder: (context, state) => NewAccountPage(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
GoRoute(
|
|
||||||
path: "/e/:id",
|
|
||||||
builder: (ctx, state) {
|
|
||||||
if (state.extra is StreamEvent) {
|
|
||||||
return StreamPage(stream: state.extra as StreamEvent);
|
|
||||||
} else {
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
GoRoute(
|
|
||||||
path: "/p/:id",
|
|
||||||
builder: (ctx, state) {
|
|
||||||
return ProfilePage(pubkey: state.pathParameters["id"]!);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
208
lib/notifications.dart
Normal file
208
lib/notifications.dart
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:developer' as developer;
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:convert/convert.dart';
|
||||||
|
import 'package:crypto/crypto.dart';
|
||||||
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||||
|
import 'package:ndk/ndk.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/utils.dart';
|
||||||
|
|
||||||
|
class Notepush {
|
||||||
|
final String base;
|
||||||
|
final EventSigner signer;
|
||||||
|
|
||||||
|
Notepush(this.base, {required this.signer});
|
||||||
|
|
||||||
|
Future<String> register(String token) async {
|
||||||
|
final pubkey = signer.getPublicKey();
|
||||||
|
final url =
|
||||||
|
"$base/user-info/$pubkey/${Uri.encodeComponent(token)}?backend=fcm";
|
||||||
|
final rsp = await _sendPutRequest(url);
|
||||||
|
return rsp.body;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<String>> getWatchedKeys() async {
|
||||||
|
final pubkey = signer.getPublicKey();
|
||||||
|
final url = "$base/user-info/$pubkey/notify";
|
||||||
|
final rsp = await _sendGetRequest(url);
|
||||||
|
final List<dynamic> obj = JsonCodec().decode(rsp.body);
|
||||||
|
return List<String>.from(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> watchPubkey(String target, List<int> kinds) async {
|
||||||
|
final pubkey = signer.getPublicKey();
|
||||||
|
final url = "$base/user-info/$pubkey/notify/$target";
|
||||||
|
await _sendPutRequest(url, body: {"kinds": kinds});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> removeWatchPubkey(String target) async {
|
||||||
|
final pubkey = signer.getPublicKey();
|
||||||
|
final url = "$base/user-info/$pubkey/notify/$target";
|
||||||
|
await _sendDeleteRequest(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setNotificationSettings(String token, List<int> kinds) async {
|
||||||
|
final pubkey = signer.getPublicKey();
|
||||||
|
final url =
|
||||||
|
"$base/user-info/$pubkey/${Uri.encodeComponent(token)}/preference";
|
||||||
|
await _sendPutRequest(url, body: {"kinds": kinds});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<http.Response> _sendPutRequest(String url, {Object? body}) async {
|
||||||
|
final jsonBody = body != null ? JsonCodec().encode(body) : null;
|
||||||
|
final auth = await _makeAuth("PUT", url, body: jsonBody);
|
||||||
|
final rsp = await http
|
||||||
|
.put(
|
||||||
|
Uri.parse(url),
|
||||||
|
body: jsonBody,
|
||||||
|
headers: {
|
||||||
|
"authorization": "Nostr $auth",
|
||||||
|
"accept": "application/json",
|
||||||
|
"content-type": "application/json",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.timeout(Duration(seconds: 10));
|
||||||
|
developer.log(rsp.body);
|
||||||
|
return rsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<http.Response> _sendGetRequest(String url, {Object? body}) async {
|
||||||
|
final jsonBody = body != null ? JsonCodec().encode(body) : null;
|
||||||
|
final auth = await _makeAuth("GET", url, body: jsonBody);
|
||||||
|
final rsp = await http
|
||||||
|
.get(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {
|
||||||
|
"authorization": "Nostr $auth",
|
||||||
|
"accept": "application/json",
|
||||||
|
"content-type": "application/json",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.timeout(Duration(seconds: 10));
|
||||||
|
developer.log(rsp.body);
|
||||||
|
return rsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<http.Response> _sendDeleteRequest(String url, {Object? body}) async {
|
||||||
|
final jsonBody = body != null ? JsonCodec().encode(body) : null;
|
||||||
|
final auth = await _makeAuth("DELETE", url, body: jsonBody);
|
||||||
|
final rsp = await http
|
||||||
|
.delete(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {
|
||||||
|
"authorization": "Nostr $auth",
|
||||||
|
"accept": "application/json",
|
||||||
|
"content-type": "application/json",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.timeout(Duration(seconds: 10));
|
||||||
|
developer.log(rsp.body);
|
||||||
|
return rsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> _makeAuth(String method, String url, {String? body}) async {
|
||||||
|
final pubkey = signer.getPublicKey();
|
||||||
|
var tags = [
|
||||||
|
["u", url],
|
||||||
|
["method", method],
|
||||||
|
];
|
||||||
|
if (body != null) {
|
||||||
|
final hash = hex.encode(sha256.convert(utf8.encode(body)).bytes);
|
||||||
|
tags.add(["payload", hash]);
|
||||||
|
}
|
||||||
|
final authEvent = Nip01Event(
|
||||||
|
pubKey: pubkey,
|
||||||
|
kind: 27235,
|
||||||
|
tags: tags,
|
||||||
|
content: "",
|
||||||
|
);
|
||||||
|
await signer.sign(authEvent);
|
||||||
|
return authEvent.toBase64();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Notepush? getNotificationService() {
|
||||||
|
final signer = ndk.accounts.getLoggedAccount()?.signer;
|
||||||
|
return signer != null
|
||||||
|
? Notepush(dotenv.env["NOTEPUSH_URL"]!, signer: signer)
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setupNotifications() async {
|
||||||
|
await Firebase.initializeApp();
|
||||||
|
|
||||||
|
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()}");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await fbase.setAutoInitEnabled(true);
|
||||||
|
await fbase.setForegroundNotificationPresentationOptions(
|
||||||
|
alert: true,
|
||||||
|
badge: true,
|
||||||
|
sound: true,
|
||||||
|
);
|
||||||
|
await fbase.requestPermission(provisional: true);
|
||||||
|
|
||||||
|
await localNotifications.initialize(
|
||||||
|
InitializationSettings(
|
||||||
|
android: AndroidInitializationSettings("@mipmap/ic_launcher"),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
fbase.onTokenRefresh.listen((token) async {
|
||||||
|
developer.log("NEW TOKEN: $token");
|
||||||
|
await pusher.register(token);
|
||||||
|
await pusher.setNotificationSettings(token, [30_311]);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (Platform.isIOS) {
|
||||||
|
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
|
||||||
|
if (apnsToken == null) {
|
||||||
|
throw "APNS token not availble";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final fcmToken = await FirebaseMessaging.instance.getToken();
|
||||||
|
if (fcmToken == null) {
|
||||||
|
throw "Push token is null";
|
||||||
|
}
|
||||||
|
await pusher.register(fcmToken);
|
||||||
|
await pusher.setNotificationSettings(fcmToken, [30_311]);
|
||||||
|
}
|
||||||
|
}
|
106
lib/pages/category.dart
Normal file
106
lib/pages/category.dart
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:zap_stream_flutter/imgproxy.dart';
|
||||||
|
import 'package:zap_stream_flutter/rx_filter.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/category_top_zapped.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/header.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/pill.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/stream_grid.dart';
|
||||||
|
|
||||||
|
class CategoryPage extends StatelessWidget {
|
||||||
|
final String category;
|
||||||
|
final GameInfo? info;
|
||||||
|
|
||||||
|
const CategoryPage({super.key, required this.category, required this.info});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
margin: EdgeInsets.all(5.0),
|
||||||
|
child: Column(
|
||||||
|
spacing: 16,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
HeaderWidget(),
|
||||||
|
Row(
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
if (info?.coverImage != null)
|
||||||
|
Container(
|
||||||
|
clipBehavior: Clip.antiAlias,
|
||||||
|
constraints: BoxConstraints(maxHeight: 200),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: DEFAULT_BR,
|
||||||
|
color: LAYER_1,
|
||||||
|
),
|
||||||
|
child:
|
||||||
|
info!.coverImage!.startsWith("assets/")
|
||||||
|
? Image.asset(
|
||||||
|
info!.coverImage!,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
)
|
||||||
|
: ProxyImg(url: info!.coverImage!),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
info?.name ?? category,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 24,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (info?.genres != null)
|
||||||
|
Row(
|
||||||
|
spacing: 4,
|
||||||
|
children:
|
||||||
|
info!.genres
|
||||||
|
.map(
|
||||||
|
(g) => PillWidget(
|
||||||
|
color: LAYER_1,
|
||||||
|
child: Text(
|
||||||
|
g,
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
CategoryTopZapped(tag: category),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
RxFilter<Nip01Event>(
|
||||||
|
Key("category-page:$category"),
|
||||||
|
filters: [
|
||||||
|
Filter(
|
||||||
|
kinds: [30_311],
|
||||||
|
limit: 100,
|
||||||
|
tTags: [category.toLowerCase()],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
builder: (ctx, state) {
|
||||||
|
if (state == null) {
|
||||||
|
return SizedBox.shrink();
|
||||||
|
} else {
|
||||||
|
return StreamGrid(events: state);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
45
lib/pages/hashtag.dart
Normal file
45
lib/pages/hashtag.dart
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:zap_stream_flutter/rx_filter.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/category_top_zapped.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/header.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/stream_grid.dart';
|
||||||
|
|
||||||
|
class HashtagPage extends StatelessWidget {
|
||||||
|
final String tag;
|
||||||
|
|
||||||
|
const HashtagPage({super.key, required this.tag});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
margin: EdgeInsets.all(5.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
HeaderWidget(),
|
||||||
|
Text(
|
||||||
|
"#$tag",
|
||||||
|
style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
CategoryTopZapped(tag: tag),
|
||||||
|
RxFilter<Nip01Event>(
|
||||||
|
Key("tags-page:$tag"),
|
||||||
|
filters: [
|
||||||
|
Filter(kinds: [30_311], limit: 100, tTags: [tag.toLowerCase()]),
|
||||||
|
],
|
||||||
|
builder: (ctx, state) {
|
||||||
|
if (state == null) {
|
||||||
|
return SizedBox.shrink();
|
||||||
|
} else {
|
||||||
|
return StreamGrid(events: state);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -13,11 +13,13 @@ class HomePage extends StatelessWidget {
|
|||||||
child: Container(
|
child: Container(
|
||||||
margin: EdgeInsets.all(5.0),
|
margin: EdgeInsets.all(5.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
HeaderWidget(),
|
HeaderWidget(),
|
||||||
RxFilter<Nip01Event>(
|
RxFilter<Nip01Event>(
|
||||||
|
Key("home-page"),
|
||||||
filters: [
|
filters: [
|
||||||
Filter(kinds: [30_311], limit: 50),
|
Filter(kinds: [30_311], limit: 100),
|
||||||
],
|
],
|
||||||
builder: (ctx, state) {
|
builder: (ctx, state) {
|
||||||
if (state == null) {
|
if (state == null) {
|
||||||
@ -27,7 +29,6 @@ class HomePage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
//other stuff..
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:go_router/go_router.dart';
|
|
||||||
|
|
||||||
class LayoutScreen extends StatelessWidget {
|
|
||||||
final StatefulNavigationShell navigationShell;
|
|
||||||
|
|
||||||
const LayoutScreen(this.navigationShell, {super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
body: navigationShell,
|
|
||||||
backgroundColor: Colors.black,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +1,11 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:amberflutter/amberflutter.dart';
|
import 'package:amberflutter/amberflutter.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
import 'package:zap_stream_flutter/login.dart';
|
import 'package:zap_stream_flutter/login.dart';
|
||||||
import 'package:zap_stream_flutter/main.dart';
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
import 'package:zap_stream_flutter/theme.dart';
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
import 'package:zap_stream_flutter/utils.dart';
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/button.dart';
|
import 'package:zap_stream_flutter/widgets/button.dart';
|
||||||
@ -14,31 +17,31 @@ class LoginPage extends StatelessWidget {
|
|||||||
return Column(
|
return Column(
|
||||||
spacing: 20,
|
spacing: 20,
|
||||||
children: [
|
children: [
|
||||||
FutureBuilder(
|
if (Platform.isAndroid)
|
||||||
future: Amberflutter().isAppInstalled(),
|
FutureBuilder(
|
||||||
builder: (ctx, state) {
|
future: Amberflutter().isAppInstalled(),
|
||||||
if (state.data ?? false) {
|
builder: (ctx, state) {
|
||||||
return BasicButton.text(
|
if (state.data ?? false) {
|
||||||
"Login with Amber",
|
return BasicButton.text(
|
||||||
onTap: () async {
|
t.login.amber,
|
||||||
final amber = Amberflutter();
|
onTap: () async {
|
||||||
final result = await amber.getPublicKey();
|
final amber = Amberflutter();
|
||||||
if (result['signature'] != null) {
|
final result = await amber.getPublicKey();
|
||||||
final key = bech32ToHex(result['signature']);
|
if (result['signature'] != null) {
|
||||||
loginData.value = LoginAccount.externalPublicKeyHex(key);
|
final key = bech32ToHex(result['signature']);
|
||||||
ctx.go("/");
|
loginData.value = LoginAccount.externalPublicKeyHex(key);
|
||||||
}
|
if (ctx.mounted) {
|
||||||
},
|
ctx.go("/");
|
||||||
);
|
}
|
||||||
} else {
|
}
|
||||||
return SizedBox.shrink();
|
},
|
||||||
}
|
);
|
||||||
},
|
} else {
|
||||||
),
|
return SizedBox.shrink();
|
||||||
BasicButton.text(
|
}
|
||||||
"Login with Key",
|
},
|
||||||
onTap: () => context.push("/login/key"),
|
),
|
||||||
),
|
BasicButton.text(t.login.key, onTap: () => context.push("/login/key")),
|
||||||
Container(
|
Container(
|
||||||
margin: EdgeInsets.symmetric(vertical: 20),
|
margin: EdgeInsets.symmetric(vertical: 20),
|
||||||
height: 1,
|
height: 1,
|
||||||
@ -47,7 +50,7 @@ class LoginPage extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
BasicButton.text(
|
BasicButton.text(
|
||||||
"Create Account",
|
t.login.create,
|
||||||
onTap: () => context.push("/login/new"),
|
onTap: () => context.push("/login/new"),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
import 'package:zap_stream_flutter/login.dart';
|
import 'package:zap_stream_flutter/login.dart';
|
||||||
import 'package:zap_stream_flutter/main.dart';
|
|
||||||
import 'package:zap_stream_flutter/theme.dart';
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
import 'package:zap_stream_flutter/utils.dart';
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/button.dart';
|
import 'package:zap_stream_flutter/widgets/button.dart';
|
||||||
@ -27,15 +28,23 @@ class _LoginInputPage extends State<LoginInputPage> {
|
|||||||
decoration: InputDecoration(labelText: "npub/nsec"),
|
decoration: InputDecoration(labelText: "npub/nsec"),
|
||||||
),
|
),
|
||||||
BasicButton.text(
|
BasicButton.text(
|
||||||
"Login",
|
t.button.login,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
try {
|
try {
|
||||||
|
if (_controller.text.startsWith("bunker://")) {
|
||||||
|
// not supported yet in ndk
|
||||||
|
setState(() {
|
||||||
|
_error = "Bunker login not supported yet";
|
||||||
|
_controller.clear();
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
final keyData = bech32ToHex(_controller.text);
|
final keyData = bech32ToHex(_controller.text);
|
||||||
if (keyData.isNotEmpty) {
|
if (keyData.isNotEmpty) {
|
||||||
loginData.value = LoginAccount.nip19(_controller.text);
|
loginData.value = LoginAccount.nip19(_controller.text);
|
||||||
context.go("/");
|
context.go("/");
|
||||||
} else {
|
} else {
|
||||||
throw "Invalid key";
|
throw t.login.error.invalid_key;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import 'package:cached_network_image/cached_network_image.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
|
||||||
import 'package:ndk/ndk.dart';
|
import 'package:ndk/ndk.dart';
|
||||||
import 'package:ndk/shared/nips/nip01/bip340.dart';
|
import 'package:ndk/shared/nips/nip01/bip340.dart';
|
||||||
import 'package:ndk/shared/nips/nip01/key_pair.dart';
|
import 'package:ndk/shared/nips/nip01/key_pair.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
import 'package:zap_stream_flutter/login.dart';
|
import 'package:zap_stream_flutter/login.dart';
|
||||||
import 'package:zap_stream_flutter/main.dart';
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
import 'package:zap_stream_flutter/theme.dart';
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/avatar_upload.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/button.dart';
|
import 'package:zap_stream_flutter/widgets/button.dart';
|
||||||
|
|
||||||
class NewAccountPage extends StatefulWidget {
|
class NewAccountPage extends StatefulWidget {
|
||||||
@ -19,28 +19,12 @@ class NewAccountPage extends StatefulWidget {
|
|||||||
|
|
||||||
class _NewAccountPage extends State<NewAccountPage> {
|
class _NewAccountPage extends State<NewAccountPage> {
|
||||||
final TextEditingController _name = TextEditingController();
|
final TextEditingController _name = TextEditingController();
|
||||||
|
final FocusNode _nameFocus = FocusNode();
|
||||||
String? _avatar;
|
String? _avatar;
|
||||||
String? _error;
|
String? _error;
|
||||||
|
bool _loading = false;
|
||||||
final KeyPair _privateKey = Bip340.generatePrivateKey();
|
final KeyPair _privateKey = Bip340.generatePrivateKey();
|
||||||
|
|
||||||
Future<void> _uploadAvatar() async {
|
|
||||||
ndk.accounts.loginPrivateKey(
|
|
||||||
pubkey: _privateKey.publicKey,
|
|
||||||
privkey: _privateKey.privateKey!,
|
|
||||||
);
|
|
||||||
|
|
||||||
final file = await ImagePicker().pickImage(source: ImageSource.gallery);
|
|
||||||
if (file != null) {
|
|
||||||
final upload = await ndk.blossom.uploadBlob(
|
|
||||||
serverUrls: ["https://nostr.download"],
|
|
||||||
data: await file.readAsBytes(),
|
|
||||||
);
|
|
||||||
setState(() {
|
|
||||||
_avatar = upload.first.descriptor!.url;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _login() async {
|
Future<void> _login() async {
|
||||||
if (ndk.accounts.isNotLoggedIn) {
|
if (ndk.accounts.isNotLoggedIn) {
|
||||||
ndk.accounts.loginPrivateKey(
|
ndk.accounts.loginPrivateKey(
|
||||||
@ -63,53 +47,58 @@ class _NewAccountPage extends State<NewAccountPage> {
|
|||||||
return Column(
|
return Column(
|
||||||
spacing: 20,
|
spacing: 20,
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
AvatarUpload(
|
||||||
onTap: () {
|
onUploadStart: () async {
|
||||||
_uploadAvatar().catchError((e) {
|
if (ndk.accounts.isNotLoggedIn) {
|
||||||
setState(() {
|
ndk.accounts.loginPrivateKey(
|
||||||
if (e is String) {
|
pubkey: _privateKey.publicKey,
|
||||||
_error = e;
|
privkey: _privateKey.privateKey!,
|
||||||
}
|
);
|
||||||
});
|
}
|
||||||
|
},
|
||||||
|
onUpload: (i) {
|
||||||
|
setState(() {
|
||||||
|
_avatar = i;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
child: Container(
|
|
||||||
width: 200,
|
|
||||||
height: 200,
|
|
||||||
clipBehavior: Clip.antiAlias,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(200)),
|
|
||||||
color: Color.fromARGB(100, 50, 50, 50),
|
|
||||||
),
|
|
||||||
child:
|
|
||||||
_avatar == null
|
|
||||||
? Center(child: Text("Upload Avatar"))
|
|
||||||
: CachedNetworkImage(imageUrl: _avatar!),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
controller: _name,
|
controller: _name,
|
||||||
decoration: InputDecoration(labelText: "Username"),
|
readOnly: _loading,
|
||||||
|
focusNode: _nameFocus,
|
||||||
|
decoration: InputDecoration(labelText: t.login.username),
|
||||||
),
|
),
|
||||||
BasicButton.text(
|
ValueListenableBuilder(
|
||||||
"Login",
|
valueListenable: _name,
|
||||||
onTap: () {
|
builder: (context, value, child) {
|
||||||
_login()
|
return BasicButton.text(
|
||||||
.then((_) {
|
t.button.login,
|
||||||
loginData.value = LoginAccount.privateKeyHex(
|
disabled: _loading || value.text.isEmpty,
|
||||||
_privateKey.privateKey!,
|
onTap: () {
|
||||||
);
|
setState(() {
|
||||||
context.go("/");
|
_loading = true;
|
||||||
})
|
_nameFocus.unfocus();
|
||||||
.catchError((e) {
|
|
||||||
setState(() {
|
|
||||||
if (e is String) {
|
|
||||||
_error = e;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
_login()
|
||||||
|
.then((_) {
|
||||||
|
loginData.value = LoginAccount.privateKeyHex(
|
||||||
|
_privateKey.privateKey!,
|
||||||
|
);
|
||||||
|
if (context.mounted) {
|
||||||
|
context.go("/");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catchError((e) {
|
||||||
|
setState(() {
|
||||||
|
_loading = false;
|
||||||
|
_error = e is String ? e : e.toString();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
if (_loading) CircularProgressIndicator(),
|
||||||
if (_error != null)
|
if (_error != null)
|
||||||
Text(
|
Text(
|
||||||
_error!,
|
_error!,
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
import 'package:cached_network_image/cached_network_image.dart';
|
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:ndk/ndk.dart';
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
import 'package:zap_stream_flutter/imgproxy.dart';
|
import 'package:zap_stream_flutter/imgproxy.dart';
|
||||||
import 'package:zap_stream_flutter/main.dart';
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
import 'package:zap_stream_flutter/rx_filter.dart';
|
import 'package:zap_stream_flutter/rx_filter.dart';
|
||||||
import 'package:zap_stream_flutter/theme.dart';
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
import 'package:zap_stream_flutter/utils.dart';
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/avatar.dart';
|
import 'package:zap_stream_flutter/widgets/avatar.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/button.dart';
|
import 'package:zap_stream_flutter/widgets/button.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/button_follow.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/header.dart';
|
import 'package:zap_stream_flutter/widgets/header.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/nostr_text.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/profile.dart';
|
import 'package:zap_stream_flutter/widgets/profile.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/stream_grid.dart';
|
import 'package:zap_stream_flutter/widgets/stream_grid.dart';
|
||||||
|
|
||||||
@ -21,6 +23,8 @@ class ProfilePage extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final hexPubkey = bech32ToHex(pubkey);
|
final hexPubkey = bech32ToHex(pubkey);
|
||||||
|
final isMe = ndk.accounts.getPublicKey() == hexPubkey;
|
||||||
|
|
||||||
return ProfileLoaderWidget(hexPubkey, (ctx, state) {
|
return ProfileLoaderWidget(hexPubkey, (ctx, state) {
|
||||||
final profile = state.data ?? Metadata(pubKey: hexPubkey);
|
final profile = state.data ?? Metadata(pubKey: hexPubkey);
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
@ -33,10 +37,7 @@ class ProfilePage extends StatelessWidget {
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
height: 140,
|
height: 140,
|
||||||
width: double.maxFinite,
|
width: double.maxFinite,
|
||||||
child: CachedNetworkImage(
|
child: ProxyImg(url: profile.banner!),
|
||||||
imageUrl: proxyImg(context, profile.banner!),
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Row(
|
Row(
|
||||||
spacing: 8,
|
spacing: 8,
|
||||||
@ -53,9 +54,15 @@ class ProfilePage extends StatelessWidget {
|
|||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Text.rich(
|
||||||
profile.about ?? "",
|
TextSpan(
|
||||||
style: TextStyle(color: LAYER_5),
|
style: TextStyle(color: LAYER_5),
|
||||||
|
children: textToSpans(
|
||||||
|
profile.about ?? "",
|
||||||
|
[],
|
||||||
|
profile.pubKey,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -63,29 +70,37 @@ class ProfilePage extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
if (ndk.accounts.getPublicKey() == hexPubkey)
|
if (isMe)
|
||||||
Row(
|
Row(
|
||||||
|
spacing: 8,
|
||||||
children: [
|
children: [
|
||||||
BasicButton.text(
|
BasicButton.text(
|
||||||
"Logout",
|
t.button.logout,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
loginData.logout();
|
loginData.logout();
|
||||||
|
ndk.accounts.logout();
|
||||||
context.go("/");
|
context.go("/");
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
BasicButton.text(
|
||||||
|
t.button.edit_profile,
|
||||||
|
onTap: () {
|
||||||
|
context.push("/settings/profile");
|
||||||
|
},
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
if (!isMe) FollowButton(pubkey: hexPubkey),
|
||||||
Text(
|
Text(
|
||||||
"Past Streams",
|
t.profile.past_streams,
|
||||||
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600),
|
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600),
|
||||||
),
|
),
|
||||||
|
|
||||||
RxFilter<Nip01Event>(
|
RxFilter<Nip01Event>(
|
||||||
key: Key("profile-streams:$hexPubkey"),
|
Key("profile-streams:$hexPubkey"),
|
||||||
relays: defaultRelays,
|
|
||||||
filters: [
|
filters: [
|
||||||
Filter(kinds: [30_311], limit: 200, pTags: [hexPubkey]),
|
Filter(kinds: [30_311], limit: 100, pTags: [hexPubkey]),
|
||||||
Filter(kinds: [30_311], limit: 200, authors: [hexPubkey]),
|
Filter(kinds: [30_311], limit: 100, authors: [hexPubkey]),
|
||||||
],
|
],
|
||||||
builder: (ctx, state) {
|
builder: (ctx, state) {
|
||||||
return StreamGrid(
|
return StreamGrid(
|
||||||
|
118
lib/pages/settings_profile.dart
Normal file
118
lib/pages/settings_profile.dart
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/avatar_upload.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/button.dart';
|
||||||
|
|
||||||
|
class SettingsProfilePage extends StatelessWidget {
|
||||||
|
final TextEditingController _picture = TextEditingController();
|
||||||
|
final TextEditingController _name = TextEditingController();
|
||||||
|
final TextEditingController _about = TextEditingController();
|
||||||
|
final TextEditingController _nip5 = TextEditingController();
|
||||||
|
final TextEditingController _lud16 = TextEditingController();
|
||||||
|
final ValueNotifier<bool> _loading = ValueNotifier(false);
|
||||||
|
|
||||||
|
SettingsProfilePage({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final pubkey = ndk.accounts.getPublicKey();
|
||||||
|
if (pubkey == null) return Text(t.profile.edit.error.logged_out);
|
||||||
|
|
||||||
|
return FutureBuilder(
|
||||||
|
future: ndk.metadata.loadMetadata(pubkey),
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state.hasData) {
|
||||||
|
_name.text = state.data!.name ?? "";
|
||||||
|
_about.text = state.data!.about ?? "";
|
||||||
|
_nip5.text = state.data!.nip05 ?? "";
|
||||||
|
_lud16.text = state.data!.lud16 ?? "";
|
||||||
|
_picture.text = state.data!.picture ?? "";
|
||||||
|
}
|
||||||
|
return ValueListenableBuilder(
|
||||||
|
valueListenable: _loading,
|
||||||
|
builder: (context, v, _) {
|
||||||
|
return Column(
|
||||||
|
spacing: 16,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
|
child: AvatarUpload(
|
||||||
|
key: Key("avatar:${_picture.text}"),
|
||||||
|
avatar: _picture.text.isEmpty ? null : _picture.text,
|
||||||
|
onUpload: (i) {
|
||||||
|
_picture.text = i;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextField(
|
||||||
|
controller: _name,
|
||||||
|
readOnly: v,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: t.profile.edit.display_name,
|
||||||
|
fillColor: LAYER_1,
|
||||||
|
filled: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextField(
|
||||||
|
controller: _about,
|
||||||
|
readOnly: v,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: t.profile.edit.about,
|
||||||
|
fillColor: LAYER_1,
|
||||||
|
filled: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextField(
|
||||||
|
controller: _nip5,
|
||||||
|
readOnly: v,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: t.profile.edit.nip05,
|
||||||
|
fillColor: LAYER_1,
|
||||||
|
filled: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextField(
|
||||||
|
controller: _lud16,
|
||||||
|
readOnly: v,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: t.profile.edit.lud16,
|
||||||
|
fillColor: LAYER_1,
|
||||||
|
filled: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
BasicButton.text(
|
||||||
|
t.button.save,
|
||||||
|
disabled: v,
|
||||||
|
onTap: () async {
|
||||||
|
_loading.value = true;
|
||||||
|
try {
|
||||||
|
final newMeta = Metadata(
|
||||||
|
pubKey: pubkey,
|
||||||
|
name: _name.text.isEmpty ? null : _name.text,
|
||||||
|
about: _about.text.isEmpty ? null : _about.text,
|
||||||
|
picture: _picture.text.isEmpty ? null : _picture.text,
|
||||||
|
nip05: _nip5.text.isEmpty ? null : _nip5.text,
|
||||||
|
lud16: _lud16.text.isEmpty ? null : _lud16.text,
|
||||||
|
);
|
||||||
|
await ndk.metadata.broadcastMetadata(newMeta);
|
||||||
|
if (context.mounted) {
|
||||||
|
context.pop();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
_loading.value = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if (v) Center(child: CircularProgressIndicator()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,77 +1,138 @@
|
|||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'dart:developer' as developer;
|
||||||
import 'package:chewie/chewie.dart';
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:video_player/video_player.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:ndk/ndk.dart';
|
||||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
import 'package:zap_stream_flutter/imgproxy.dart';
|
import 'package:zap_stream_flutter/imgproxy.dart';
|
||||||
import 'package:zap_stream_flutter/main.dart';
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/rx_filter.dart';
|
||||||
import 'package:zap_stream_flutter/theme.dart';
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
import 'package:zap_stream_flutter/utils.dart';
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/button.dart';
|
import 'package:zap_stream_flutter/widgets/button.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/chat.dart';
|
import 'package:zap_stream_flutter/widgets/chat.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/notifications_button.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/pill.dart';
|
import 'package:zap_stream_flutter/widgets/pill.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/profile.dart';
|
import 'package:zap_stream_flutter/widgets/profile.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/stream_info.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/video_player.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/zap.dart';
|
import 'package:zap_stream_flutter/widgets/zap.dart';
|
||||||
|
|
||||||
class StreamPage extends StatefulWidget {
|
class StreamPage extends StatefulWidget {
|
||||||
|
static const String path = "/e/:id";
|
||||||
final StreamEvent stream;
|
final StreamEvent stream;
|
||||||
|
|
||||||
const StreamPage({super.key, required this.stream});
|
const StreamPage({super.key, required this.stream});
|
||||||
|
|
||||||
|
static Widget loader(String id) {
|
||||||
|
final entity = decodeBech32ToTLVEntity(id);
|
||||||
|
return RxFilter<Nip01Event>(
|
||||||
|
Key("stream-loader:$id"),
|
||||||
|
filters: [entity.toFilter()],
|
||||||
|
builder: (context, state) {
|
||||||
|
final stream = state?.firstWhereOrNull(
|
||||||
|
(e) => e.getDtag() == entity.specialUtf8,
|
||||||
|
);
|
||||||
|
if (stream != null) {
|
||||||
|
return StreamPage(stream: StreamEvent(stream));
|
||||||
|
} else {
|
||||||
|
return Center(
|
||||||
|
child: SizedBox(
|
||||||
|
width: 40,
|
||||||
|
height: 40,
|
||||||
|
child: CircularProgressIndicator(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() => _StreamPage();
|
State<StatefulWidget> createState() => _StreamPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _StreamPage extends State<StreamPage> {
|
class _StreamPage extends State<StreamPage> with RouteAware {
|
||||||
VideoPlayerController? _controller;
|
bool _offScreen = false;
|
||||||
ChewieController? _chewieController;
|
|
||||||
|
bool isWidgetVisible(BuildContext context) {
|
||||||
|
final router = GoRouter.of(context);
|
||||||
|
final currentConfiguration = router.routerDelegate.currentConfiguration;
|
||||||
|
final match = currentConfiguration.matches.lastOrNull;
|
||||||
|
final lastMatch =
|
||||||
|
match is ShellRouteMatch ? match.matches.lastOrNull : match;
|
||||||
|
return lastMatch != null &&
|
||||||
|
(lastMatch.route is GoRoute &&
|
||||||
|
(lastMatch.route as GoRoute).path == StreamPage.path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeDependencies() {
|
||||||
|
super.didChangeDependencies();
|
||||||
|
routeObserver.subscribe(this, ModalRoute.of(context)!);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
|
||||||
|
|
||||||
WakelockPlus.enable();
|
WakelockPlus.enable();
|
||||||
final url = widget.stream.info.stream;
|
super.initState();
|
||||||
|
|
||||||
if (url != null) {
|
|
||||||
if (_controller != null) {
|
|
||||||
_controller!.dispose();
|
|
||||||
}
|
|
||||||
_controller = VideoPlayerController.networkUrl(
|
|
||||||
Uri.parse(url),
|
|
||||||
httpHeaders: Map.from({"user-agent": userAgent}),
|
|
||||||
);
|
|
||||||
() async {
|
|
||||||
await _controller!.initialize();
|
|
||||||
setState(() {
|
|
||||||
_chewieController = ChewieController(
|
|
||||||
videoPlayerController: _controller!,
|
|
||||||
aspectRatio: 16 / 9,
|
|
||||||
autoPlay: true,
|
|
||||||
placeholder:
|
|
||||||
(widget.stream.info.image?.isNotEmpty ?? false)
|
|
||||||
? CachedNetworkImage(
|
|
||||||
imageUrl: proxyImg(context, widget.stream.info.image!),
|
|
||||||
)
|
|
||||||
: null,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
super.dispose();
|
|
||||||
WakelockPlus.disable();
|
WakelockPlus.disable();
|
||||||
if (_controller != null) {
|
routeObserver.unsubscribe(this);
|
||||||
_controller!.dispose();
|
super.dispose();
|
||||||
_controller = null;
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didPush() {
|
||||||
|
setState(() {
|
||||||
|
developer.log("STREAM: ON SCREEN");
|
||||||
|
_offScreen = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didPopNext() {
|
||||||
|
setState(() {
|
||||||
|
developer.log("STREAM: ON SCREEN");
|
||||||
|
_offScreen = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didPushNext() {
|
||||||
|
if (!isWidgetVisible(context)) {
|
||||||
|
setState(() {
|
||||||
|
developer.log("STREAM: OFF SCREEN");
|
||||||
|
_offScreen = true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
return RxFilter<Nip01Event>(
|
||||||
|
Key("stream:event:${widget.stream.aTag}"),
|
||||||
|
relays: widget.stream.info.relays,
|
||||||
|
filters: [
|
||||||
|
Filter(
|
||||||
|
kinds: [widget.stream.event.kind],
|
||||||
|
authors: [widget.stream.event.pubKey],
|
||||||
|
dTags: [widget.stream.event.getDtag()!],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
builder: (ctx, state) {
|
||||||
|
final stream = StreamEvent(state?.firstOrNull ?? widget.stream.event);
|
||||||
|
return _buildStream(context, stream);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildStream(BuildContext context, StreamEvent stream) {
|
||||||
return Column(
|
return Column(
|
||||||
spacing: 4,
|
spacing: 4,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
@ -79,68 +140,80 @@ class _StreamPage extends State<StreamPage> {
|
|||||||
AspectRatio(
|
AspectRatio(
|
||||||
aspectRatio: 16 / 9,
|
aspectRatio: 16 / 9,
|
||||||
child:
|
child:
|
||||||
_chewieController != null
|
(stream.info.stream != null && !_offScreen)
|
||||||
? Chewie(controller: _chewieController!)
|
? VideoPlayerWidget(
|
||||||
: Container(
|
url: stream.info.stream!,
|
||||||
color: LAYER_1,
|
placeholder: stream.info.image,
|
||||||
child:
|
aspectRatio: 16 / 9,
|
||||||
(widget.stream.info.image?.isNotEmpty ?? false)
|
)
|
||||||
? CachedNetworkImage(
|
: (stream.info.image?.isNotEmpty ?? false)
|
||||||
imageUrl: proxyImg(
|
? ProxyImg(url: stream.info.image)
|
||||||
context,
|
: Container(decoration: BoxDecoration(color: LAYER_1)),
|
||||||
widget.stream.info.image!,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: null,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
Text(
|
if (stream.info.title?.isNotEmpty ?? false)
|
||||||
widget.stream.info.title ?? "",
|
Text(
|
||||||
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 18),
|
stream.info.title!,
|
||||||
),
|
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 18),
|
||||||
Row(
|
),
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
ProfileWidget.pubkey(
|
||||||
|
stream.info.host,
|
||||||
children: [
|
children: [
|
||||||
ProfileWidget.pubkey(widget.stream.info.host),
|
NotificationsButtonWidget(stream: widget.stream),
|
||||||
Row(
|
Spacer(),
|
||||||
spacing: 8,
|
BasicButton(
|
||||||
children: [
|
Row(
|
||||||
BasicButton(
|
children: [Icon(Icons.bolt, size: 14), Text(t.zap.button_zap)],
|
||||||
Row(children: [Icon(Icons.bolt, size: 14), Text("Zap")]),
|
),
|
||||||
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 2),
|
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 2),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: PRIMARY_1,
|
color: PRIMARY_1,
|
||||||
borderRadius: DEFAULT_BR,
|
borderRadius: DEFAULT_BR,
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
context: context,
|
context: context,
|
||||||
constraints: BoxConstraints.expand(),
|
constraints: BoxConstraints.expand(),
|
||||||
builder: (ctx) {
|
builder: (ctx) {
|
||||||
return ZapWidget(
|
return SingleChildScrollView(
|
||||||
pubkey: widget.stream.info.host,
|
primary: false,
|
||||||
target: widget.stream.event,
|
child: ZapWidget(
|
||||||
);
|
pubkey: stream.info.host,
|
||||||
},
|
target: stream.event,
|
||||||
|
zapTags:
|
||||||
|
// tag goal onto zap request
|
||||||
|
stream.info.goal != null
|
||||||
|
? [
|
||||||
|
["e", stream.info.goal!],
|
||||||
|
]
|
||||||
|
: null,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
if (stream.info.participants != null)
|
||||||
|
PillWidget(
|
||||||
|
color: LAYER_1,
|
||||||
|
child: Text(
|
||||||
|
t.viewers(n: stream.info.participants!),
|
||||||
|
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w500),
|
||||||
),
|
),
|
||||||
if (widget.stream.info.participants != null)
|
),
|
||||||
PillWidget(
|
GestureDetector(
|
||||||
color: LAYER_1,
|
onTap: () {
|
||||||
child: Text(
|
showModalBottomSheet(
|
||||||
"${widget.stream.info.participants} viewers",
|
context: context,
|
||||||
style: TextStyle(
|
constraints: BoxConstraints.expand(),
|
||||||
fontSize: 12,
|
isScrollControlled: true,
|
||||||
fontWeight: FontWeight.w500,
|
builder: (context) => StreamInfoWidget(stream: stream),
|
||||||
),
|
);
|
||||||
),
|
},
|
||||||
),
|
child: Icon(Icons.info),
|
||||||
],
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Expanded(child: ChatWidget(stream: widget.stream)),
|
Expanded(child: ChatWidget(stream: stream)),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
|
import 'dart:async';
|
||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
import 'dart:developer' as developer;
|
import 'dart:developer' as developer;
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:ndk/ndk.dart';
|
import 'package:ndk/ndk.dart';
|
||||||
import 'package:rxdart/rxdart.dart';
|
import 'package:rxdart/rxdart.dart';
|
||||||
import 'package:zap_stream_flutter/main.dart';
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
|
||||||
/// Reactive filter which builds the widget with a snapshot of the data
|
/// Reactive filter which builds the widget with a snapshot of the data
|
||||||
class RxFilter<T> extends StatefulWidget {
|
class RxFilter<T> extends StatefulWidget {
|
||||||
@ -14,67 +16,133 @@ class RxFilter<T> extends StatefulWidget {
|
|||||||
final T Function(Nip01Event)? mapper;
|
final T Function(Nip01Event)? mapper;
|
||||||
final List<String>? relays;
|
final List<String>? relays;
|
||||||
|
|
||||||
const RxFilter({
|
const RxFilter(
|
||||||
super.key,
|
Key? key, {
|
||||||
required this.filters,
|
required this.filters,
|
||||||
|
this.leaveOpen = false,
|
||||||
required this.builder,
|
required this.builder,
|
||||||
this.mapper,
|
this.mapper,
|
||||||
this.leaveOpen = true,
|
|
||||||
this.relays,
|
this.relays,
|
||||||
});
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() => _RxFilter<T>();
|
State<StatefulWidget> createState() => _RxFilter<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _RxFilter<T> extends State<RxFilter<T>> {
|
class _RxFilter<T> extends State<RxFilter<T>> {
|
||||||
late NdkResponse _response;
|
late final RxFilterState<T> _state;
|
||||||
HashMap<String, (int, T)>? _events;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
_state = RxFilterState<T>(
|
||||||
developer.log("RX:SEDNING ${widget.filters}");
|
|
||||||
_response = ndk.requests.subscription(
|
|
||||||
filters: widget.filters,
|
filters: widget.filters,
|
||||||
cacheRead: true,
|
leaveOpen: widget.leaveOpen,
|
||||||
cacheWrite: true,
|
mapper: widget.mapper,
|
||||||
explicitRelays: widget.relays,
|
relays: widget.relays,
|
||||||
);
|
);
|
||||||
if (!widget.leaveOpen) {
|
/* send spam into chat
|
||||||
|
if (widget.key is ValueKey) {
|
||||||
|
final vk = (widget.key as ValueKey).value as String;
|
||||||
|
if (vk.startsWith("stream:chat:")) {
|
||||||
|
Timer.periodic(Duration(seconds: 1), (_) {
|
||||||
|
final spam = Nip01Event(
|
||||||
|
pubKey:
|
||||||
|
"63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed",
|
||||||
|
kind: 1311,
|
||||||
|
tags: [
|
||||||
|
["a", vk.split(":").last],
|
||||||
|
],
|
||||||
|
content: "SPAM ${DateTime.now()}",
|
||||||
|
);
|
||||||
|
_state.insertEvent(spam);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_state.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return ValueListenableBuilder(
|
||||||
|
valueListenable: _state,
|
||||||
|
builder: (context, state, _) {
|
||||||
|
return widget.builder(context, state);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class RxFilterState<T> extends ChangeNotifier
|
||||||
|
implements ValueListenable<List<T>?> {
|
||||||
|
final List<Filter> filters;
|
||||||
|
final bool leaveOpen;
|
||||||
|
final T Function(Nip01Event)? mapper;
|
||||||
|
final List<String>? relays;
|
||||||
|
HashMap<String, (int, T)>? _events;
|
||||||
|
late final NdkResponse _response;
|
||||||
|
late final StreamSubscription _listener;
|
||||||
|
|
||||||
|
RxFilterState({
|
||||||
|
required this.filters,
|
||||||
|
this.leaveOpen = false,
|
||||||
|
this.mapper,
|
||||||
|
this.relays,
|
||||||
|
}) {
|
||||||
|
developer.log("RX:SEDNING $filters");
|
||||||
|
_response = ndk.requests.subscription(
|
||||||
|
filters: filters,
|
||||||
|
explicitRelays: relays,
|
||||||
|
cacheWrite: true,
|
||||||
|
);
|
||||||
|
if (!leaveOpen) {
|
||||||
_response.future.then((_) {
|
_response.future.then((_) {
|
||||||
developer.log("RX:CLOSING ${widget.filters}");
|
developer.log("RX:CLOSING $filters");
|
||||||
ndk.requests.closeSubscription(_response.requestId);
|
ndk.requests.closeSubscription(_response.requestId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_response.stream
|
_listener = _response.stream
|
||||||
.bufferTime(const Duration(milliseconds: 500))
|
.bufferTime(const Duration(milliseconds: 500))
|
||||||
.where((events) => events.isNotEmpty)
|
.where((events) => events.isNotEmpty)
|
||||||
.handleError((e) {
|
.handleError((e) {
|
||||||
developer.log("RX:ERROR $e");
|
developer.log("RX:ERROR $e");
|
||||||
})
|
})
|
||||||
.listen((events) {
|
.listen((events) {
|
||||||
setState(() {
|
developer.log("RX:GOT ${events.length} events for $filters");
|
||||||
_events ??= HashMap();
|
var didUpdate = false;
|
||||||
developer.log(
|
for (final ev in events) {
|
||||||
"RX:GOT ${events.length} events for ${widget.filters}",
|
if (_replaceInto(ev)) {
|
||||||
);
|
didUpdate = true;
|
||||||
events.forEach(_replaceInto);
|
}
|
||||||
});
|
}
|
||||||
|
if (didUpdate) {
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _replaceInto(Nip01Event ev) {
|
void insertEvent(Nip01Event ev) {
|
||||||
final evKey = _eventKey(ev);
|
if (_replaceInto(ev)) {
|
||||||
final existing = _events?[evKey];
|
notifyListeners();
|
||||||
if (existing == null || existing.$1 < ev.createdAt) {
|
|
||||||
_events?[evKey] = (
|
|
||||||
ev.createdAt,
|
|
||||||
widget.mapper != null ? widget.mapper!(ev) : ev as T,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _replaceInto(Nip01Event ev) {
|
||||||
|
final evKey = _eventKey(ev);
|
||||||
|
_events ??= HashMap();
|
||||||
|
final existing = _events![evKey];
|
||||||
|
if (existing == null || existing.$1 < ev.createdAt) {
|
||||||
|
_events![evKey] = (ev.createdAt, mapper != null ? mapper!(ev) : ev as T);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
String _eventKey(Nip01Event ev) {
|
String _eventKey(Nip01Event ev) {
|
||||||
if ([0, 3].contains(ev.kind) || (ev.kind >= 10000 && ev.kind < 20000)) {
|
if ([0, 3].contains(ev.kind) || (ev.kind >= 10000 && ev.kind < 20000)) {
|
||||||
return "${ev.kind}:${ev.pubKey}";
|
return "${ev.kind}:${ev.pubKey}";
|
||||||
@ -86,16 +154,15 @@ class _RxFilter<T> extends State<RxFilter<T>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
List<T>? get value =>
|
||||||
super.dispose();
|
_events != null ? List<T>.from(_events!.values.map((v) => v.$2)) : null;
|
||||||
|
|
||||||
developer.log("RX:CLOSING ${widget.filters}");
|
|
||||||
ndk.requests.closeSubscription(_response.requestId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
void dispose() {
|
||||||
return widget.builder(context, _events?.values.map((v) => v.$2).toList());
|
developer.log("RX:CLOSING $filters");
|
||||||
|
_listener.cancel();
|
||||||
|
ndk.requests.closeSubscription(_response.requestId);
|
||||||
|
super.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,14 +174,14 @@ class RxFutureFilter<T> extends StatelessWidget {
|
|||||||
final Widget? loadingWidget;
|
final Widget? loadingWidget;
|
||||||
final T Function(Nip01Event)? mapper;
|
final T Function(Nip01Event)? mapper;
|
||||||
|
|
||||||
const RxFutureFilter({
|
const RxFutureFilter(
|
||||||
super.key,
|
Key key, {
|
||||||
required this.filterBuilder,
|
required this.filterBuilder,
|
||||||
required this.builder,
|
required this.builder,
|
||||||
this.mapper,
|
this.mapper,
|
||||||
this.leaveOpen = true,
|
this.leaveOpen = true,
|
||||||
this.loadingWidget,
|
this.loadingWidget,
|
||||||
});
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -123,6 +190,7 @@ class RxFutureFilter<T> extends StatelessWidget {
|
|||||||
builder: (ctx, data) {
|
builder: (ctx, data) {
|
||||||
if (data.hasData) {
|
if (data.hasData) {
|
||||||
return RxFilter<T>(
|
return RxFilter<T>(
|
||||||
|
super.key!,
|
||||||
filters: data.data!,
|
filters: data.data!,
|
||||||
mapper: mapper,
|
mapper: mapper,
|
||||||
builder: builder,
|
builder: builder,
|
||||||
|
339
lib/utils.dart
339
lib/utils.dart
@ -1,7 +1,12 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:bech32/bech32.dart';
|
import 'package:bech32/bech32.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:convert/convert.dart';
|
import 'package:convert/convert.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'package:ndk/ndk.dart';
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:ndk/shared/nips/nip19/hrps.dart';
|
||||||
import 'package:ndk/shared/nips/nip19/nip19.dart';
|
import 'package:ndk/shared/nips/nip19/nip19.dart';
|
||||||
|
|
||||||
/// Container class over event and stream info
|
/// Container class over event and stream info
|
||||||
@ -14,6 +19,23 @@ class StreamEvent {
|
|||||||
return "${event.kind}:${event.pubKey}:${info.id}";
|
return "${event.kind}:${event.pubKey}:${info.id}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the naddr for this stream
|
||||||
|
String get link {
|
||||||
|
final k = event.kind & 0xFFFFFFFF;
|
||||||
|
final idData = utf8.encode(info.id!);
|
||||||
|
final tlv = [
|
||||||
|
TLV(0, idData.length, idData),
|
||||||
|
TLV(2, 32, hex.decode(event.pubKey)),
|
||||||
|
TLV(3, 4, [
|
||||||
|
(k >> 24) & 0xFF,
|
||||||
|
(k >> 16) & 0xFF,
|
||||||
|
(k >> 8) & 0xFF,
|
||||||
|
k & 0xFF,
|
||||||
|
]),
|
||||||
|
];
|
||||||
|
return encodeBech32TLV("naddr", tlv);
|
||||||
|
}
|
||||||
|
|
||||||
StreamEvent(this.event) {
|
StreamEvent(this.event) {
|
||||||
info = extractStreamInfo(event);
|
info = extractStreamInfo(event);
|
||||||
}
|
}
|
||||||
@ -42,6 +64,7 @@ class StreamInfo {
|
|||||||
String? gameId;
|
String? gameId;
|
||||||
GameInfo? gameInfo;
|
GameInfo? gameInfo;
|
||||||
List<String> streams;
|
List<String> streams;
|
||||||
|
List<String>? relays;
|
||||||
|
|
||||||
StreamInfo({
|
StreamInfo({
|
||||||
this.id,
|
this.id,
|
||||||
@ -67,16 +90,16 @@ class StreamInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class GameInfo {
|
class GameInfo {
|
||||||
String id;
|
final String id;
|
||||||
String name;
|
final String name;
|
||||||
List<String> genres;
|
final List<String> genres;
|
||||||
String className;
|
final String? coverImage;
|
||||||
|
|
||||||
GameInfo({
|
const GameInfo({
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.genres,
|
required this.genres,
|
||||||
required this.className,
|
required this.coverImage,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,6 +149,12 @@ StreamInfo extractStreamInfo(Nip01Event ev) {
|
|||||||
matchTag(t, 'starts', (v) => ret.starts = int.tryParse(v));
|
matchTag(t, 'starts', (v) => ret.starts = int.tryParse(v));
|
||||||
matchTag(t, 'ends', (v) => ret.ends = int.tryParse(v));
|
matchTag(t, 'ends', (v) => ret.ends = int.tryParse(v));
|
||||||
matchTag(t, 'service', (v) => ret.service = v);
|
matchTag(t, 'service', (v) => ret.service = v);
|
||||||
|
if (t[0] == "relays") {
|
||||||
|
ret.relays = t.slice(1);
|
||||||
|
if (ret.relays!.isEmpty) {
|
||||||
|
ret.relays = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sortedTags = sortStreamTags(ev.tags);
|
var sortedTags = sortStreamTags(ev.tags);
|
||||||
@ -169,32 +198,32 @@ StreamInfo extractStreamInfo(Nip01Event ev) {
|
|||||||
({GameInfo? gameInfo, String? gameId}) extractGameTag(List<String> tags) {
|
({GameInfo? gameInfo, String? gameId}) extractGameTag(List<String> tags) {
|
||||||
final gameId = tags.firstWhereOrNull((a) => gameTagFormat.hasMatch(a));
|
final gameId = tags.firstWhereOrNull((a) => gameTagFormat.hasMatch(a));
|
||||||
|
|
||||||
final internalGame = AllCategories.firstWhereOrNull(
|
final internalGame = allCategories.firstWhereOrNull(
|
||||||
(a) => gameId == 'internal:${a.id}',
|
(a) => gameId == 'internal:${a.id}',
|
||||||
);
|
);
|
||||||
if (internalGame != null) {
|
if (internalGame != null) {
|
||||||
return (
|
return (
|
||||||
gameInfo: GameInfo(
|
gameInfo: GameInfo(
|
||||||
id: internalGame.id,
|
id: "internal:${internalGame.id}",
|
||||||
name: internalGame.name,
|
name: internalGame.name,
|
||||||
genres: internalGame.tags,
|
genres: internalGame.tags,
|
||||||
className: internalGame.className,
|
coverImage: internalGame.coverImage,
|
||||||
),
|
),
|
||||||
gameId: gameId,
|
gameId: gameId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final lowerTags = tags.map((t) => t.toLowerCase());
|
final lowerTags = tags.map((t) => t.toLowerCase());
|
||||||
final taggedCategory = AllCategories.firstWhereOrNull(
|
final taggedCategory = allCategories.firstWhereOrNull(
|
||||||
(a) => a.tags.any(lowerTags.contains),
|
(a) => a.tags.any(lowerTags.contains),
|
||||||
);
|
);
|
||||||
if (taggedCategory != null) {
|
if (taggedCategory != null) {
|
||||||
return (
|
return (
|
||||||
gameInfo: GameInfo(
|
gameInfo: GameInfo(
|
||||||
id: taggedCategory.id,
|
id: "internal:${taggedCategory.id}",
|
||||||
name: taggedCategory.name,
|
name: taggedCategory.name,
|
||||||
genres: taggedCategory.tags,
|
genres: taggedCategory.tags,
|
||||||
className: taggedCategory.className,
|
coverImage: taggedCategory.coverImage,
|
||||||
),
|
),
|
||||||
gameId: gameId,
|
gameId: gameId,
|
||||||
);
|
);
|
||||||
@ -210,28 +239,89 @@ String getHost(Nip01Event ev) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Category {
|
class Category {
|
||||||
String id;
|
final String id;
|
||||||
String name;
|
final String name;
|
||||||
List<String> tags;
|
final IconData icon;
|
||||||
String className;
|
final List<String> tags;
|
||||||
|
final int order;
|
||||||
|
final String? coverImage;
|
||||||
|
|
||||||
Category({
|
const Category({
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.name,
|
required this.name,
|
||||||
|
required this.icon,
|
||||||
required this.tags,
|
required this.tags,
|
||||||
required this.className,
|
required this.order,
|
||||||
|
this.coverImage,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Category> AllCategories = []; // Implement as needed
|
const List<Category> allCategories = [
|
||||||
|
Category(
|
||||||
|
id: "irl",
|
||||||
|
name: "IRL",
|
||||||
|
icon: Icons.face,
|
||||||
|
tags: ["irl"],
|
||||||
|
order: 0,
|
||||||
|
coverImage: "assets/category/irl.jpeg",
|
||||||
|
),
|
||||||
|
Category(
|
||||||
|
id: "gaming",
|
||||||
|
name: "Gaming",
|
||||||
|
icon: Icons.gamepad,
|
||||||
|
tags: ["gaming"],
|
||||||
|
order: 0,
|
||||||
|
coverImage: "assets/category/gaming.jpeg",
|
||||||
|
),
|
||||||
|
Category(
|
||||||
|
id: "music",
|
||||||
|
name: "Music",
|
||||||
|
icon: Icons.note,
|
||||||
|
tags: ["music", "raido"],
|
||||||
|
order: 0,
|
||||||
|
coverImage: "assets/category/music.jpeg",
|
||||||
|
),
|
||||||
|
Category(
|
||||||
|
id: "talk",
|
||||||
|
name: "Talk",
|
||||||
|
icon: Icons.mic,
|
||||||
|
tags: ["talk", "just-chatting"],
|
||||||
|
order: 0,
|
||||||
|
coverImage: "assets/category/talk.jpeg",
|
||||||
|
),
|
||||||
|
Category(
|
||||||
|
id: "art",
|
||||||
|
name: "Art",
|
||||||
|
icon: Icons.brush,
|
||||||
|
tags: ["art"],
|
||||||
|
order: 0,
|
||||||
|
coverImage: "assets/category/art.jpeg",
|
||||||
|
),
|
||||||
|
Category(
|
||||||
|
id: "gambling",
|
||||||
|
name: "Gambling",
|
||||||
|
icon: Icons.casino,
|
||||||
|
tags: ["gambling", "casino", "slots"],
|
||||||
|
order: 1,
|
||||||
|
),
|
||||||
|
Category(
|
||||||
|
id: "science-and-technology",
|
||||||
|
name: "Science & Technology",
|
||||||
|
icon: Icons.casino,
|
||||||
|
tags: ["science", "tech", "technology"],
|
||||||
|
order: 1,
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
String formatSats(int n) {
|
String formatSats(int n, {int? maxDigits}) {
|
||||||
|
final fmt = NumberFormat();
|
||||||
|
fmt.maximumFractionDigits = maxDigits ?? 2;
|
||||||
if (n >= 1000000) {
|
if (n >= 1000000) {
|
||||||
return "${(n / 1000000).toStringAsFixed(1)}M";
|
return "${fmt.format(n / 1000000)}M";
|
||||||
} else if (n >= 1000) {
|
} else if (n >= 1500) {
|
||||||
return "${(n / 1000).toStringAsFixed(1)}k";
|
return "${fmt.format(n / 1000)}K";
|
||||||
} else {
|
} else {
|
||||||
return "$n";
|
return fmt.format(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,6 +332,57 @@ String zapSum(List<Nip01Event> zaps) {
|
|||||||
return formatSats(total);
|
return formatSats(total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TopZaps {
|
||||||
|
final int sum;
|
||||||
|
final List<ZapReceipt> zaps;
|
||||||
|
|
||||||
|
const TopZaps({required this.sum, required this.zaps});
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, TopZaps> topZapSender(Iterable<ZapReceipt> zaps) {
|
||||||
|
return Map.fromEntries(
|
||||||
|
zaps
|
||||||
|
.where((e) => e.sender != null)
|
||||||
|
.groupListsBy((v) => v.sender!)
|
||||||
|
.entries
|
||||||
|
.map(
|
||||||
|
(v) => MapEntry(
|
||||||
|
v.key,
|
||||||
|
TopZaps(
|
||||||
|
sum: v.value.fold(0, (acc, v) => acc + (v.amountSats ?? 0)),
|
||||||
|
zaps: v.value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, TopZaps> topZapReceiver(Iterable<ZapReceipt> zaps) {
|
||||||
|
return Map.fromEntries(
|
||||||
|
zaps
|
||||||
|
.where((e) => e.recipient != null)
|
||||||
|
.groupListsBy((v) => v.recipient!)
|
||||||
|
.entries
|
||||||
|
.map(
|
||||||
|
(v) => MapEntry(
|
||||||
|
v.key,
|
||||||
|
TopZaps(
|
||||||
|
sum: v.value.fold(0, (acc, v) => acc + (v.amountSats ?? 0)),
|
||||||
|
zaps: v.value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
String formatSecondsToHHMMSS(int seconds) {
|
||||||
|
int hours = seconds ~/ 3600;
|
||||||
|
int minutes = (seconds % 3600) ~/ 60;
|
||||||
|
int remainingSeconds = seconds % 60;
|
||||||
|
|
||||||
|
return '${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}:${remainingSeconds.toString().padLeft(2, '0')}';
|
||||||
|
}
|
||||||
|
|
||||||
String bech32ToHex(String bech32) {
|
String bech32ToHex(String bech32) {
|
||||||
final decoder = Bech32Decoder();
|
final decoder = Bech32Decoder();
|
||||||
final data = decoder.convert(bech32, 10_000);
|
final data = decoder.convert(bech32, 10_000);
|
||||||
@ -254,12 +395,120 @@ String bech32ToHex(String bech32) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/nostr-protocol/nips/blob/master/19.md
|
||||||
|
class TLVTypes {
|
||||||
|
static const int kSpecial = 0;
|
||||||
|
static const int kRelay = 1;
|
||||||
|
static const int kAuthor = 2;
|
||||||
|
static const int kKind = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
class TLVEntity {
|
||||||
|
final String hrp;
|
||||||
|
final List<TLV> data;
|
||||||
|
|
||||||
|
const TLVEntity(this.hrp, this.data);
|
||||||
|
|
||||||
|
TLV? get special {
|
||||||
|
return data.firstWhereOrNull((e) => e.type == TLVTypes.kSpecial);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the special entry as hex
|
||||||
|
String? get specialHex {
|
||||||
|
final r = special;
|
||||||
|
return r != null ? hex.encode(r.value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the special entry as utf8 string
|
||||||
|
String? get specialUtf8 {
|
||||||
|
final r = special;
|
||||||
|
return r != null ? utf8.decode(r.value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int? get kind {
|
||||||
|
final k = data.firstWhereOrNull((e) => e.type == TLVTypes.kKind);
|
||||||
|
return k != null
|
||||||
|
? k.value[0] << 24 | k.value[1] << 16 | k.value[2] << 8 | k.value[3]
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
String? get author {
|
||||||
|
final a = data.firstWhereOrNull((e) => e.type == TLVTypes.kAuthor);
|
||||||
|
return a != null ? hex.encode(a.value) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String>? get relays {
|
||||||
|
final r = data.where((r) => r.type == TLVTypes.kRelay);
|
||||||
|
if (r.isNotEmpty) {
|
||||||
|
return r.map((e) => utf8.decode(e.value)).toList();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Filter toFilter() {
|
||||||
|
var ret = <String, dynamic>{};
|
||||||
|
if (hrp == Hrps.kNaddr) {
|
||||||
|
final dTag = specialUtf8;
|
||||||
|
final kindValue = kind;
|
||||||
|
final authorValue = author;
|
||||||
|
if (dTag == null || kindValue == null || authorValue == null) {
|
||||||
|
throw "Invalid naddr entity, special, kind and author must be set";
|
||||||
|
}
|
||||||
|
ret["#d"] = [dTag];
|
||||||
|
ret["authors"] = [authorValue];
|
||||||
|
ret["kinds"] = [kindValue];
|
||||||
|
} else if (hrp == Hrps.kNevent) {
|
||||||
|
final idValue = specialHex;
|
||||||
|
if (idValue == null) {
|
||||||
|
throw "Invalid nevent, special entry is invalid or missing";
|
||||||
|
}
|
||||||
|
ret["ids"] = [idValue];
|
||||||
|
final kindValue = kind;
|
||||||
|
if (kindValue != null) {
|
||||||
|
ret["kinds"] = [kindValue];
|
||||||
|
}
|
||||||
|
final authorValue = author;
|
||||||
|
if (authorValue != null) {
|
||||||
|
ret["authors"] = [authorValue];
|
||||||
|
}
|
||||||
|
} else if (hrp == Hrps.kNoteId) {
|
||||||
|
final idValue = specialHex;
|
||||||
|
if (idValue == null) {
|
||||||
|
throw "Invalid nevent, special entry is invalid or missing";
|
||||||
|
}
|
||||||
|
ret["ids"] = [idValue];
|
||||||
|
} else {
|
||||||
|
throw "Cant convert $hrp to a filter";
|
||||||
|
}
|
||||||
|
return Filter.fromMap(ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class TLV {
|
class TLV {
|
||||||
final int type;
|
final int type;
|
||||||
final int length;
|
final int length;
|
||||||
final List<int> value;
|
final List<int> value;
|
||||||
|
|
||||||
TLV(this.type, this.length, this.value);
|
TLV(this.type, this.length, this.value);
|
||||||
|
|
||||||
|
void validate() {
|
||||||
|
if (type < 0 || type > 255) {
|
||||||
|
throw ArgumentError('Type must be 0-255 (1 byte)');
|
||||||
|
}
|
||||||
|
if (length < 0 || length > 255) {
|
||||||
|
throw ArgumentError('Length must be 0-255 (1 byte)');
|
||||||
|
}
|
||||||
|
if (length != value.length) {
|
||||||
|
throw ArgumentError(
|
||||||
|
'Length ($length) does not match value length (${value.length})',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
for (var byte in value) {
|
||||||
|
if (byte < 0 || byte > 255) {
|
||||||
|
throw ArgumentError('Value bytes must be 0-255');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<TLV> parseTLV(List<int> data) {
|
List<TLV> parseTLV(List<int> data) {
|
||||||
@ -294,3 +543,45 @@ List<TLV> parseTLV(List<int> data) {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<int> serializeTLV(List<TLV> tlvs) {
|
||||||
|
List<int> result = [];
|
||||||
|
|
||||||
|
for (var tlv in tlvs) {
|
||||||
|
tlv.validate();
|
||||||
|
result.add(tlv.type);
|
||||||
|
result.add(tlv.length);
|
||||||
|
result.addAll(tlv.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Encodes TLV data into a Bech32 string
|
||||||
|
String encodeBech32TLV(String hrp, List<TLV> tlvs) {
|
||||||
|
try {
|
||||||
|
final data8bit = serializeTLV(tlvs);
|
||||||
|
final data5bit = Nip19.convertBits(data8bit, 8, 5, true);
|
||||||
|
final bech32Data = Bech32(hrp, data5bit);
|
||||||
|
return bech32.encode(bech32Data, 10_000);
|
||||||
|
} catch (e) {
|
||||||
|
throw FormatException('Failed to encode Bech32 or TLV: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TLVEntity decodeBech32ToTLVEntity(String input) {
|
||||||
|
final decoder = Bech32Decoder();
|
||||||
|
final data = decoder.convert(input, 10_000);
|
||||||
|
final data8bit = Nip19.convertBits(data.data, 5, 8, false);
|
||||||
|
if (data.hrp != "npub" || data.hrp != "nsec" || data.hrp != "note") {
|
||||||
|
return TLVEntity(data.hrp, parseTLV(data8bit));
|
||||||
|
} else {
|
||||||
|
// convert to basic type using special entry only
|
||||||
|
return TLVEntity(data.hrp, [TLV(0, data8bit.length, data8bit)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Filter aTagToFilter(String tag) {
|
||||||
|
final ts = tag.split(":");
|
||||||
|
return Filter(kinds: [int.parse(ts[0])], authors: [ts[1]], dTags: [ts[2]]);
|
||||||
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import 'package:cached_network_image/cached_network_image.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:ndk/ndk.dart';
|
import 'package:ndk/ndk.dart';
|
||||||
import 'package:zap_stream_flutter/imgproxy.dart';
|
import 'package:zap_stream_flutter/imgproxy.dart';
|
||||||
@ -23,17 +22,13 @@ class AvatarWidget extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final thisSize = size ?? 40;
|
final thisSize = size ?? 40;
|
||||||
return ClipOval(
|
return ClipOval(
|
||||||
child: CachedNetworkImage(
|
child: ProxyImg(
|
||||||
fit: BoxFit.cover,
|
url:
|
||||||
imageUrl: proxyImg(
|
profile.picture ??
|
||||||
context,
|
"https://nostr.api.v0l.io/api/v1/avatar/cyberpunks/${profile.pubKey}",
|
||||||
profile.picture ??
|
resize: thisSize.ceil(),
|
||||||
"https://nostr.api.v0l.io/api/v1/avatar/cyberpunks/${profile.pubKey}",
|
|
||||||
resize: thisSize.ceil(),
|
|
||||||
),
|
|
||||||
height: thisSize,
|
|
||||||
width: thisSize,
|
width: thisSize,
|
||||||
errorWidget: (context, url, error) => Icon(Icons.error),
|
height: thisSize,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
107
lib/widgets/avatar_upload.dart
Normal file
107
lib/widgets/avatar_upload.dart
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:image_picker/image_picker.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
|
||||||
|
class AvatarUpload extends StatefulWidget {
|
||||||
|
final String? avatar;
|
||||||
|
final Future<void> Function()? onUploadStart;
|
||||||
|
final void Function(String)? onUpload;
|
||||||
|
|
||||||
|
const AvatarUpload({
|
||||||
|
super.key,
|
||||||
|
this.onUpload,
|
||||||
|
this.onUploadStart,
|
||||||
|
this.avatar,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _AvatarUpload();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AvatarUpload extends State<AvatarUpload> {
|
||||||
|
String? _avatar;
|
||||||
|
String? _error;
|
||||||
|
bool _loading = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_avatar = widget.avatar;
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String?> _uploadAvatar() async {
|
||||||
|
if (widget.onUploadStart != null) {
|
||||||
|
await widget.onUploadStart!();
|
||||||
|
}
|
||||||
|
final file = await ImagePicker().pickImage(source: ImageSource.gallery);
|
||||||
|
if (file != null) {
|
||||||
|
final upload = await ndk.blossom.uploadBlob(
|
||||||
|
serverUrls: ["https://nostr.download"],
|
||||||
|
data: await file.readAsBytes(),
|
||||||
|
);
|
||||||
|
final imgUrl = upload.first.descriptor!.url;
|
||||||
|
setState(() {
|
||||||
|
_avatar = imgUrl;
|
||||||
|
});
|
||||||
|
return imgUrl;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
_loading = true;
|
||||||
|
});
|
||||||
|
_uploadAvatar()
|
||||||
|
.then((u) {
|
||||||
|
setState(() {
|
||||||
|
_loading = false;
|
||||||
|
});
|
||||||
|
if (widget.onUpload != null && u != null) {
|
||||||
|
widget.onUpload!(u);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catchError((e) {
|
||||||
|
setState(() {
|
||||||
|
_error = e is String ? e : e.toString();
|
||||||
|
_loading = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Column(
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: 200,
|
||||||
|
height: 200,
|
||||||
|
clipBehavior: Clip.antiAlias,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(200)),
|
||||||
|
color: Color.fromARGB(100, 50, 50, 50),
|
||||||
|
),
|
||||||
|
child:
|
||||||
|
_avatar == null
|
||||||
|
? Center(
|
||||||
|
child:
|
||||||
|
_loading
|
||||||
|
? CircularProgressIndicator()
|
||||||
|
: Text(t.upload_avatar),
|
||||||
|
)
|
||||||
|
: CachedNetworkImage(imageUrl: _avatar!),
|
||||||
|
),
|
||||||
|
if (_error != null)
|
||||||
|
Text(
|
||||||
|
_error!,
|
||||||
|
style: TextStyle(color: WARNING, fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,7 @@ class BasicButton extends StatelessWidget {
|
|||||||
final EdgeInsetsGeometry? padding;
|
final EdgeInsetsGeometry? padding;
|
||||||
final EdgeInsetsGeometry? margin;
|
final EdgeInsetsGeometry? margin;
|
||||||
final void Function()? onTap;
|
final void Function()? onTap;
|
||||||
|
final bool? disabled;
|
||||||
|
|
||||||
const BasicButton(
|
const BasicButton(
|
||||||
this.child, {
|
this.child, {
|
||||||
@ -15,25 +16,36 @@ class BasicButton extends StatelessWidget {
|
|||||||
this.padding,
|
this.padding,
|
||||||
this.margin,
|
this.margin,
|
||||||
this.onTap,
|
this.onTap,
|
||||||
|
this.disabled,
|
||||||
});
|
});
|
||||||
|
|
||||||
static text(
|
static Widget text(
|
||||||
String text, {
|
String text, {
|
||||||
BoxDecoration? decoration,
|
BoxDecoration? decoration,
|
||||||
EdgeInsetsGeometry? padding,
|
EdgeInsetsGeometry? padding,
|
||||||
EdgeInsetsGeometry? margin,
|
EdgeInsetsGeometry? margin,
|
||||||
void Function()? onTap,
|
void Function()? onTap,
|
||||||
double? fontSize,
|
double? fontSize,
|
||||||
|
bool? disabled,
|
||||||
|
Icon? icon,
|
||||||
}) {
|
}) {
|
||||||
return BasicButton(
|
return BasicButton(
|
||||||
Text(
|
Text.rich(
|
||||||
text,
|
TextSpan(
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color.fromARGB(255, 255, 255, 255),
|
color: Color.fromARGB(255, 255, 255, 255),
|
||||||
fontSize: fontSize,
|
fontSize: fontSize,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
if (icon != null)
|
||||||
|
WidgetSpan(child: icon, alignment: PlaceholderAlignment.middle),
|
||||||
|
if (icon != null) TextSpan(text: " "),
|
||||||
|
TextSpan(text: text),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
disabled: disabled,
|
||||||
decoration: decoration,
|
decoration: decoration,
|
||||||
padding: padding ?? EdgeInsets.symmetric(vertical: 4, horizontal: 12),
|
padding: padding ?? EdgeInsets.symmetric(vertical: 4, horizontal: 12),
|
||||||
margin: margin,
|
margin: margin,
|
||||||
@ -44,16 +56,20 @@ class BasicButton extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final defaultBr = BorderRadius.all(Radius.circular(100));
|
final defaultBr = BorderRadius.all(Radius.circular(100));
|
||||||
|
final inner = Container(
|
||||||
|
padding: padding,
|
||||||
|
margin: margin,
|
||||||
|
decoration:
|
||||||
|
decoration ?? BoxDecoration(color: LAYER_2, borderRadius: defaultBr),
|
||||||
|
child: Center(child: child),
|
||||||
|
);
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: onTap,
|
onTap: () {
|
||||||
child: Container(
|
if (!(disabled ?? false) && onTap != null) {
|
||||||
padding: padding,
|
onTap!();
|
||||||
margin: margin,
|
}
|
||||||
decoration:
|
},
|
||||||
decoration ??
|
child: (disabled ?? false) ? Opacity(opacity: 0.5, child: inner) : inner,
|
||||||
BoxDecoration(color: LAYER_2, borderRadius: defaultBr),
|
|
||||||
child: Center(child: child),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
93
lib/widgets/button_follow.dart
Normal file
93
lib/widgets/button_follow.dart
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/button.dart';
|
||||||
|
|
||||||
|
class FollowButton extends StatelessWidget {
|
||||||
|
final String pubkey;
|
||||||
|
final void Function()? onTap;
|
||||||
|
final void Function()? onFollow;
|
||||||
|
final void Function()? onUnfollow;
|
||||||
|
final ValueNotifier<bool> _loading = ValueNotifier(false);
|
||||||
|
|
||||||
|
FollowButton({
|
||||||
|
super.key,
|
||||||
|
required this.pubkey,
|
||||||
|
this.onTap,
|
||||||
|
this.onFollow,
|
||||||
|
this.onUnfollow,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final signer = ndk.accounts.getLoggedAccount()?.signer;
|
||||||
|
if (signer == null || signer.getPublicKey() == pubkey) {
|
||||||
|
return SizedBox.shrink();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ValueListenableBuilder(
|
||||||
|
valueListenable: _loading,
|
||||||
|
builder: (context, loading, _) {
|
||||||
|
return FutureBuilder(
|
||||||
|
future: ndk.follows.getContactList(signer.getPublicKey()),
|
||||||
|
builder: (context, state) {
|
||||||
|
final follows = state.data?.contacts ?? [];
|
||||||
|
final isFollowing = follows.contains(pubkey);
|
||||||
|
return BasicButton(
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
loading
|
||||||
|
? SizedBox(
|
||||||
|
height: 16,
|
||||||
|
width: 16,
|
||||||
|
child: CircularProgressIndicator(),
|
||||||
|
)
|
||||||
|
: Icon(
|
||||||
|
isFollowing ? Icons.person_remove : Icons.person_add,
|
||||||
|
size: 16,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
isFollowing
|
||||||
|
? t.button.unfollow
|
||||||
|
: t.button.follow,
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
disabled: loading,
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 4, horizontal: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: DEFAULT_BR,
|
||||||
|
color: LAYER_2,
|
||||||
|
),
|
||||||
|
onTap: () async {
|
||||||
|
_loading.value = true;
|
||||||
|
try {
|
||||||
|
if (onTap != null) {
|
||||||
|
onTap!();
|
||||||
|
}
|
||||||
|
if (isFollowing) {
|
||||||
|
await ndk.follows.broadcastRemoveContact(pubkey);
|
||||||
|
if (onUnfollow != null) {
|
||||||
|
onUnfollow!();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await ndk.follows.broadcastAddContact(pubkey);
|
||||||
|
if (onFollow != null) {
|
||||||
|
onFollow!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
_loading.value = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
110
lib/widgets/category_top_zapped.dart
Normal file
110
lib/widgets/category_top_zapped.dart
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/rx_filter.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/avatar.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/profile.dart';
|
||||||
|
|
||||||
|
class CategoryTopZapped extends StatelessWidget {
|
||||||
|
final String tag;
|
||||||
|
final int? limit;
|
||||||
|
|
||||||
|
const CategoryTopZapped({super.key, required this.tag, this.limit});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
children: [
|
||||||
|
WidgetSpan(
|
||||||
|
child: Icon(Icons.bolt, color: ZAP_1),
|
||||||
|
alignment: PlaceholderAlignment.middle,
|
||||||
|
),
|
||||||
|
TextSpan(
|
||||||
|
text: " ${t.most_zapped_streamers}",
|
||||||
|
style: TextStyle(color: LAYER_4, fontWeight: FontWeight.w500),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SingleChildScrollView(
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
primary: false,
|
||||||
|
child: FutureBuilder(
|
||||||
|
future:
|
||||||
|
ndk.requests
|
||||||
|
.query(
|
||||||
|
filters: [
|
||||||
|
Filter(
|
||||||
|
kinds: [30_311],
|
||||||
|
limit: 100,
|
||||||
|
tTags: [tag.toLowerCase()],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
.future,
|
||||||
|
builder: (context, state) {
|
||||||
|
final aTags =
|
||||||
|
(state.data ?? [])
|
||||||
|
.map((e) => "30311:${e.pubKey}:${e.getDtag()}")
|
||||||
|
.toList();
|
||||||
|
return RxFilter<Nip01Event>(
|
||||||
|
Key("top-zapped:$tag:${aTags.length}"),
|
||||||
|
filters: [
|
||||||
|
Filter(kinds: [9735], aTags: aTags),
|
||||||
|
],
|
||||||
|
builder: (context, zaps) {
|
||||||
|
final parsedZaps =
|
||||||
|
zaps?.map((e) => ZapReceipt.fromEvent(e)) ?? [];
|
||||||
|
final topZapped = topZapReceiver(parsedZaps).entries
|
||||||
|
.sortedBy((e) => e.value.sum)
|
||||||
|
.reversed
|
||||||
|
.take(limit ?? 5);
|
||||||
|
|
||||||
|
return Row(
|
||||||
|
spacing: 16,
|
||||||
|
children:
|
||||||
|
topZapped
|
||||||
|
.map(
|
||||||
|
(e) => Row(
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
AvatarWidget.pubkey(e.key),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
spacing: 2,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
formatSats(e.value.sum, maxDigits: 0),
|
||||||
|
style: TextStyle(
|
||||||
|
color: ZAP_1,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
ProfileNameWidget.pubkey(e.key),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,16 +1,20 @@
|
|||||||
import 'dart:developer' as developer;
|
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:ndk/ndk.dart';
|
import 'package:ndk/ndk.dart';
|
||||||
import 'package:zap_stream_flutter/main.dart';
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
import 'package:zap_stream_flutter/rx_filter.dart';
|
import 'package:zap_stream_flutter/rx_filter.dart';
|
||||||
import 'package:zap_stream_flutter/theme.dart';
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
import 'package:zap_stream_flutter/utils.dart';
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/avatar.dart';
|
import 'package:zap_stream_flutter/widgets/chat_badge.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/nostr_text.dart';
|
import 'package:zap_stream_flutter/widgets/chat_message.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/chat_raid.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/chat_timeout.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/chat_write.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/chat_zap.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/countdown.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/goal.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/profile.dart';
|
import 'package:zap_stream_flutter/widgets/profile.dart';
|
||||||
import 'package:zap_stream_flutter/widgets/profile_modal.dart';
|
|
||||||
|
|
||||||
class ChatWidget extends StatelessWidget {
|
class ChatWidget extends StatelessWidget {
|
||||||
final StreamEvent stream;
|
final StreamEvent stream;
|
||||||
@ -19,87 +23,140 @@ class ChatWidget extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var muteLists = [stream.info.host];
|
var moderators = [stream.info.host];
|
||||||
if (ndk.accounts.getPublicKey() != null) {
|
final myKey = ndk.accounts.getPublicKey();
|
||||||
muteLists.add(ndk.accounts.getPublicKey()!);
|
if (myKey != null) {
|
||||||
|
moderators.add(myKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var filters = [
|
||||||
|
Filter(kinds: [1311, 9735], limit: 200, aTags: [stream.aTag]),
|
||||||
|
Filter(kinds: [1312, 1313], limit: 200, aTags: [stream.aTag]),
|
||||||
|
Filter(kinds: [Nip51List.kMute], authors: moderators),
|
||||||
|
Filter(kinds: [1314], authors: moderators),
|
||||||
|
Filter(kinds: [8], authors: [stream.info.host]),
|
||||||
|
];
|
||||||
return RxFilter<Nip01Event>(
|
return RxFilter<Nip01Event>(
|
||||||
filters: [
|
Key("stream:chat:${stream.aTag}"),
|
||||||
Filter(kinds: [1311, 9735], limit: 200, aTags: [stream.aTag]),
|
relays: stream.info.relays,
|
||||||
Filter(kinds: [Nip51List.kMute], authors: muteLists),
|
filters: filters,
|
||||||
],
|
|
||||||
builder: (ctx, state) {
|
builder: (ctx, state) {
|
||||||
final mutedPubkeys =
|
final now = DateTime.now().millisecondsSinceEpoch / 1000;
|
||||||
|
final firstPassEvents =
|
||||||
(state ?? [])
|
(state ?? [])
|
||||||
.where((e) => e.kind == Nip51List.kMute)
|
.where(
|
||||||
|
(e) => switch (e.kind) {
|
||||||
|
1314 =>
|
||||||
|
moderators.contains(e.pubKey) &&
|
||||||
|
double.parse(e.getFirstTag("expiration")!) >
|
||||||
|
now, // filter timeouts to only people allowed to mute
|
||||||
|
// TODO: check other kinds are valid for this stream
|
||||||
|
_ => true,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.toList();
|
||||||
|
final mutedPubkeys =
|
||||||
|
firstPassEvents
|
||||||
|
.where(
|
||||||
|
(e) =>
|
||||||
|
e.kind == Nip51List.kMute ||
|
||||||
|
(e.kind == 1314 &&
|
||||||
|
e.createdAt < now &&
|
||||||
|
double.parse(e.getFirstTag("expiration")!) > now),
|
||||||
|
)
|
||||||
.map((e) => e.tags)
|
.map((e) => e.tags)
|
||||||
.expand((e) => e)
|
.expand((e) => e)
|
||||||
.where((e) => e[0] == "p")
|
.where((e) => e[0] == "p")
|
||||||
.map((e) => e[1])
|
.map((e) => e[1])
|
||||||
.toSet();
|
.toSet();
|
||||||
|
|
||||||
|
final isChatDisabled = mutedPubkeys.contains(myKey);
|
||||||
final filteredChat =
|
final filteredChat =
|
||||||
(state ?? [])
|
firstPassEvents
|
||||||
.where(
|
.where((e) {
|
||||||
(e) =>
|
final author = switch (e.kind) {
|
||||||
!mutedPubkeys.contains(switch (e.kind) {
|
9735 => ZapReceipt.fromEvent(e).sender ?? e.pubKey,
|
||||||
9735 => ZapReceipt.fromEvent(e).sender ?? e.pubKey,
|
_ => e.pubKey,
|
||||||
_ => e.pubKey,
|
};
|
||||||
}),
|
return moderators.contains(
|
||||||
)
|
author,
|
||||||
|
) || // cant mute self or host
|
||||||
|
!mutedPubkeys.contains(author);
|
||||||
|
})
|
||||||
|
// filter events that are created before stream start time
|
||||||
|
.where((e) => e.createdAt >= (stream.info.starts ?? 0))
|
||||||
.sortedBy((e) => e.createdAt)
|
.sortedBy((e) => e.createdAt)
|
||||||
.reversed
|
.reversed
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
final zaps =
|
||||||
|
filteredChat
|
||||||
|
.where((e) => e.kind == 9735)
|
||||||
|
.map((e) => ZapReceipt.fromEvent(e))
|
||||||
|
.toList();
|
||||||
|
// pubkey -> Set<badge a tag>
|
||||||
|
final badgeAwards = filteredChat
|
||||||
|
.where((e) => e.kind == 8)
|
||||||
|
.map((e) => e.getTags("p").map((p) => (p, e.getFirstTag("a")!)))
|
||||||
|
.expand((v) => v)
|
||||||
|
.groupFoldBy(
|
||||||
|
(e) => e.$1,
|
||||||
|
(Set<String>? acc, v) => (acc ?? {})..add(v.$2),
|
||||||
|
);
|
||||||
|
|
||||||
return Column(
|
return Column(
|
||||||
spacing: 8,
|
spacing: 8,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
_TopZappersWidget(events: filteredChat),
|
if (zaps.isNotEmpty) _TopZappersWidget(events: zaps),
|
||||||
|
if (stream.info.goal != null) GoalWidget.id(stream.info.goal!),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
reverse: true,
|
reverse: true,
|
||||||
shrinkWrap: true,
|
|
||||||
primary: true,
|
|
||||||
itemCount: filteredChat.length,
|
itemCount: filteredChat.length,
|
||||||
itemBuilder:
|
itemBuilder: (ctx, idx) {
|
||||||
(ctx, idx) => switch (filteredChat[idx].kind) {
|
final msg = filteredChat[idx];
|
||||||
1311 => Padding(
|
final widget = switch (msg.kind) {
|
||||||
padding: EdgeInsets.symmetric(
|
1311 => ChatMessageWidget(
|
||||||
horizontal: 2,
|
stream: stream,
|
||||||
vertical: 2,
|
msg: msg,
|
||||||
),
|
badges:
|
||||||
child: _ChatMessageWidget(
|
badgeAwards[msg.pubKey]
|
||||||
stream: stream,
|
?.map(
|
||||||
msg: filteredChat[idx],
|
(a) => ChatBadgeWidget.fromATag(
|
||||||
),
|
a,
|
||||||
),
|
key: Key("${msg.pubKey}:$a"),
|
||||||
9735 => Padding(
|
),
|
||||||
padding: EdgeInsets.symmetric(
|
)
|
||||||
horizontal: 2,
|
.toList(),
|
||||||
vertical: 2,
|
),
|
||||||
),
|
1312 => ChatRaidMessage(event: msg, stream: stream),
|
||||||
child: _ChatZapWidget(
|
1314 => ChatTimeoutWidget(timeout: msg),
|
||||||
stream: stream,
|
9735 => ChatZapWidget(stream: stream, zap: msg),
|
||||||
zap: filteredChat[idx],
|
8 => ChatBadgeAwardWidget(event: msg, stream: stream),
|
||||||
),
|
_ => SizedBox(),
|
||||||
),
|
};
|
||||||
_ => SizedBox.shrink(),
|
|
||||||
},
|
return widget;
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (stream.info.status == StreamStatus.live)
|
if (stream.info.status == StreamStatus.live && !isChatDisabled)
|
||||||
_WriteMessageWidget(stream: stream),
|
WriteMessageWidget(stream: stream),
|
||||||
|
if (stream.info.status == StreamStatus.live && isChatDisabled)
|
||||||
|
_chatDisabled(firstPassEvents),
|
||||||
if (stream.info.status == StreamStatus.ended)
|
if (stream.info.status == StreamStatus.ended)
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.all(8),
|
padding: EdgeInsets.all(8),
|
||||||
margin: EdgeInsets.symmetric(vertical: 8),
|
margin: EdgeInsets.only(bottom: 8, top: 4),
|
||||||
width: double.maxFinite,
|
width: double.maxFinite,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
decoration: BoxDecoration(borderRadius: DEFAULT_BR),
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: DEFAULT_BR,
|
||||||
|
color: PRIMARY_1,
|
||||||
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
"STREAM ENDED",
|
t.stream.chat.ended,
|
||||||
style: TextStyle(fontWeight: FontWeight.bold),
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -108,10 +165,40 @@ class ChatWidget extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _chatDisabled(List<Nip01Event> events) {
|
||||||
|
final myKey = ndk.accounts.getPublicKey();
|
||||||
|
final timeoutEvent = events.firstWhereOrNull(
|
||||||
|
(e) => e.kind == 1314 && e.pTags.contains(myKey),
|
||||||
|
);
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.all(12),
|
||||||
|
width: double.maxFinite,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
decoration: BoxDecoration(color: WARNING),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
t.stream.chat.disabled,
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
if (timeoutEvent != null)
|
||||||
|
CountdownTimer(
|
||||||
|
onTrigger: () => {},
|
||||||
|
format: (time) => t.stream.chat.disabled_timeout(time: time),
|
||||||
|
style: TextStyle(color: LAYER_5),
|
||||||
|
triggerAt: DateTime.fromMillisecondsSinceEpoch(
|
||||||
|
int.parse(timeoutEvent.getFirstTag("expiration")!) * 1000,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _TopZappersWidget extends StatelessWidget {
|
class _TopZappersWidget extends StatelessWidget {
|
||||||
final List<Nip01Event> events;
|
final List<ZapReceipt> events;
|
||||||
|
|
||||||
const _TopZappersWidget({required this.events});
|
const _TopZappersWidget({required this.events});
|
||||||
|
|
||||||
@ -119,8 +206,6 @@ class _TopZappersWidget extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final topZaps =
|
final topZaps =
|
||||||
events
|
events
|
||||||
.where((e) => e.kind == 9735)
|
|
||||||
.map((e) => ZapReceipt.fromEvent(e))
|
|
||||||
.fold(<String, int>{}, (acc, e) {
|
.fold(<String, int>{}, (acc, e) {
|
||||||
if (e.sender != null) {
|
if (e.sender != null) {
|
||||||
acc[e.sender!] = (acc[e.sender!] ?? 0) + e.amountSats!;
|
acc[e.sender!] = (acc[e.sender!] ?? 0) + e.amountSats!;
|
||||||
@ -164,270 +249,3 @@ class _TopZappersWidget extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ChatZapWidget extends StatelessWidget {
|
|
||||||
final StreamEvent stream;
|
|
||||||
final Nip01Event zap;
|
|
||||||
|
|
||||||
const _ChatZapWidget({required this.stream, required this.zap});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final parsed = ZapReceipt.fromEvent(zap);
|
|
||||||
return Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(color: ZAP_1),
|
|
||||||
borderRadius: DEFAULT_BR,
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
_zapperRowZap(parsed),
|
|
||||||
if (parsed.comment?.isNotEmpty ?? false) Text(parsed.comment!),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _zapperRowZap(ZapReceipt parsed) {
|
|
||||||
if (parsed.sender != null) {
|
|
||||||
return ProfileLoaderWidget(parsed.sender!, (ctx, state) {
|
|
||||||
final name = ProfileNameWidget.nameFromProfile(
|
|
||||||
state.data ?? Metadata(pubKey: parsed.sender!),
|
|
||||||
);
|
|
||||||
return _zapperRow(name, parsed.amountSats ?? 0, state.data);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return _zapperRow("Anon", parsed.amountSats ?? 0, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _zapperRow(String name, int amount, Metadata? profile) {
|
|
||||||
return Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
|
||||||
children: [
|
|
||||||
RichText(
|
|
||||||
text: TextSpan(
|
|
||||||
style: TextStyle(color: ZAP_1),
|
|
||||||
children: [
|
|
||||||
WidgetSpan(
|
|
||||||
child: Icon(Icons.bolt, color: ZAP_1),
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
),
|
|
||||||
if (profile != null)
|
|
||||||
WidgetSpan(
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.only(right: 8),
|
|
||||||
child: AvatarWidget(profile: profile, size: 20),
|
|
||||||
),
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
),
|
|
||||||
TextSpan(text: name),
|
|
||||||
TextSpan(text: " zapped ", style: TextStyle(color: FONT_COLOR)),
|
|
||||||
TextSpan(text: formatSats(amount)),
|
|
||||||
TextSpan(text: " sats", style: TextStyle(color: FONT_COLOR)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ChatMessageWidget extends StatelessWidget {
|
|
||||||
final StreamEvent stream;
|
|
||||||
final Nip01Event msg;
|
|
||||||
|
|
||||||
const _ChatMessageWidget({required this.stream, required this.msg});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ProfileLoaderWidget(msg.pubKey, (ctx, state) {
|
|
||||||
final profile = state.data ?? Metadata(pubKey: msg.pubKey);
|
|
||||||
return GestureDetector(
|
|
||||||
onLongPress: () {
|
|
||||||
if (ndk.accounts.canSign) {
|
|
||||||
showModalBottomSheet(
|
|
||||||
context: context,
|
|
||||||
constraints: BoxConstraints.expand(),
|
|
||||||
builder:
|
|
||||||
(ctx) => ProfileModalWidget(profile: profile, event: msg),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: Column(
|
|
||||||
spacing: 2,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
_chatText(profile),
|
|
||||||
RxFilter<Nip01Event>(
|
|
||||||
filters: [
|
|
||||||
Filter(kinds: [9735, 7], eTags: [msg.id]),
|
|
||||||
],
|
|
||||||
builder: (ctx, data) => _chatReactions(data),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _chatText(Metadata profile) {
|
|
||||||
return RichText(
|
|
||||||
text: TextSpan(
|
|
||||||
children: [
|
|
||||||
WidgetSpan(
|
|
||||||
child: AvatarWidget(profile: profile, size: 24),
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
),
|
|
||||||
TextSpan(text: " "),
|
|
||||||
WidgetSpan(
|
|
||||||
alignment: PlaceholderAlignment.middle,
|
|
||||||
child: ProfileNameWidget(
|
|
||||||
profile: profile,
|
|
||||||
style: TextStyle(
|
|
||||||
color: msg.pubKey == stream.info.host ? PRIMARY_1 : SECONDARY_1,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(text: " "),
|
|
||||||
...textToSpans(msg.content, msg.tags, msg.pubKey),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _chatReactions(List<Nip01Event>? events) {
|
|
||||||
if ((events?.length ?? 0) == 0) return SizedBox.shrink();
|
|
||||||
|
|
||||||
final zaps = events!
|
|
||||||
.where((e) => e.kind == 9735)
|
|
||||||
.map((e) => ZapReceipt.fromEvent(e));
|
|
||||||
final reactions = events.where((e) => e.kind == 7);
|
|
||||||
|
|
||||||
return Row(
|
|
||||||
spacing: 8,
|
|
||||||
children: [
|
|
||||||
if (zaps.isNotEmpty)
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2),
|
|
||||||
decoration: BoxDecoration(color: LAYER_2, borderRadius: DEFAULT_BR),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Icon(Icons.bolt, color: ZAP_1, size: 16),
|
|
||||||
Text(
|
|
||||||
formatSats(
|
|
||||||
zaps.fold(0, (acc, v) => acc + (v.amountSats ?? 0)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
if (reactions.isNotEmpty)
|
|
||||||
...reactions
|
|
||||||
.fold(<String, Set<String>>{}, (acc, v) {
|
|
||||||
acc[v.content] ??= Set();
|
|
||||||
acc[v.content]!.add(v.pubKey);
|
|
||||||
return acc;
|
|
||||||
})
|
|
||||||
.entries
|
|
||||||
.map(
|
|
||||||
(v) => Container(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: LAYER_2,
|
|
||||||
borderRadius: DEFAULT_BR,
|
|
||||||
),
|
|
||||||
child: Center(child: Text(v.key)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _WriteMessageWidget extends StatefulWidget {
|
|
||||||
final StreamEvent stream;
|
|
||||||
|
|
||||||
const _WriteMessageWidget({required this.stream});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<StatefulWidget> createState() => __WriteMessageWidget();
|
|
||||||
}
|
|
||||||
|
|
||||||
class __WriteMessageWidget extends State<_WriteMessageWidget> {
|
|
||||||
late final TextEditingController _controller;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_controller = TextEditingController();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _sendMessage() async {
|
|
||||||
final login = ndk.accounts.getLoggedAccount();
|
|
||||||
if (login == null) return;
|
|
||||||
|
|
||||||
final chatMsg = Nip01Event(
|
|
||||||
pubKey: login.pubkey,
|
|
||||||
kind: 1311,
|
|
||||||
content: _controller.text,
|
|
||||||
tags: [
|
|
||||||
["a", widget.stream.aTag],
|
|
||||||
],
|
|
||||||
);
|
|
||||||
final res = ndk.broadcast.broadcast(nostrEvent: chatMsg);
|
|
||||||
await res.broadcastDoneFuture;
|
|
||||||
_controller.text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final canSign = ndk.accounts.canSign;
|
|
||||||
final isLogin = ndk.accounts.isLoggedIn;
|
|
||||||
|
|
||||||
return Container(
|
|
||||||
margin: EdgeInsets.fromLTRB(4, 8, 4, 0),
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 8),
|
|
||||||
decoration: BoxDecoration(color: LAYER_2, borderRadius: DEFAULT_BR),
|
|
||||||
child:
|
|
||||||
canSign
|
|
||||||
? Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: TextField(
|
|
||||||
controller: _controller,
|
|
||||||
onSubmitted: (_) => _sendMessage(),
|
|
||||||
decoration: InputDecoration(
|
|
||||||
labelText: "Write message",
|
|
||||||
contentPadding: EdgeInsets.symmetric(vertical: 4),
|
|
||||||
labelStyle: TextStyle(color: LAYER_4, fontSize: 14),
|
|
||||||
border: InputBorder.none,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
//IconButton(onPressed: () {}, icon: Icon(Icons.mood)),
|
|
||||||
IconButton(
|
|
||||||
onPressed: () {
|
|
||||||
_sendMessage();
|
|
||||||
},
|
|
||||||
icon: Icon(Icons.send),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
: Container(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 12),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
isLogin
|
|
||||||
? "Can't write messages with npub login"
|
|
||||||
: "Please login to send messages",
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
103
lib/widgets/chat_badge.dart
Normal file
103
lib/widgets/chat_badge.dart
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
import 'package:collection/collection.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:ndk/entities.dart';
|
||||||
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
||||||
|
import 'package:zap_stream_flutter/imgproxy.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/profile.dart';
|
||||||
|
|
||||||
|
class ChatBadgeAwardWidget extends StatelessWidget {
|
||||||
|
final Nip01Event event;
|
||||||
|
final StreamEvent stream;
|
||||||
|
|
||||||
|
const ChatBadgeAwardWidget({
|
||||||
|
super.key,
|
||||||
|
required this.event,
|
||||||
|
required this.stream,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final aTag = event.getFirstTag("a");
|
||||||
|
if (aTag == null) return SizedBox();
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
margin: EdgeInsets.symmetric(horizontal: 2, vertical: 4),
|
||||||
|
padding: EdgeInsets.all(5),
|
||||||
|
decoration: BoxDecoration(color: LAYER_1, borderRadius: DEFAULT_BR),
|
||||||
|
child: FutureBuilder(
|
||||||
|
future: ndk.requests.query(filters: [aTagToFilter(aTag)]).future,
|
||||||
|
builder: (context, state) {
|
||||||
|
final badge = state.data?.firstOrNull;
|
||||||
|
final image = badge?.getFirstTag("image");
|
||||||
|
final name = badge?.getFirstTag("name");
|
||||||
|
final title = badge?.getFirstTag("description");
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
if (image?.isNotEmpty ?? false)
|
||||||
|
ProxyImg(url: image, width: 64),
|
||||||
|
if (name?.isNotEmpty ?? false)
|
||||||
|
Text(
|
||||||
|
name!,
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontSize: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (title?.isNotEmpty ?? false)
|
||||||
|
Text(
|
||||||
|
title!,
|
||||||
|
style: TextStyle(color: LAYER_5),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"${t.stream.chat.badge.awarded_to} ",
|
||||||
|
style: TextStyle(fontWeight: FontWeight.w500),
|
||||||
|
),
|
||||||
|
...event
|
||||||
|
.getTags("p")
|
||||||
|
.map((e) => ProfileWidget.pubkey(e, size: 20)),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ChatBadgeWidget extends StatelessWidget {
|
||||||
|
final Nip01Event badge;
|
||||||
|
|
||||||
|
const ChatBadgeWidget({super.key, required this.badge});
|
||||||
|
|
||||||
|
static Widget fromATag(String aTag, {Key? key}) {
|
||||||
|
return FutureBuilder(
|
||||||
|
future: ndk.requests.query(filters: [aTagToFilter(aTag)]).future,
|
||||||
|
builder: (context, state) {
|
||||||
|
final ev = state.data?.firstWhereOrNull(
|
||||||
|
(e) => "${e.kind}:${e.pubKey}:${e.getDtag()}" == aTag,
|
||||||
|
);
|
||||||
|
if (ev == null) return SizedBox();
|
||||||
|
return ChatBadgeWidget(badge: ev, key: key);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final image = badge.getFirstTag("image");
|
||||||
|
if (image?.isEmpty ?? true) return SizedBox();
|
||||||
|
|
||||||
|
return ProxyImg(url: image, resize: 24, height: 24);
|
||||||
|
}
|
||||||
|
}
|
164
lib/widgets/chat_message.dart
Normal file
164
lib/widgets/chat_message.dart
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:ndk/ndk.dart';
|
||||||
|
import 'package:zap_stream_flutter/const.dart';
|
||||||
|
import 'package:zap_stream_flutter/theme.dart';
|
||||||
|
import 'package:zap_stream_flutter/utils.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/avatar.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/chat_modal.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/custom_emoji.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/nostr_text.dart';
|
||||||
|
import 'package:zap_stream_flutter/widgets/profile.dart';
|
||||||
|
|
||||||
|
class ChatMessageWidget extends StatelessWidget {
|
||||||
|
final StreamEvent stream;
|
||||||
|
final Nip01Event msg;
|
||||||
|
final List<Widget>? badges;
|
||||||
|
|
||||||
|
const ChatMessageWidget({
|
||||||
|
super.key,
|
||||||
|
required this.stream,
|
||||||
|
required this.msg,
|
||||||
|
this.badges,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return FutureBuilder(
|
||||||
|
future: ndk.metadata.loadMetadata(msg.pubKey),
|
||||||
|
builder: (ctx, state) {
|
||||||
|
final profile = state.data ?? Metadata(pubKey: msg.pubKey);
|
||||||
|
return GestureDetector(
|
||||||
|
onLongPress: () {
|
||||||
|
if (ndk.accounts.canSign) {
|
||||||
|
showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
constraints: BoxConstraints.expand(),
|
||||||
|
builder:
|
||||||
|
(ctx) => ChatModalWidget(
|
||||||
|
profile: profile,
|
||||||
|
event: msg,
|
||||||
|
stream: stream,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 2, vertical: 4),
|
||||||
|
child: Column(
|
||||||
|
spacing: 2,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
_chatText(profile),
|
||||||
|
/*RxFilter<Nip01Event>(
|
||||||
|
Key(msg.id),
|
||||||
|
filters: [
|
||||||
|
Filter(kinds: [9735, 7], eTags: [msg.id]),
|
||||||
|
],
|
||||||
|
builder: (context, state) {
|
||||||
|
return ChatReactions(msg: msg, events: state ?? []);
|
||||||
|
},
|
||||||
|
),*/
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _chatText(Metadata profile) {
|
||||||
|
return RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
children: [
|
||||||
|
WidgetSpan(
|
||||||
|
child: AvatarWidget(profile: profile, size: 24),
|
||||||
|
alignment: PlaceholderAlignment.middle,
|
||||||
|
),
|
||||||
|
TextSpan(text: " "),
|
||||||
|
WidgetSpan(
|
||||||
|
alignment: PlaceholderAlignment.middle,
|
||||||
|
child: ProfileNameWidget(
|
||||||
|
profile: profile,
|
||||||
|
style: TextStyle(
|
||||||
|
color: msg.pubKey == stream.info.host ? PRIMARY_1 : SECONDARY_1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (badges?.isNotEmpty ?? false) TextSpan(text: " "),
|
||||||
|
if (badges?.isNotEmpty ?? false)
|
||||||
|
WidgetSpan(
|
||||||
|
alignment: PlaceholderAlignment.middle,
|
||||||
|
child: Row(
|
||||||
|
spacing: 4,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: badges!,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextSpan(text: " "),
|
||||||
|
...textToSpans(msg.content, msg.tags, msg.pubKey),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ChatReactions extends StatelessWidget {
|
||||||
|
final Nip01Event msg;
|
||||||
|
final List<Nip01Event> events;
|
||||||
|
|
||||||
|
const ChatReactions({super.key, required this.msg, required this.events});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
// reactions must have e tag pointing to msg
|
||||||
|
final filteredEvents = events.where((e) => e.getEId() == msg.id);
|
||||||
|
if (filteredEvents.isEmpty) return SizedBox.shrink();
|
||||||
|
final zaps = filteredEvents
|
||||||
|
.where((e) => e.kind == 9735)
|
||||||
|
.map((e) => ZapReceipt.fromEvent(e));
|
||||||
|
final reactions = filteredEvents.where((e) => e.kind == 7);
|
||||||
|
|
||||||
|
return Row(
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
if (zaps.isNotEmpty)
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2),
|
||||||
|
decoration: BoxDecoration(color: LAYER_2, borderRadius: DEFAULT_BR),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(Icons.bolt, color: ZAP_1, size: 16),
|
||||||
|
Text(
|
||||||
|
formatSats(
|
||||||
|
zaps.fold(0, (acc, v) => acc + (v.amountSats ?? 0)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (reactions.isNotEmpty)
|
||||||
|
...reactions
|
||||||
|
.fold(<String, Set<Nip01Event>>{}, (acc, v) {
|
||||||
|
// ignore: prefer_collection_literals
|
||||||
|
acc[v.content] ??= Set();
|
||||||
|
acc[v.content]!.add(v);
|
||||||
|
return acc;
|
||||||
|
})
|
||||||
|
.entries
|
||||||
|
.map(
|
||||||
|
(v) => Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 4, vertical: 2),
|
||||||
|
clipBehavior: Clip.antiAlias,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: LAYER_2,
|
||||||
|
borderRadius: DEFAULT_BR,
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: CustomEmoji(emoji: v.key, tags: v.value.first.tags),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user